pgsql: Collect dependency information for parsed CallStmts. - Mailing list pgsql-committers

From Tom Lane
Subject pgsql: Collect dependency information for parsed CallStmts.
Date
Msg-id E1qkqXR-005uYG-TJ@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
Collect dependency information for parsed CallStmts.

Parse analysis of a CallStmt will inject mutable information,
for instance the OID of the called procedure, so that subsequent
DDL may create a need to re-parse the CALL.  We failed to detect
this for CALLs in plpgsql routines, because no dependency information
was collected when putting a CallStmt into the plan cache.  That
could lead to misbehavior or strange errors such as "cache lookup
failed".

Before commit ee895a655, the issue would only manifest for CALLs
appearing in atomic contexts, because we re-planned non-atomic
CALLs every time through anyway.

It is now apparent that extract_query_dependencies() probably
needs a special case for every utility statement type for which
stmt_requires_parse_analysis() returns true.  I wanted to add
something like Assert(!stmt_requires_parse_analysis(...)) when
falling out of extract_query_dependencies_walker without doing
anything, but there are API issues as well as a more fundamental
point: stmt_requires_parse_analysis is supposed to be applied to
raw parser output, so it'd be cheating to assume it will give the
correct answer for post-parse-analysis trees.  I contented myself
with adding a comment.

Per bug #18131 from Christian Stork.  Back-patch to all supported
branches.

Discussion: https://postgr.es/m/18131-576854e79c5cd264@postgresql.org

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/dc8d72c1c213d65a3f1500111d3c773aabce419f

Modified Files
--------------
src/backend/optimizer/plan/setrefs.c         | 23 ++++++++++++--
src/pl/plpgsql/src/expected/plpgsql_call.out | 47 ++++++++++++++++++++++++++++
src/pl/plpgsql/src/sql/plpgsql_call.sql      | 38 ++++++++++++++++++++++
3 files changed, 106 insertions(+), 2 deletions(-)


pgsql-committers by date:

Previous
From: Andres Freund
Date:
Subject: pgsql: docs: Clarify --with-segsize-blocks documentation
Next
From: Andres Freund
Date:
Subject: pgsql: pg_dump: tests: Correct test condition for invalid databases