From 34787017912a7692d82bbc287ef42452ab30b254 Mon Sep 17 00:00:00 2001 From: Shihao Date: Sat, 3 Oct 2026 22:00:46 -0600 Subject: [PATCH v2 2/2] Add tests for setop Appends left with a single child Reported-by: Junwen AN --- src/test/regress/expected/union.out | 61 +++++++++++++++++++++++++++++ src/test/regress/sql/union.sql | 24 ++++++++++++ 2 files changed, 85 insertions(+) diff --git a/src/test/regress/expected/union.out b/src/test/regress/expected/union.out index 84abcd6b14f..ad2573b247b 100644 --- a/src/test/regress/expected/union.out +++ b/src/test/regress/expected/union.out @@ -1388,6 +1388,67 @@ SELECT ten FROM tenk1 dummy WHERE 1=2; Output: t2.four (11 rows) +-- Ensure the Append left with a single child after removing an empty input +-- doesn't use the child's pathkeys. +SET enable_hashagg = off; +EXPLAIN (COSTS OFF) +SELECT two FROM tenk1 WHERE two = 1 +INTERSECT ALL +SELECT four FROM tenk1 WHERE four = 1 +UNION ALL +SELECT ten FROM tenk1 WHERE 1=2; + QUERY PLAN +--------------------------------------- + SetOp Intersect All + -> Sort + Sort Key: tenk1.two + -> Seq Scan on tenk1 + Filter: (two = 1) + -> Sort + Sort Key: tenk1_1.four + -> Seq Scan on tenk1 tenk1_1 + Filter: (four = 1) +(9 rows) + +EXPLAIN (COSTS OFF) +(SELECT two FROM tenk1 WHERE two = 1 + INTERSECT + SELECT four FROM tenk1 WHERE four = 1) +EXCEPT ALL +SELECT ten FROM tenk1 WHERE 1=2; + QUERY PLAN +--------------------------------------- + SetOp Intersect + -> Sort + Sort Key: tenk1.two + -> Seq Scan on tenk1 + Filter: (two = 1) + -> Sort + Sort Key: tenk1_1.four + -> Seq Scan on tenk1 tenk1_1 + Filter: (four = 1) +(9 rows) + +-- As above, but the child's output needs a type coercion +EXPLAIN (COSTS OFF) +(SELECT two FROM tenk1 UNION SELECT four FROM tenk1) +UNION ALL +SELECT ten::numeric FROM tenk1 WHERE 1=2; + QUERY PLAN +--------------------------------------------------- + Result + -> Unique + -> Merge Append + Sort Key: tenk1.two + -> Sort + Sort Key: tenk1.two + -> Seq Scan on tenk1 + -> Sort + Sort Key: tenk1_1.four + -> Seq Scan on tenk1 tenk1_1 +(10 rows) + +RESET enable_hashagg; -- Test constraint exclusion of UNION ALL subqueries explain (costs off) SELECT * FROM diff --git a/src/test/regress/sql/union.sql b/src/test/regress/sql/union.sql index c8de276c2b5..8a0d32e5400 100644 --- a/src/test/regress/sql/union.sql +++ b/src/test/regress/sql/union.sql @@ -531,6 +531,30 @@ SELECT four FROM tenk1 t2 UNION SELECT ten FROM tenk1 dummy WHERE 1=2; +-- Ensure the Append left with a single child after removing an empty input +-- doesn't use the child's pathkeys. +SET enable_hashagg = off; +EXPLAIN (COSTS OFF) +SELECT two FROM tenk1 WHERE two = 1 +INTERSECT ALL +SELECT four FROM tenk1 WHERE four = 1 +UNION ALL +SELECT ten FROM tenk1 WHERE 1=2; + +EXPLAIN (COSTS OFF) +(SELECT two FROM tenk1 WHERE two = 1 + INTERSECT + SELECT four FROM tenk1 WHERE four = 1) +EXCEPT ALL +SELECT ten FROM tenk1 WHERE 1=2; + +-- As above, but the child's output needs a type coercion +EXPLAIN (COSTS OFF) +(SELECT two FROM tenk1 UNION SELECT four FROM tenk1) +UNION ALL +SELECT ten::numeric FROM tenk1 WHERE 1=2; +RESET enable_hashagg; + -- Test constraint exclusion of UNION ALL subqueries explain (costs off) SELECT * FROM -- 2.37.1 (Apple Git-137.1)