blob: 011d365c19b4fad4f593eedc7348dfa3e48b3b79 [file] [log] [blame]
# Copyright 2016, Quickstep Research Group, Computer Sciences Department,
# University of Wisconsin—Madison.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Prepare testing relations
CREATE TABLE a(w INT, x LONG, y DOUBLE, z VARCHAR(16));
CREATE TABLE b(w INT, x LONG);
CREATE TABLE c(x LONG, y DOUBLE);
CREATE TABLE d(y DOUBLE, z VARCHAR(16));
INSERT INTO a VALUES(0, 0, 0, 'C0');
INSERT INTO a VALUES(1, 10, 100, 'C1');
INSERT INTO a VALUES(2, 20, 200, 'C2');
INSERT INTO a VALUES(3, 30, 300, 'C3');
INSERT INTO a VALUES(4, 40, 400, 'C4');
INSERT INTO a VALUES(5, 50, 500, 'C5');
INSERT INTO a VALUES(6, 60, 600, 'C6');
INSERT INTO a VALUES(7, 70, 700, 'C7');
INSERT INTO a VALUES(8, 80, 800, 'C8');
INSERT INTO a VALUES(9, 90, 900, 'C9');
INSERT INTO a VALUES(10, 100, 1000, 'C10');
INSERT INTO a VALUES(11, 110, 1100, 'C11');
INSERT INTO a VALUES(12, 120, 1200, 'C12');
INSERT INTO a VALUES(13, 130, 1300, 'C13');
INSERT INTO a VALUES(14, 140, 1400, 'C14');
INSERT INTO a VALUES(15, 150, 1500, 'C15');
INSERT INTO a VALUES(16, 160, 1600, 'C16');
INSERT INTO a VALUES(17, 170, 1700, 'C17');
INSERT INTO a VALUES(18, 180, 1800, 'C18');
INSERT INTO a VALUES(19, 190, 1900, 'C19');
INSERT INTO b
SELECT w, x + (w/2)%2
FROM a
WHERE w % 2 = 0;
INSERT INTO c
SELECT x, y + (x/3)%3-1
FROM a
WHERE x % 3 = 0;
INSERT INTO d
SELECT y, z
FROM a;
--
==
# Join queries
SELECT a.w, b.x, c.y, d.z
FROM a JOIN b ON a.w = b.w
JOIN c ON a.x = c.x
JOIN d ON a.y = d.y;
--
+-----------+--------------------+------------------------+----------------+
|w |x |y |z |
+-----------+--------------------+------------------------+----------------+
| 0| 0| -1| C0|
| 6| 61| 601| C6|
| 12| 120| 1200| C12|
| 18| 181| 1799| C18|
+-----------+--------------------+------------------------+----------------+
==
SELECT a.w, b.x, c.y
FROM a JOIN b ON (a.w = b.w OR a.x > b.x)
JOIN c ON (a.x = c.x AND a.y > c.y)
JOIN d ON (a.y = d.y OR a.z > d.z)
GROUP BY a.w, b.x, c.y
ORDER BY a.w, b.x, c.y;
--
+-----------+--------------------+------------------------+
|w |x |y |
+-----------+--------------------+------------------------+
| 0| 0| -1|
| 9| 0| 899|
| 9| 21| 899|
| 9| 40| 899|
| 9| 61| 899|
| 9| 80| 899|
| 18| 0| 1799|
| 18| 21| 1799|
| 18| 40| 1799|
| 18| 61| 1799|
| 18| 80| 1799|
| 18| 101| 1799|
| 18| 120| 1799|
| 18| 141| 1799|
| 18| 160| 1799|
| 18| 181| 1799|
+-----------+--------------------+------------------------+
==
SELECT a1.w, b1.x, c1.y, d1.z
FROM a AS a1 JOIN b AS b1 ON a1.w = b1.w
JOIN c AS c1 ON a1.x = c1.x
JOIN d AS d1 ON a1.y = d1.y
WHERE a1.x = b1.x
AND a1.y = c1.y
AND a1.z = d1.z;
--
+-----------+--------------------+------------------------+----------------+
|w |x |y |z |
+-----------+--------------------+------------------------+----------------+
| 12| 120| 1200| C12|
+-----------+--------------------+------------------------+----------------+
==
SELECT a1.w, b1.x, c1.y, d1.z
FROM a AS a1 JOIN b AS b1 ON a1.x <> b1.x
JOIN c AS c1 ON a1.y <> c1.y
JOIN d AS d1 ON a1.z = d1.z
WHERE a1.w = b1.w
AND a1.x = c1.x;
--
+-----------+--------------------+------------------------+----------------+
|w |x |y |z |
+-----------+--------------------+------------------------+----------------+
| 6| 61| 601| C6|
| 18| 181| 1799| C18|
+-----------+--------------------+------------------------+----------------+
==
SELECT a.w AS "a.w", b.x AS "b.x", c.y AS "c.y", d.z AS "d.z"
FROM a LEFT JOIN b ON a.w = b.w
LEFT JOIN c ON a.x = c.x
LEFT JOIN d ON a.y = d.y
ORDER BY a.w;
--
+-----------+--------------------+------------------------+----------------+
|a.w |b.x |c.y |d.z |
+-----------+--------------------+------------------------+----------------+
| 0| 0| -1| C0|
| 1| NULL| NULL| C1|
| 2| 21| NULL| C2|
| 3| NULL| 300| C3|
| 4| 40| NULL| C4|
| 5| NULL| NULL| C5|
| 6| 61| 601| C6|
| 7| NULL| NULL| C7|
| 8| 80| NULL| C8|
| 9| NULL| 899| C9|
| 10| 101| NULL| C10|
| 11| NULL| NULL| C11|
| 12| 120| 1200| C12|
| 13| NULL| NULL| C13|
| 14| 141| NULL| C14|
| 15| NULL| 1501| C15|
| 16| 160| NULL| C16|
| 17| NULL| NULL| C17|
| 18| 181| 1799| C18|
| 19| NULL| NULL| C19|
+-----------+--------------------+------------------------+----------------+
==
SELECT a.w AS "a.w", b.x AS "b.x", c.y AS "c.y", d.z AS "d.z"
FROM a LEFT JOIN b ON a.w = b.w
LEFT JOIN c ON b.x = c.x
LEFT JOIN d ON c.y = d.y
ORDER BY a.w;
--
+-----------+--------------------+------------------------+----------------+
|a.w |b.x |c.y |d.z |
+-----------+--------------------+------------------------+----------------+
| 0| 0| -1| NULL|
| 1| NULL| NULL| NULL|
| 2| 21| NULL| NULL|
| 3| NULL| NULL| NULL|
| 4| 40| NULL| NULL|
| 5| NULL| NULL| NULL|
| 6| 61| NULL| NULL|
| 7| NULL| NULL| NULL|
| 8| 80| NULL| NULL|
| 9| NULL| NULL| NULL|
| 10| 101| NULL| NULL|
| 11| NULL| NULL| NULL|
| 12| 120| 1200| C12|
| 13| NULL| NULL| NULL|
| 14| 141| NULL| NULL|
| 15| NULL| NULL| NULL|
| 16| 160| NULL| NULL|
| 17| NULL| NULL| NULL|
| 18| 181| NULL| NULL|
| 19| NULL| NULL| NULL|
+-----------+--------------------+------------------------+----------------+
==
SELECT b.x AS "b.x", c1.x AS "c1.x", c2.x AS "c2.x"
FROM b LEFT JOIN c c1 ON (b.x = c1.x)
LEFT JOIN c c2 ON (b.x = c2.x AND c2.x > 10)
ORDER BY b.x;
--
+--------------------+--------------------+--------------------+
|b.x |c1.x |c2.x |
+--------------------+--------------------+--------------------+
| 0| 0| NULL|
| 21| NULL| NULL|
| 40| NULL| NULL|
| 61| NULL| NULL|
| 80| NULL| NULL|
| 101| NULL| NULL|
| 120| 120| 120|
| 141| NULL| NULL|
| 160| NULL| NULL|
| 181| NULL| NULL|
+--------------------+--------------------+--------------------+
==
SELECT a.w AS "a.w", b.x AS "b.x", c.y AS "c.y", d.z AS "d.z"
FROM a RIGHT JOIN b ON a.w = b.w
JOIN c ON a.x = c.x
LEFT JOIN d ON a.y = d.y
WHERE b.x > 10
AND c.y < 1000;
--
+-----------+--------------------+------------------------+----------------+
|a.w |b.x |c.y |d.z |
+-----------+--------------------+------------------------+----------------+
| 6| 61| 601| C6|
+-----------+--------------------+------------------------+----------------+