Commit 92c8437d authored by Thomas G. Lockhart's avatar Thomas G. Lockhart

Update "join syntax" test for new capabilities.

parent ebd697a3
...@@ -2,12 +2,12 @@ ...@@ -2,12 +2,12 @@
-- JOIN -- JOIN
-- Test join clauses -- Test join clauses
-- --
CREATE TABLE JOIN1_TBL ( CREATE TABLE J1_TBL (
i integer, i integer,
j integer, j integer,
t text t text
); );
CREATE TABLE JOIN2_TBL ( CREATE TABLE J2_TBL (
i integer, i integer,
k integer k integer
); );
...@@ -20,21 +20,99 @@ CREATE TABLE JOIN4_TBL ( ...@@ -20,21 +20,99 @@ CREATE TABLE JOIN4_TBL (
k integer, k integer,
z integer z integer
); );
INSERT INTO JOIN1_TBL VALUES (1, 3, 'one'); INSERT INTO J1_TBL VALUES (1, 3, 'one');
INSERT INTO JOIN1_TBL VALUES (2, 2, 'two'); INSERT INTO J1_TBL VALUES (2, 2, 'two');
INSERT INTO JOIN1_TBL VALUES (3, 1, 'three'); INSERT INTO J1_TBL VALUES (3, 1, 'three');
INSERT INTO JOIN1_TBL VALUES (4, 0, 'four'); INSERT INTO J1_TBL VALUES (4, 0, 'four');
INSERT INTO JOIN2_TBL VALUES (1, -1); INSERT INTO J2_TBL VALUES (1, -1);
INSERT INTO JOIN2_TBL VALUES (2, 2); INSERT INTO J2_TBL VALUES (2, 2);
INSERT INTO JOIN2_TBL VALUES (3, -3); INSERT INTO J2_TBL VALUES (3, -3);
INSERT INTO JOIN2_TBL VALUES (2, 4); INSERT INTO J2_TBL VALUES (2, 4);
--
-- CORRELATION NAMES
-- Make sure that table/column aliases are supported
-- before diving into more complex join syntax.
--
SELECT '' AS "xxx", *
FROM J1_TBL AS tx;
xxx | i | j | t
-----+---+---+-------
| 1 | 3 | one
| 2 | 2 | two
| 3 | 1 | three
| 4 | 0 | four
(4 rows)
SELECT '' AS "xxx", *
FROM J1_TBL tx;
xxx | i | j | t
-----+---+---+-------
| 1 | 3 | one
| 2 | 2 | two
| 3 | 1 | three
| 4 | 0 | four
(4 rows)
SELECT '' AS "xxx", *
FROM J1_TBL AS t1 (a, b, c);
xxx | a | b | c
-----+---+---+-------
| 1 | 3 | one
| 2 | 2 | two
| 3 | 1 | three
| 4 | 0 | four
(4 rows)
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c);
xxx | a | b | c
-----+---+---+-------
| 1 | 3 | one
| 2 | 2 | two
| 3 | 1 | three
| 4 | 0 | four
(4 rows)
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c), J2_TBL t2 (d, e);
xxx | a | b | c | d | e
-----+---+---+-------+---+----
| 1 | 3 | one | 1 | -1
| 2 | 2 | two | 1 | -1
| 3 | 1 | three | 1 | -1
| 4 | 0 | four | 1 | -1
| 1 | 3 | one | 2 | 2
| 2 | 2 | two | 2 | 2
| 3 | 1 | three | 2 | 2
| 4 | 0 | four | 2 | 2
| 1 | 3 | one | 3 | -3
| 2 | 2 | two | 3 | -3
| 3 | 1 | three | 3 | -3
| 4 | 0 | four | 3 | -3
| 1 | 3 | one | 2 | 4
| 2 | 2 | two | 2 | 4
| 3 | 1 | three | 2 | 4
| 4 | 0 | four | 2 | 4
(16 rows)
SELECT '' AS "xxx", t1.a, t2.e
FROM J1_TBL t1 (a, b, c), J2_TBL t2 (d, e)
WHERE t1.a = t2.d;
xxx | a | e
-----+---+----
| 1 | -1
| 2 | 2
| 2 | 4
| 3 | -3
(4 rows)
-- --
-- CROSS JOIN -- CROSS JOIN
-- Qualifications are not allowed on cross joins, -- Qualifications are not allowed on cross joins,
-- which degenerate into a standard unqualified inner join. -- which degenerate into a standard unqualified inner join.
-- --
SELECT '' AS "xxx", * SELECT '' AS "xxx", *
FROM JOIN1_TBL CROSS JOIN JOIN2_TBL; FROM J1_TBL CROSS JOIN J2_TBL;
xxx | i | j | t | i | k xxx | i | j | t | i | k
-----+---+---+-------+---+---- -----+---+---+-------+---+----
| 1 | 3 | one | 1 | -1 | 1 | 3 | one | 1 | -1
...@@ -55,15 +133,41 @@ SELECT '' AS "xxx", * ...@@ -55,15 +133,41 @@ SELECT '' AS "xxx", *
| 4 | 0 | four | 2 | 4 | 4 | 0 | four | 2 | 4
(16 rows) (16 rows)
-- ambiguous column
SELECT '' AS "xxx", i, k, t SELECT '' AS "xxx", i, k, t
FROM JOIN1_TBL CROSS JOIN JOIN2_TBL; FROM J1_TBL CROSS JOIN J2_TBL;
ERROR: Column 'i' is ambiguous ERROR: Column 'i' is ambiguous
-- resolve previous ambiguity by specifying the table name
SELECT '' AS "xxx", t1.i, k, t
FROM J1_TBL t1 CROSS JOIN J2_TBL t2;
xxx | i | k | t
-----+---+----+-------
| 1 | -1 | one
| 2 | -1 | two
| 3 | -1 | three
| 4 | -1 | four
| 1 | 2 | one
| 2 | 2 | two
| 3 | 2 | three
| 4 | 2 | four
| 1 | -3 | one
| 2 | -3 | two
| 3 | -3 | three
| 4 | -3 | four
| 1 | 4 | one
| 2 | 4 | two
| 3 | 4 | three
| 4 | 4 | four
(16 rows)
SELECT '' AS "xxx", ii, tt, kk SELECT '' AS "xxx", ii, tt, kk
FROM JOIN1_TBL CROSS JOIN JOIN2_TBL AS JT (ii, jj, tt, ii2, kk); FROM (J1_TBL CROSS JOIN J2_TBL)
ERROR: parser: parse error at or near "(" AS tx (ii, jj, tt, ii2, kk);
SELECT '' AS "xxx", jt.ii, jt.jj, jt.kk ERROR: JOIN table aliases are not supported
FROM JOIN1_TBL CROSS JOIN JOIN2_TBL AS JT (ii, jj, tt, ii2, kk); SELECT '' AS "xxx", tx.ii, tx.jj, tx.kk
ERROR: parser: parse error at or near "(" FROM (J1_TBL t1 (a, b, c) CROSS JOIN J2_TBL t2 (d, e))
AS tx (ii, jj, tt, ii2, kk);
ERROR: JOIN table aliases are not supported
-- --
-- --
-- Inner joins (equi-joins) -- Inner joins (equi-joins)
...@@ -74,29 +178,108 @@ ERROR: parser: parse error at or near "(" ...@@ -74,29 +178,108 @@ ERROR: parser: parse error at or near "("
-- The USING syntax changes the shape of the resulting table -- The USING syntax changes the shape of the resulting table
-- by including a column in the USING clause only once in the result. -- by including a column in the USING clause only once in the result.
-- --
-- Inner equi-join on all columns with the same name
SELECT '' AS "xxx", *
FROM JOIN1_TBL NATURAL JOIN JOIN2_TBL;
ERROR: JOIN expressions are not yet implemented
-- Inner equi-join on specified column -- Inner equi-join on specified column
SELECT '' AS "xxx", * SELECT '' AS "xxx", *
FROM JOIN1_TBL INNER JOIN JOIN2_TBL USING (i); FROM J1_TBL INNER JOIN J2_TBL USING (i);
ERROR: JOIN expressions are not yet implemented xxx | i | j | t | k
-----+---+---+-------+----
| 1 | 3 | one | -1
| 2 | 2 | two | 2
| 2 | 2 | two | 4
| 3 | 1 | three | -3
(4 rows)
-- Same as above, slightly different syntax -- Same as above, slightly different syntax
SELECT '' AS "xxx", * SELECT '' AS "xxx", *
FROM JOIN1_TBL JOIN JOIN2_TBL USING (i); FROM J1_TBL JOIN J2_TBL USING (i);
ERROR: JOIN expressions are not yet implemented xxx | i | j | t | k
-----+---+---+-------+----
| 1 | 3 | one | -1
| 2 | 2 | two | 2
| 2 | 2 | two | 4
| 3 | 1 | three | -3
(4 rows)
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c) JOIN J2_TBL t2 (a, d) USING (a);
xxx | a | b | c | d
-----+---+---+-------+----
| 1 | 3 | one | -1
| 2 | 2 | two | 2
| 2 | 2 | two | 4
| 3 | 1 | three | -3
(4 rows)
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c) JOIN J2_TBL t2 (a, b) USING (b);
xxx | b | a | c | a
-----+---+---+-----+---
| 2 | 2 | two | 2
(1 row)
--
-- NATURAL JOIN
-- Inner equi-join on all columns with the same name
--
SELECT '' AS "xxx", *
FROM J1_TBL NATURAL JOIN J2_TBL;
xxx | i | j | t | k
-----+---+---+-------+----
| 1 | 3 | one | -1
| 2 | 2 | two | 2
| 2 | 2 | two | 4
| 3 | 1 | three | -3
(4 rows)
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (a, d);
xxx | a | b | c | d
-----+---+---+-------+----
| 1 | 3 | one | -1
| 2 | 2 | two | 2
| 2 | 2 | two | 4
| 3 | 1 | three | -3
(4 rows)
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (d, a);
xxx | a | b | c | d
-----+---+---+------+---
| 2 | 2 | two | 2
| 4 | 0 | four | 2
(2 rows)
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (d, a);
xxx | a | b | c | d
-----+---+---+------+---
| 2 | 2 | two | 2
| 4 | 0 | four | 2
(2 rows)
-- mismatch number of columns
-- currently, Postgres will fill in with underlying names
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b) NATURAL JOIN J2_TBL t2 (a);
xxx | a | b | t | k
-----+---+---+-------+----
| 1 | 3 | one | -1
| 2 | 2 | two | 2
| 2 | 2 | two | 4
| 3 | 1 | three | -3
(4 rows)
-- --
-- Inner joins (equi-joins) -- Inner joins (equi-joins)
-- --
SELECT '' AS "xxx", * SELECT '' AS "xxx", *
FROM JOIN1_TBL JOIN JOIN2_TBL ON (JOIN1_TBL.i = JOIN2_TBL.i); FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.i);
ERROR: JOIN expressions are not yet implemented ERROR: transformExpr: does not know how to transform node 501 (internal error)
SELECT '' AS "xxx", * SELECT '' AS "xxx", *
FROM JOIN1_TBL JOIN JOIN2_TBL ON (JOIN1_TBL.i = JOIN2_TBL.k); FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.k);
ERROR: JOIN expressions are not yet implemented ERROR: transformExpr: does not know how to transform node 501 (internal error)
SELECT '' AS "xxx", * SELECT '' AS "xxx", *
FROM JOIN1_TBL CROSS JOIN JOIN2_TBL; FROM J1_TBL CROSS JOIN J2_TBL;
xxx | i | j | t | i | k xxx | i | j | t | i | k
-----+---+---+-------+---+---- -----+---+---+-------+---+----
| 1 | 3 | one | 1 | -1 | 1 | 3 | one | 1 | -1
...@@ -121,32 +304,28 @@ SELECT '' AS "xxx", * ...@@ -121,32 +304,28 @@ SELECT '' AS "xxx", *
-- Non-equi-joins -- Non-equi-joins
-- --
SELECT '' AS "xxx", * SELECT '' AS "xxx", *
FROM JOIN1_TBL JOIN JOIN2_TBL ON (JOIN1_TBL.i <= JOIN2_TBL.k); FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i <= J2_TBL.k);
ERROR: JOIN expressions are not yet implemented ERROR: transformExpr: does not know how to transform node 501 (internal error)
-- --
-- Outer joins -- Outer joins
-- --
SELECT '' AS "xxx", * SELECT '' AS "xxx", *
FROM JOIN1_TBL OUTER JOIN JOIN2_TBL USING (i); FROM J1_TBL OUTER JOIN J2_TBL USING (i);
NOTICE: OUTER JOIN not yet implemented ERROR: OUTER JOIN is not yet supported
ERROR: JOIN expressions are not yet implemented
SELECT '' AS "xxx", * SELECT '' AS "xxx", *
FROM JOIN1_TBL LEFT OUTER JOIN JOIN2_TBL USING (i); FROM J1_TBL LEFT OUTER JOIN J2_TBL USING (i);
NOTICE: LEFT OUTER JOIN not yet implemented ERROR: OUTER JOIN is not yet supported
ERROR: JOIN expressions are not yet implemented
SELECT '' AS "xxx", * SELECT '' AS "xxx", *
FROM JOIN1_TBL RIGHT OUTER JOIN JOIN2_TBL USING (i); FROM J1_TBL RIGHT OUTER JOIN J2_TBL USING (i);
NOTICE: RIGHT OUTER JOIN not yet implemented ERROR: OUTER JOIN is not yet supported
ERROR: JOIN expressions are not yet implemented
SELECT '' AS "xxx", * SELECT '' AS "xxx", *
FROM JOIN1_TBL FULL OUTER JOIN JOIN2_TBL USING (i); FROM J1_TBL FULL OUTER JOIN J2_TBL USING (i);
NOTICE: FULL OUTER JOIN not yet implemented ERROR: OUTER JOIN is not yet supported
ERROR: JOIN expressions are not yet implemented
-- --
-- More complicated constructs -- More complicated constructs
-- --
-- --
-- Clean up -- Clean up
-- --
DROP TABLE JOIN1_TBL; DROP TABLE J1_TBL;
DROP TABLE JOIN2_TBL; DROP TABLE J2_TBL;
...@@ -3,13 +3,13 @@ ...@@ -3,13 +3,13 @@
-- Test join clauses -- Test join clauses
-- --
CREATE TABLE JOIN1_TBL ( CREATE TABLE J1_TBL (
i integer, i integer,
j integer, j integer,
t text t text
); );
CREATE TABLE JOIN2_TBL ( CREATE TABLE J2_TBL (
i integer, i integer,
k integer k integer
); );
...@@ -25,15 +25,40 @@ CREATE TABLE JOIN4_TBL ( ...@@ -25,15 +25,40 @@ CREATE TABLE JOIN4_TBL (
z integer z integer
); );
INSERT INTO JOIN1_TBL VALUES (1, 3, 'one'); INSERT INTO J1_TBL VALUES (1, 3, 'one');
INSERT INTO JOIN1_TBL VALUES (2, 2, 'two'); INSERT INTO J1_TBL VALUES (2, 2, 'two');
INSERT INTO JOIN1_TBL VALUES (3, 1, 'three'); INSERT INTO J1_TBL VALUES (3, 1, 'three');
INSERT INTO JOIN1_TBL VALUES (4, 0, 'four'); INSERT INTO J1_TBL VALUES (4, 0, 'four');
INSERT INTO JOIN2_TBL VALUES (1, -1); INSERT INTO J2_TBL VALUES (1, -1);
INSERT INTO JOIN2_TBL VALUES (2, 2); INSERT INTO J2_TBL VALUES (2, 2);
INSERT INTO JOIN2_TBL VALUES (3, -3); INSERT INTO J2_TBL VALUES (3, -3);
INSERT INTO JOIN2_TBL VALUES (2, 4); INSERT INTO J2_TBL VALUES (2, 4);
--
-- CORRELATION NAMES
-- Make sure that table/column aliases are supported
-- before diving into more complex join syntax.
--
SELECT '' AS "xxx", *
FROM J1_TBL AS tx;
SELECT '' AS "xxx", *
FROM J1_TBL tx;
SELECT '' AS "xxx", *
FROM J1_TBL AS t1 (a, b, c);
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c);
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c), J2_TBL t2 (d, e);
SELECT '' AS "xxx", t1.a, t2.e
FROM J1_TBL t1 (a, b, c), J2_TBL t2 (d, e)
WHERE t1.a = t2.d;
-- --
...@@ -43,16 +68,23 @@ INSERT INTO JOIN2_TBL VALUES (2, 4); ...@@ -43,16 +68,23 @@ INSERT INTO JOIN2_TBL VALUES (2, 4);
-- --
SELECT '' AS "xxx", * SELECT '' AS "xxx", *
FROM JOIN1_TBL CROSS JOIN JOIN2_TBL; FROM J1_TBL CROSS JOIN J2_TBL;
-- ambiguous column
SELECT '' AS "xxx", i, k, t SELECT '' AS "xxx", i, k, t
FROM JOIN1_TBL CROSS JOIN JOIN2_TBL; FROM J1_TBL CROSS JOIN J2_TBL;
-- resolve previous ambiguity by specifying the table name
SELECT '' AS "xxx", t1.i, k, t
FROM J1_TBL t1 CROSS JOIN J2_TBL t2;
SELECT '' AS "xxx", ii, tt, kk SELECT '' AS "xxx", ii, tt, kk
FROM JOIN1_TBL CROSS JOIN JOIN2_TBL AS JT (ii, jj, tt, ii2, kk); FROM (J1_TBL CROSS JOIN J2_TBL)
AS tx (ii, jj, tt, ii2, kk);
SELECT '' AS "xxx", jt.ii, jt.jj, jt.kk SELECT '' AS "xxx", tx.ii, tx.jj, tx.kk
FROM JOIN1_TBL CROSS JOIN JOIN2_TBL AS JT (ii, jj, tt, ii2, kk); FROM (J1_TBL t1 (a, b, c) CROSS JOIN J2_TBL t2 (d, e))
AS tx (ii, jj, tt, ii2, kk);
-- --
...@@ -67,17 +99,42 @@ SELECT '' AS "xxx", jt.ii, jt.jj, jt.kk ...@@ -67,17 +99,42 @@ SELECT '' AS "xxx", jt.ii, jt.jj, jt.kk
-- by including a column in the USING clause only once in the result. -- by including a column in the USING clause only once in the result.
-- --
-- Inner equi-join on specified column
SELECT '' AS "xxx", *
FROM J1_TBL INNER JOIN J2_TBL USING (i);
-- Same as above, slightly different syntax
SELECT '' AS "xxx", *
FROM J1_TBL JOIN J2_TBL USING (i);
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c) JOIN J2_TBL t2 (a, d) USING (a);
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c) JOIN J2_TBL t2 (a, b) USING (b);
--
-- NATURAL JOIN
-- Inner equi-join on all columns with the same name -- Inner equi-join on all columns with the same name
--
SELECT '' AS "xxx", * SELECT '' AS "xxx", *
FROM JOIN1_TBL NATURAL JOIN JOIN2_TBL; FROM J1_TBL NATURAL JOIN J2_TBL;
-- Inner equi-join on specified column
SELECT '' AS "xxx", * SELECT '' AS "xxx", *
FROM JOIN1_TBL INNER JOIN JOIN2_TBL USING (i); FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (a, d);
-- Same as above, slightly different syntax
SELECT '' AS "xxx", * SELECT '' AS "xxx", *
FROM JOIN1_TBL JOIN JOIN2_TBL USING (i); FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (d, a);
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (d, a);
-- mismatch number of columns
-- currently, Postgres will fill in with underlying names
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b) NATURAL JOIN J2_TBL t2 (a);
-- --
...@@ -85,13 +142,13 @@ SELECT '' AS "xxx", * ...@@ -85,13 +142,13 @@ SELECT '' AS "xxx", *
-- --
SELECT '' AS "xxx", * SELECT '' AS "xxx", *
FROM JOIN1_TBL JOIN JOIN2_TBL ON (JOIN1_TBL.i = JOIN2_TBL.i); FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.i);
SELECT '' AS "xxx", * SELECT '' AS "xxx", *
FROM JOIN1_TBL JOIN JOIN2_TBL ON (JOIN1_TBL.i = JOIN2_TBL.k); FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.k);
SELECT '' AS "xxx", * SELECT '' AS "xxx", *
FROM JOIN1_TBL CROSS JOIN JOIN2_TBL; FROM J1_TBL CROSS JOIN J2_TBL;
-- --
...@@ -99,7 +156,7 @@ SELECT '' AS "xxx", * ...@@ -99,7 +156,7 @@ SELECT '' AS "xxx", *
-- --
SELECT '' AS "xxx", * SELECT '' AS "xxx", *
FROM JOIN1_TBL JOIN JOIN2_TBL ON (JOIN1_TBL.i <= JOIN2_TBL.k); FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i <= J2_TBL.k);
-- --
...@@ -107,16 +164,16 @@ SELECT '' AS "xxx", * ...@@ -107,16 +164,16 @@ SELECT '' AS "xxx", *
-- --
SELECT '' AS "xxx", * SELECT '' AS "xxx", *
FROM JOIN1_TBL OUTER JOIN JOIN2_TBL USING (i); FROM J1_TBL OUTER JOIN J2_TBL USING (i);
SELECT '' AS "xxx", * SELECT '' AS "xxx", *
FROM JOIN1_TBL LEFT OUTER JOIN JOIN2_TBL USING (i); FROM J1_TBL LEFT OUTER JOIN J2_TBL USING (i);
SELECT '' AS "xxx", * SELECT '' AS "xxx", *
FROM JOIN1_TBL RIGHT OUTER JOIN JOIN2_TBL USING (i); FROM J1_TBL RIGHT OUTER JOIN J2_TBL USING (i);
SELECT '' AS "xxx", * SELECT '' AS "xxx", *
FROM JOIN1_TBL FULL OUTER JOIN JOIN2_TBL USING (i); FROM J1_TBL FULL OUTER JOIN J2_TBL USING (i);
-- --
...@@ -127,6 +184,6 @@ SELECT '' AS "xxx", * ...@@ -127,6 +184,6 @@ SELECT '' AS "xxx", *
-- Clean up -- Clean up
-- --
DROP TABLE JOIN1_TBL; DROP TABLE J1_TBL;
DROP TABLE JOIN2_TBL; DROP TABLE J2_TBL;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment