mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-10-02 19:26:51 +02:00
20ab467d76
during parse analysis, not only errors detected in the flex/bison stages. This is per my earlier proposal. This commit includes all the basic infrastructure, but locations are only tracked and reported for errors involving column references, function calls, and operators. More could be done later but this seems like a good set to start with. I've also moved the ReportSyntaxErrorPosition logic out of psql and into libpq, which should make it available to more people --- even within psql this is an improvement because warnings weren't handled by ReportSyntaxErrorPosition.
431 lines
7.6 KiB
Plaintext
431 lines
7.6 KiB
Plaintext
--
|
|
-- UNION (also INTERSECT, EXCEPT)
|
|
--
|
|
-- Simple UNION constructs
|
|
SELECT 1 AS two UNION SELECT 2;
|
|
two
|
|
-----
|
|
1
|
|
2
|
|
(2 rows)
|
|
|
|
SELECT 1 AS one UNION SELECT 1;
|
|
one
|
|
-----
|
|
1
|
|
(1 row)
|
|
|
|
SELECT 1 AS two UNION ALL SELECT 2;
|
|
two
|
|
-----
|
|
1
|
|
2
|
|
(2 rows)
|
|
|
|
SELECT 1 AS two UNION ALL SELECT 1;
|
|
two
|
|
-----
|
|
1
|
|
1
|
|
(2 rows)
|
|
|
|
SELECT 1 AS three UNION SELECT 2 UNION SELECT 3;
|
|
three
|
|
-------
|
|
1
|
|
2
|
|
3
|
|
(3 rows)
|
|
|
|
SELECT 1 AS two UNION SELECT 2 UNION SELECT 2;
|
|
two
|
|
-----
|
|
1
|
|
2
|
|
(2 rows)
|
|
|
|
SELECT 1 AS three UNION SELECT 2 UNION ALL SELECT 2;
|
|
three
|
|
-------
|
|
1
|
|
2
|
|
2
|
|
(3 rows)
|
|
|
|
SELECT 1.1 AS two UNION SELECT 2.2;
|
|
two
|
|
-----
|
|
1.1
|
|
2.2
|
|
(2 rows)
|
|
|
|
-- Mixed types
|
|
SELECT 1.1 AS two UNION SELECT 2;
|
|
two
|
|
-----
|
|
1.1
|
|
2
|
|
(2 rows)
|
|
|
|
SELECT 1 AS two UNION SELECT 2.2;
|
|
two
|
|
-----
|
|
1
|
|
2.2
|
|
(2 rows)
|
|
|
|
SELECT 1 AS one UNION SELECT 1.0::float8;
|
|
one
|
|
-----
|
|
1
|
|
(1 row)
|
|
|
|
SELECT 1.1 AS two UNION ALL SELECT 2;
|
|
two
|
|
-----
|
|
1.1
|
|
2
|
|
(2 rows)
|
|
|
|
SELECT 1.0::float8 AS two UNION ALL SELECT 1;
|
|
two
|
|
-----
|
|
1
|
|
1
|
|
(2 rows)
|
|
|
|
SELECT 1.1 AS three UNION SELECT 2 UNION SELECT 3;
|
|
three
|
|
-------
|
|
1.1
|
|
2
|
|
3
|
|
(3 rows)
|
|
|
|
SELECT 1.1::float8 AS two UNION SELECT 2 UNION SELECT 2.0::float8;
|
|
two
|
|
-----
|
|
1.1
|
|
2
|
|
(2 rows)
|
|
|
|
SELECT 1.1 AS three UNION SELECT 2 UNION ALL SELECT 2;
|
|
three
|
|
-------
|
|
1.1
|
|
2
|
|
2
|
|
(3 rows)
|
|
|
|
SELECT 1.1 AS two UNION (SELECT 2 UNION ALL SELECT 2);
|
|
two
|
|
-----
|
|
1.1
|
|
2
|
|
(2 rows)
|
|
|
|
--
|
|
-- Try testing from tables...
|
|
--
|
|
SELECT f1 AS five FROM FLOAT8_TBL
|
|
UNION
|
|
SELECT f1 FROM FLOAT8_TBL;
|
|
five
|
|
-----------------------
|
|
-1.2345678901234e+200
|
|
-1004.3
|
|
-34.84
|
|
-1.2345678901234e-200
|
|
0
|
|
(5 rows)
|
|
|
|
SELECT f1 AS ten FROM FLOAT8_TBL
|
|
UNION ALL
|
|
SELECT f1 FROM FLOAT8_TBL;
|
|
ten
|
|
-----------------------
|
|
0
|
|
-34.84
|
|
-1004.3
|
|
-1.2345678901234e+200
|
|
-1.2345678901234e-200
|
|
0
|
|
-34.84
|
|
-1004.3
|
|
-1.2345678901234e+200
|
|
-1.2345678901234e-200
|
|
(10 rows)
|
|
|
|
SELECT f1 AS nine FROM FLOAT8_TBL
|
|
UNION
|
|
SELECT f1 FROM INT4_TBL;
|
|
nine
|
|
-----------------------
|
|
-1.2345678901234e+200
|
|
-2147483647
|
|
-123456
|
|
-1004.3
|
|
-34.84
|
|
-1.2345678901234e-200
|
|
0
|
|
123456
|
|
2147483647
|
|
(9 rows)
|
|
|
|
SELECT f1 AS ten FROM FLOAT8_TBL
|
|
UNION ALL
|
|
SELECT f1 FROM INT4_TBL;
|
|
ten
|
|
-----------------------
|
|
0
|
|
-34.84
|
|
-1004.3
|
|
-1.2345678901234e+200
|
|
-1.2345678901234e-200
|
|
0
|
|
123456
|
|
-123456
|
|
2147483647
|
|
-2147483647
|
|
(10 rows)
|
|
|
|
SELECT f1 AS five FROM FLOAT8_TBL
|
|
WHERE f1 BETWEEN -1e6 AND 1e6
|
|
UNION
|
|
SELECT f1 FROM INT4_TBL
|
|
WHERE f1 BETWEEN 0 AND 1000000;
|
|
five
|
|
-----------------------
|
|
-1004.3
|
|
-34.84
|
|
-1.2345678901234e-200
|
|
0
|
|
123456
|
|
(5 rows)
|
|
|
|
SELECT CAST(f1 AS char(4)) AS three FROM VARCHAR_TBL
|
|
UNION
|
|
SELECT f1 FROM CHAR_TBL;
|
|
three
|
|
-------
|
|
a
|
|
ab
|
|
abcd
|
|
(3 rows)
|
|
|
|
SELECT f1 AS three FROM VARCHAR_TBL
|
|
UNION
|
|
SELECT CAST(f1 AS varchar) FROM CHAR_TBL;
|
|
three
|
|
-------
|
|
a
|
|
ab
|
|
abcd
|
|
(3 rows)
|
|
|
|
SELECT f1 AS eight FROM VARCHAR_TBL
|
|
UNION ALL
|
|
SELECT f1 FROM CHAR_TBL;
|
|
eight
|
|
-------
|
|
a
|
|
ab
|
|
abcd
|
|
abcd
|
|
a
|
|
ab
|
|
abcd
|
|
abcd
|
|
(8 rows)
|
|
|
|
SELECT f1 AS five FROM TEXT_TBL
|
|
UNION
|
|
SELECT f1 FROM VARCHAR_TBL
|
|
UNION
|
|
SELECT TRIM(TRAILING FROM f1) FROM CHAR_TBL;
|
|
five
|
|
-------------------
|
|
a
|
|
ab
|
|
abcd
|
|
doh!
|
|
hi de ho neighbor
|
|
(5 rows)
|
|
|
|
--
|
|
-- INTERSECT and EXCEPT
|
|
--
|
|
SELECT q2 FROM int8_tbl INTERSECT SELECT q1 FROM int8_tbl;
|
|
q2
|
|
------------------
|
|
123
|
|
4567890123456789
|
|
(2 rows)
|
|
|
|
SELECT q2 FROM int8_tbl INTERSECT ALL SELECT q1 FROM int8_tbl;
|
|
q2
|
|
------------------
|
|
123
|
|
4567890123456789
|
|
4567890123456789
|
|
(3 rows)
|
|
|
|
SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl;
|
|
q2
|
|
-------------------
|
|
-4567890123456789
|
|
456
|
|
(2 rows)
|
|
|
|
SELECT q2 FROM int8_tbl EXCEPT ALL SELECT q1 FROM int8_tbl;
|
|
q2
|
|
-------------------
|
|
-4567890123456789
|
|
456
|
|
(2 rows)
|
|
|
|
SELECT q2 FROM int8_tbl EXCEPT ALL SELECT DISTINCT q1 FROM int8_tbl;
|
|
q2
|
|
-------------------
|
|
-4567890123456789
|
|
456
|
|
4567890123456789
|
|
(3 rows)
|
|
|
|
SELECT q1 FROM int8_tbl EXCEPT SELECT q2 FROM int8_tbl;
|
|
q1
|
|
----
|
|
(0 rows)
|
|
|
|
SELECT q1 FROM int8_tbl EXCEPT ALL SELECT q2 FROM int8_tbl;
|
|
q1
|
|
------------------
|
|
123
|
|
4567890123456789
|
|
(2 rows)
|
|
|
|
SELECT q1 FROM int8_tbl EXCEPT ALL SELECT DISTINCT q2 FROM int8_tbl;
|
|
q1
|
|
------------------
|
|
123
|
|
4567890123456789
|
|
4567890123456789
|
|
(3 rows)
|
|
|
|
--
|
|
-- Mixed types
|
|
--
|
|
SELECT f1 FROM float8_tbl INTERSECT SELECT f1 FROM int4_tbl;
|
|
f1
|
|
----
|
|
0
|
|
(1 row)
|
|
|
|
SELECT f1 FROM float8_tbl EXCEPT SELECT f1 FROM int4_tbl;
|
|
f1
|
|
-----------------------
|
|
-1.2345678901234e+200
|
|
-1004.3
|
|
-34.84
|
|
-1.2345678901234e-200
|
|
(4 rows)
|
|
|
|
--
|
|
-- Operator precedence and (((((extra))))) parentheses
|
|
--
|
|
SELECT q1 FROM int8_tbl INTERSECT SELECT q2 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl;
|
|
q1
|
|
-------------------
|
|
123
|
|
4567890123456789
|
|
456
|
|
4567890123456789
|
|
123
|
|
4567890123456789
|
|
-4567890123456789
|
|
(7 rows)
|
|
|
|
SELECT q1 FROM int8_tbl INTERSECT (((SELECT q2 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl)));
|
|
q1
|
|
------------------
|
|
123
|
|
4567890123456789
|
|
(2 rows)
|
|
|
|
(((SELECT q1 FROM int8_tbl INTERSECT SELECT q2 FROM int8_tbl))) UNION ALL SELECT q2 FROM int8_tbl;
|
|
q1
|
|
-------------------
|
|
123
|
|
4567890123456789
|
|
456
|
|
4567890123456789
|
|
123
|
|
4567890123456789
|
|
-4567890123456789
|
|
(7 rows)
|
|
|
|
SELECT q1 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl;
|
|
q1
|
|
-------------------
|
|
-4567890123456789
|
|
456
|
|
(2 rows)
|
|
|
|
SELECT q1 FROM int8_tbl UNION ALL (((SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl)));
|
|
q1
|
|
-------------------
|
|
123
|
|
123
|
|
4567890123456789
|
|
4567890123456789
|
|
4567890123456789
|
|
-4567890123456789
|
|
456
|
|
(7 rows)
|
|
|
|
(((SELECT q1 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl))) EXCEPT SELECT q1 FROM int8_tbl;
|
|
q1
|
|
-------------------
|
|
-4567890123456789
|
|
456
|
|
(2 rows)
|
|
|
|
--
|
|
-- Subqueries with ORDER BY & LIMIT clauses
|
|
--
|
|
-- In this syntax, ORDER BY/LIMIT apply to the result of the EXCEPT
|
|
SELECT q1,q2 FROM int8_tbl EXCEPT SELECT q2,q1 FROM int8_tbl
|
|
ORDER BY q2,q1;
|
|
q1 | q2
|
|
------------------+-------------------
|
|
4567890123456789 | -4567890123456789
|
|
123 | 456
|
|
(2 rows)
|
|
|
|
-- This should fail, because q2 isn't a name of an EXCEPT output column
|
|
SELECT q1 FROM int8_tbl EXCEPT SELECT q2 FROM int8_tbl ORDER BY q2 LIMIT 1;
|
|
ERROR: column "q2" does not exist
|
|
LINE 1: ... int8_tbl EXCEPT SELECT q2 FROM int8_tbl ORDER BY q2 LIMIT 1...
|
|
^
|
|
-- But this should work:
|
|
SELECT q1 FROM int8_tbl EXCEPT (((SELECT q2 FROM int8_tbl ORDER BY q2 LIMIT 1)));
|
|
q1
|
|
------------------
|
|
123
|
|
4567890123456789
|
|
(2 rows)
|
|
|
|
--
|
|
-- New syntaxes (7.1) permit new tests
|
|
--
|
|
(((((select * from int8_tbl)))));
|
|
q1 | q2
|
|
------------------+-------------------
|
|
123 | 456
|
|
123 | 4567890123456789
|
|
4567890123456789 | 123
|
|
4567890123456789 | 4567890123456789
|
|
4567890123456789 | -4567890123456789
|
|
(5 rows)
|
|
|