Make pg_get_expr() more bulletproof.

Tom Lane <tgl@sss.pgh.pa.us>

Commit: 6867f963e319934cbdafeb4bd5beaea5797c7be2
Author: Tom Lane <tgl@sss.pgh.pa.us>
Date: 2022-01-09T17:43:09Z
Releases: 15.0
Make pg_get_expr() more bulletproof.

Since this function is defined to accept pg_node_tree values, it could
get applied to any nodetree that can appear in a cataloged pg_node_tree
column.  Some such cases can't be supported --- for example, its API
doesn't allow providing referents for more than one relation --- but
we should try to throw a user-facing error rather than an internal
error when encountering such a case.

In support of this, extend expression_tree_walker/mutator to be sure
they'll work on any such node tree (which basically means adding
support for relpartbound node types).  That allows us to run pull_varnos
and check for the case of multiple relations before we start processing
the tree.  The alternative of changing the low-level error thrown for an
out-of-range varno isn't appealing, because that could mask actual bugs
in other usages of ruleutils.

Per report from Justin Pryzby.  This is basically cosmetic, so no
back-patch.

Discussion: https://postgr.es/m/20211219205422.GT17618@telsasoft.com

Files

PathChange+/−
src/backend/nodes/nodeFuncs.c modified +42 −0
src/backend/optimizer/util/var.c modified +9 −2
src/backend/utils/adt/ruleutils.c modified +43 −1

Discussion