Allow examine_simple_variable() to work on INSERT RETURNING Vars.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 8 Jan 2024 16:48:44 +0000 (11:48 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 8 Jan 2024 16:48:44 +0000 (11:48 -0500)
commit89b69db82adf742cadc36ee9a365cf47a632cdb0
treef923f0e4c3f988f6cbe7e4c179c38d606f459fb6
parentbea18b1c949145ba2ca79d4765dba3cc9494a480
Allow examine_simple_variable() to work on INSERT RETURNING Vars.

Since commit 599b33b94, this function assumed that every RTE_RELATION
RangeTblEntry would have an associated RelOptInfo.  But that's not so:
we only build RelOptInfos for relations that are scanned by the query.
In particular the target of an INSERT won't have one, so that Vars
appearing in an INSERT ... RETURNING list will not have an associated
RelOptInfo.  This apparently wasn't a problem before commit f7816aec2
taught examine_simple_variable() to drill down into CTEs containing
INSERT RETURNING, but it is now.

To fix, add a fallback code path that gets the userid to use directly
from the RTEPermissionInfo associated with the RTE.  (Sadly, we must
have two code paths, because not every RTE has a RTEPermissionInfo
either.)

Per report from Alexander Lakhin.  No back-patch, since the case is
apparently unreachable before f7816aec2.

Discussion: https://postgr.es/m/608a4886-6c60-0f9e-97d5-591256bd4150@gmail.com
src/backend/optimizer/util/relnode.c
src/backend/utils/adt/selfuncs.c
src/include/optimizer/pathnode.h
src/test/regress/expected/with.out
src/test/regress/sql/with.sql