From 4c8f8cff42c00419a23ebfc3395ec150bb350d17 Mon Sep 17 00:00:00 2001 From: Corey Huinker Date: Thu, 9 May 2024 21:49:50 -0400 Subject: [PATCH v1] Regression tests for BUG #18429 Formalize the regression tests suggested in BUG #18429 (Inconsistent results on similar queries with join lateral). --- src/test/regress/expected/join.out | 80 ++++++++++++++++++++++++++++++ src/test/regress/sql/join.sql | 66 ++++++++++++++++++++++++ 2 files changed, 146 insertions(+) diff --git a/src/test/regress/expected/join.out b/src/test/regress/expected/join.out index 0246d56aea..9ad1238851 100644 --- a/src/test/regress/expected/join.out +++ b/src/test/regress/expected/join.out @@ -7924,3 +7924,83 @@ where exists (select 1 from j3 (13 rows) drop table j3; +-- Bug #18429 +-- Setup +create schema if not exists weird; +create table weird.t ( + wd int not null, + wt int not null, + primary key (wd, wt) +); +insert into weird.t values (4, 6); +-- Q1 +with c2 as ( + -- Return 1 row `(4, 6)` when fetched separately + select arrayd.ad d, coalesce(c.t, 0) t + from unnest(ARRAY[4]) as arrayd(ad) + left join lateral ( + select wt t from weird.t + where wd = arrayd.ad + order by wt desc limit 1 + ) c on true +) +-- `where` clause should return false: (14 - 6) / 4 = (12 - 6) / 4 → false +select 1 from c2 where (14 - c2.t) / c2.d = (12 - c2.t) / c2.d; + ?column? +---------- +(0 rows) + +-- Q2 (simplified sub-query) +with c2 as ( + select wd d, wt t from weird.t +) +select 1 from c2 where (14 - c2.t) / c2.d = (12 - c2.t) / c2.d; + ?column? +---------- +(0 rows) + +-- Q3 (sub-select instead of `with`) +select 1 from ( + select arrayd.ad d, coalesce(c.t, 0) t + from unnest(ARRAY[4]) as arrayd(ad) + left join lateral ( + select wt t from weird.t + where wd = arrayd.ad + order by wt desc limit 1 + ) c on true + ) c2 + where (14 - c2.t) / c2.d = (12 - c2.t) / c2.d; + ?column? +---------- +(0 rows) + +-- Q4 (remove `order by limit` from Q3) +select 1 from ( + select arrayd.ad d, coalesce(c.t, 0) t + from unnest(ARRAY[4]) as arrayd(ad) + left join lateral ( + select wt t from weird.t + where wd = arrayd.ad + ) c on true + ) c2 + where (14 - c2.t) / c2.d = (12 - c2.t) / c2.d; + ?column? +---------- +(0 rows) + +-- Q5 (remove `coalesce` from Q4) +select 1 from ( + select arrayd.ad d, c.t t + from unnest(ARRAY[4]) as arrayd(ad) + left join lateral ( + select wt t from weird.t + where wd = arrayd.ad + ) c on true + ) c2 + where (14 - c2.t) / c2.d = (12 - c2.t) / c2.d; + ?column? +---------- +(0 rows) + +drop table weird.t; +drop schema weird; diff --git a/src/test/regress/sql/join.sql b/src/test/regress/sql/join.sql index 923e7c5549..dd0e51b327 100644 --- a/src/test/regress/sql/join.sql +++ b/src/test/regress/sql/join.sql @@ -2904,3 +2904,69 @@ where exists (select 1 from j3 and t1.unique1 < 1; drop table j3; + +-- Bug #18429 +-- Setup +create schema if not exists weird; +create table weird.t ( + wd int not null, + wt int not null, + primary key (wd, wt) +); +insert into weird.t values (4, 6); + +-- Q1 +with c2 as ( + -- Return 1 row `(4, 6)` when fetched separately + select arrayd.ad d, coalesce(c.t, 0) t + from unnest(ARRAY[4]) as arrayd(ad) + left join lateral ( + select wt t from weird.t + where wd = arrayd.ad + order by wt desc limit 1 + ) c on true +) +-- `where` clause should return false: (14 - 6) / 4 = (12 - 6) / 4 → false +select 1 from c2 where (14 - c2.t) / c2.d = (12 - c2.t) / c2.d; + +-- Q2 (simplified sub-query) +with c2 as ( + select wd d, wt t from weird.t +) +select 1 from c2 where (14 - c2.t) / c2.d = (12 - c2.t) / c2.d; + +-- Q3 (sub-select instead of `with`) +select 1 from ( + select arrayd.ad d, coalesce(c.t, 0) t + from unnest(ARRAY[4]) as arrayd(ad) + left join lateral ( + select wt t from weird.t + where wd = arrayd.ad + order by wt desc limit 1 + ) c on true + ) c2 + where (14 - c2.t) / c2.d = (12 - c2.t) / c2.d; + +-- Q4 (remove `order by limit` from Q3) +select 1 from ( + select arrayd.ad d, coalesce(c.t, 0) t + from unnest(ARRAY[4]) as arrayd(ad) + left join lateral ( + select wt t from weird.t + where wd = arrayd.ad + ) c on true + ) c2 + where (14 - c2.t) / c2.d = (12 - c2.t) / c2.d; + +-- Q5 (remove `coalesce` from Q4) +select 1 from ( + select arrayd.ad d, c.t t + from unnest(ARRAY[4]) as arrayd(ad) + left join lateral ( + select wt t from weird.t + where wd = arrayd.ad + ) c on true + ) c2 + where (14 - c2.t) / c2.d = (12 - c2.t) / c2.d; +drop table weird.t; +drop schema weird; -- 2.45.0