# # 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;