Fix join alias expansion in lateral TABLESAMPLE clauses preprocess_expression skips flatten_join_alias_vars for TABLESAMPLE clauses, on the assumption that they cannot contain Vars of the current query level. That's not true once a LATERAL subquery containing a sampled relation has been pulled up: the relation's TABLESAMPLE clause then becomes a lateral reference of this level, and if it referred to a join alias Var, that Var is left unexpanded. extract_lateral_references then pulls the join alias Var out as a lateral reference and fails with "no relation entry for relid N".
To fix, treat such clauses like lateral function and VALUES RTEs: introduce EXPRKIND_TABLESAMPLE_LATERAL, used for the TABLESAMPLE clause of a lateral relation RTE, and keep skipping the alias expansion only for the non-lateral kind. Back-patch to all supported branches, as this dates back to the introduction of TABLESAMPLE. Author: Richard Guo <[email protected]> Reviewed-by: Ewan Young <[email protected]> Reviewed-by: Ayush Tiwari <[email protected]> Discussion: https://postgr.es/m/cambws4834twotyyycyvja3muobkfpxy3dfal0zt_vcm1ktq...@mail.gmail.com Backpatch-through: 14 Branch ------ REL_18_STABLE Details ------- https://git.postgresql.org/pg/commitdiff/30baaacdd1c039e4aced3f4970f24c425a5e0145 Modified Files -------------- src/backend/optimizer/plan/planner.c | 16 +++++++++++----- src/test/regress/expected/tablesample.out | 32 +++++++++++++++++++++++++++++++ src/test/regress/sql/tablesample.sql | 12 ++++++++++++ 3 files changed, 55 insertions(+), 5 deletions(-)
