postgres.git / summary / log / commit / refs

commit    1d98fdaed89c00465ef68fa2804967ea27b03abc
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Fri Jul 09 17:38:24 2021 +0000

    Avoid creating a RESULT RTE that's marked LATERAL.
    
    Commit 7266d0997 added code to pull up simple constant function
    results, converting the RTE_FUNCTION RTE to a dummy RTE_RESULT
    RTE since it no longer need be scanned.  But I forgot to clear
    the LATERAL flag if the RTE has it set.  If the function reduced
    to a constant, it surely contains no lateral references so this
    simplification is logically OK.  It's needed because various other
    places will Assert that RESULT RTEs aren't LATERAL.
    
    Per bug #17097 from Yaoguang Chen.  Back-patch to v13 where the
    faulty code came in.
    
    Discussion: https://postgr.es/m/17097-3372ef9f798fc94f@postgresql.org


src/backend/optimizer/prep/prepjointree.c | 5 ++++- src/test/regress/expected/join.out | 8 ++++++++ src/test/regress/sql/join.sql | 3 +++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/backend/optimizer/prep/prepjointree.c b/src/backend/optimizer/prep/prepjointree.c index 62a16687963..b164866c729 100644 --- a/src/backend/optimizer/prep/prepjointree.c +++ b/src/backend/optimizer/prep/prepjointree.c @@ -1801,10 +1801,13 @@ pull_up_constant_function(PlannerInfo *root, Node *jtnode, /* * Convert the RTE to be RTE_RESULT type, signifying that we don't need to - * scan it anymore, and zero out RTE_FUNCTION-specific fields. + * scan it anymore, and zero out RTE_FUNCTION-specific fields. Also make + * sure the RTE is not marked LATERAL, since elsewhere we don't expect + * RTE_RESULTs to be LATERAL. */ rte->rtekind = RTE_RESULT; rte->functions = NIL; + rte->lateral = false; /* * We can reuse the RangeTblRef node. diff --git a/src/test/regress/expected/join.out b/src/test/regress/expected/join.out index fec0325e73e..19cd0569876 100644 --- a/src/test/regress/expected/join.out +++ b/src/test/regress/expected/join.out @@ -3469,6 +3469,14 @@ select unique1 from tenk1, lateral f_immutable_int4(1) x where x = unique1; Index Cond: (unique1 = 1) (2 rows) +explain (costs off) +select unique1 from tenk1, lateral f_immutable_int4(1) x where x in (select 17); + QUERY PLAN +-------------------------- + Result + One-Time Filter: false +(2 rows) + explain (costs off) select unique1, x from tenk1 join f_immutable_int4(1) x on unique1 = x; QUERY PLAN diff --git a/src/test/regress/sql/join.sql b/src/test/regress/sql/join.sql index 7f866c603b8..2a0e2d12d83 100644 --- a/src/test/regress/sql/join.sql +++ b/src/test/regress/sql/join.sql @@ -1113,6 +1113,9 @@ select unique1 from tenk1, f_immutable_int4(1) x where x = unique1; explain (costs off) select unique1 from tenk1, lateral f_immutable_int4(1) x where x = unique1; +explain (costs off) +select unique1 from tenk1, lateral f_immutable_int4(1) x where x in (select 17); + explain (costs off) select unique1, x from tenk1 join f_immutable_int4(1) x on unique1 = x; [parent: 5620ec83362d]