postgres.git / summary / log / commit / refs
commit 9807b9aedc6e8b8a497db161b3d2d9f83648ea5b
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 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
@@ -3414,6 +3414,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 88181848603..2fc4f030f7a 100644
--- a/src/test/regress/sql/join.sql
+++ b/src/test/regress/sql/join.sql
@@ -1099,6 +1099,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: 55cccdfdf1ee]