diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2021-07-09 13:38:24 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2021-07-09 13:38:24 -0400 |
commit | 9807b9aedc6e8b8a497db161b3d2d9f83648ea5b (patch) | |
tree | d2b1d162a20d8aee3874f9c6a14d0d931e1bb6cf /src | |
parent | 55cccdfdf1ee63fd8e818c2aa885f4d357773adc (diff) | |
download | postgresql-9807b9aedc6e8b8a497db161b3d2d9f83648ea5b.tar.gz postgresql-9807b9aedc6e8b8a497db161b3d2d9f83648ea5b.zip |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/optimizer/prep/prepjointree.c | 5 | ||||
-rw-r--r-- | src/test/regress/expected/join.out | 8 | ||||
-rw-r--r-- | src/test/regress/sql/join.sql | 3 |
3 files changed, 15 insertions, 1 deletions
diff --git a/src/backend/optimizer/prep/prepjointree.c b/src/backend/optimizer/prep/prepjointree.c index 9ff2b595a86..08a73fb9d86 100644 --- a/src/backend/optimizer/prep/prepjointree.c +++ b/src/backend/optimizer/prep/prepjointree.c @@ -1802,10 +1802,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 37ef22f3d5c..9b9fe11f278 100644 --- a/src/test/regress/expected/join.out +++ b/src/test/regress/expected/join.out @@ -3415,6 +3415,14 @@ select unique1 from tenk1, lateral f_immutable_int4(1) x where x = unique1; (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 88181848603..2fc4f030f7a 100644 --- a/src/test/regress/sql/join.sql +++ b/src/test/regress/sql/join.sql @@ -1100,6 +1100,9 @@ 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; explain (costs off) |