Print the correct aliases for DML target tables in ruleutils. ruleutils.c blindly printed the user-given alias (or nothing if there hadn't been one) for the target table of INSERT/UPDATE/DELETE queries. That works a large percentage of the time, but not always: for queries appearing in WITH, it's possible that we chose a different alias to avoid conflict with outer-scope names. Since the chosen alias would be used in any Var references to the target table, this'd lead to an inconsistent printout with consequences such as dump/restore failures.
The correct logic for printing (or not) a relation alias was embedded in get_from_clause_item. Factor it out to a separate function so that we don't need a jointree node to use it. (Only a limited part of that function can be reached from these new call sites, but this seems like the cleanest non-duplicative factorization.) In passing, I got rid of a redundant "\d+ rules_src" step in rules.sql. Initial report from Jonathan Katz; thanks to Vignesh C for analysis. This has been broken for a long time, so back-patch to all supported branches. Discussion: https://postgr.es/m/[email protected] Discussion: https://postgr.es/m/CALDaNm1MMntjmT_NJGp-Z=xbf02qhgayushfyhias3tqqbp...@mail.gmail.com Branch ------ REL_13_STABLE Details ------- https://git.postgresql.org/pg/commitdiff/4efb4f0d48787fbdf42c0b760f19c997664f0d56 Modified Files -------------- src/backend/utils/adt/ruleutils.c | 145 +++++++++++++++++++++--------------- src/test/regress/expected/rules.out | 47 +++++++----- src/test/regress/sql/rules.sql | 13 +++- 3 files changed, 126 insertions(+), 79 deletions(-)
