Re: Sanding down some edge cases for PL/pgSQL reserved words - Mailing list pgsql-hackers

From Pavel Stehule
Subject Re: Sanding down some edge cases for PL/pgSQL reserved words
Date
Msg-id CAFj8pRC6ypKrfOgALS+HqcqCzswDitYzhg+++ugRCEGkq2dRAA@mail.gmail.com
Whole thread Raw
In response to Sanding down some edge cases for PL/pgSQL reserved words  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
Hi

I started reviewing this patch.


so 7. 6. 2025 v 18:41 odesílatel Tom Lane <tgl@sss.pgh.pa.us> napsal:
This is a rather delayed response to the discussion of bug
#18693 [1], in which I wrote:

> (It's kind of annoying that "strict" has to be double-quoted
> in the RAISE NOTICE, especially since you get a rather misleading
> error if it isn't.  But that seems like a different discussion.)

As an example of that, if you don't double-quote "strict"
in this usage you get

regression=# do $$ declare r record; begin
SELECT a, b AS STRICT INTO r FROM (SELECT 'A' AS a, 'B' AS b) AS q;
RAISE NOTICE 'STRICT r.strict = %', r.strict;
end $$;
ERROR:  record "r" has no field "strict"
LINE 1: r.strict
        ^
QUERY:  r.strict
CONTEXT:  PL/pgSQL function inline_code_block line 3 at RAISE

which is pretty bogus because the record *does* have a field
named "strict".  The actual problem is that STRICT is a fully
reserved PL/pgSQL keyword, which means you need to double-quote
it if you want to use it this way.

The attached patches provide two independent responses to that:

1. AFAICS, there is no real reason for STRICT to be a reserved
rather than unreserved PL/pgSQL keyword, and for that matter not
EXECUTE either.  Making them unreserved does allow some ambiguity,
but I don't think there's any surprises in how that ambiguity
would be resolved; and certainly we've preferred ambiguity over
introducing new reserved keywords in PL/pgSQL before.  I think
these two just escaped that treatment by dint of being ancient.

There is no issue.

 

2. That "has no field" error message is flat-out wrong.  The now-known
way to trigger it has a different cause, and what's more, we simply do
not know at this point whether the malleable record type has such a
field.  So in 0002 below I just changed it to assume that the problem
is a reserved field name.  We might find another way to reach that
failure in future, but I doubt that "has no field" would be the right
thing to say in any case.

The proposed patch is a zero invasive solution. But the question is why we cannot allow plpgsql reserved keywords in recfilds?

There should not be any collisions. Isn't there a better solution to modify plpgsql_yylex instead and allow all keywords after '.' ? Sure. It will be more invasive.

Regards

Pavel
 



This is v19 material at this point, so I'll stick it on the CF queue.

                        regards, tom lane

[1] https://www.postgresql.org/message-id/flat/18693-65968418890877b4%40postgresql.org

pgsql-hackers by date:

Previous
From: Laurenz Albe
Date:
Subject: Re: Enhancing PostgreSQL Management and Observability in Cloud Environments
Next
From: Etsuro Fujita
Date:
Subject: Re: pgsql: postgres_fdw: Inherit the local transaction's access/deferrable