Make regression tests less dependent on hash table order.

Upcoming changes to the hash table code used, among others, for grouping
and set operations will change the output order for a few queries. To
make it less likely that actual bugs are hidden between regression test
ordering changes, and to make the tests robust against platform
dependant ordering, add ORDER BYs guaranteeing the output order.

As it's possible that some of the changes expose platform dependant
ordering, push this earlier, to let the buildfarm shake out potentially
unstable results.

Discussion: <20160727004333.r3e2k2y6fvk2ntup@alap3.anarazel.de>
This commit is contained in:
Andres Freund 2016-10-10 13:41:57 -07:00
parent 886f6c5ccd
commit 0137caf273
10 changed files with 125 additions and 111 deletions

View File

@ -33,7 +33,7 @@ SELECT relispopulated FROM pg_class WHERE oid = 'mvtest_tm'::regclass;
f f
(1 row) (1 row)
SELECT * FROM mvtest_tm; SELECT * FROM mvtest_tm ORDER BY type;
ERROR: materialized view "mvtest_tm" has not been populated ERROR: materialized view "mvtest_tm" has not been populated
HINT: Use the REFRESH MATERIALIZED VIEW command. HINT: Use the REFRESH MATERIALIZED VIEW command.
REFRESH MATERIALIZED VIEW mvtest_tm; REFRESH MATERIALIZED VIEW mvtest_tm;
@ -44,12 +44,12 @@ SELECT relispopulated FROM pg_class WHERE oid = 'mvtest_tm'::regclass;
(1 row) (1 row)
CREATE UNIQUE INDEX mvtest_tm_type ON mvtest_tm (type); CREATE UNIQUE INDEX mvtest_tm_type ON mvtest_tm (type);
SELECT * FROM mvtest_tm; SELECT * FROM mvtest_tm ORDER BY type;
type | totamt type | totamt
------+-------- ------+--------
x | 5
y | 12 y | 12
z | 11 z | 11
x | 5
(3 rows) (3 rows)
-- create various views -- create various views

View File

@ -123,7 +123,7 @@ unicode_header_linestyle single
prepare q as select array_to_string(array_agg(repeat('x',2*n)),E'\n') as "ab prepare q as select array_to_string(array_agg(repeat('x',2*n)),E'\n') as "ab
c", array_to_string(array_agg(repeat('y',20-2*n)),E'\n') as "a c", array_to_string(array_agg(repeat('y',20-2*n)),E'\n') as "a
bc" from generate_series(1,10) as n(n) group by n>1 ; bc" from generate_series(1,10) as n(n) group by n>1 order by n>1;
\pset linestyle ascii \pset linestyle ascii
\pset expanded off \pset expanded off
\pset columns 40 \pset columns 40

View File

@ -187,15 +187,15 @@ SELECT SUM(count(*)) OVER(PARTITION BY generate_series(1,3) ORDER BY generate_se
(3 rows) (3 rows)
-- sorting + grouping -- sorting + grouping
SELECT few.dataa, count(*), min(id), max(id), generate_series(1,3) FROM few GROUP BY few.dataa ORDER BY 5; SELECT few.dataa, count(*), min(id), max(id), generate_series(1,3) FROM few GROUP BY few.dataa ORDER BY 5, 1;
dataa | count | min | max | generate_series dataa | count | min | max | generate_series
-------+-------+-----+-----+----------------- -------+-------+-----+-----+-----------------
b | 1 | 3 | 3 | 1
a | 2 | 1 | 2 | 1 a | 2 | 1 | 2 | 1
b | 1 | 3 | 3 | 2 b | 1 | 3 | 3 | 1
a | 2 | 1 | 2 | 2 a | 2 | 1 | 2 | 2
b | 1 | 3 | 3 | 3 b | 1 | 3 | 3 | 2
a | 2 | 1 | 2 | 3 a | 2 | 1 | 2 | 3
b | 1 | 3 | 3 | 3
(6 rows) (6 rows)
-- grouping sets are a bit special, they produce NULLs in columns not actually NULL -- grouping sets are a bit special, they produce NULLs in columns not actually NULL

View File

@ -2,14 +2,14 @@
-- UNION (also INTERSECT, EXCEPT) -- UNION (also INTERSECT, EXCEPT)
-- --
-- Simple UNION constructs -- Simple UNION constructs
SELECT 1 AS two UNION SELECT 2; SELECT 1 AS two UNION SELECT 2 ORDER BY 1;
two two
----- -----
1 1
2 2
(2 rows) (2 rows)
SELECT 1 AS one UNION SELECT 1; SELECT 1 AS one UNION SELECT 1 ORDER BY 1;
one one
----- -----
1 1
@ -29,7 +29,7 @@ SELECT 1 AS two UNION ALL SELECT 1;
1 1
(2 rows) (2 rows)
SELECT 1 AS three UNION SELECT 2 UNION SELECT 3; SELECT 1 AS three UNION SELECT 2 UNION SELECT 3 ORDER BY 1;
three three
------- -------
1 1
@ -37,14 +37,14 @@ SELECT 1 AS three UNION SELECT 2 UNION SELECT 3;
3 3
(3 rows) (3 rows)
SELECT 1 AS two UNION SELECT 2 UNION SELECT 2; SELECT 1 AS two UNION SELECT 2 UNION SELECT 2 ORDER BY 1;
two two
----- -----
1 1
2 2
(2 rows) (2 rows)
SELECT 1 AS three UNION SELECT 2 UNION ALL SELECT 2; SELECT 1 AS three UNION SELECT 2 UNION ALL SELECT 2 ORDER BY 1;
three three
------- -------
1 1
@ -52,7 +52,7 @@ SELECT 1 AS three UNION SELECT 2 UNION ALL SELECT 2;
2 2
(3 rows) (3 rows)
SELECT 1.1 AS two UNION SELECT 2.2; SELECT 1.1 AS two UNION SELECT 2.2 ORDER BY 1;
two two
----- -----
1.1 1.1
@ -60,41 +60,41 @@ SELECT 1.1 AS two UNION SELECT 2.2;
(2 rows) (2 rows)
-- Mixed types -- Mixed types
SELECT 1.1 AS two UNION SELECT 2; SELECT 1.1 AS two UNION SELECT 2 ORDER BY 1;
two two
----- -----
1.1 1.1
2 2
(2 rows) (2 rows)
SELECT 1 AS two UNION SELECT 2.2; SELECT 1 AS two UNION SELECT 2.2 ORDER BY 1;
two two
----- -----
1 1
2.2 2.2
(2 rows) (2 rows)
SELECT 1 AS one UNION SELECT 1.0::float8; SELECT 1 AS one UNION SELECT 1.0::float8 ORDER BY 1;
one one
----- -----
1 1
(1 row) (1 row)
SELECT 1.1 AS two UNION ALL SELECT 2; SELECT 1.1 AS two UNION ALL SELECT 2 ORDER BY 1;
two two
----- -----
1.1 1.1
2 2
(2 rows) (2 rows)
SELECT 1.0::float8 AS two UNION ALL SELECT 1; SELECT 1.0::float8 AS two UNION ALL SELECT 1 ORDER BY 1;
two two
----- -----
1 1
1 1
(2 rows) (2 rows)
SELECT 1.1 AS three UNION SELECT 2 UNION SELECT 3; SELECT 1.1 AS three UNION SELECT 2 UNION SELECT 3 ORDER BY 1;
three three
------- -------
1.1 1.1
@ -109,7 +109,7 @@ SELECT 1.1::float8 AS two UNION SELECT 2 UNION SELECT 2.0::float8 ORDER BY 1;
2 2
(2 rows) (2 rows)
SELECT 1.1 AS three UNION SELECT 2 UNION ALL SELECT 2; SELECT 1.1 AS three UNION SELECT 2 UNION ALL SELECT 2 ORDER BY 1;
three three
------- -------
1.1 1.1
@ -117,7 +117,7 @@ SELECT 1.1 AS three UNION SELECT 2 UNION ALL SELECT 2;
2 2
(3 rows) (3 rows)
SELECT 1.1 AS two UNION (SELECT 2 UNION ALL SELECT 2); SELECT 1.1 AS two UNION (SELECT 2 UNION ALL SELECT 2) ORDER BY 1;
two two
----- -----
1.1 1.1
@ -195,7 +195,8 @@ SELECT f1 AS five FROM FLOAT8_TBL
WHERE f1 BETWEEN -1e6 AND 1e6 WHERE f1 BETWEEN -1e6 AND 1e6
UNION UNION
SELECT f1 FROM INT4_TBL SELECT f1 FROM INT4_TBL
WHERE f1 BETWEEN 0 AND 1000000; WHERE f1 BETWEEN 0 AND 1000000
ORDER BY 1;
five five
----------------------- -----------------------
-1004.3 -1004.3
@ -260,19 +261,19 @@ ORDER BY 1;
-- --
-- INTERSECT and EXCEPT -- INTERSECT and EXCEPT
-- --
SELECT q2 FROM int8_tbl INTERSECT SELECT q1 FROM int8_tbl; SELECT q2 FROM int8_tbl INTERSECT SELECT q1 FROM int8_tbl ORDER BY 1;
q2 q2
------------------ ------------------
4567890123456789
123 123
4567890123456789
(2 rows) (2 rows)
SELECT q2 FROM int8_tbl INTERSECT ALL SELECT q1 FROM int8_tbl; SELECT q2 FROM int8_tbl INTERSECT ALL SELECT q1 FROM int8_tbl ORDER BY 1;
q2 q2
------------------ ------------------
4567890123456789
4567890123456789
123 123
4567890123456789
4567890123456789
(3 rows) (3 rows)
SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl ORDER BY 1; SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl ORDER BY 1;
@ -297,24 +298,24 @@ SELECT q2 FROM int8_tbl EXCEPT ALL SELECT DISTINCT q1 FROM int8_tbl ORDER BY 1;
4567890123456789 4567890123456789
(3 rows) (3 rows)
SELECT q1 FROM int8_tbl EXCEPT SELECT q2 FROM int8_tbl; SELECT q1 FROM int8_tbl EXCEPT SELECT q2 FROM int8_tbl ORDER BY 1;
q1 q1
---- ----
(0 rows) (0 rows)
SELECT q1 FROM int8_tbl EXCEPT ALL SELECT q2 FROM int8_tbl; SELECT q1 FROM int8_tbl EXCEPT ALL SELECT q2 FROM int8_tbl ORDER BY 1;
q1 q1
------------------ ------------------
4567890123456789
123 123
4567890123456789
(2 rows) (2 rows)
SELECT q1 FROM int8_tbl EXCEPT ALL SELECT DISTINCT q2 FROM int8_tbl; SELECT q1 FROM int8_tbl EXCEPT ALL SELECT DISTINCT q2 FROM int8_tbl ORDER BY 1;
q1 q1
------------------ ------------------
4567890123456789
4567890123456789
123 123
4567890123456789
4567890123456789
(3 rows) (3 rows)
SELECT q1 FROM int8_tbl EXCEPT ALL SELECT q1 FROM int8_tbl FOR NO KEY UPDATE; SELECT q1 FROM int8_tbl EXCEPT ALL SELECT q1 FROM int8_tbl FOR NO KEY UPDATE;
@ -322,7 +323,7 @@ ERROR: FOR NO KEY UPDATE is not allowed with UNION/INTERSECT/EXCEPT
-- --
-- Mixed types -- Mixed types
-- --
SELECT f1 FROM float8_tbl INTERSECT SELECT f1 FROM int4_tbl; SELECT f1 FROM float8_tbl INTERSECT SELECT f1 FROM int4_tbl ORDER BY 1;
f1 f1
---- ----
0 0
@ -340,30 +341,30 @@ SELECT f1 FROM float8_tbl EXCEPT SELECT f1 FROM int4_tbl ORDER BY 1;
-- --
-- Operator precedence and (((((extra))))) parentheses -- Operator precedence and (((((extra))))) parentheses
-- --
SELECT q1 FROM int8_tbl INTERSECT SELECT q2 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl; SELECT q1 FROM int8_tbl INTERSECT SELECT q2 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl ORDER BY 1;
q1 q1
------------------- -------------------
4567890123456789 -4567890123456789
123
123 123
456 456
4567890123456789 4567890123456789
123
4567890123456789 4567890123456789
-4567890123456789 4567890123456789
(7 rows) (7 rows)
SELECT q1 FROM int8_tbl INTERSECT (((SELECT q2 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl))); SELECT q1 FROM int8_tbl INTERSECT (((SELECT q2 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl))) ORDER BY 1;
q1 q1
------------------ ------------------
4567890123456789
123 123
4567890123456789
(2 rows) (2 rows)
(((SELECT q1 FROM int8_tbl INTERSECT SELECT q2 FROM int8_tbl))) UNION ALL SELECT q2 FROM int8_tbl; (((SELECT q1 FROM int8_tbl INTERSECT SELECT q2 FROM int8_tbl ORDER BY 1))) UNION ALL SELECT q2 FROM int8_tbl;
q1 q1
------------------- -------------------
4567890123456789
123 123
4567890123456789
456 456
4567890123456789 4567890123456789
123 123
@ -416,11 +417,11 @@ LINE 1: ... int8_tbl EXCEPT SELECT q2 FROM int8_tbl ORDER BY q2 LIMIT 1...
^ ^
HINT: There is a column named "q2" in table "*SELECT* 2", but it cannot be referenced from this part of the query. HINT: There is a column named "q2" in table "*SELECT* 2", but it cannot be referenced from this part of the query.
-- But this should work: -- But this should work:
SELECT q1 FROM int8_tbl EXCEPT (((SELECT q2 FROM int8_tbl ORDER BY q2 LIMIT 1))); SELECT q1 FROM int8_tbl EXCEPT (((SELECT q2 FROM int8_tbl ORDER BY q2 LIMIT 1))) ORDER BY 1;
q1 q1
------------------ ------------------
4567890123456789
123 123
4567890123456789
(2 rows) (2 rows)
-- --
@ -593,23 +594,27 @@ SELECT * FROM
(SELECT 1 AS t, 2 AS x (SELECT 1 AS t, 2 AS x
UNION UNION
SELECT 2 AS t, 4 AS x) ss SELECT 2 AS t, 4 AS x) ss
WHERE x < 4; WHERE x < 4
QUERY PLAN ORDER BY x;
-------------------------------------------- QUERY PLAN
Unique --------------------------------------------------
-> Sort Sort
Sort Key: (1), (2) Sort Key: (2)
-> Append -> Unique
-> Result -> Sort
-> Result Sort Key: (1), (2)
One-Time Filter: false -> Append
(7 rows) -> Result
-> Result
One-Time Filter: false
(9 rows)
SELECT * FROM SELECT * FROM
(SELECT 1 AS t, 2 AS x (SELECT 1 AS t, 2 AS x
UNION UNION
SELECT 2 AS t, 4 AS x) ss SELECT 2 AS t, 4 AS x) ss
WHERE x < 4; WHERE x < 4
ORDER BY x;
t | x t | x
---+--- ---+---
1 | 2 1 | 2
@ -653,24 +658,28 @@ SELECT * FROM
(SELECT 1 AS t, (random()*3)::int AS x (SELECT 1 AS t, (random()*3)::int AS x
UNION UNION
SELECT 2 AS t, 4 AS x) ss SELECT 2 AS t, 4 AS x) ss
WHERE x > 3; WHERE x > 3
QUERY PLAN ORDER BY x;
------------------------------------------------------------------------------ QUERY PLAN
Subquery Scan on ss ------------------------------------------------------------------------------------
Filter: (ss.x > 3) Sort
-> Unique Sort Key: ss.x
-> Sort -> Subquery Scan on ss
Sort Key: (1), (((random() * '3'::double precision))::integer) Filter: (ss.x > 3)
-> Append -> Unique
-> Result -> Sort
-> Result Sort Key: (1), (((random() * '3'::double precision))::integer)
(8 rows) -> Append
-> Result
-> Result
(10 rows)
SELECT * FROM SELECT * FROM
(SELECT 1 AS t, (random()*3)::int AS x (SELECT 1 AS t, (random()*3)::int AS x
UNION UNION
SELECT 2 AS t, 4 AS x) ss SELECT 2 AS t, 4 AS x) ss
WHERE x > 3; WHERE x > 3
ORDER BY x;
t | x t | x
---+--- ---+---
2 | 4 2 | 4

View File

@ -1244,7 +1244,7 @@ WITH outermost(x) AS (
SELECT * FROM innermost SELECT * FROM innermost
UNION SELECT 3) UNION SELECT 3)
) )
SELECT * FROM outermost; SELECT * FROM outermost ORDER BY 1;
x x
--- ---
1 1
@ -1258,7 +1258,7 @@ WITH outermost(x) AS (
SELECT * FROM outermost -- fail SELECT * FROM outermost -- fail
UNION SELECT * FROM innermost) UNION SELECT * FROM innermost)
) )
SELECT * FROM outermost; SELECT * FROM outermost ORDER BY 1;
ERROR: relation "outermost" does not exist ERROR: relation "outermost" does not exist
LINE 4: SELECT * FROM outermost LINE 4: SELECT * FROM outermost
^ ^
@ -1270,7 +1270,7 @@ WITH RECURSIVE outermost(x) AS (
SELECT * FROM outermost SELECT * FROM outermost
UNION SELECT * FROM innermost) UNION SELECT * FROM innermost)
) )
SELECT * FROM outermost; SELECT * FROM outermost ORDER BY 1;
x x
--- ---
1 1
@ -1282,7 +1282,7 @@ WITH RECURSIVE outermost(x) AS (
SELECT * FROM innermost SELECT * FROM innermost
UNION SELECT * from outermost UNION SELECT * from outermost
) )
SELECT * FROM outermost; SELECT * FROM outermost ORDER BY 1;
ERROR: recursive reference to query "outermost" must not appear within a subquery ERROR: recursive reference to query "outermost" must not appear within a subquery
LINE 2: WITH innermost as (SELECT 2 FROM outermost) LINE 2: WITH innermost as (SELECT 2 FROM outermost)
^ ^

View File

@ -16,11 +16,11 @@ EXPLAIN (costs off)
CREATE MATERIALIZED VIEW mvtest_tm AS SELECT type, sum(amt) AS totamt FROM mvtest_t GROUP BY type WITH NO DATA; CREATE MATERIALIZED VIEW mvtest_tm AS SELECT type, sum(amt) AS totamt FROM mvtest_t GROUP BY type WITH NO DATA;
CREATE MATERIALIZED VIEW mvtest_tm AS SELECT type, sum(amt) AS totamt FROM mvtest_t GROUP BY type WITH NO DATA; CREATE MATERIALIZED VIEW mvtest_tm AS SELECT type, sum(amt) AS totamt FROM mvtest_t GROUP BY type WITH NO DATA;
SELECT relispopulated FROM pg_class WHERE oid = 'mvtest_tm'::regclass; SELECT relispopulated FROM pg_class WHERE oid = 'mvtest_tm'::regclass;
SELECT * FROM mvtest_tm; SELECT * FROM mvtest_tm ORDER BY type;
REFRESH MATERIALIZED VIEW mvtest_tm; REFRESH MATERIALIZED VIEW mvtest_tm;
SELECT relispopulated FROM pg_class WHERE oid = 'mvtest_tm'::regclass; SELECT relispopulated FROM pg_class WHERE oid = 'mvtest_tm'::regclass;
CREATE UNIQUE INDEX mvtest_tm_type ON mvtest_tm (type); CREATE UNIQUE INDEX mvtest_tm_type ON mvtest_tm (type);
SELECT * FROM mvtest_tm; SELECT * FROM mvtest_tm ORDER BY type;
-- create various views -- create various views
EXPLAIN (costs off) EXPLAIN (costs off)

View File

@ -67,7 +67,7 @@ select 'drop table gexec_test', 'select ''2000-01-01''::date as party_over'
prepare q as select array_to_string(array_agg(repeat('x',2*n)),E'\n') as "ab prepare q as select array_to_string(array_agg(repeat('x',2*n)),E'\n') as "ab
c", array_to_string(array_agg(repeat('y',20-2*n)),E'\n') as "a c", array_to_string(array_agg(repeat('y',20-2*n)),E'\n') as "a
bc" from generate_series(1,10) as n(n) group by n>1 ; bc" from generate_series(1,10) as n(n) group by n>1 order by n>1;
\pset linestyle ascii \pset linestyle ascii

View File

@ -56,7 +56,7 @@ SELECT id,lag(id) OVER(), count(*) OVER(), generate_series(1,3) FROM few;
SELECT SUM(count(*)) OVER(PARTITION BY generate_series(1,3) ORDER BY generate_series(1,3)), generate_series(1,3) g FROM few GROUP BY g; SELECT SUM(count(*)) OVER(PARTITION BY generate_series(1,3) ORDER BY generate_series(1,3)), generate_series(1,3) g FROM few GROUP BY g;
-- sorting + grouping -- sorting + grouping
SELECT few.dataa, count(*), min(id), max(id), generate_series(1,3) FROM few GROUP BY few.dataa ORDER BY 5; SELECT few.dataa, count(*), min(id), max(id), generate_series(1,3) FROM few GROUP BY few.dataa ORDER BY 5, 1;
-- grouping sets are a bit special, they produce NULLs in columns not actually NULL -- grouping sets are a bit special, they produce NULLs in columns not actually NULL
SELECT dataa, datab b, generate_series(1,2) g, count(*) FROM few GROUP BY CUBE(dataa, datab); SELECT dataa, datab b, generate_series(1,2) g, count(*) FROM few GROUP BY CUBE(dataa, datab);

View File

@ -4,41 +4,41 @@
-- Simple UNION constructs -- Simple UNION constructs
SELECT 1 AS two UNION SELECT 2; SELECT 1 AS two UNION SELECT 2 ORDER BY 1;
SELECT 1 AS one UNION SELECT 1; SELECT 1 AS one UNION SELECT 1 ORDER BY 1;
SELECT 1 AS two UNION ALL SELECT 2; SELECT 1 AS two UNION ALL SELECT 2;
SELECT 1 AS two UNION ALL SELECT 1; SELECT 1 AS two UNION ALL SELECT 1;
SELECT 1 AS three UNION SELECT 2 UNION SELECT 3; SELECT 1 AS three UNION SELECT 2 UNION SELECT 3 ORDER BY 1;
SELECT 1 AS two UNION SELECT 2 UNION SELECT 2; SELECT 1 AS two UNION SELECT 2 UNION SELECT 2 ORDER BY 1;
SELECT 1 AS three UNION SELECT 2 UNION ALL SELECT 2; SELECT 1 AS three UNION SELECT 2 UNION ALL SELECT 2 ORDER BY 1;
SELECT 1.1 AS two UNION SELECT 2.2; SELECT 1.1 AS two UNION SELECT 2.2 ORDER BY 1;
-- Mixed types -- Mixed types
SELECT 1.1 AS two UNION SELECT 2; SELECT 1.1 AS two UNION SELECT 2 ORDER BY 1;
SELECT 1 AS two UNION SELECT 2.2; SELECT 1 AS two UNION SELECT 2.2 ORDER BY 1;
SELECT 1 AS one UNION SELECT 1.0::float8; SELECT 1 AS one UNION SELECT 1.0::float8 ORDER BY 1;
SELECT 1.1 AS two UNION ALL SELECT 2; SELECT 1.1 AS two UNION ALL SELECT 2 ORDER BY 1;
SELECT 1.0::float8 AS two UNION ALL SELECT 1; SELECT 1.0::float8 AS two UNION ALL SELECT 1 ORDER BY 1;
SELECT 1.1 AS three UNION SELECT 2 UNION SELECT 3; SELECT 1.1 AS three UNION SELECT 2 UNION SELECT 3 ORDER BY 1;
SELECT 1.1::float8 AS two UNION SELECT 2 UNION SELECT 2.0::float8 ORDER BY 1; SELECT 1.1::float8 AS two UNION SELECT 2 UNION SELECT 2.0::float8 ORDER BY 1;
SELECT 1.1 AS three UNION SELECT 2 UNION ALL SELECT 2; SELECT 1.1 AS three UNION SELECT 2 UNION ALL SELECT 2 ORDER BY 1;
SELECT 1.1 AS two UNION (SELECT 2 UNION ALL SELECT 2); SELECT 1.1 AS two UNION (SELECT 2 UNION ALL SELECT 2) ORDER BY 1;
-- --
-- Try testing from tables... -- Try testing from tables...
@ -66,7 +66,8 @@ SELECT f1 AS five FROM FLOAT8_TBL
WHERE f1 BETWEEN -1e6 AND 1e6 WHERE f1 BETWEEN -1e6 AND 1e6
UNION UNION
SELECT f1 FROM INT4_TBL SELECT f1 FROM INT4_TBL
WHERE f1 BETWEEN 0 AND 1000000; WHERE f1 BETWEEN 0 AND 1000000
ORDER BY 1;
SELECT CAST(f1 AS char(4)) AS three FROM VARCHAR_TBL SELECT CAST(f1 AS char(4)) AS three FROM VARCHAR_TBL
UNION UNION
@ -93,9 +94,9 @@ ORDER BY 1;
-- INTERSECT and EXCEPT -- INTERSECT and EXCEPT
-- --
SELECT q2 FROM int8_tbl INTERSECT SELECT q1 FROM int8_tbl; SELECT q2 FROM int8_tbl INTERSECT SELECT q1 FROM int8_tbl ORDER BY 1;
SELECT q2 FROM int8_tbl INTERSECT ALL SELECT q1 FROM int8_tbl; SELECT q2 FROM int8_tbl INTERSECT ALL SELECT q1 FROM int8_tbl ORDER BY 1;
SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl ORDER BY 1; SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl ORDER BY 1;
@ -103,11 +104,11 @@ SELECT q2 FROM int8_tbl EXCEPT ALL SELECT q1 FROM int8_tbl ORDER BY 1;
SELECT q2 FROM int8_tbl EXCEPT ALL SELECT DISTINCT q1 FROM int8_tbl ORDER BY 1; SELECT q2 FROM int8_tbl EXCEPT ALL SELECT DISTINCT q1 FROM int8_tbl ORDER BY 1;
SELECT q1 FROM int8_tbl EXCEPT SELECT q2 FROM int8_tbl; SELECT q1 FROM int8_tbl EXCEPT SELECT q2 FROM int8_tbl ORDER BY 1;
SELECT q1 FROM int8_tbl EXCEPT ALL SELECT q2 FROM int8_tbl; SELECT q1 FROM int8_tbl EXCEPT ALL SELECT q2 FROM int8_tbl ORDER BY 1;
SELECT q1 FROM int8_tbl EXCEPT ALL SELECT DISTINCT q2 FROM int8_tbl; SELECT q1 FROM int8_tbl EXCEPT ALL SELECT DISTINCT q2 FROM int8_tbl ORDER BY 1;
SELECT q1 FROM int8_tbl EXCEPT ALL SELECT q1 FROM int8_tbl FOR NO KEY UPDATE; SELECT q1 FROM int8_tbl EXCEPT ALL SELECT q1 FROM int8_tbl FOR NO KEY UPDATE;
@ -115,7 +116,7 @@ SELECT q1 FROM int8_tbl EXCEPT ALL SELECT q1 FROM int8_tbl FOR NO KEY UPDATE;
-- Mixed types -- Mixed types
-- --
SELECT f1 FROM float8_tbl INTERSECT SELECT f1 FROM int4_tbl; SELECT f1 FROM float8_tbl INTERSECT SELECT f1 FROM int4_tbl ORDER BY 1;
SELECT f1 FROM float8_tbl EXCEPT SELECT f1 FROM int4_tbl ORDER BY 1; SELECT f1 FROM float8_tbl EXCEPT SELECT f1 FROM int4_tbl ORDER BY 1;
@ -123,11 +124,11 @@ SELECT f1 FROM float8_tbl EXCEPT SELECT f1 FROM int4_tbl ORDER BY 1;
-- Operator precedence and (((((extra))))) parentheses -- Operator precedence and (((((extra))))) parentheses
-- --
SELECT q1 FROM int8_tbl INTERSECT SELECT q2 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl; SELECT q1 FROM int8_tbl INTERSECT SELECT q2 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl ORDER BY 1;
SELECT q1 FROM int8_tbl INTERSECT (((SELECT q2 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl))); SELECT q1 FROM int8_tbl INTERSECT (((SELECT q2 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl))) ORDER BY 1;
(((SELECT q1 FROM int8_tbl INTERSECT SELECT q2 FROM int8_tbl))) UNION ALL SELECT q2 FROM int8_tbl; (((SELECT q1 FROM int8_tbl INTERSECT SELECT q2 FROM int8_tbl ORDER BY 1))) UNION ALL SELECT q2 FROM int8_tbl;
SELECT q1 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl ORDER BY 1; SELECT q1 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl ORDER BY 1;
@ -147,7 +148,7 @@ ORDER BY q2,q1;
SELECT q1 FROM int8_tbl EXCEPT SELECT q2 FROM int8_tbl ORDER BY q2 LIMIT 1; SELECT q1 FROM int8_tbl EXCEPT SELECT q2 FROM int8_tbl ORDER BY q2 LIMIT 1;
-- But this should work: -- But this should work:
SELECT q1 FROM int8_tbl EXCEPT (((SELECT q2 FROM int8_tbl ORDER BY q2 LIMIT 1))); SELECT q1 FROM int8_tbl EXCEPT (((SELECT q2 FROM int8_tbl ORDER BY q2 LIMIT 1))) ORDER BY 1;
-- --
-- New syntaxes (7.1) permit new tests -- New syntaxes (7.1) permit new tests
@ -261,13 +262,15 @@ SELECT * FROM
(SELECT 1 AS t, 2 AS x (SELECT 1 AS t, 2 AS x
UNION UNION
SELECT 2 AS t, 4 AS x) ss SELECT 2 AS t, 4 AS x) ss
WHERE x < 4; WHERE x < 4
ORDER BY x;
SELECT * FROM SELECT * FROM
(SELECT 1 AS t, 2 AS x (SELECT 1 AS t, 2 AS x
UNION UNION
SELECT 2 AS t, 4 AS x) ss SELECT 2 AS t, 4 AS x) ss
WHERE x < 4; WHERE x < 4
ORDER BY x;
explain (costs off) explain (costs off)
SELECT * FROM SELECT * FROM
@ -289,13 +292,15 @@ SELECT * FROM
(SELECT 1 AS t, (random()*3)::int AS x (SELECT 1 AS t, (random()*3)::int AS x
UNION UNION
SELECT 2 AS t, 4 AS x) ss SELECT 2 AS t, 4 AS x) ss
WHERE x > 3; WHERE x > 3
ORDER BY x;
SELECT * FROM SELECT * FROM
(SELECT 1 AS t, (random()*3)::int AS x (SELECT 1 AS t, (random()*3)::int AS x
UNION UNION
SELECT 2 AS t, 4 AS x) ss SELECT 2 AS t, 4 AS x) ss
WHERE x > 3; WHERE x > 3
ORDER BY x;
-- Test proper handling of parameterized appendrel paths when the -- Test proper handling of parameterized appendrel paths when the
-- potential join qual is expensive -- potential join qual is expensive

View File

@ -575,7 +575,7 @@ WITH outermost(x) AS (
SELECT * FROM innermost SELECT * FROM innermost
UNION SELECT 3) UNION SELECT 3)
) )
SELECT * FROM outermost; SELECT * FROM outermost ORDER BY 1;
WITH outermost(x) AS ( WITH outermost(x) AS (
SELECT 1 SELECT 1
@ -583,7 +583,7 @@ WITH outermost(x) AS (
SELECT * FROM outermost -- fail SELECT * FROM outermost -- fail
UNION SELECT * FROM innermost) UNION SELECT * FROM innermost)
) )
SELECT * FROM outermost; SELECT * FROM outermost ORDER BY 1;
WITH RECURSIVE outermost(x) AS ( WITH RECURSIVE outermost(x) AS (
SELECT 1 SELECT 1
@ -591,14 +591,14 @@ WITH RECURSIVE outermost(x) AS (
SELECT * FROM outermost SELECT * FROM outermost
UNION SELECT * FROM innermost) UNION SELECT * FROM innermost)
) )
SELECT * FROM outermost; SELECT * FROM outermost ORDER BY 1;
WITH RECURSIVE outermost(x) AS ( WITH RECURSIVE outermost(x) AS (
WITH innermost as (SELECT 2 FROM outermost) -- fail WITH innermost as (SELECT 2 FROM outermost) -- fail
SELECT * FROM innermost SELECT * FROM innermost
UNION SELECT * from outermost UNION SELECT * from outermost
) )
SELECT * FROM outermost; SELECT * FROM outermost ORDER BY 1;
-- --
-- This test will fail with the old implementation of PARAM_EXEC parameter -- This test will fail with the old implementation of PARAM_EXEC parameter