Subject: Re: Regression in Postgres 17?

From: Adrian Klaver <[email-masked]>
Date: Tue, 22 Oct 2024 09:03:05 -0700

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
[email-masked]

---

From: Tom Lane <[email-masked]>
Date: Tue, 22 Oct 2024 12:12:46 -0400

Adrian Klaver <[email-masked]> writes:
>> ...

> 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