postgresql/src/test/regress/expected/join.out
Tom Lane 37c443eefd Fix compare_fuzzy_path_costs() to behave a bit more sanely. The original
coding would ignore startup cost differences of less than 1% of the
estimated total cost; which was OK for normal planning but highly not OK
if a very small LIMIT was applied afterwards, so that startup cost becomes
the name of the game.  Instead, compare startup and total costs fuzzily
but independently.  This changes the plan selected for two queries in the
regression tests; adjust expected-output files for resulting changes in
row order.  Per reports from Dawid Kuroczko and Sam Mason.
2005-07-22 19:12:02 +00:00

2187 lines
65 KiB
Plaintext

--
-- JOIN
-- Test JOIN clauses
--
CREATE TABLE J1_TBL (
i integer,
j integer,
t text
);
CREATE TABLE J2_TBL (
i integer,
k integer
);
INSERT INTO J1_TBL VALUES (1, 4, 'one');
INSERT INTO J1_TBL VALUES (2, 3, 'two');
INSERT INTO J1_TBL VALUES (3, 2, 'three');
INSERT INTO J1_TBL VALUES (4, 1, 'four');
INSERT INTO J1_TBL VALUES (5, 0, 'five');
INSERT INTO J1_TBL VALUES (6, 6, 'six');
INSERT INTO J1_TBL VALUES (7, 7, 'seven');
INSERT INTO J1_TBL VALUES (8, 8, 'eight');
INSERT INTO J1_TBL VALUES (0, NULL, 'zero');
INSERT INTO J1_TBL VALUES (NULL, NULL, 'null');
INSERT INTO J1_TBL VALUES (NULL, 0, 'zero');
INSERT INTO J2_TBL VALUES (1, -1);
INSERT INTO J2_TBL VALUES (2, 2);
INSERT INTO J2_TBL VALUES (3, -3);
INSERT INTO J2_TBL VALUES (2, 4);
INSERT INTO J2_TBL VALUES (5, -5);
INSERT INTO J2_TBL VALUES (5, -5);
INSERT INTO J2_TBL VALUES (0, NULL);
INSERT INTO J2_TBL VALUES (NULL, NULL);
INSERT INTO J2_TBL VALUES (NULL, 0);
--
-- 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 | 4 | one
| 2 | 3 | two
| 3 | 2 | three
| 4 | 1 | four
| 5 | 0 | five
| 6 | 6 | six
| 7 | 7 | seven
| 8 | 8 | eight
| 0 | | zero
| | | null
| | 0 | zero
(11 rows)
SELECT '' AS "xxx", *
FROM J1_TBL tx;
xxx | i | j | t
-----+---+---+-------
| 1 | 4 | one
| 2 | 3 | two
| 3 | 2 | three
| 4 | 1 | four
| 5 | 0 | five
| 6 | 6 | six
| 7 | 7 | seven
| 8 | 8 | eight
| 0 | | zero
| | | null
| | 0 | zero
(11 rows)
SELECT '' AS "xxx", *
FROM J1_TBL AS t1 (a, b, c);
xxx | a | b | c
-----+---+---+-------
| 1 | 4 | one
| 2 | 3 | two
| 3 | 2 | three
| 4 | 1 | four
| 5 | 0 | five
| 6 | 6 | six
| 7 | 7 | seven
| 8 | 8 | eight
| 0 | | zero
| | | null
| | 0 | zero
(11 rows)
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c);
xxx | a | b | c
-----+---+---+-------
| 1 | 4 | one
| 2 | 3 | two
| 3 | 2 | three
| 4 | 1 | four
| 5 | 0 | five
| 6 | 6 | six
| 7 | 7 | seven
| 8 | 8 | eight
| 0 | | zero
| | | null
| | 0 | zero
(11 rows)
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c), J2_TBL t2 (d, e);
xxx | a | b | c | d | e
-----+---+---+-------+---+----
| 1 | 4 | one | 1 | -1
| 2 | 3 | two | 1 | -1
| 3 | 2 | three | 1 | -1
| 4 | 1 | four | 1 | -1
| 5 | 0 | five | 1 | -1
| 6 | 6 | six | 1 | -1
| 7 | 7 | seven | 1 | -1
| 8 | 8 | eight | 1 | -1
| 0 | | zero | 1 | -1
| | | null | 1 | -1
| | 0 | zero | 1 | -1
| 1 | 4 | one | 2 | 2
| 2 | 3 | two | 2 | 2
| 3 | 2 | three | 2 | 2
| 4 | 1 | four | 2 | 2
| 5 | 0 | five | 2 | 2
| 6 | 6 | six | 2 | 2
| 7 | 7 | seven | 2 | 2
| 8 | 8 | eight | 2 | 2
| 0 | | zero | 2 | 2
| | | null | 2 | 2
| | 0 | zero | 2 | 2
| 1 | 4 | one | 3 | -3
| 2 | 3 | two | 3 | -3
| 3 | 2 | three | 3 | -3
| 4 | 1 | four | 3 | -3
| 5 | 0 | five | 3 | -3
| 6 | 6 | six | 3 | -3
| 7 | 7 | seven | 3 | -3
| 8 | 8 | eight | 3 | -3
| 0 | | zero | 3 | -3
| | | null | 3 | -3
| | 0 | zero | 3 | -3
| 1 | 4 | one | 2 | 4
| 2 | 3 | two | 2 | 4
| 3 | 2 | three | 2 | 4
| 4 | 1 | four | 2 | 4
| 5 | 0 | five | 2 | 4
| 6 | 6 | six | 2 | 4
| 7 | 7 | seven | 2 | 4
| 8 | 8 | eight | 2 | 4
| 0 | | zero | 2 | 4
| | | null | 2 | 4
| | 0 | zero | 2 | 4
| 1 | 4 | one | 5 | -5
| 2 | 3 | two | 5 | -5
| 3 | 2 | three | 5 | -5
| 4 | 1 | four | 5 | -5
| 5 | 0 | five | 5 | -5
| 6 | 6 | six | 5 | -5
| 7 | 7 | seven | 5 | -5
| 8 | 8 | eight | 5 | -5
| 0 | | zero | 5 | -5
| | | null | 5 | -5
| | 0 | zero | 5 | -5
| 1 | 4 | one | 5 | -5
| 2 | 3 | two | 5 | -5
| 3 | 2 | three | 5 | -5
| 4 | 1 | four | 5 | -5
| 5 | 0 | five | 5 | -5
| 6 | 6 | six | 5 | -5
| 7 | 7 | seven | 5 | -5
| 8 | 8 | eight | 5 | -5
| 0 | | zero | 5 | -5
| | | null | 5 | -5
| | 0 | zero | 5 | -5
| 1 | 4 | one | 0 |
| 2 | 3 | two | 0 |
| 3 | 2 | three | 0 |
| 4 | 1 | four | 0 |
| 5 | 0 | five | 0 |
| 6 | 6 | six | 0 |
| 7 | 7 | seven | 0 |
| 8 | 8 | eight | 0 |
| 0 | | zero | 0 |
| | | null | 0 |
| | 0 | zero | 0 |
| 1 | 4 | one | |
| 2 | 3 | two | |
| 3 | 2 | three | |
| 4 | 1 | four | |
| 5 | 0 | five | |
| 6 | 6 | six | |
| 7 | 7 | seven | |
| 8 | 8 | eight | |
| 0 | | zero | |
| | | null | |
| | 0 | zero | |
| 1 | 4 | one | | 0
| 2 | 3 | two | | 0
| 3 | 2 | three | | 0
| 4 | 1 | four | | 0
| 5 | 0 | five | | 0
| 6 | 6 | six | | 0
| 7 | 7 | seven | | 0
| 8 | 8 | eight | | 0
| 0 | | zero | | 0
| | | null | | 0
| | 0 | zero | | 0
(99 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
-----+---+----
| 0 |
| 1 | -1
| 2 | 2
| 2 | 4
| 3 | -3
| 5 | -5
| 5 | -5
(7 rows)
--
-- CROSS JOIN
-- Qualifications are not allowed on cross joins,
-- which degenerate into a standard unqualified inner join.
--
SELECT '' AS "xxx", *
FROM J1_TBL CROSS JOIN J2_TBL;
xxx | i | j | t | i | k
-----+---+---+-------+---+----
| 1 | 4 | one | 1 | -1
| 2 | 3 | two | 1 | -1
| 3 | 2 | three | 1 | -1
| 4 | 1 | four | 1 | -1
| 5 | 0 | five | 1 | -1
| 6 | 6 | six | 1 | -1
| 7 | 7 | seven | 1 | -1
| 8 | 8 | eight | 1 | -1
| 0 | | zero | 1 | -1
| | | null | 1 | -1
| | 0 | zero | 1 | -1
| 1 | 4 | one | 2 | 2
| 2 | 3 | two | 2 | 2
| 3 | 2 | three | 2 | 2
| 4 | 1 | four | 2 | 2
| 5 | 0 | five | 2 | 2
| 6 | 6 | six | 2 | 2
| 7 | 7 | seven | 2 | 2
| 8 | 8 | eight | 2 | 2
| 0 | | zero | 2 | 2
| | | null | 2 | 2
| | 0 | zero | 2 | 2
| 1 | 4 | one | 3 | -3
| 2 | 3 | two | 3 | -3
| 3 | 2 | three | 3 | -3
| 4 | 1 | four | 3 | -3
| 5 | 0 | five | 3 | -3
| 6 | 6 | six | 3 | -3
| 7 | 7 | seven | 3 | -3
| 8 | 8 | eight | 3 | -3
| 0 | | zero | 3 | -3
| | | null | 3 | -3
| | 0 | zero | 3 | -3
| 1 | 4 | one | 2 | 4
| 2 | 3 | two | 2 | 4
| 3 | 2 | three | 2 | 4
| 4 | 1 | four | 2 | 4
| 5 | 0 | five | 2 | 4
| 6 | 6 | six | 2 | 4
| 7 | 7 | seven | 2 | 4
| 8 | 8 | eight | 2 | 4
| 0 | | zero | 2 | 4
| | | null | 2 | 4
| | 0 | zero | 2 | 4
| 1 | 4 | one | 5 | -5
| 2 | 3 | two | 5 | -5
| 3 | 2 | three | 5 | -5
| 4 | 1 | four | 5 | -5
| 5 | 0 | five | 5 | -5
| 6 | 6 | six | 5 | -5
| 7 | 7 | seven | 5 | -5
| 8 | 8 | eight | 5 | -5
| 0 | | zero | 5 | -5
| | | null | 5 | -5
| | 0 | zero | 5 | -5
| 1 | 4 | one | 5 | -5
| 2 | 3 | two | 5 | -5
| 3 | 2 | three | 5 | -5
| 4 | 1 | four | 5 | -5
| 5 | 0 | five | 5 | -5
| 6 | 6 | six | 5 | -5
| 7 | 7 | seven | 5 | -5
| 8 | 8 | eight | 5 | -5
| 0 | | zero | 5 | -5
| | | null | 5 | -5
| | 0 | zero | 5 | -5
| 1 | 4 | one | 0 |
| 2 | 3 | two | 0 |
| 3 | 2 | three | 0 |
| 4 | 1 | four | 0 |
| 5 | 0 | five | 0 |
| 6 | 6 | six | 0 |
| 7 | 7 | seven | 0 |
| 8 | 8 | eight | 0 |
| 0 | | zero | 0 |
| | | null | 0 |
| | 0 | zero | 0 |
| 1 | 4 | one | |
| 2 | 3 | two | |
| 3 | 2 | three | |
| 4 | 1 | four | |
| 5 | 0 | five | |
| 6 | 6 | six | |
| 7 | 7 | seven | |
| 8 | 8 | eight | |
| 0 | | zero | |
| | | null | |
| | 0 | zero | |
| 1 | 4 | one | | 0
| 2 | 3 | two | | 0
| 3 | 2 | three | | 0
| 4 | 1 | four | | 0
| 5 | 0 | five | | 0
| 6 | 6 | six | | 0
| 7 | 7 | seven | | 0
| 8 | 8 | eight | | 0
| 0 | | zero | | 0
| | | null | | 0
| | 0 | zero | | 0
(99 rows)
-- ambiguous column
SELECT '' AS "xxx", i, k, t
FROM J1_TBL CROSS JOIN J2_TBL;
ERROR: column reference "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
| 5 | -1 | five
| 6 | -1 | six
| 7 | -1 | seven
| 8 | -1 | eight
| 0 | -1 | zero
| | -1 | null
| | -1 | zero
| 1 | 2 | one
| 2 | 2 | two
| 3 | 2 | three
| 4 | 2 | four
| 5 | 2 | five
| 6 | 2 | six
| 7 | 2 | seven
| 8 | 2 | eight
| 0 | 2 | zero
| | 2 | null
| | 2 | zero
| 1 | -3 | one
| 2 | -3 | two
| 3 | -3 | three
| 4 | -3 | four
| 5 | -3 | five
| 6 | -3 | six
| 7 | -3 | seven
| 8 | -3 | eight
| 0 | -3 | zero
| | -3 | null
| | -3 | zero
| 1 | 4 | one
| 2 | 4 | two
| 3 | 4 | three
| 4 | 4 | four
| 5 | 4 | five
| 6 | 4 | six
| 7 | 4 | seven
| 8 | 4 | eight
| 0 | 4 | zero
| | 4 | null
| | 4 | zero
| 1 | -5 | one
| 2 | -5 | two
| 3 | -5 | three
| 4 | -5 | four
| 5 | -5 | five
| 6 | -5 | six
| 7 | -5 | seven
| 8 | -5 | eight
| 0 | -5 | zero
| | -5 | null
| | -5 | zero
| 1 | -5 | one
| 2 | -5 | two
| 3 | -5 | three
| 4 | -5 | four
| 5 | -5 | five
| 6 | -5 | six
| 7 | -5 | seven
| 8 | -5 | eight
| 0 | -5 | zero
| | -5 | null
| | -5 | zero
| 1 | | one
| 2 | | two
| 3 | | three
| 4 | | four
| 5 | | five
| 6 | | six
| 7 | | seven
| 8 | | eight
| 0 | | zero
| | | null
| | | zero
| 1 | | one
| 2 | | two
| 3 | | three
| 4 | | four
| 5 | | five
| 6 | | six
| 7 | | seven
| 8 | | eight
| 0 | | zero
| | | null
| | | zero
| 1 | 0 | one
| 2 | 0 | two
| 3 | 0 | three
| 4 | 0 | four
| 5 | 0 | five
| 6 | 0 | six
| 7 | 0 | seven
| 8 | 0 | eight
| 0 | 0 | zero
| | 0 | null
| | 0 | zero
(99 rows)
SELECT '' AS "xxx", ii, tt, kk
FROM (J1_TBL CROSS JOIN J2_TBL)
AS tx (ii, jj, tt, ii2, kk);
xxx | ii | tt | kk
-----+----+-------+----
| 1 | one | -1
| 2 | two | -1
| 3 | three | -1
| 4 | four | -1
| 5 | five | -1
| 6 | six | -1
| 7 | seven | -1
| 8 | eight | -1
| 0 | zero | -1
| | null | -1
| | zero | -1
| 1 | one | 2
| 2 | two | 2
| 3 | three | 2
| 4 | four | 2
| 5 | five | 2
| 6 | six | 2
| 7 | seven | 2
| 8 | eight | 2
| 0 | zero | 2
| | null | 2
| | zero | 2
| 1 | one | -3
| 2 | two | -3
| 3 | three | -3
| 4 | four | -3
| 5 | five | -3
| 6 | six | -3
| 7 | seven | -3
| 8 | eight | -3
| 0 | zero | -3
| | null | -3
| | zero | -3
| 1 | one | 4
| 2 | two | 4
| 3 | three | 4
| 4 | four | 4
| 5 | five | 4
| 6 | six | 4
| 7 | seven | 4
| 8 | eight | 4
| 0 | zero | 4
| | null | 4
| | zero | 4
| 1 | one | -5
| 2 | two | -5
| 3 | three | -5
| 4 | four | -5
| 5 | five | -5
| 6 | six | -5
| 7 | seven | -5
| 8 | eight | -5
| 0 | zero | -5
| | null | -5
| | zero | -5
| 1 | one | -5
| 2 | two | -5
| 3 | three | -5
| 4 | four | -5
| 5 | five | -5
| 6 | six | -5
| 7 | seven | -5
| 8 | eight | -5
| 0 | zero | -5
| | null | -5
| | zero | -5
| 1 | one |
| 2 | two |
| 3 | three |
| 4 | four |
| 5 | five |
| 6 | six |
| 7 | seven |
| 8 | eight |
| 0 | zero |
| | null |
| | zero |
| 1 | one |
| 2 | two |
| 3 | three |
| 4 | four |
| 5 | five |
| 6 | six |
| 7 | seven |
| 8 | eight |
| 0 | zero |
| | null |
| | zero |
| 1 | one | 0
| 2 | two | 0
| 3 | three | 0
| 4 | four | 0
| 5 | five | 0
| 6 | six | 0
| 7 | seven | 0
| 8 | eight | 0
| 0 | zero | 0
| | null | 0
| | zero | 0
(99 rows)
SELECT '' AS "xxx", tx.ii, tx.jj, tx.kk
FROM (J1_TBL t1 (a, b, c) CROSS JOIN J2_TBL t2 (d, e))
AS tx (ii, jj, tt, ii2, kk);
xxx | ii | jj | kk
-----+----+----+----
| 1 | 4 | -1
| 2 | 3 | -1
| 3 | 2 | -1
| 4 | 1 | -1
| 5 | 0 | -1
| 6 | 6 | -1
| 7 | 7 | -1
| 8 | 8 | -1
| 0 | | -1
| | | -1
| | 0 | -1
| 1 | 4 | 2
| 2 | 3 | 2
| 3 | 2 | 2
| 4 | 1 | 2
| 5 | 0 | 2
| 6 | 6 | 2
| 7 | 7 | 2
| 8 | 8 | 2
| 0 | | 2
| | | 2
| | 0 | 2
| 1 | 4 | -3
| 2 | 3 | -3
| 3 | 2 | -3
| 4 | 1 | -3
| 5 | 0 | -3
| 6 | 6 | -3
| 7 | 7 | -3
| 8 | 8 | -3
| 0 | | -3
| | | -3
| | 0 | -3
| 1 | 4 | 4
| 2 | 3 | 4
| 3 | 2 | 4
| 4 | 1 | 4
| 5 | 0 | 4
| 6 | 6 | 4
| 7 | 7 | 4
| 8 | 8 | 4
| 0 | | 4
| | | 4
| | 0 | 4
| 1 | 4 | -5
| 2 | 3 | -5
| 3 | 2 | -5
| 4 | 1 | -5
| 5 | 0 | -5
| 6 | 6 | -5
| 7 | 7 | -5
| 8 | 8 | -5
| 0 | | -5
| | | -5
| | 0 | -5
| 1 | 4 | -5
| 2 | 3 | -5
| 3 | 2 | -5
| 4 | 1 | -5
| 5 | 0 | -5
| 6 | 6 | -5
| 7 | 7 | -5
| 8 | 8 | -5
| 0 | | -5
| | | -5
| | 0 | -5
| 1 | 4 |
| 2 | 3 |
| 3 | 2 |
| 4 | 1 |
| 5 | 0 |
| 6 | 6 |
| 7 | 7 |
| 8 | 8 |
| 0 | |
| | |
| | 0 |
| 1 | 4 |
| 2 | 3 |
| 3 | 2 |
| 4 | 1 |
| 5 | 0 |
| 6 | 6 |
| 7 | 7 |
| 8 | 8 |
| 0 | |
| | |
| | 0 |
| 1 | 4 | 0
| 2 | 3 | 0
| 3 | 2 | 0
| 4 | 1 | 0
| 5 | 0 | 0
| 6 | 6 | 0
| 7 | 7 | 0
| 8 | 8 | 0
| 0 | | 0
| | | 0
| | 0 | 0
(99 rows)
SELECT '' AS "xxx", *
FROM J1_TBL CROSS JOIN J2_TBL a CROSS JOIN J2_TBL b;
xxx | i | j | t | i | k | i | k
-----+---+---+-------+---+----+---+----
| 1 | 4 | one | 1 | -1 | 1 | -1
| 2 | 3 | two | 1 | -1 | 1 | -1
| 3 | 2 | three | 1 | -1 | 1 | -1
| 4 | 1 | four | 1 | -1 | 1 | -1
| 5 | 0 | five | 1 | -1 | 1 | -1
| 6 | 6 | six | 1 | -1 | 1 | -1
| 7 | 7 | seven | 1 | -1 | 1 | -1
| 8 | 8 | eight | 1 | -1 | 1 | -1
| 0 | | zero | 1 | -1 | 1 | -1
| | | null | 1 | -1 | 1 | -1
| | 0 | zero | 1 | -1 | 1 | -1
| 1 | 4 | one | 1 | -1 | 2 | 2
| 2 | 3 | two | 1 | -1 | 2 | 2
| 3 | 2 | three | 1 | -1 | 2 | 2
| 4 | 1 | four | 1 | -1 | 2 | 2
| 5 | 0 | five | 1 | -1 | 2 | 2
| 6 | 6 | six | 1 | -1 | 2 | 2
| 7 | 7 | seven | 1 | -1 | 2 | 2
| 8 | 8 | eight | 1 | -1 | 2 | 2
| 0 | | zero | 1 | -1 | 2 | 2
| | | null | 1 | -1 | 2 | 2
| | 0 | zero | 1 | -1 | 2 | 2
| 1 | 4 | one | 1 | -1 | 3 | -3
| 2 | 3 | two | 1 | -1 | 3 | -3
| 3 | 2 | three | 1 | -1 | 3 | -3
| 4 | 1 | four | 1 | -1 | 3 | -3
| 5 | 0 | five | 1 | -1 | 3 | -3
| 6 | 6 | six | 1 | -1 | 3 | -3
| 7 | 7 | seven | 1 | -1 | 3 | -3
| 8 | 8 | eight | 1 | -1 | 3 | -3
| 0 | | zero | 1 | -1 | 3 | -3
| | | null | 1 | -1 | 3 | -3
| | 0 | zero | 1 | -1 | 3 | -3
| 1 | 4 | one | 1 | -1 | 2 | 4
| 2 | 3 | two | 1 | -1 | 2 | 4
| 3 | 2 | three | 1 | -1 | 2 | 4
| 4 | 1 | four | 1 | -1 | 2 | 4
| 5 | 0 | five | 1 | -1 | 2 | 4
| 6 | 6 | six | 1 | -1 | 2 | 4
| 7 | 7 | seven | 1 | -1 | 2 | 4
| 8 | 8 | eight | 1 | -1 | 2 | 4
| 0 | | zero | 1 | -1 | 2 | 4
| | | null | 1 | -1 | 2 | 4
| | 0 | zero | 1 | -1 | 2 | 4
| 1 | 4 | one | 1 | -1 | 5 | -5
| 2 | 3 | two | 1 | -1 | 5 | -5
| 3 | 2 | three | 1 | -1 | 5 | -5
| 4 | 1 | four | 1 | -1 | 5 | -5
| 5 | 0 | five | 1 | -1 | 5 | -5
| 6 | 6 | six | 1 | -1 | 5 | -5
| 7 | 7 | seven | 1 | -1 | 5 | -5
| 8 | 8 | eight | 1 | -1 | 5 | -5
| 0 | | zero | 1 | -1 | 5 | -5
| | | null | 1 | -1 | 5 | -5
| | 0 | zero | 1 | -1 | 5 | -5
| 1 | 4 | one | 1 | -1 | 5 | -5
| 2 | 3 | two | 1 | -1 | 5 | -5
| 3 | 2 | three | 1 | -1 | 5 | -5
| 4 | 1 | four | 1 | -1 | 5 | -5
| 5 | 0 | five | 1 | -1 | 5 | -5
| 6 | 6 | six | 1 | -1 | 5 | -5
| 7 | 7 | seven | 1 | -1 | 5 | -5
| 8 | 8 | eight | 1 | -1 | 5 | -5
| 0 | | zero | 1 | -1 | 5 | -5
| | | null | 1 | -1 | 5 | -5
| | 0 | zero | 1 | -1 | 5 | -5
| 1 | 4 | one | 1 | -1 | 0 |
| 2 | 3 | two | 1 | -1 | 0 |
| 3 | 2 | three | 1 | -1 | 0 |
| 4 | 1 | four | 1 | -1 | 0 |
| 5 | 0 | five | 1 | -1 | 0 |
| 6 | 6 | six | 1 | -1 | 0 |
| 7 | 7 | seven | 1 | -1 | 0 |
| 8 | 8 | eight | 1 | -1 | 0 |
| 0 | | zero | 1 | -1 | 0 |
| | | null | 1 | -1 | 0 |
| | 0 | zero | 1 | -1 | 0 |
| 1 | 4 | one | 1 | -1 | |
| 2 | 3 | two | 1 | -1 | |
| 3 | 2 | three | 1 | -1 | |
| 4 | 1 | four | 1 | -1 | |
| 5 | 0 | five | 1 | -1 | |
| 6 | 6 | six | 1 | -1 | |
| 7 | 7 | seven | 1 | -1 | |
| 8 | 8 | eight | 1 | -1 | |
| 0 | | zero | 1 | -1 | |
| | | null | 1 | -1 | |
| | 0 | zero | 1 | -1 | |
| 1 | 4 | one | 1 | -1 | | 0
| 2 | 3 | two | 1 | -1 | | 0
| 3 | 2 | three | 1 | -1 | | 0
| 4 | 1 | four | 1 | -1 | | 0
| 5 | 0 | five | 1 | -1 | | 0
| 6 | 6 | six | 1 | -1 | | 0
| 7 | 7 | seven | 1 | -1 | | 0
| 8 | 8 | eight | 1 | -1 | | 0
| 0 | | zero | 1 | -1 | | 0
| | | null | 1 | -1 | | 0
| | 0 | zero | 1 | -1 | | 0
| 1 | 4 | one | 2 | 2 | 1 | -1
| 2 | 3 | two | 2 | 2 | 1 | -1
| 3 | 2 | three | 2 | 2 | 1 | -1
| 4 | 1 | four | 2 | 2 | 1 | -1
| 5 | 0 | five | 2 | 2 | 1 | -1
| 6 | 6 | six | 2 | 2 | 1 | -1
| 7 | 7 | seven | 2 | 2 | 1 | -1
| 8 | 8 | eight | 2 | 2 | 1 | -1
| 0 | | zero | 2 | 2 | 1 | -1
| | | null | 2 | 2 | 1 | -1
| | 0 | zero | 2 | 2 | 1 | -1
| 1 | 4 | one | 2 | 2 | 2 | 2
| 2 | 3 | two | 2 | 2 | 2 | 2
| 3 | 2 | three | 2 | 2 | 2 | 2
| 4 | 1 | four | 2 | 2 | 2 | 2
| 5 | 0 | five | 2 | 2 | 2 | 2
| 6 | 6 | six | 2 | 2 | 2 | 2
| 7 | 7 | seven | 2 | 2 | 2 | 2
| 8 | 8 | eight | 2 | 2 | 2 | 2
| 0 | | zero | 2 | 2 | 2 | 2
| | | null | 2 | 2 | 2 | 2
| | 0 | zero | 2 | 2 | 2 | 2
| 1 | 4 | one | 2 | 2 | 3 | -3
| 2 | 3 | two | 2 | 2 | 3 | -3
| 3 | 2 | three | 2 | 2 | 3 | -3
| 4 | 1 | four | 2 | 2 | 3 | -3
| 5 | 0 | five | 2 | 2 | 3 | -3
| 6 | 6 | six | 2 | 2 | 3 | -3
| 7 | 7 | seven | 2 | 2 | 3 | -3
| 8 | 8 | eight | 2 | 2 | 3 | -3
| 0 | | zero | 2 | 2 | 3 | -3
| | | null | 2 | 2 | 3 | -3
| | 0 | zero | 2 | 2 | 3 | -3
| 1 | 4 | one | 2 | 2 | 2 | 4
| 2 | 3 | two | 2 | 2 | 2 | 4
| 3 | 2 | three | 2 | 2 | 2 | 4
| 4 | 1 | four | 2 | 2 | 2 | 4
| 5 | 0 | five | 2 | 2 | 2 | 4
| 6 | 6 | six | 2 | 2 | 2 | 4
| 7 | 7 | seven | 2 | 2 | 2 | 4
| 8 | 8 | eight | 2 | 2 | 2 | 4
| 0 | | zero | 2 | 2 | 2 | 4
| | | null | 2 | 2 | 2 | 4
| | 0 | zero | 2 | 2 | 2 | 4
| 1 | 4 | one | 2 | 2 | 5 | -5
| 2 | 3 | two | 2 | 2 | 5 | -5
| 3 | 2 | three | 2 | 2 | 5 | -5
| 4 | 1 | four | 2 | 2 | 5 | -5
| 5 | 0 | five | 2 | 2 | 5 | -5
| 6 | 6 | six | 2 | 2 | 5 | -5
| 7 | 7 | seven | 2 | 2 | 5 | -5
| 8 | 8 | eight | 2 | 2 | 5 | -5
| 0 | | zero | 2 | 2 | 5 | -5
| | | null | 2 | 2 | 5 | -5
| | 0 | zero | 2 | 2 | 5 | -5
| 1 | 4 | one | 2 | 2 | 5 | -5
| 2 | 3 | two | 2 | 2 | 5 | -5
| 3 | 2 | three | 2 | 2 | 5 | -5
| 4 | 1 | four | 2 | 2 | 5 | -5
| 5 | 0 | five | 2 | 2 | 5 | -5
| 6 | 6 | six | 2 | 2 | 5 | -5
| 7 | 7 | seven | 2 | 2 | 5 | -5
| 8 | 8 | eight | 2 | 2 | 5 | -5
| 0 | | zero | 2 | 2 | 5 | -5
| | | null | 2 | 2 | 5 | -5
| | 0 | zero | 2 | 2 | 5 | -5
| 1 | 4 | one | 2 | 2 | 0 |
| 2 | 3 | two | 2 | 2 | 0 |
| 3 | 2 | three | 2 | 2 | 0 |
| 4 | 1 | four | 2 | 2 | 0 |
| 5 | 0 | five | 2 | 2 | 0 |
| 6 | 6 | six | 2 | 2 | 0 |
| 7 | 7 | seven | 2 | 2 | 0 |
| 8 | 8 | eight | 2 | 2 | 0 |
| 0 | | zero | 2 | 2 | 0 |
| | | null | 2 | 2 | 0 |
| | 0 | zero | 2 | 2 | 0 |
| 1 | 4 | one | 2 | 2 | |
| 2 | 3 | two | 2 | 2 | |
| 3 | 2 | three | 2 | 2 | |
| 4 | 1 | four | 2 | 2 | |
| 5 | 0 | five | 2 | 2 | |
| 6 | 6 | six | 2 | 2 | |
| 7 | 7 | seven | 2 | 2 | |
| 8 | 8 | eight | 2 | 2 | |
| 0 | | zero | 2 | 2 | |
| | | null | 2 | 2 | |
| | 0 | zero | 2 | 2 | |
| 1 | 4 | one | 2 | 2 | | 0
| 2 | 3 | two | 2 | 2 | | 0
| 3 | 2 | three | 2 | 2 | | 0
| 4 | 1 | four | 2 | 2 | | 0
| 5 | 0 | five | 2 | 2 | | 0
| 6 | 6 | six | 2 | 2 | | 0
| 7 | 7 | seven | 2 | 2 | | 0
| 8 | 8 | eight | 2 | 2 | | 0
| 0 | | zero | 2 | 2 | | 0
| | | null | 2 | 2 | | 0
| | 0 | zero | 2 | 2 | | 0
| 1 | 4 | one | 3 | -3 | 1 | -1
| 2 | 3 | two | 3 | -3 | 1 | -1
| 3 | 2 | three | 3 | -3 | 1 | -1
| 4 | 1 | four | 3 | -3 | 1 | -1
| 5 | 0 | five | 3 | -3 | 1 | -1
| 6 | 6 | six | 3 | -3 | 1 | -1
| 7 | 7 | seven | 3 | -3 | 1 | -1
| 8 | 8 | eight | 3 | -3 | 1 | -1
| 0 | | zero | 3 | -3 | 1 | -1
| | | null | 3 | -3 | 1 | -1
| | 0 | zero | 3 | -3 | 1 | -1
| 1 | 4 | one | 3 | -3 | 2 | 2
| 2 | 3 | two | 3 | -3 | 2 | 2
| 3 | 2 | three | 3 | -3 | 2 | 2
| 4 | 1 | four | 3 | -3 | 2 | 2
| 5 | 0 | five | 3 | -3 | 2 | 2
| 6 | 6 | six | 3 | -3 | 2 | 2
| 7 | 7 | seven | 3 | -3 | 2 | 2
| 8 | 8 | eight | 3 | -3 | 2 | 2
| 0 | | zero | 3 | -3 | 2 | 2
| | | null | 3 | -3 | 2 | 2
| | 0 | zero | 3 | -3 | 2 | 2
| 1 | 4 | one | 3 | -3 | 3 | -3
| 2 | 3 | two | 3 | -3 | 3 | -3
| 3 | 2 | three | 3 | -3 | 3 | -3
| 4 | 1 | four | 3 | -3 | 3 | -3
| 5 | 0 | five | 3 | -3 | 3 | -3
| 6 | 6 | six | 3 | -3 | 3 | -3
| 7 | 7 | seven | 3 | -3 | 3 | -3
| 8 | 8 | eight | 3 | -3 | 3 | -3
| 0 | | zero | 3 | -3 | 3 | -3
| | | null | 3 | -3 | 3 | -3
| | 0 | zero | 3 | -3 | 3 | -3
| 1 | 4 | one | 3 | -3 | 2 | 4
| 2 | 3 | two | 3 | -3 | 2 | 4
| 3 | 2 | three | 3 | -3 | 2 | 4
| 4 | 1 | four | 3 | -3 | 2 | 4
| 5 | 0 | five | 3 | -3 | 2 | 4
| 6 | 6 | six | 3 | -3 | 2 | 4
| 7 | 7 | seven | 3 | -3 | 2 | 4
| 8 | 8 | eight | 3 | -3 | 2 | 4
| 0 | | zero | 3 | -3 | 2 | 4
| | | null | 3 | -3 | 2 | 4
| | 0 | zero | 3 | -3 | 2 | 4
| 1 | 4 | one | 3 | -3 | 5 | -5
| 2 | 3 | two | 3 | -3 | 5 | -5
| 3 | 2 | three | 3 | -3 | 5 | -5
| 4 | 1 | four | 3 | -3 | 5 | -5
| 5 | 0 | five | 3 | -3 | 5 | -5
| 6 | 6 | six | 3 | -3 | 5 | -5
| 7 | 7 | seven | 3 | -3 | 5 | -5
| 8 | 8 | eight | 3 | -3 | 5 | -5
| 0 | | zero | 3 | -3 | 5 | -5
| | | null | 3 | -3 | 5 | -5
| | 0 | zero | 3 | -3 | 5 | -5
| 1 | 4 | one | 3 | -3 | 5 | -5
| 2 | 3 | two | 3 | -3 | 5 | -5
| 3 | 2 | three | 3 | -3 | 5 | -5
| 4 | 1 | four | 3 | -3 | 5 | -5
| 5 | 0 | five | 3 | -3 | 5 | -5
| 6 | 6 | six | 3 | -3 | 5 | -5
| 7 | 7 | seven | 3 | -3 | 5 | -5
| 8 | 8 | eight | 3 | -3 | 5 | -5
| 0 | | zero | 3 | -3 | 5 | -5
| | | null | 3 | -3 | 5 | -5
| | 0 | zero | 3 | -3 | 5 | -5
| 1 | 4 | one | 3 | -3 | 0 |
| 2 | 3 | two | 3 | -3 | 0 |
| 3 | 2 | three | 3 | -3 | 0 |
| 4 | 1 | four | 3 | -3 | 0 |
| 5 | 0 | five | 3 | -3 | 0 |
| 6 | 6 | six | 3 | -3 | 0 |
| 7 | 7 | seven | 3 | -3 | 0 |
| 8 | 8 | eight | 3 | -3 | 0 |
| 0 | | zero | 3 | -3 | 0 |
| | | null | 3 | -3 | 0 |
| | 0 | zero | 3 | -3 | 0 |
| 1 | 4 | one | 3 | -3 | |
| 2 | 3 | two | 3 | -3 | |
| 3 | 2 | three | 3 | -3 | |
| 4 | 1 | four | 3 | -3 | |
| 5 | 0 | five | 3 | -3 | |
| 6 | 6 | six | 3 | -3 | |
| 7 | 7 | seven | 3 | -3 | |
| 8 | 8 | eight | 3 | -3 | |
| 0 | | zero | 3 | -3 | |
| | | null | 3 | -3 | |
| | 0 | zero | 3 | -3 | |
| 1 | 4 | one | 3 | -3 | | 0
| 2 | 3 | two | 3 | -3 | | 0
| 3 | 2 | three | 3 | -3 | | 0
| 4 | 1 | four | 3 | -3 | | 0
| 5 | 0 | five | 3 | -3 | | 0
| 6 | 6 | six | 3 | -3 | | 0
| 7 | 7 | seven | 3 | -3 | | 0
| 8 | 8 | eight | 3 | -3 | | 0
| 0 | | zero | 3 | -3 | | 0
| | | null | 3 | -3 | | 0
| | 0 | zero | 3 | -3 | | 0
| 1 | 4 | one | 2 | 4 | 1 | -1
| 2 | 3 | two | 2 | 4 | 1 | -1
| 3 | 2 | three | 2 | 4 | 1 | -1
| 4 | 1 | four | 2 | 4 | 1 | -1
| 5 | 0 | five | 2 | 4 | 1 | -1
| 6 | 6 | six | 2 | 4 | 1 | -1
| 7 | 7 | seven | 2 | 4 | 1 | -1
| 8 | 8 | eight | 2 | 4 | 1 | -1
| 0 | | zero | 2 | 4 | 1 | -1
| | | null | 2 | 4 | 1 | -1
| | 0 | zero | 2 | 4 | 1 | -1
| 1 | 4 | one | 2 | 4 | 2 | 2
| 2 | 3 | two | 2 | 4 | 2 | 2
| 3 | 2 | three | 2 | 4 | 2 | 2
| 4 | 1 | four | 2 | 4 | 2 | 2
| 5 | 0 | five | 2 | 4 | 2 | 2
| 6 | 6 | six | 2 | 4 | 2 | 2
| 7 | 7 | seven | 2 | 4 | 2 | 2
| 8 | 8 | eight | 2 | 4 | 2 | 2
| 0 | | zero | 2 | 4 | 2 | 2
| | | null | 2 | 4 | 2 | 2
| | 0 | zero | 2 | 4 | 2 | 2
| 1 | 4 | one | 2 | 4 | 3 | -3
| 2 | 3 | two | 2 | 4 | 3 | -3
| 3 | 2 | three | 2 | 4 | 3 | -3
| 4 | 1 | four | 2 | 4 | 3 | -3
| 5 | 0 | five | 2 | 4 | 3 | -3
| 6 | 6 | six | 2 | 4 | 3 | -3
| 7 | 7 | seven | 2 | 4 | 3 | -3
| 8 | 8 | eight | 2 | 4 | 3 | -3
| 0 | | zero | 2 | 4 | 3 | -3
| | | null | 2 | 4 | 3 | -3
| | 0 | zero | 2 | 4 | 3 | -3
| 1 | 4 | one | 2 | 4 | 2 | 4
| 2 | 3 | two | 2 | 4 | 2 | 4
| 3 | 2 | three | 2 | 4 | 2 | 4
| 4 | 1 | four | 2 | 4 | 2 | 4
| 5 | 0 | five | 2 | 4 | 2 | 4
| 6 | 6 | six | 2 | 4 | 2 | 4
| 7 | 7 | seven | 2 | 4 | 2 | 4
| 8 | 8 | eight | 2 | 4 | 2 | 4
| 0 | | zero | 2 | 4 | 2 | 4
| | | null | 2 | 4 | 2 | 4
| | 0 | zero | 2 | 4 | 2 | 4
| 1 | 4 | one | 2 | 4 | 5 | -5
| 2 | 3 | two | 2 | 4 | 5 | -5
| 3 | 2 | three | 2 | 4 | 5 | -5
| 4 | 1 | four | 2 | 4 | 5 | -5
| 5 | 0 | five | 2 | 4 | 5 | -5
| 6 | 6 | six | 2 | 4 | 5 | -5
| 7 | 7 | seven | 2 | 4 | 5 | -5
| 8 | 8 | eight | 2 | 4 | 5 | -5
| 0 | | zero | 2 | 4 | 5 | -5
| | | null | 2 | 4 | 5 | -5
| | 0 | zero | 2 | 4 | 5 | -5
| 1 | 4 | one | 2 | 4 | 5 | -5
| 2 | 3 | two | 2 | 4 | 5 | -5
| 3 | 2 | three | 2 | 4 | 5 | -5
| 4 | 1 | four | 2 | 4 | 5 | -5
| 5 | 0 | five | 2 | 4 | 5 | -5
| 6 | 6 | six | 2 | 4 | 5 | -5
| 7 | 7 | seven | 2 | 4 | 5 | -5
| 8 | 8 | eight | 2 | 4 | 5 | -5
| 0 | | zero | 2 | 4 | 5 | -5
| | | null | 2 | 4 | 5 | -5
| | 0 | zero | 2 | 4 | 5 | -5
| 1 | 4 | one | 2 | 4 | 0 |
| 2 | 3 | two | 2 | 4 | 0 |
| 3 | 2 | three | 2 | 4 | 0 |
| 4 | 1 | four | 2 | 4 | 0 |
| 5 | 0 | five | 2 | 4 | 0 |
| 6 | 6 | six | 2 | 4 | 0 |
| 7 | 7 | seven | 2 | 4 | 0 |
| 8 | 8 | eight | 2 | 4 | 0 |
| 0 | | zero | 2 | 4 | 0 |
| | | null | 2 | 4 | 0 |
| | 0 | zero | 2 | 4 | 0 |
| 1 | 4 | one | 2 | 4 | |
| 2 | 3 | two | 2 | 4 | |
| 3 | 2 | three | 2 | 4 | |
| 4 | 1 | four | 2 | 4 | |
| 5 | 0 | five | 2 | 4 | |
| 6 | 6 | six | 2 | 4 | |
| 7 | 7 | seven | 2 | 4 | |
| 8 | 8 | eight | 2 | 4 | |
| 0 | | zero | 2 | 4 | |
| | | null | 2 | 4 | |
| | 0 | zero | 2 | 4 | |
| 1 | 4 | one | 2 | 4 | | 0
| 2 | 3 | two | 2 | 4 | | 0
| 3 | 2 | three | 2 | 4 | | 0
| 4 | 1 | four | 2 | 4 | | 0
| 5 | 0 | five | 2 | 4 | | 0
| 6 | 6 | six | 2 | 4 | | 0
| 7 | 7 | seven | 2 | 4 | | 0
| 8 | 8 | eight | 2 | 4 | | 0
| 0 | | zero | 2 | 4 | | 0
| | | null | 2 | 4 | | 0
| | 0 | zero | 2 | 4 | | 0
| 1 | 4 | one | 5 | -5 | 1 | -1
| 2 | 3 | two | 5 | -5 | 1 | -1
| 3 | 2 | three | 5 | -5 | 1 | -1
| 4 | 1 | four | 5 | -5 | 1 | -1
| 5 | 0 | five | 5 | -5 | 1 | -1
| 6 | 6 | six | 5 | -5 | 1 | -1
| 7 | 7 | seven | 5 | -5 | 1 | -1
| 8 | 8 | eight | 5 | -5 | 1 | -1
| 0 | | zero | 5 | -5 | 1 | -1
| | | null | 5 | -5 | 1 | -1
| | 0 | zero | 5 | -5 | 1 | -1
| 1 | 4 | one | 5 | -5 | 2 | 2
| 2 | 3 | two | 5 | -5 | 2 | 2
| 3 | 2 | three | 5 | -5 | 2 | 2
| 4 | 1 | four | 5 | -5 | 2 | 2
| 5 | 0 | five | 5 | -5 | 2 | 2
| 6 | 6 | six | 5 | -5 | 2 | 2
| 7 | 7 | seven | 5 | -5 | 2 | 2
| 8 | 8 | eight | 5 | -5 | 2 | 2
| 0 | | zero | 5 | -5 | 2 | 2
| | | null | 5 | -5 | 2 | 2
| | 0 | zero | 5 | -5 | 2 | 2
| 1 | 4 | one | 5 | -5 | 3 | -3
| 2 | 3 | two | 5 | -5 | 3 | -3
| 3 | 2 | three | 5 | -5 | 3 | -3
| 4 | 1 | four | 5 | -5 | 3 | -3
| 5 | 0 | five | 5 | -5 | 3 | -3
| 6 | 6 | six | 5 | -5 | 3 | -3
| 7 | 7 | seven | 5 | -5 | 3 | -3
| 8 | 8 | eight | 5 | -5 | 3 | -3
| 0 | | zero | 5 | -5 | 3 | -3
| | | null | 5 | -5 | 3 | -3
| | 0 | zero | 5 | -5 | 3 | -3
| 1 | 4 | one | 5 | -5 | 2 | 4
| 2 | 3 | two | 5 | -5 | 2 | 4
| 3 | 2 | three | 5 | -5 | 2 | 4
| 4 | 1 | four | 5 | -5 | 2 | 4
| 5 | 0 | five | 5 | -5 | 2 | 4
| 6 | 6 | six | 5 | -5 | 2 | 4
| 7 | 7 | seven | 5 | -5 | 2 | 4
| 8 | 8 | eight | 5 | -5 | 2 | 4
| 0 | | zero | 5 | -5 | 2 | 4
| | | null | 5 | -5 | 2 | 4
| | 0 | zero | 5 | -5 | 2 | 4
| 1 | 4 | one | 5 | -5 | 5 | -5
| 2 | 3 | two | 5 | -5 | 5 | -5
| 3 | 2 | three | 5 | -5 | 5 | -5
| 4 | 1 | four | 5 | -5 | 5 | -5
| 5 | 0 | five | 5 | -5 | 5 | -5
| 6 | 6 | six | 5 | -5 | 5 | -5
| 7 | 7 | seven | 5 | -5 | 5 | -5
| 8 | 8 | eight | 5 | -5 | 5 | -5
| 0 | | zero | 5 | -5 | 5 | -5
| | | null | 5 | -5 | 5 | -5
| | 0 | zero | 5 | -5 | 5 | -5
| 1 | 4 | one | 5 | -5 | 5 | -5
| 2 | 3 | two | 5 | -5 | 5 | -5
| 3 | 2 | three | 5 | -5 | 5 | -5
| 4 | 1 | four | 5 | -5 | 5 | -5
| 5 | 0 | five | 5 | -5 | 5 | -5
| 6 | 6 | six | 5 | -5 | 5 | -5
| 7 | 7 | seven | 5 | -5 | 5 | -5
| 8 | 8 | eight | 5 | -5 | 5 | -5
| 0 | | zero | 5 | -5 | 5 | -5
| | | null | 5 | -5 | 5 | -5
| | 0 | zero | 5 | -5 | 5 | -5
| 1 | 4 | one | 5 | -5 | 0 |
| 2 | 3 | two | 5 | -5 | 0 |
| 3 | 2 | three | 5 | -5 | 0 |
| 4 | 1 | four | 5 | -5 | 0 |
| 5 | 0 | five | 5 | -5 | 0 |
| 6 | 6 | six | 5 | -5 | 0 |
| 7 | 7 | seven | 5 | -5 | 0 |
| 8 | 8 | eight | 5 | -5 | 0 |
| 0 | | zero | 5 | -5 | 0 |
| | | null | 5 | -5 | 0 |
| | 0 | zero | 5 | -5 | 0 |
| 1 | 4 | one | 5 | -5 | |
| 2 | 3 | two | 5 | -5 | |
| 3 | 2 | three | 5 | -5 | |
| 4 | 1 | four | 5 | -5 | |
| 5 | 0 | five | 5 | -5 | |
| 6 | 6 | six | 5 | -5 | |
| 7 | 7 | seven | 5 | -5 | |
| 8 | 8 | eight | 5 | -5 | |
| 0 | | zero | 5 | -5 | |
| | | null | 5 | -5 | |
| | 0 | zero | 5 | -5 | |
| 1 | 4 | one | 5 | -5 | | 0
| 2 | 3 | two | 5 | -5 | | 0
| 3 | 2 | three | 5 | -5 | | 0
| 4 | 1 | four | 5 | -5 | | 0
| 5 | 0 | five | 5 | -5 | | 0
| 6 | 6 | six | 5 | -5 | | 0
| 7 | 7 | seven | 5 | -5 | | 0
| 8 | 8 | eight | 5 | -5 | | 0
| 0 | | zero | 5 | -5 | | 0
| | | null | 5 | -5 | | 0
| | 0 | zero | 5 | -5 | | 0
| 1 | 4 | one | 5 | -5 | 1 | -1
| 2 | 3 | two | 5 | -5 | 1 | -1
| 3 | 2 | three | 5 | -5 | 1 | -1
| 4 | 1 | four | 5 | -5 | 1 | -1
| 5 | 0 | five | 5 | -5 | 1 | -1
| 6 | 6 | six | 5 | -5 | 1 | -1
| 7 | 7 | seven | 5 | -5 | 1 | -1
| 8 | 8 | eight | 5 | -5 | 1 | -1
| 0 | | zero | 5 | -5 | 1 | -1
| | | null | 5 | -5 | 1 | -1
| | 0 | zero | 5 | -5 | 1 | -1
| 1 | 4 | one | 5 | -5 | 2 | 2
| 2 | 3 | two | 5 | -5 | 2 | 2
| 3 | 2 | three | 5 | -5 | 2 | 2
| 4 | 1 | four | 5 | -5 | 2 | 2
| 5 | 0 | five | 5 | -5 | 2 | 2
| 6 | 6 | six | 5 | -5 | 2 | 2
| 7 | 7 | seven | 5 | -5 | 2 | 2
| 8 | 8 | eight | 5 | -5 | 2 | 2
| 0 | | zero | 5 | -5 | 2 | 2
| | | null | 5 | -5 | 2 | 2
| | 0 | zero | 5 | -5 | 2 | 2
| 1 | 4 | one | 5 | -5 | 3 | -3
| 2 | 3 | two | 5 | -5 | 3 | -3
| 3 | 2 | three | 5 | -5 | 3 | -3
| 4 | 1 | four | 5 | -5 | 3 | -3
| 5 | 0 | five | 5 | -5 | 3 | -3
| 6 | 6 | six | 5 | -5 | 3 | -3
| 7 | 7 | seven | 5 | -5 | 3 | -3
| 8 | 8 | eight | 5 | -5 | 3 | -3
| 0 | | zero | 5 | -5 | 3 | -3
| | | null | 5 | -5 | 3 | -3
| | 0 | zero | 5 | -5 | 3 | -3
| 1 | 4 | one | 5 | -5 | 2 | 4
| 2 | 3 | two | 5 | -5 | 2 | 4
| 3 | 2 | three | 5 | -5 | 2 | 4
| 4 | 1 | four | 5 | -5 | 2 | 4
| 5 | 0 | five | 5 | -5 | 2 | 4
| 6 | 6 | six | 5 | -5 | 2 | 4
| 7 | 7 | seven | 5 | -5 | 2 | 4
| 8 | 8 | eight | 5 | -5 | 2 | 4
| 0 | | zero | 5 | -5 | 2 | 4
| | | null | 5 | -5 | 2 | 4
| | 0 | zero | 5 | -5 | 2 | 4
| 1 | 4 | one | 5 | -5 | 5 | -5
| 2 | 3 | two | 5 | -5 | 5 | -5
| 3 | 2 | three | 5 | -5 | 5 | -5
| 4 | 1 | four | 5 | -5 | 5 | -5
| 5 | 0 | five | 5 | -5 | 5 | -5
| 6 | 6 | six | 5 | -5 | 5 | -5
| 7 | 7 | seven | 5 | -5 | 5 | -5
| 8 | 8 | eight | 5 | -5 | 5 | -5
| 0 | | zero | 5 | -5 | 5 | -5
| | | null | 5 | -5 | 5 | -5
| | 0 | zero | 5 | -5 | 5 | -5
| 1 | 4 | one | 5 | -5 | 5 | -5
| 2 | 3 | two | 5 | -5 | 5 | -5
| 3 | 2 | three | 5 | -5 | 5 | -5
| 4 | 1 | four | 5 | -5 | 5 | -5
| 5 | 0 | five | 5 | -5 | 5 | -5
| 6 | 6 | six | 5 | -5 | 5 | -5
| 7 | 7 | seven | 5 | -5 | 5 | -5
| 8 | 8 | eight | 5 | -5 | 5 | -5
| 0 | | zero | 5 | -5 | 5 | -5
| | | null | 5 | -5 | 5 | -5
| | 0 | zero | 5 | -5 | 5 | -5
| 1 | 4 | one | 5 | -5 | 0 |
| 2 | 3 | two | 5 | -5 | 0 |
| 3 | 2 | three | 5 | -5 | 0 |
| 4 | 1 | four | 5 | -5 | 0 |
| 5 | 0 | five | 5 | -5 | 0 |
| 6 | 6 | six | 5 | -5 | 0 |
| 7 | 7 | seven | 5 | -5 | 0 |
| 8 | 8 | eight | 5 | -5 | 0 |
| 0 | | zero | 5 | -5 | 0 |
| | | null | 5 | -5 | 0 |
| | 0 | zero | 5 | -5 | 0 |
| 1 | 4 | one | 5 | -5 | |
| 2 | 3 | two | 5 | -5 | |
| 3 | 2 | three | 5 | -5 | |
| 4 | 1 | four | 5 | -5 | |
| 5 | 0 | five | 5 | -5 | |
| 6 | 6 | six | 5 | -5 | |
| 7 | 7 | seven | 5 | -5 | |
| 8 | 8 | eight | 5 | -5 | |
| 0 | | zero | 5 | -5 | |
| | | null | 5 | -5 | |
| | 0 | zero | 5 | -5 | |
| 1 | 4 | one | 5 | -5 | | 0
| 2 | 3 | two | 5 | -5 | | 0
| 3 | 2 | three | 5 | -5 | | 0
| 4 | 1 | four | 5 | -5 | | 0
| 5 | 0 | five | 5 | -5 | | 0
| 6 | 6 | six | 5 | -5 | | 0
| 7 | 7 | seven | 5 | -5 | | 0
| 8 | 8 | eight | 5 | -5 | | 0
| 0 | | zero | 5 | -5 | | 0
| | | null | 5 | -5 | | 0
| | 0 | zero | 5 | -5 | | 0
| 1 | 4 | one | 0 | | 1 | -1
| 2 | 3 | two | 0 | | 1 | -1
| 3 | 2 | three | 0 | | 1 | -1
| 4 | 1 | four | 0 | | 1 | -1
| 5 | 0 | five | 0 | | 1 | -1
| 6 | 6 | six | 0 | | 1 | -1
| 7 | 7 | seven | 0 | | 1 | -1
| 8 | 8 | eight | 0 | | 1 | -1
| 0 | | zero | 0 | | 1 | -1
| | | null | 0 | | 1 | -1
| | 0 | zero | 0 | | 1 | -1
| 1 | 4 | one | 0 | | 2 | 2
| 2 | 3 | two | 0 | | 2 | 2
| 3 | 2 | three | 0 | | 2 | 2
| 4 | 1 | four | 0 | | 2 | 2
| 5 | 0 | five | 0 | | 2 | 2
| 6 | 6 | six | 0 | | 2 | 2
| 7 | 7 | seven | 0 | | 2 | 2
| 8 | 8 | eight | 0 | | 2 | 2
| 0 | | zero | 0 | | 2 | 2
| | | null | 0 | | 2 | 2
| | 0 | zero | 0 | | 2 | 2
| 1 | 4 | one | 0 | | 3 | -3
| 2 | 3 | two | 0 | | 3 | -3
| 3 | 2 | three | 0 | | 3 | -3
| 4 | 1 | four | 0 | | 3 | -3
| 5 | 0 | five | 0 | | 3 | -3
| 6 | 6 | six | 0 | | 3 | -3
| 7 | 7 | seven | 0 | | 3 | -3
| 8 | 8 | eight | 0 | | 3 | -3
| 0 | | zero | 0 | | 3 | -3
| | | null | 0 | | 3 | -3
| | 0 | zero | 0 | | 3 | -3
| 1 | 4 | one | 0 | | 2 | 4
| 2 | 3 | two | 0 | | 2 | 4
| 3 | 2 | three | 0 | | 2 | 4
| 4 | 1 | four | 0 | | 2 | 4
| 5 | 0 | five | 0 | | 2 | 4
| 6 | 6 | six | 0 | | 2 | 4
| 7 | 7 | seven | 0 | | 2 | 4
| 8 | 8 | eight | 0 | | 2 | 4
| 0 | | zero | 0 | | 2 | 4
| | | null | 0 | | 2 | 4
| | 0 | zero | 0 | | 2 | 4
| 1 | 4 | one | 0 | | 5 | -5
| 2 | 3 | two | 0 | | 5 | -5
| 3 | 2 | three | 0 | | 5 | -5
| 4 | 1 | four | 0 | | 5 | -5
| 5 | 0 | five | 0 | | 5 | -5
| 6 | 6 | six | 0 | | 5 | -5
| 7 | 7 | seven | 0 | | 5 | -5
| 8 | 8 | eight | 0 | | 5 | -5
| 0 | | zero | 0 | | 5 | -5
| | | null | 0 | | 5 | -5
| | 0 | zero | 0 | | 5 | -5
| 1 | 4 | one | 0 | | 5 | -5
| 2 | 3 | two | 0 | | 5 | -5
| 3 | 2 | three | 0 | | 5 | -5
| 4 | 1 | four | 0 | | 5 | -5
| 5 | 0 | five | 0 | | 5 | -5
| 6 | 6 | six | 0 | | 5 | -5
| 7 | 7 | seven | 0 | | 5 | -5
| 8 | 8 | eight | 0 | | 5 | -5
| 0 | | zero | 0 | | 5 | -5
| | | null | 0 | | 5 | -5
| | 0 | zero | 0 | | 5 | -5
| 1 | 4 | one | 0 | | 0 |
| 2 | 3 | two | 0 | | 0 |
| 3 | 2 | three | 0 | | 0 |
| 4 | 1 | four | 0 | | 0 |
| 5 | 0 | five | 0 | | 0 |
| 6 | 6 | six | 0 | | 0 |
| 7 | 7 | seven | 0 | | 0 |
| 8 | 8 | eight | 0 | | 0 |
| 0 | | zero | 0 | | 0 |
| | | null | 0 | | 0 |
| | 0 | zero | 0 | | 0 |
| 1 | 4 | one | 0 | | |
| 2 | 3 | two | 0 | | |
| 3 | 2 | three | 0 | | |
| 4 | 1 | four | 0 | | |
| 5 | 0 | five | 0 | | |
| 6 | 6 | six | 0 | | |
| 7 | 7 | seven | 0 | | |
| 8 | 8 | eight | 0 | | |
| 0 | | zero | 0 | | |
| | | null | 0 | | |
| | 0 | zero | 0 | | |
| 1 | 4 | one | 0 | | | 0
| 2 | 3 | two | 0 | | | 0
| 3 | 2 | three | 0 | | | 0
| 4 | 1 | four | 0 | | | 0
| 5 | 0 | five | 0 | | | 0
| 6 | 6 | six | 0 | | | 0
| 7 | 7 | seven | 0 | | | 0
| 8 | 8 | eight | 0 | | | 0
| 0 | | zero | 0 | | | 0
| | | null | 0 | | | 0
| | 0 | zero | 0 | | | 0
| 1 | 4 | one | | | 1 | -1
| 2 | 3 | two | | | 1 | -1
| 3 | 2 | three | | | 1 | -1
| 4 | 1 | four | | | 1 | -1
| 5 | 0 | five | | | 1 | -1
| 6 | 6 | six | | | 1 | -1
| 7 | 7 | seven | | | 1 | -1
| 8 | 8 | eight | | | 1 | -1
| 0 | | zero | | | 1 | -1
| | | null | | | 1 | -1
| | 0 | zero | | | 1 | -1
| 1 | 4 | one | | | 2 | 2
| 2 | 3 | two | | | 2 | 2
| 3 | 2 | three | | | 2 | 2
| 4 | 1 | four | | | 2 | 2
| 5 | 0 | five | | | 2 | 2
| 6 | 6 | six | | | 2 | 2
| 7 | 7 | seven | | | 2 | 2
| 8 | 8 | eight | | | 2 | 2
| 0 | | zero | | | 2 | 2
| | | null | | | 2 | 2
| | 0 | zero | | | 2 | 2
| 1 | 4 | one | | | 3 | -3
| 2 | 3 | two | | | 3 | -3
| 3 | 2 | three | | | 3 | -3
| 4 | 1 | four | | | 3 | -3
| 5 | 0 | five | | | 3 | -3
| 6 | 6 | six | | | 3 | -3
| 7 | 7 | seven | | | 3 | -3
| 8 | 8 | eight | | | 3 | -3
| 0 | | zero | | | 3 | -3
| | | null | | | 3 | -3
| | 0 | zero | | | 3 | -3
| 1 | 4 | one | | | 2 | 4
| 2 | 3 | two | | | 2 | 4
| 3 | 2 | three | | | 2 | 4
| 4 | 1 | four | | | 2 | 4
| 5 | 0 | five | | | 2 | 4
| 6 | 6 | six | | | 2 | 4
| 7 | 7 | seven | | | 2 | 4
| 8 | 8 | eight | | | 2 | 4
| 0 | | zero | | | 2 | 4
| | | null | | | 2 | 4
| | 0 | zero | | | 2 | 4
| 1 | 4 | one | | | 5 | -5
| 2 | 3 | two | | | 5 | -5
| 3 | 2 | three | | | 5 | -5
| 4 | 1 | four | | | 5 | -5
| 5 | 0 | five | | | 5 | -5
| 6 | 6 | six | | | 5 | -5
| 7 | 7 | seven | | | 5 | -5
| 8 | 8 | eight | | | 5 | -5
| 0 | | zero | | | 5 | -5
| | | null | | | 5 | -5
| | 0 | zero | | | 5 | -5
| 1 | 4 | one | | | 5 | -5
| 2 | 3 | two | | | 5 | -5
| 3 | 2 | three | | | 5 | -5
| 4 | 1 | four | | | 5 | -5
| 5 | 0 | five | | | 5 | -5
| 6 | 6 | six | | | 5 | -5
| 7 | 7 | seven | | | 5 | -5
| 8 | 8 | eight | | | 5 | -5
| 0 | | zero | | | 5 | -5
| | | null | | | 5 | -5
| | 0 | zero | | | 5 | -5
| 1 | 4 | one | | | 0 |
| 2 | 3 | two | | | 0 |
| 3 | 2 | three | | | 0 |
| 4 | 1 | four | | | 0 |
| 5 | 0 | five | | | 0 |
| 6 | 6 | six | | | 0 |
| 7 | 7 | seven | | | 0 |
| 8 | 8 | eight | | | 0 |
| 0 | | zero | | | 0 |
| | | null | | | 0 |
| | 0 | zero | | | 0 |
| 1 | 4 | one | | | |
| 2 | 3 | two | | | |
| 3 | 2 | three | | | |
| 4 | 1 | four | | | |
| 5 | 0 | five | | | |
| 6 | 6 | six | | | |
| 7 | 7 | seven | | | |
| 8 | 8 | eight | | | |
| 0 | | zero | | | |
| | | null | | | |
| | 0 | zero | | | |
| 1 | 4 | one | | | | 0
| 2 | 3 | two | | | | 0
| 3 | 2 | three | | | | 0
| 4 | 1 | four | | | | 0
| 5 | 0 | five | | | | 0
| 6 | 6 | six | | | | 0
| 7 | 7 | seven | | | | 0
| 8 | 8 | eight | | | | 0
| 0 | | zero | | | | 0
| | | null | | | | 0
| | 0 | zero | | | | 0
| 1 | 4 | one | | 0 | 1 | -1
| 2 | 3 | two | | 0 | 1 | -1
| 3 | 2 | three | | 0 | 1 | -1
| 4 | 1 | four | | 0 | 1 | -1
| 5 | 0 | five | | 0 | 1 | -1
| 6 | 6 | six | | 0 | 1 | -1
| 7 | 7 | seven | | 0 | 1 | -1
| 8 | 8 | eight | | 0 | 1 | -1
| 0 | | zero | | 0 | 1 | -1
| | | null | | 0 | 1 | -1
| | 0 | zero | | 0 | 1 | -1
| 1 | 4 | one | | 0 | 2 | 2
| 2 | 3 | two | | 0 | 2 | 2
| 3 | 2 | three | | 0 | 2 | 2
| 4 | 1 | four | | 0 | 2 | 2
| 5 | 0 | five | | 0 | 2 | 2
| 6 | 6 | six | | 0 | 2 | 2
| 7 | 7 | seven | | 0 | 2 | 2
| 8 | 8 | eight | | 0 | 2 | 2
| 0 | | zero | | 0 | 2 | 2
| | | null | | 0 | 2 | 2
| | 0 | zero | | 0 | 2 | 2
| 1 | 4 | one | | 0 | 3 | -3
| 2 | 3 | two | | 0 | 3 | -3
| 3 | 2 | three | | 0 | 3 | -3
| 4 | 1 | four | | 0 | 3 | -3
| 5 | 0 | five | | 0 | 3 | -3
| 6 | 6 | six | | 0 | 3 | -3
| 7 | 7 | seven | | 0 | 3 | -3
| 8 | 8 | eight | | 0 | 3 | -3
| 0 | | zero | | 0 | 3 | -3
| | | null | | 0 | 3 | -3
| | 0 | zero | | 0 | 3 | -3
| 1 | 4 | one | | 0 | 2 | 4
| 2 | 3 | two | | 0 | 2 | 4
| 3 | 2 | three | | 0 | 2 | 4
| 4 | 1 | four | | 0 | 2 | 4
| 5 | 0 | five | | 0 | 2 | 4
| 6 | 6 | six | | 0 | 2 | 4
| 7 | 7 | seven | | 0 | 2 | 4
| 8 | 8 | eight | | 0 | 2 | 4
| 0 | | zero | | 0 | 2 | 4
| | | null | | 0 | 2 | 4
| | 0 | zero | | 0 | 2 | 4
| 1 | 4 | one | | 0 | 5 | -5
| 2 | 3 | two | | 0 | 5 | -5
| 3 | 2 | three | | 0 | 5 | -5
| 4 | 1 | four | | 0 | 5 | -5
| 5 | 0 | five | | 0 | 5 | -5
| 6 | 6 | six | | 0 | 5 | -5
| 7 | 7 | seven | | 0 | 5 | -5
| 8 | 8 | eight | | 0 | 5 | -5
| 0 | | zero | | 0 | 5 | -5
| | | null | | 0 | 5 | -5
| | 0 | zero | | 0 | 5 | -5
| 1 | 4 | one | | 0 | 5 | -5
| 2 | 3 | two | | 0 | 5 | -5
| 3 | 2 | three | | 0 | 5 | -5
| 4 | 1 | four | | 0 | 5 | -5
| 5 | 0 | five | | 0 | 5 | -5
| 6 | 6 | six | | 0 | 5 | -5
| 7 | 7 | seven | | 0 | 5 | -5
| 8 | 8 | eight | | 0 | 5 | -5
| 0 | | zero | | 0 | 5 | -5
| | | null | | 0 | 5 | -5
| | 0 | zero | | 0 | 5 | -5
| 1 | 4 | one | | 0 | 0 |
| 2 | 3 | two | | 0 | 0 |
| 3 | 2 | three | | 0 | 0 |
| 4 | 1 | four | | 0 | 0 |
| 5 | 0 | five | | 0 | 0 |
| 6 | 6 | six | | 0 | 0 |
| 7 | 7 | seven | | 0 | 0 |
| 8 | 8 | eight | | 0 | 0 |
| 0 | | zero | | 0 | 0 |
| | | null | | 0 | 0 |
| | 0 | zero | | 0 | 0 |
| 1 | 4 | one | | 0 | |
| 2 | 3 | two | | 0 | |
| 3 | 2 | three | | 0 | |
| 4 | 1 | four | | 0 | |
| 5 | 0 | five | | 0 | |
| 6 | 6 | six | | 0 | |
| 7 | 7 | seven | | 0 | |
| 8 | 8 | eight | | 0 | |
| 0 | | zero | | 0 | |
| | | null | | 0 | |
| | 0 | zero | | 0 | |
| 1 | 4 | one | | 0 | | 0
| 2 | 3 | two | | 0 | | 0
| 3 | 2 | three | | 0 | | 0
| 4 | 1 | four | | 0 | | 0
| 5 | 0 | five | | 0 | | 0
| 6 | 6 | six | | 0 | | 0
| 7 | 7 | seven | | 0 | | 0
| 8 | 8 | eight | | 0 | | 0
| 0 | | zero | | 0 | | 0
| | | null | | 0 | | 0
| | 0 | zero | | 0 | | 0
(891 rows)
--
--
-- Inner joins (equi-joins)
--
--
--
-- Inner joins (equi-joins) with USING clause
-- The USING syntax changes the shape of the resulting table
-- 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);
xxx | i | j | t | k
-----+---+---+-------+----
| 0 | | zero |
| 1 | 4 | one | -1
| 2 | 3 | two | 2
| 2 | 3 | two | 4
| 3 | 2 | three | -3
| 5 | 0 | five | -5
| 5 | 0 | five | -5
(7 rows)
-- Same as above, slightly different syntax
SELECT '' AS "xxx", *
FROM J1_TBL JOIN J2_TBL USING (i);
xxx | i | j | t | k
-----+---+---+-------+----
| 0 | | zero |
| 1 | 4 | one | -1
| 2 | 3 | two | 2
| 2 | 3 | two | 4
| 3 | 2 | three | -3
| 5 | 0 | five | -5
| 5 | 0 | five | -5
(7 rows)
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c) JOIN J2_TBL t2 (a, d) USING (a)
ORDER BY a, d;
xxx | a | b | c | d
-----+---+---+-------+----
| 0 | | zero |
| 1 | 4 | one | -1
| 2 | 3 | two | 2
| 2 | 3 | two | 4
| 3 | 2 | three | -3
| 5 | 0 | five | -5
| 5 | 0 | five | -5
(7 rows)
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c) JOIN J2_TBL t2 (a, b) USING (b)
ORDER BY b, t1.a;
xxx | b | a | c | a
-----+---+---+-------+---
| 0 | 5 | five |
| 0 | | zero |
| 2 | 3 | three | 2
| 4 | 1 | one | 2
(4 rows)
--
-- 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
-----+---+---+-------+----
| 0 | | zero |
| 1 | 4 | one | -1
| 2 | 3 | two | 2
| 2 | 3 | two | 4
| 3 | 2 | three | -3
| 5 | 0 | five | -5
| 5 | 0 | five | -5
(7 rows)
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (a, d);
xxx | a | b | c | d
-----+---+---+-------+----
| 0 | | zero |
| 1 | 4 | one | -1
| 2 | 3 | two | 2
| 2 | 3 | two | 4
| 3 | 2 | three | -3
| 5 | 0 | five | -5
| 5 | 0 | five | -5
(7 rows)
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (d, a);
xxx | a | b | c | d
-----+---+---+------+---
| 0 | | zero |
| 2 | 3 | two | 2
| 4 | 1 | four | 2
(3 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
-----+---+---+-------+----
| 0 | | zero |
| 1 | 4 | one | -1
| 2 | 3 | two | 2
| 2 | 3 | two | 4
| 3 | 2 | three | -3
| 5 | 0 | five | -5
| 5 | 0 | five | -5
(7 rows)
--
-- Inner joins (equi-joins)
--
SELECT '' AS "xxx", *
FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.i);
xxx | i | j | t | i | k
-----+---+---+-------+---+----
| 0 | | zero | 0 |
| 1 | 4 | one | 1 | -1
| 2 | 3 | two | 2 | 2
| 2 | 3 | two | 2 | 4
| 3 | 2 | three | 3 | -3
| 5 | 0 | five | 5 | -5
| 5 | 0 | five | 5 | -5
(7 rows)
SELECT '' AS "xxx", *
FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.k);
xxx | i | j | t | i | k
-----+---+---+------+---+---
| 0 | | zero | | 0
| 2 | 3 | two | 2 | 2
| 4 | 1 | four | 2 | 4
(3 rows)
--
-- Non-equi-joins
--
SELECT '' AS "xxx", *
FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i <= J2_TBL.k);
xxx | i | j | t | i | k
-----+---+---+-------+---+---
| 1 | 4 | one | 2 | 2
| 2 | 3 | two | 2 | 2
| 0 | | zero | 2 | 2
| 1 | 4 | one | 2 | 4
| 2 | 3 | two | 2 | 4
| 3 | 2 | three | 2 | 4
| 4 | 1 | four | 2 | 4
| 0 | | zero | 2 | 4
| 0 | | zero | | 0
(9 rows)
--
-- Outer joins
-- Note that OUTER is a noise word
--
SELECT '' AS "xxx", *
FROM J1_TBL LEFT OUTER JOIN J2_TBL USING (i)
ORDER BY i, k, t;
xxx | i | j | t | k
-----+---+---+-------+----
| 0 | | zero |
| 1 | 4 | one | -1
| 2 | 3 | two | 2
| 2 | 3 | two | 4
| 3 | 2 | three | -3
| 4 | 1 | four |
| 5 | 0 | five | -5
| 5 | 0 | five | -5
| 6 | 6 | six |
| 7 | 7 | seven |
| 8 | 8 | eight |
| | | null |
| | 0 | zero |
(13 rows)
SELECT '' AS "xxx", *
FROM J1_TBL LEFT JOIN J2_TBL USING (i)
ORDER BY i, k, t;
xxx | i | j | t | k
-----+---+---+-------+----
| 0 | | zero |
| 1 | 4 | one | -1
| 2 | 3 | two | 2
| 2 | 3 | two | 4
| 3 | 2 | three | -3
| 4 | 1 | four |
| 5 | 0 | five | -5
| 5 | 0 | five | -5
| 6 | 6 | six |
| 7 | 7 | seven |
| 8 | 8 | eight |
| | | null |
| | 0 | zero |
(13 rows)
SELECT '' AS "xxx", *
FROM J1_TBL RIGHT OUTER JOIN J2_TBL USING (i);
xxx | i | j | t | k
-----+---+---+-------+----
| 0 | | zero |
| 1 | 4 | one | -1
| 2 | 3 | two | 2
| 2 | 3 | two | 4
| 3 | 2 | three | -3
| 5 | 0 | five | -5
| 5 | 0 | five | -5
| | | |
| | | | 0
(9 rows)
SELECT '' AS "xxx", *
FROM J1_TBL RIGHT JOIN J2_TBL USING (i);
xxx | i | j | t | k
-----+---+---+-------+----
| 0 | | zero |
| 1 | 4 | one | -1
| 2 | 3 | two | 2
| 2 | 3 | two | 4
| 3 | 2 | three | -3
| 5 | 0 | five | -5
| 5 | 0 | five | -5
| | | |
| | | | 0
(9 rows)
SELECT '' AS "xxx", *
FROM J1_TBL FULL OUTER JOIN J2_TBL USING (i)
ORDER BY i, k, t;
xxx | i | j | t | k
-----+---+---+-------+----
| 0 | | zero |
| 1 | 4 | one | -1
| 2 | 3 | two | 2
| 2 | 3 | two | 4
| 3 | 2 | three | -3
| 4 | 1 | four |
| 5 | 0 | five | -5
| 5 | 0 | five | -5
| 6 | 6 | six |
| 7 | 7 | seven |
| 8 | 8 | eight |
| | | | 0
| | | null |
| | 0 | zero |
| | | |
(15 rows)
SELECT '' AS "xxx", *
FROM J1_TBL FULL JOIN J2_TBL USING (i)
ORDER BY i, k, t;
xxx | i | j | t | k
-----+---+---+-------+----
| 0 | | zero |
| 1 | 4 | one | -1
| 2 | 3 | two | 2
| 2 | 3 | two | 4
| 3 | 2 | three | -3
| 4 | 1 | four |
| 5 | 0 | five | -5
| 5 | 0 | five | -5
| 6 | 6 | six |
| 7 | 7 | seven |
| 8 | 8 | eight |
| | | | 0
| | | null |
| | 0 | zero |
| | | |
(15 rows)
SELECT '' AS "xxx", *
FROM J1_TBL LEFT JOIN J2_TBL USING (i) WHERE (k = 1);
xxx | i | j | t | k
-----+---+---+---+---
(0 rows)
SELECT '' AS "xxx", *
FROM J1_TBL LEFT JOIN J2_TBL USING (i) WHERE (i = 1);
xxx | i | j | t | k
-----+---+---+-----+----
| 1 | 4 | one | -1
(1 row)
--
-- More complicated constructs
--
-- UNION JOIN isn't implemented yet
SELECT '' AS "xxx", *
FROM J1_TBL UNION JOIN J2_TBL;
ERROR: UNION JOIN is not implemented
--
-- Multiway full join
--
CREATE TABLE t1 (name TEXT, n INTEGER);
CREATE TABLE t2 (name TEXT, n INTEGER);
CREATE TABLE t3 (name TEXT, n INTEGER);
INSERT INTO t1 VALUES ( 'aa', 11 );
INSERT INTO t2 VALUES ( 'aa', 12 );
INSERT INTO t2 VALUES ( 'bb', 22 );
INSERT INTO t2 VALUES ( 'dd', 42 );
INSERT INTO t3 VALUES ( 'aa', 13 );
INSERT INTO t3 VALUES ( 'bb', 23 );
INSERT INTO t3 VALUES ( 'cc', 33 );
SELECT * FROM t1 FULL JOIN t2 USING (name) FULL JOIN t3 USING (name);
name | n | n | n
------+----+----+----
aa | 11 | 12 | 13
bb | | 22 | 23
cc | | | 33
dd | | 42 |
(4 rows)
--
-- Test interactions of join syntax and subqueries
--
-- Basic cases (we expect planner to pull up the subquery here)
SELECT * FROM
(SELECT * FROM t2) as s2
INNER JOIN
(SELECT * FROM t3) s3
USING (name);
name | n | n
------+----+----
aa | 12 | 13
bb | 22 | 23
(2 rows)
SELECT * FROM
(SELECT * FROM t2) as s2
LEFT JOIN
(SELECT * FROM t3) s3
USING (name);
name | n | n
------+----+----
aa | 12 | 13
bb | 22 | 23
dd | 42 |
(3 rows)
SELECT * FROM
(SELECT * FROM t2) as s2
FULL JOIN
(SELECT * FROM t3) s3
USING (name);
name | n | n
------+----+----
aa | 12 | 13
bb | 22 | 23
cc | | 33
dd | 42 |
(4 rows)
-- Cases with non-nullable expressions in subquery results;
-- make sure these go to null as expected
SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2
NATURAL INNER JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t3) s3;
name | s2_n | s2_2 | s3_n | s3_2
------+------+------+------+------
aa | 12 | 2 | 13 | 3
bb | 22 | 2 | 23 | 3
(2 rows)
SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2
NATURAL LEFT JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t3) s3;
name | s2_n | s2_2 | s3_n | s3_2
------+------+------+------+------
aa | 12 | 2 | 13 | 3
bb | 22 | 2 | 23 | 3
dd | 42 | 2 | |
(3 rows)
SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t3) s3;
name | s2_n | s2_2 | s3_n | s3_2
------+------+------+------+------
aa | 12 | 2 | 13 | 3
bb | 22 | 2 | 23 | 3
cc | | | 33 | 3
dd | 42 | 2 | |
(4 rows)
SELECT * FROM
(SELECT name, n as s1_n, 1 as s1_1 FROM t1) as s1
NATURAL INNER JOIN
(SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2
NATURAL INNER JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t3) s3;
name | s1_n | s1_1 | s2_n | s2_2 | s3_n | s3_2
------+------+------+------+------+------+------
aa | 11 | 1 | 12 | 2 | 13 | 3
(1 row)
SELECT * FROM
(SELECT name, n as s1_n, 1 as s1_1 FROM t1) as s1
NATURAL FULL JOIN
(SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t3) s3;
name | s1_n | s1_1 | s2_n | s2_2 | s3_n | s3_2
------+------+------+------+------+------+------
aa | 11 | 1 | 12 | 2 | 13 | 3
bb | | | 22 | 2 | 23 | 3
cc | | | | | 33 | 3
dd | | | 42 | 2 | |
(4 rows)
SELECT * FROM
(SELECT name, n as s1_n FROM t1) as s1
NATURAL FULL JOIN
(SELECT * FROM
(SELECT name, n as s2_n FROM t2) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n FROM t3) as s3
) ss2;
name | s1_n | s2_n | s3_n
------+------+------+------
aa | 11 | 12 | 13
bb | | 22 | 23
cc | | | 33
dd | | 42 |
(4 rows)
SELECT * FROM
(SELECT name, n as s1_n FROM t1) as s1
NATURAL FULL JOIN
(SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t2) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n FROM t3) as s3
) ss2;
name | s1_n | s2_n | s2_2 | s3_n
------+------+------+------+------
aa | 11 | 12 | 2 | 13
bb | | 22 | 2 | 23
cc | | | | 33
dd | | 42 | 2 |
(4 rows)
-- Test for propagation of nullability constraints into sub-joins
create temp table x (x1 int, x2 int);
insert into x values (1,11);
insert into x values (2,22);
insert into x values (3,null);
insert into x values (4,44);
insert into x values (5,null);
create temp table y (y1 int, y2 int);
insert into y values (1,111);
insert into y values (2,222);
insert into y values (3,333);
insert into y values (4,null);
select * from x;
x1 | x2
----+----
1 | 11
2 | 22
3 |
4 | 44
5 |
(5 rows)
select * from y;
y1 | y2
----+-----
1 | 111
2 | 222
3 | 333
4 |
(4 rows)
select * from x left join y on (x1 = y1 and x2 is not null);
x1 | x2 | y1 | y2
----+----+----+-----
1 | 11 | 1 | 111
2 | 22 | 2 | 222
3 | | |
4 | 44 | 4 |
5 | | |
(5 rows)
select * from x left join y on (x1 = y1 and y2 is not null);
x1 | x2 | y1 | y2
----+----+----+-----
1 | 11 | 1 | 111
2 | 22 | 2 | 222
3 | | 3 | 333
4 | 44 | |
5 | | |
(5 rows)
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1);
x1 | x2 | y1 | y2 | xx1 | xx2
----+----+----+-----+-----+-----
1 | 11 | 1 | 111 | 1 | 11
2 | 22 | 2 | 222 | 2 | 22
3 | | 3 | 333 | 3 |
4 | 44 | 4 | | 4 | 44
5 | | | | 5 |
(5 rows)
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1 and x2 is not null);
x1 | x2 | y1 | y2 | xx1 | xx2
----+----+----+-----+-----+-----
1 | 11 | 1 | 111 | 1 | 11
2 | 22 | 2 | 222 | 2 | 22
3 | | 3 | 333 | |
4 | 44 | 4 | | 4 | 44
5 | | | | |
(5 rows)
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1 and y2 is not null);
x1 | x2 | y1 | y2 | xx1 | xx2
----+----+----+-----+-----+-----
1 | 11 | 1 | 111 | 1 | 11
2 | 22 | 2 | 222 | 2 | 22
3 | | 3 | 333 | 3 |
4 | 44 | 4 | | |
5 | | | | |
(5 rows)
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1 and xx2 is not null);
x1 | x2 | y1 | y2 | xx1 | xx2
----+----+----+-----+-----+-----
1 | 11 | 1 | 111 | 1 | 11
2 | 22 | 2 | 222 | 2 | 22
3 | | 3 | 333 | |
4 | 44 | 4 | | 4 | 44
5 | | | | |
(5 rows)
-- these should NOT give the same answers as above
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1) where (x2 is not null);
x1 | x2 | y1 | y2 | xx1 | xx2
----+----+----+-----+-----+-----
1 | 11 | 1 | 111 | 1 | 11
2 | 22 | 2 | 222 | 2 | 22
4 | 44 | 4 | | 4 | 44
(3 rows)
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1) where (y2 is not null);
x1 | x2 | y1 | y2 | xx1 | xx2
----+----+----+-----+-----+-----
1 | 11 | 1 | 111 | 1 | 11
2 | 22 | 2 | 222 | 2 | 22
3 | | 3 | 333 | 3 |
(3 rows)
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1) where (xx2 is not null);
x1 | x2 | y1 | y2 | xx1 | xx2
----+----+----+-----+-----+-----
1 | 11 | 1 | 111 | 1 | 11
2 | 22 | 2 | 222 | 2 | 22
4 | 44 | 4 | | 4 | 44
(3 rows)
--
-- regression test: check for bug with propagation of implied equality
-- to outside an IN
--
select count(*) from tenk1 a where unique1 in
(select unique1 from tenk1 b join tenk1 c using (unique1)
where b.unique2 = 42);
count
-------
1
(1 row)
--
-- Clean up
--
DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;
DROP TABLE J1_TBL;
DROP TABLE J2_TBL;
-- Both DELETE and UPDATE allow the specification of additional tables
-- to "join" against to determine which rows should be modified.
CREATE TEMP TABLE t1 (a int, b int);
CREATE TEMP TABLE t2 (a int, b int);
CREATE TEMP TABLE t3 (x int, y int);
INSERT INTO t1 VALUES (5, 10);
INSERT INTO t1 VALUES (15, 20);
INSERT INTO t1 VALUES (100, 100);
INSERT INTO t1 VALUES (200, 1000);
INSERT INTO t2 VALUES (200, 2000);
INSERT INTO t3 VALUES (5, 20);
INSERT INTO t3 VALUES (6, 7);
INSERT INTO t3 VALUES (7, 8);
INSERT INTO t3 VALUES (500, 100);
DELETE FROM t3 USING t1 table1 WHERE t3.x = table1.a;
SELECT * FROM t3;
x | y
-----+-----
6 | 7
7 | 8
500 | 100
(3 rows)
DELETE FROM t3 USING t1 JOIN t2 USING (a) WHERE t3.x > t1.a;
SELECT * FROM t3;
x | y
---+---
6 | 7
7 | 8
(2 rows)
DELETE FROM t3 USING t3 t3_other WHERE t3.x = t3_other.x AND t3.y = t3_other.y;
SELECT * FROM t3;
x | y
---+---
(0 rows)