Re: References to parameters by name are lost in INSERT INTO ... SELECT <parameter value> .... statements in case of routines with the SQL-standard function body
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Erki Eessaar <erki.eessaar@taltech.ee>
Cc: Masahiko Sawada <sawada.mshk@gmail.com>,
"pgsql-bugs@lists.postgresql.org" <pgsql-bugs@lists.postgresql.org>,
Peter Eisentraut <peter.eisentraut@enterprisedb.com>
Date: 2021-11-16T21:52:57Z
Lists: pgsql-bugs
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Fix display of SQL-standard function's arguments in INSERT/SELECT.
- a8d8445a7b2f 15.0 landed
- 5d5779aeaf07 14.2 landed
-
SQL-standard function body
- e717a9a18b2e 14.0 cited
Attachments
- fix-sql-function-param-decompile.patch (text/x-diff) patch
Erki Eessaar <erki.eessaar@taltech.ee> writes: > Indeed, re-execution of this code without any modifications in it produces the same result. Right, that printout is functionally equivalent to the original. > Still I see here two problems. > * Inconsistency - see INSERT vs. UPDATE. Yeah, it's weird that the same parameter is printed two different ways. I dug into it and found out that we're losing the "context->namespace" list when recursing into the sub-SELECT from get_insert_query_def. The fix is trivial (attached). The other places where get_query_def is invoked quasi-recursively all pass down the parent namespace list already. The fact that this one is out of step is a very ancient oversight (it's at least old enough to vote, according to some quick git archaeology). But as far as I can see, it didn't have any visible consequences until commit e717a9a18 taught get_parameter() to pay attention to the last entry of the list. So I'm inclined not to change it before v14. I was also pretty unhappy that get_parameter() was so naively trusting that an EXTERN Param must have something to do with the last entry's argnames array, or even that there must be a last entry. So the attached makes that a little more paranoid, too. > * The problem of positional references in general is that changing the order of parameters requires changing the body as well, i.e., the result lost some of its qualities. Thus, one could argue that in this case the input and output are not equivalent. I don't think this argument holds a lot of water, because you could reverse it too: if the author had originally written $N, maybe there was a reason why she thought that would be more maintainable than a named reference. But we don't store any distinction between the two ways of writing a Param reference, so we can't promise to regenerate it exactly the way it was written. Still, it's clear that the intent here was to print a reference-by-name if possible, and the failure to do so within only the context of INSERT/SELECT is therefore a bug. regards, tom lane