]> granicus.if.org Git - postgresql/commitdiff
Add regression tests exercising the non-hashed code paths in nodeSetop.c.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 11 Aug 2017 20:52:12 +0000 (16:52 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 11 Aug 2017 21:28:01 +0000 (17:28 -0400)
Perusal of the code coverage report shows that the existing regression
test cases for INTERSECT and EXCEPT seemingly all prefer the SETOP_HASHED
implementation.  Add some test cases in which we force use of the
SETOP_SORTED mode.

src/test/regress/expected/union.out
src/test/regress/sql/union.sql

index 5c4edd1c16645b30daf530e8c8f05839dc46d2ee..ee26b163f7d5773bc5432ced99edfae200d9f2a0 100644 (file)
@@ -345,6 +345,96 @@ ERROR:  FOR NO KEY UPDATE is not allowed with UNION/INTERSECT/EXCEPT
         1 |        2 |        3
 (1 row)
 
+-- exercise both hashed and sorted implementations of INTERSECT/EXCEPT
+set enable_hashagg to on;
+explain (costs off)
+select count(*) from
+  ( select unique1 from tenk1 intersect select fivethous from tenk1 ) ss;
+                                     QUERY PLAN                                     
+------------------------------------------------------------------------------------
+ Aggregate
+   ->  Subquery Scan on ss
+         ->  HashSetOp Intersect
+               ->  Append
+                     ->  Subquery Scan on "*SELECT* 2"
+                           ->  Seq Scan on tenk1
+                     ->  Subquery Scan on "*SELECT* 1"
+                           ->  Index Only Scan using tenk1_unique1 on tenk1 tenk1_1
+(8 rows)
+
+select count(*) from
+  ( select unique1 from tenk1 intersect select fivethous from tenk1 ) ss;
+ count 
+-------
+  5000
+(1 row)
+
+explain (costs off)
+select unique1 from tenk1 except select unique2 from tenk1 where unique2 != 10;
+                               QUERY PLAN                               
+------------------------------------------------------------------------
+ HashSetOp Except
+   ->  Append
+         ->  Subquery Scan on "*SELECT* 1"
+               ->  Index Only Scan using tenk1_unique1 on tenk1
+         ->  Subquery Scan on "*SELECT* 2"
+               ->  Index Only Scan using tenk1_unique2 on tenk1 tenk1_1
+                     Filter: (unique2 <> 10)
+(7 rows)
+
+select unique1 from tenk1 except select unique2 from tenk1 where unique2 != 10;
+ unique1 
+---------
+      10
+(1 row)
+
+set enable_hashagg to off;
+explain (costs off)
+select count(*) from
+  ( select unique1 from tenk1 intersect select fivethous from tenk1 ) ss;
+                                        QUERY PLAN                                        
+------------------------------------------------------------------------------------------
+ Aggregate
+   ->  Subquery Scan on ss
+         ->  SetOp Intersect
+               ->  Sort
+                     Sort Key: "*SELECT* 2".fivethous
+                     ->  Append
+                           ->  Subquery Scan on "*SELECT* 2"
+                                 ->  Seq Scan on tenk1
+                           ->  Subquery Scan on "*SELECT* 1"
+                                 ->  Index Only Scan using tenk1_unique1 on tenk1 tenk1_1
+(10 rows)
+
+select count(*) from
+  ( select unique1 from tenk1 intersect select fivethous from tenk1 ) ss;
+ count 
+-------
+  5000
+(1 row)
+
+explain (costs off)
+select unique1 from tenk1 except select unique2 from tenk1 where unique2 != 10;
+                                  QUERY PLAN                                  
+------------------------------------------------------------------------------
+ SetOp Except
+   ->  Sort
+         Sort Key: "*SELECT* 1".unique1
+         ->  Append
+               ->  Subquery Scan on "*SELECT* 1"
+                     ->  Index Only Scan using tenk1_unique1 on tenk1
+               ->  Subquery Scan on "*SELECT* 2"
+                     ->  Index Only Scan using tenk1_unique2 on tenk1 tenk1_1
+                           Filter: (unique2 <> 10)
+(9 rows)
+
+select unique1 from tenk1 except select unique2 from tenk1 where unique2 != 10;
+ unique1 
+---------
+      10
+(1 row)
+
+reset enable_hashagg;
 --
 -- Mixed types
 --
index 5e0eff2ca301b8bfc1eadbdd185c0233782a61d6..c0317cccb4ba359463c1546800eaa04c28c43de8 100644 (file)
@@ -118,6 +118,34 @@ SELECT q1 FROM int8_tbl EXCEPT ALL SELECT q1 FROM int8_tbl FOR NO KEY UPDATE;
 (SELECT 1,2,3 UNION SELECT 4,5,6) EXCEPT SELECT 4,5,6;
 (SELECT 1,2,3 UNION SELECT 4,5,6 ORDER BY 1,2) EXCEPT SELECT 4,5,6;
 
+-- exercise both hashed and sorted implementations of INTERSECT/EXCEPT
+
+set enable_hashagg to on;
+
+explain (costs off)
+select count(*) from
+  ( select unique1 from tenk1 intersect select fivethous from tenk1 ) ss;
+select count(*) from
+  ( select unique1 from tenk1 intersect select fivethous from tenk1 ) ss;
+
+explain (costs off)
+select unique1 from tenk1 except select unique2 from tenk1 where unique2 != 10;
+select unique1 from tenk1 except select unique2 from tenk1 where unique2 != 10;
+
+set enable_hashagg to off;
+
+explain (costs off)
+select count(*) from
+  ( select unique1 from tenk1 intersect select fivethous from tenk1 ) ss;
+select count(*) from
+  ( select unique1 from tenk1 intersect select fivethous from tenk1 ) ss;
+
+explain (costs off)
+select unique1 from tenk1 except select unique2 from tenk1 where unique2 != 10;
+select unique1 from tenk1 except select unique2 from tenk1 where unique2 != 10;
+
+reset enable_hashagg;
+
 --
 -- Mixed types
 --