#
# WL#10358 Implement table value constructors: VALUES.
#
# Allowed:
with VALUES for a
# clause.
VALUES ROW(1, 10);
column_0 column_1
1 10
VALUES ROW(1, 10), ROW(2, 20);
column_0 column_1
1 10
2 20
# Allowed: Table value constructor inside a subquery.
SELECT * FROM (VALUES ROW(1, 10)) AS dt;
column_0 column_1
1 10
SELECT * FROM (VALUES ROW(1, 10), ROW(2, 20)) AS dt;
column_0 column_1
1 10
2 20
# Allowed: Both old and new syntax for INSERT statements.
CREATE TABLE t0(a INT, b INT);
INSERT INTO t0 VALUES(1, 10);
INSERT INTO t0 VALUES ROW(2, 20), ROW(3, 30);
SELECT * FROM t0;
a b
1 10
2 20
3 30
DELETE FROM t0;
# Not allowed: Row value expressions of different degree.
VALUES ROW(1, 10), ROW(2);
ERROR 21S01: Column count doesn't match value count at row 2
VALUES ROW(1), ROW(2, 20);
ERROR 21S01: Column count doesn't match value count at row 2
# Allowed: Explicit table clause. Equivalent to SELECT * FROM table_name.
INSERT INTO t0 VALUES(1, 10);
TABLE t0;
a b
1 10
SELECT * FROM (TABLE t0) AS dt;
a b
1 10
DELETE FROM t0;
# Allowed: Using table value constructors with JOIN.
INSERT INTO t0 VALUES(1, 10);
SELECT * FROM t0 JOIN (VALUES ROW(2, 20)) AS dt;
a b column_0 column_1
1 10 2 20
SELECT * FROM t0 JOIN (VALUES ROW(2, 20), ROW(3, 30)) AS dt;
a b column_0 column_1
1 10 2 20
1 10 3 30
SELECT * FROM t0
LEFT JOIN (VALUES ROW(2, 20), ROW(3, 30)) AS dt
ON t0.a = dt.column_0;
a b column_0 column_1
1 10 NULL NULL
SELECT * FROM t0
LEFT JOIN (VALUES ROW(1, 20), ROW(1, 30)) AS dt
ON t0.a = dt.column_0;
a b column_0 column_1
1 10 1 20
1 10 1 30
SELECT * FROM t0
RIGHT JOIN (VALUES ROW(2, 20), ROW(3, 30)) AS dt
ON t0.a = dt.column_0;
a b column_0 column_1
NULL NULL 2 20
NULL NULL 3 30
SELECT * FROM t0
RIGHT JOIN (VALUES ROW(1, 20), ROW(1, 30)) AS dt
ON t0.a = dt.column_0;
a b column_0 column_1
1 10 1 20
1 10 1 30
SELECT * FROM (VALUES ROW(1), ROW(2)) AS dt0
NATURAL JOIN (VALUES ROW(1, 10), ROW(2, 20)) AS dt1;
column_0 column_1
1 10
2 20
SELECT * FROM (VALUES ROW(1), ROW(2)) AS dt0
NATURAL JOIN (VALUES ROW(1, 10), ROW(1, 20)) AS dt1;
column_0 column_1
1 10
1 20
DELETE FROM t0;
# Allowed: Using table value constructors with UNION.
VALUES ROW(1) UNION SELECT 2;
column_0
1
2
VALUES ROW(1, 10) UNION SELECT 2, 20;
column_0 column_1
1 10
2 20
# Allowed: Scalar subquery as table value constructor value.
VALUES ROW((SELECT 1), 10);
column_0 column_1
1 10
# Allowed: Aggregation of types in table values constructor rows.
VALUES ROW(1, 10), ROW(2, "20");
column_0 column_1
1 10
2 20
# Allowed: Creating tables from aggregated types.
CREATE TABLE t AS VALUES ROW(1, 1.0, 1.0e0, DATE '2000-01-01', TIME '00:00:00',
"1", POINT(1, 1), JSON_ARRAY('[1, "2"]'));
DESC t;
Field Type Null Key Default Extra
column_0 int NO 0
column_1 decimal(2,1) NO 0.0
column_2 double NO 0
column_3 date NO NULL
column_4 time NO 00:00:00
column_5 varchar(1) NO
column_6 point YES NULL
column_7 json YES NULL
DROP TABLE t;
CREATE TABLE t AS VALUES ROW(1, 1, 1, 1, 1, 1, 1, 1),
ROW(1, 1.0, 1.0e0, DATE '2000-01-01', TIME '00:00:00',
"1", POINT(1, 1), JSON_ARRAY('[1, "2"]'));
DESC t;
Field Type Null Key Default Extra
column_0 bigint NO 0
column_1 decimal(2,1) NO 0.0
column_2 double NO 0
column_3 varchar(10) NO
column_4 varchar(10) NO
column_5 varchar(2) NO
column_6 longblob YES NULL
column_7 longtext YES NULL
DROP TABLE t;
# Allowed: Aggregation of types in table value constructor used in UNION.
SELECT * FROM (VALUES ROW(1, 10), ROW(2, "20") UNION SELECT 3, 30) AS dt;
column_0 column_1
1 10
2 20
3 30
# Note: Here the columns are named from the first SELECT instead.
SELECT * FROM (SELECT 1, 10 UNION VALUES ROW(2, 20), ROW(3, "30")) AS dt;
1 10
1 10
2 20
3 30
# Allowed: Reference an inner table in subqueries within rows.
INSERT INTO t0 VALUES(1, 10);
VALUES ROW((SELECT a FROM t0), 10);
column_0 column_1
1 10
DELETE FROM t0;
# Allowed: Use table value constructor for subquery predicates.
INSERT INTO t0 VALUES(1, 10), (2, 20);
SELECT * FROM t0 WHERE a IN (VALUES ROW(1));
a b
1 10
SELECT * FROM t0 WHERE a IN (VALUES ROW(1), ROW(2));
a b
1 10
2 20
SELECT * FROM t0 WHERE (a, b) IN (VALUES ROW(1, 10));
a b
1 10
SELECT * FROM t0 WHERE (a, b) IN (VALUES ROW(1, 10), ROW(2, 20));
a b
1 10
2 20
SELECT * FROM t0 WHERE a NOT IN (VALUES ROW(1));
a b
2 20
SELECT * FROM t0 WHERE a NOT IN (VALUES ROW(1), ROW(2));
a b
SELECT * FROM t0 WHERE (a, b) NOT IN (VALUES ROW(1, 10));
a b
2 20
SELECT * FROM t0 WHERE (a, b) NOT IN (VALUES ROW(1, 10), ROW(2, 20));
a b
SELECT * FROM t0 WHERE a >ALL (VALUES ROW(1));
a b
2 20
SELECT * FROM t0 WHERE a >ALL (VALUES ROW(1), ROW(2));
a b
SELECT * FROM t0 WHERE a (ARG)' FAILED.
#
CREATE TABLE t1(a INT);
CREATE VIEW v1 AS SELECT a FROM t1;
INSERT INTO v1 VALUES() AS c(a);
INSERT INTO v1 VALUES(5) AS c(a);
SELECT * FROM v1;
a
NULL
5
DROP VIEW v1;
DROP TABLE t1;