Fix bogus Assert in find_var_for_subquery_tle find_var_for_subquery_tle() searches a subquery rel's targetlist for a Var referencing a given subquery output column, and asserted that any Var it finds there belongs to that rel. That does not hold for an appendrel child. set_append_rel_size() builds the child's targetlist by translating the parent's, and as noted there the result can contain arbitrary expressions. In particular, when a member of a LATERAL UNION ALL subquery is pulled up and its output is a lateral reference, the translated expression is a Var of the laterally referenced rel. If the child is itself a subquery with sorted paths, convert_subquery_pathkeys() would trip the Assert.
In non-assert builds, the function went on to compare such a Var's varattno with the subquery column's resno, and so could match a Var of an unrelated rel. To fix, ignore Vars that do not belong to the subquery rel, the same way set_rel_width() already does. Also correct the adjacent comment, which claimed that the only non-Var entries are placeholders. Back-patch to all supported branches. Author: Richard Guo <[email protected]> Reviewed-by: shihao zhong <[email protected]> Discussion: https://postgr.es/m/cambws48ffipi7q5yjcom_nas47zd5xgvphd9nzym_ewq+k_...@mail.gmail.com Backpatch-through: 14 Branch ------ master Details ------- https://git.postgresql.org/pg/commitdiff/11b56ee27315276bd09eff17fa503ba39f4231ce Modified Files -------------- src/backend/optimizer/path/pathkeys.c | 12 ++++++++++-- src/test/regress/expected/join.out | 18 ++++++++++++++++++ src/test/regress/sql/join.sql | 7 +++++++ 3 files changed, 35 insertions(+), 2 deletions(-)
