#
# 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;
#
# Bug#35363550 Confusing time values
#
VALUES ROW(CASE 1 WHEN 2
THEN
TIME '0:0:0.3'
END),
ROW(TIME '0:0:0.2');
column_0
NULL
00:00:00.2
VALUES ROW(CASE 1 WHEN 2
THEN
TIME '0:0:0'
END),
ROW(TIME '0:0:0');
column_0
NULL
00:00:00
VALUES ROW(NULL),
ROW(TIME '-719:0:0.2323049640');
column_0
NULL
-719:00:00.232304
#
# Bug#35512099: hypergraph_optimizer SEGV
#
CREATE TABLE t(x INT);
INSERT INTO t VALUES (0);
EXPLAIN FORMAT=TREE INSERT INTO t VALUES ROW(1), ROW(2) UNION ALL VALUES ROW(2), ROW(3);
EXPLAIN
-> Insert into t
-> Table scan on (rows=4)
-> Union all materialize (rows=4)
-> Rows fetched before execution (rows=2)
-> Rows fetched before execution (rows=2)
INSERT INTO t VALUES ROW(1), ROW(2) UNION ALL VALUES ROW(2), ROW(3);
SELECT * FROM t;
x
0
1
2
2
3
DROP TABLE t;
#
# Bug#35087820: VALUES Statement with dependent subquery is wrong
#
CREATE TABLE t(
id INTEGER PRIMARY KEY,
a VARCHAR(4),
b VARCHAR(4),
c VARCHAR(3));
INSERT INTO t VALUES (1, 'a1', 'b1', 'c1'), (2, 'a2', 'b2', 'c2');
SELECT
id,
(SELECT MAX(col1) FROM (VALUES ROW(a), ROW(b), ROW(c)) AS x(col1)) AS max
FROM t;
id max
1 c1
2 c2
DROP TABLE t;
#
# Bug#34852090: Incorrect result with VALUES in
# a correlated LATERAL subquery
#
WITH v1(x) AS (VALUES ROW (1), ROW (2), ROW (3))
SELECT * FROM v1, LATERAL (VALUES ROW(v1.x)) AS v2;
x column_0
1 1
2 2
3 3
#
# Bug#30775369: WRONG RESULT WITH "IN" COMPARATOR AND
# A TABLE VALUE CONSTRUCTOR
#
CREATE TABLE t(a INT, b INT);
INSERT INTO t VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (NULL, NULL);
ANALYZE TABLE t;
Table Op Msg_type Msg_text
test.t analyze status OK
EXPLAIN FORMAT=TREE SELECT * FROM t WHERE a IN (VALUES ROW(5), ROW(55), ROW(NULL));
EXPLAIN
-> Filter: (t.a,(select #2)) (rows=6)
-> Table scan on t (rows=6)
-> Select #2 (subquery in condition; dependent)
-> Filter: (outer_field_is_not_null, (column_0), true) (rows=3)
-> Filter: (outer_field_is_not_null, (((t.a) = column_0) or (column_0 is null)), true) (rows=3)
-> Rows fetched before execution (rows=3)
SELECT * FROM t WHERE a IN (VALUES ROW(5), ROW(55), ROW(NULL));
a b
5 6
DROP TABLE t;
#
# Bug#35785452: Table value constructor in subquery:
# Assertion `!sl->order_list.first' failed.
#
CREATE TABLE t(x INT);
INSERT INTO t VALUES (1), (2), (3), (4);
SELECT * FROM t WHERE x >= ALL (VALUES ROW(2), ROW(3) ORDER BY column_0);
x
3
4
DROP TABLE t;