summaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2024-04-16 11:22:39 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2024-04-16 11:22:39 -0400
commitab2402268c04401533f163d959cdccd0e124f526 (patch)
treeb8a84c006548001f55334c949137f45e8f6b434c /src/test
parent6fa5e67e832bbab80ea7b936701e2c03c22fe059 (diff)
Fix generation of EC join conditions at the wrong plan level.
get_baserel_parampathinfo previously assumed without checking that the results of generate_join_implied_equalities "necessarily satisfy join_clause_is_movable_into". This turns out to be wrong in the presence of outer joins, because the generated clauses could include Vars that mustn't be evaluated below a relevant outer join. That led to applying clauses at the wrong plan level and possibly getting incorrect query results. We must check each clause's nullable_relids, and really the right thing to do is test join_clause_is_movable_into. However, trying to fix it that way exposes an oversight in equivclass.c: it wasn't careful about marking join clauses for appendrel children with the correct clause_relids. That caused the modified get_baserel_parampathinfo code to reject some clauses it still needs to accept. (See parallel commit for HEAD/v16 for more commentary about that.) Per bug #18429 from BenoƮt Ryder. This misbehavior existed for a long time before commit 2489d76c4, so patch v12-v15 this way. Discussion: https://postgr.es/m/18429-8982d4a348cc86c6@postgresql.org
Diffstat (limited to 'src/test')
-rw-r--r--src/test/regress/expected/join.out31
-rw-r--r--src/test/regress/sql/join.sql19
2 files changed, 50 insertions, 0 deletions
diff --git a/src/test/regress/expected/join.out b/src/test/regress/expected/join.out
index 8eaa964d462..2eca3782e60 100644
--- a/src/test/regress/expected/join.out
+++ b/src/test/regress/expected/join.out
@@ -5949,6 +5949,37 @@ select * from
3 | 3
(6 rows)
+-- check for generation of join EC conditions at wrong level (bug #18429)
+explain (costs off)
+select * from (
+ select arrayd.ad, coalesce(c.hundred, 0) as h
+ from unnest(array[1]) as arrayd(ad)
+ left join lateral (
+ select hundred from tenk1 where unique2 = arrayd.ad
+ ) c on true
+) c2
+where c2.h * c2.ad = c2.h * (c2.ad + 1);
+ QUERY PLAN
+-------------------------------------------------------------------------------------------------------
+ Nested Loop Left Join
+ Filter: ((COALESCE(tenk1.hundred, 0) * arrayd.ad) = (COALESCE(tenk1.hundred, 0) * (arrayd.ad + 1)))
+ -> Function Scan on unnest arrayd
+ -> Index Scan using tenk1_unique2 on tenk1
+ Index Cond: (unique2 = arrayd.ad)
+(5 rows)
+
+select * from (
+ select arrayd.ad, coalesce(c.hundred, 0) as h
+ from unnest(array[1]) as arrayd(ad)
+ left join lateral (
+ select hundred from tenk1 where unique2 = arrayd.ad
+ ) c on true
+) c2
+where c2.h * c2.ad = c2.h * (c2.ad + 1);
+ ad | h
+----+---
+(0 rows)
+
-- check the number of columns specified
SELECT * FROM (int8_tbl i cross join int4_tbl j) ss(a,b,c,d);
ERROR: join expression "ss" has 3 columns available but 4 columns specified
diff --git a/src/test/regress/sql/join.sql b/src/test/regress/sql/join.sql
index f8ed53fcc43..9d622d18a12 100644
--- a/src/test/regress/sql/join.sql
+++ b/src/test/regress/sql/join.sql
@@ -2029,6 +2029,25 @@ select * from
(select q1.v)
) as q2;
+-- check for generation of join EC conditions at wrong level (bug #18429)
+explain (costs off)
+select * from (
+ select arrayd.ad, coalesce(c.hundred, 0) as h
+ from unnest(array[1]) as arrayd(ad)
+ left join lateral (
+ select hundred from tenk1 where unique2 = arrayd.ad
+ ) c on true
+) c2
+where c2.h * c2.ad = c2.h * (c2.ad + 1);
+select * from (
+ select arrayd.ad, coalesce(c.hundred, 0) as h
+ from unnest(array[1]) as arrayd(ad)
+ left join lateral (
+ select hundred from tenk1 where unique2 = arrayd.ad
+ ) c on true
+) c2
+where c2.h * c2.ad = c2.h * (c2.ad + 1);
+
-- check the number of columns specified
SELECT * FROM (int8_tbl i cross join int4_tbl j) ss(a,b,c,d);