Re: PL/pgSQL: Incomplete item Allow handling of %TYPE arrays, e.g. tab.col%TYPE[]

Quan Zongliang <quanzongliang@yeah.net>

From: Quan Zongliang <quanzongliang@yeah.net>
To: Pavel Stehule <pavel.stehule@gmail.com>
Cc: pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2023-11-23T12:27:51Z
Lists: pgsql-hackers

Attachments


On 2023/11/20 17:33, Pavel Stehule wrote:

> 
> 
> I did some deeper check:
> 
> - I don't like too much parser's modification (I am sending alternative 
> own implementation) - the SQL parser allows richer syntax, and for full 
> functionality is only few lines more
Agree.

> 
> - original patch doesn't solve %ROWTYPE
> 
> (2023-11-20 10:04:36) postgres=# select * from foo;
> ┌────┬────┐
> │ a  │ b  │
> ╞════╪════╡
> │ 10 │ 20 │
> │ 30 │ 40 │
> └────┴────┘
> (2 rows)
> 
> (2023-11-20 10:08:29) postgres=# do $$
> declare v foo%rowtype[];
> begin
>    v := array(select row(a,b) from foo);
>    raise notice '%', v;
> end;
> $$;
> NOTICE:  {"(10,20)","(30,40)"}
> DO
> 
two little fixes
1. spelling mistake
   ARRAY [ icons ] --> ARRAY [ iconst ]
2. code bug
   if (!OidIsValid(dtype->typoid)) --> if (!OidIsValid(array_typeid))


> - original patch doesn't solve type RECORD
> the error message should be more intuitive, although the arrays of 
> record type can be supported, but it probably needs bigger research.
> 
> (2023-11-20 10:10:34) postgres=# do $$
> declare r record; v r%type[];
> begin
>    v := array(select row(a,b) from foo);
>    raise notice '%', v;
> end;
> $$;
> ERROR:  syntax error at or near "%"
> LINE 2: declare r record; v r%type[];
>                               ^
> CONTEXT:  invalid type name "r%type[]"
> 
Currently only scalar variables are supported.
This error is consistent with the r%type error. And record arrays are 
not currently supported.
Support for r%type should be considered first. For now, let r%type[] 
report the same error as record[].
I prefer to implement it with a new patch.

> - missing documentation
My English is not good. I wrote it down, please correct it. Add a note 
in the "Record Types" documentation that arrays and "Copying Types" are 
not supported yet.

> 
> - I don't like using the word "partitioned" in the regress test name 
> "partitioned_table". It is confusing
fixed

> 
> Regards
> 
> Pavel

Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Clean up some edge cases in plpgsql's %TYPE parsing.

  2. In plpgsql, allow %TYPE and %ROWTYPE to be followed by array decoration.