Thread: Regression in Postgres 17?

Regression in Postgres 17?

From
"Colin 't Hart"
Date:
Hi,

This works in Postgres 15:

pg15> create function json_test(out value text, out json jsonb)
returns record
language sql
as
$$
  select null::text, null::jsonb;
$$
;
CREATE FUNCTION
pg15> select * from json_test();
┌───────┬──────┐
│ value │ json │
├───────┼──────┤
│       │      │
└───────┴──────┘
(1 row)


In Postgres 17 trying to create the function yields an error:

pg17> create function json_test(out value text, out json jsonb)
returns record
language sql
as
$$
  select null::text, null::jsonb;
$$
;
ERROR:  syntax error at or near "jsonb"
LINE 1: create function json_test(out value text, out json jsonb)


Am I doing something wrong? Or is this a regression?

Thanks,

Colin

Re: Regression in Postgres 17?

From
Achilleas Mantzios
Date:


Στις 22/10/24 18:54, ο/η Colin 't Hart έγραψε:
Hi,

This works in Postgres 15:

pg15> create function json_test(out value text, out json jsonb)
returns record
language sql
as
$$
  select null::text, null::jsonb;
$$
;
CREATE FUNCTION
pg15> select * from json_test();
┌───────┬──────┐
│ value │ json │
├───────┼──────┤
│       │      │
└───────┴──────┘
(1 row)


In Postgres 17 trying to create the function yields an error:

pg17> create function json_test(out value text, out json jsonb)
returns record
language sql
as
$$
  select null::text, null::jsonb;
$$
;
ERROR:  syntax error at or near "jsonb"
LINE 1: create function json_test(out value text, out json jsonb)


Am I doing something wrong? Or is this a regression?

Do this instead :

create function json_test(out value text, out jsonparam jsonb)
returns record
language sql
as
$$
 select null::text, null::jsonb;
$$
;
CREATE FUNCTION

apparently json is a reserved word (now) and won't be accepted as function parameter name.


Thanks,

Colin

Re: Regression in Postgres 17?

From
Adrian Klaver
Date:
On 10/22/24 08:54, Colin 't Hart wrote:
> Hi,
> 
> This works in Postgres 15:
> 
> pg15> create function json_test(out value text, out json jsonb)
> returns record
> language sql
> as
> $$
>    select null::text, null::jsonb;
> $$
> ;
> CREATE FUNCTION
> pg15> select * from json_test();
> ┌───────┬──────┐
> │ value │ json │
> ├───────┼──────┤
> │       │      │
> └───────┴──────┘
> (1 row)
> 
> 
> In Postgres 17 trying to create the function yields an error:
> 
> pg17> create function json_test(out value text, out json jsonb)
> returns record
> language sql
> as
> $$
>    select null::text, null::jsonb;
> $$
> ;
> ERROR:  syntax error at or near "jsonb"
> LINE 1: create function json_test(out value text, out json jsonb)
> 
> 
> Am I doing something wrong? Or is this a regression?

Yes you are doing something wrong, naming an argument with a type 
name(json) is not a good idea. Guessing you got caught by this:

https://www.postgresql.org/docs/16/sql-keywords-appendix.html

JSON     non-reserved     reserved           

https://www.postgresql.org/docs/17/sql-keywords-appendix.html

JSON     non-reserved (cannot be function or type)     reserved           



> Thanks,
> 
> Colin

-- 
Adrian Klaver
adrian.klaver@aklaver.com




Re: Regression in Postgres 17?

From
Tom Lane
Date:
Adrian Klaver <adrian.klaver@aklaver.com> writes:
>> In Postgres 17 trying to create the function yields an error:
>> 
>> pg17> create function json_test(out value text, out json jsonb)
>> returns record
>> ...
>> ERROR:  syntax error at or near "jsonb"
>> LINE 1: create function json_test(out value text, out json jsonb)
>> 
>> Am I doing something wrong? Or is this a regression?

> Yes you are doing something wrong, naming an argument with a type 
> name(json) is not a good idea.

The actual problem is that the SQL standards committee invented
some bizarre syntax that we couldn't parse without making JSON
a partially-reserved word.  It still works as a type name, but
in this particular syntax where it's not initially clear which
names are type names, you lose.  Double-quote the argument name,
or name it something other than "json".

            regards, tom lane



Re: Regression in Postgres 17?

From
Dominique Devienne
Date:
On Tue, Oct 22, 2024 at 6:03 PM Achilleas Mantzios
<a.mantzios@cloud.gatewaynet.com> wrote:
> Στις 22/10/24 18:54, ο/η Colin 't Hart έγραψε:
> This works in Postgres 15:
> Do this instead :
> create function json_test(out value text, out jsonparam jsonb)
...
> apparently json is a reserved word (now) and won't be accepted as function parameter name.

Or properly double-quote the param name:

```
ddevienne=> show server_version;
 server_version
----------------
 17.0
(1 row)
                                                               ^
ddevienne=> create function json_test(out value text, out "json"
jsonb) returns record language sql as 'select null::text,
null::jsonb;';
CREATE FUNCTION
ddevienne=> select * from json_test();
 value | json
-------+------
       |
(1 row)
```