should be it
This commit is contained in:
59
external/duckdb/test/sql/subquery/lateral/lateral_arrays.test
vendored
Normal file
59
external/duckdb/test/sql/subquery/lateral/lateral_arrays.test
vendored
Normal file
@@ -0,0 +1,59 @@
|
||||
# name: test/sql/subquery/lateral/lateral_arrays.test
|
||||
# description: Test LATERAL joins with arrays
|
||||
# group: [lateral]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
CREATE TABLE tbl(i INTEGER, arr INT[]);
|
||||
|
||||
statement ok
|
||||
INSERT INTO tbl VALUES (1, ARRAY[1, 3, 7]), (2, ARRAY[8, NULL]), (3, ARRAY[3, NULL, 4]), (NULL, ARRAY[]::INT[]);
|
||||
|
||||
query III
|
||||
SELECT * FROM tbl JOIN LATERAL (SELECT UNNEST(tbl.arr)) t(b) ON (i=b) ORDER BY i;
|
||||
----
|
||||
1 [1, 3, 7] 1
|
||||
3 [3, NULL, 4] 3
|
||||
|
||||
query III
|
||||
SELECT * FROM tbl JOIN LATERAL (SELECT UNNEST(tbl.arr)) t(b) ON (i<>b) ORDER BY i, b;
|
||||
----
|
||||
1 [1, 3, 7] 3
|
||||
1 [1, 3, 7] 7
|
||||
2 [8, NULL] 8
|
||||
3 [3, NULL, 4] 4
|
||||
|
||||
query III
|
||||
SELECT * FROM tbl JOIN LATERAL (SELECT UNNEST(tbl.arr)) t(b) ON (i<b) ORDER BY i, b;
|
||||
----
|
||||
1 [1, 3, 7] 3
|
||||
1 [1, 3, 7] 7
|
||||
2 [8, NULL] 8
|
||||
3 [3, NULL, 4] 4
|
||||
|
||||
query III
|
||||
SELECT * FROM tbl JOIN LATERAL (SELECT UNNEST(tbl.arr)) t(b) ON (i>=b) ORDER BY i, b;
|
||||
----
|
||||
1 [1, 3, 7] 1
|
||||
3 [3, NULL, 4] 3
|
||||
|
||||
query III
|
||||
SELECT * FROM tbl JOIN LATERAL (SELECT UNNEST(ARRAY[tbl.i * tbl.i])) t(b) ON (i>=b) ORDER BY i, b;
|
||||
----
|
||||
1 [1, 3, 7] 1
|
||||
|
||||
query III
|
||||
SELECT * FROM tbl JOIN LATERAL (SELECT x FROM generate_series(0,5,1) t(x) WHERE x>i) t(b) ON (i>=b) ORDER BY i, b;
|
||||
----
|
||||
|
||||
query III
|
||||
SELECT * FROM tbl JOIN LATERAL (SELECT x FROM generate_series(0,5,1) t(x) WHERE x<i) t(b) ON (i>=b) ORDER BY i, b;
|
||||
----
|
||||
1 [1, 3, 7] 0
|
||||
2 [8, NULL] 0
|
||||
2 [8, NULL] 1
|
||||
3 [3, NULL, 4] 0
|
||||
3 [3, NULL, 4] 1
|
||||
3 [3, NULL, 4] 2
|
||||
19
external/duckdb/test/sql/subquery/lateral/lateral_binding_views.test
vendored
Normal file
19
external/duckdb/test/sql/subquery/lateral/lateral_binding_views.test
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
# name: test/sql/subquery/lateral/lateral_binding_views.test
|
||||
# description: Verify that views cannot reference lateral join columns
|
||||
# group: [lateral]
|
||||
|
||||
statement ok
|
||||
copy (select date '2000-01-01' as dt) to '__TEST_DIR__/datetest.csv';
|
||||
|
||||
statement ok
|
||||
create view v1 as select * from read_csv('__TEST_DIR__/datetest.csv', columns={'dt': date});
|
||||
|
||||
query I
|
||||
from v1
|
||||
----
|
||||
2000-01-01
|
||||
|
||||
query II
|
||||
select * from (select date '1992-01-01' as date), v1;
|
||||
----
|
||||
1992-01-01 2000-01-01
|
||||
28
external/duckdb/test/sql/subquery/lateral/lateral_fuzzer_1463.test
vendored
Normal file
28
external/duckdb/test/sql/subquery/lateral/lateral_fuzzer_1463.test
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
# name: test/sql/subquery/lateral/lateral_fuzzer_1463.test
|
||||
# description: Test case for fuzzer issue 1463: Expression with depth > 1 detected in non-lateral join
|
||||
# group: [lateral]
|
||||
|
||||
query II
|
||||
SELECT *
|
||||
FROM
|
||||
(SELECT 42 AS c1) AS ref,
|
||||
(SELECT a + b + 1
|
||||
FROM
|
||||
(SELECT 1) t1(a),
|
||||
(SELECT (SELECT (SELECT ref.c1 + 1)) + 1) t2(b)
|
||||
)
|
||||
;
|
||||
----
|
||||
42 46
|
||||
|
||||
# postgres compatible variant
|
||||
query I
|
||||
SELECT NULL
|
||||
FROM
|
||||
(SELECT 42 AS c1) AS ref,
|
||||
LATERAL (SELECT NULL
|
||||
FROM
|
||||
(SELECT NULL) AS r2,
|
||||
(SELECT (SELECT (SELECT ref.c1))) AS r3) AS r4;
|
||||
----
|
||||
NULL
|
||||
13
external/duckdb/test/sql/subquery/lateral/lateral_fuzzer_5984_23.test
vendored
Normal file
13
external/duckdb/test/sql/subquery/lateral/lateral_fuzzer_5984_23.test
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
# name: test/sql/subquery/lateral/lateral_fuzzer_5984_23.test
|
||||
# description: Test case for fuzzer issue 5984, number 23
|
||||
# group: [lateral]
|
||||
|
||||
query I
|
||||
SELECT 1 FROM (SELECT 1) t1(c1), (SELECT TRUE IN (TRUE, t1.c1::VARCHAR LIKE 'a' ESCAPE NULL));
|
||||
----
|
||||
1
|
||||
|
||||
query I
|
||||
SELECT (SELECT t1.c1::VARCHAR LIKE 'a' ESCAPE NULL) FROM (SELECT 1) t1(c1)
|
||||
----
|
||||
NULL
|
||||
48
external/duckdb/test/sql/subquery/lateral/lateral_grouping_sets.test
vendored
Normal file
48
external/duckdb/test/sql/subquery/lateral/lateral_grouping_sets.test
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
# name: test/sql/subquery/lateral/lateral_grouping_sets.test
|
||||
# description: Test LATERAL join with empty grouping sets
|
||||
# group: [lateral]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
query III
|
||||
select x, a, b
|
||||
from
|
||||
(values (1), (2)) t2(x),
|
||||
lateral (select count(*), count(a) from (select 1, 2 where 1 = x) t(a, b) group by grouping sets ((), (b), (a, b))) t3(a, b)
|
||||
order by all;
|
||||
----
|
||||
1 1 1
|
||||
1 1 1
|
||||
1 1 1
|
||||
2 0 0
|
||||
|
||||
query II
|
||||
select x, a
|
||||
from
|
||||
(values (1), (2)) t2(x),
|
||||
lateral (select sum(a) from (select 1, 2 where 1 = x) t(a, b) group by grouping sets ((), (b), (a, b))) t3(a)
|
||||
order by all;
|
||||
----
|
||||
1 1
|
||||
1 1
|
||||
1 1
|
||||
2 NULL
|
||||
|
||||
query II
|
||||
select *
|
||||
from
|
||||
(values (1), (2)) t2(x), lateral (select sum(a) from (select 42 a) where x=1)
|
||||
order by all
|
||||
----
|
||||
1 42
|
||||
2 NULL
|
||||
|
||||
query II
|
||||
select *
|
||||
from
|
||||
(values (1), (2)) t2(x) left join (select sum(a) from (select 42 a) where x=1) on (1=1)
|
||||
order by all
|
||||
----
|
||||
1 42
|
||||
2 NULL
|
||||
36
external/duckdb/test/sql/subquery/lateral/lateral_join_aggregate.test
vendored
Normal file
36
external/duckdb/test/sql/subquery/lateral/lateral_join_aggregate.test
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
# name: test/sql/subquery/lateral/lateral_join_aggregate.test
|
||||
# description: Lateral join with aggregates
|
||||
# group: [lateral]
|
||||
|
||||
statement ok
|
||||
SET default_null_order='nulls_first';
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
CREATE TABLE integers(i INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO integers VALUES (1), (2), (3), (NULL);
|
||||
|
||||
# we cannot bind aggregates over lateral joins
|
||||
# Postgres error message is "aggregate functions are not allowed in FROM clause of their own query level"
|
||||
statement error
|
||||
SELECT * FROM integers, (SELECT SUM(i)) t(sum);
|
||||
----
|
||||
Binder Error: LATERAL join cannot contain aggregates
|
||||
|
||||
statement error
|
||||
SELECT * FROM integers, LATERAL (SELECT SUM(i)) t(sum);
|
||||
----
|
||||
Binder Error: LATERAL join cannot contain aggregates
|
||||
|
||||
# we can use lateral columns inside aggregate expressions, however
|
||||
query II
|
||||
SELECT * FROM integers i1, LATERAL (SELECT SUM(i + i1.i) FROM integers) t(sum) ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 9
|
||||
2 12
|
||||
3 15
|
||||
62
external/duckdb/test/sql/subquery/lateral/lateral_join_chain.test
vendored
Normal file
62
external/duckdb/test/sql/subquery/lateral/lateral_join_chain.test
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
# name: test/sql/subquery/lateral/lateral_join_chain.test
|
||||
# description: Test lateral join
|
||||
# group: [lateral]
|
||||
|
||||
statement ok
|
||||
SET default_null_order='nulls_first';
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
CREATE TABLE integers(i INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO integers VALUES (1), (2), (3), (NULL);
|
||||
|
||||
# Multiple LATERAL joins in a row
|
||||
query III
|
||||
SELECT * FROM integers, (SELECT [i + 1]) t(k), (SELECT UNNEST(k)) t2(l) ORDER BY i;
|
||||
----
|
||||
NULL [NULL] NULL
|
||||
1 [2] 2
|
||||
2 [3] 3
|
||||
3 [4] 4
|
||||
|
||||
# explicit LATERAL
|
||||
query III
|
||||
SELECT * FROM integers, LATERAL (SELECT [i + 1]) t(k), LATERAL (SELECT UNNEST(k)) t2(l) ORDER BY i;
|
||||
----
|
||||
NULL [NULL] NULL
|
||||
1 [2] 2
|
||||
2 [3] 3
|
||||
3 [4] 4
|
||||
|
||||
# lateral cross join
|
||||
query III
|
||||
SELECT * FROM integers CROSS JOIN LATERAL (SELECT [i + 1]) t(k) CROSS JOIN LATERAL (SELECT UNNEST(k)) t2(l) ORDER BY i;
|
||||
----
|
||||
NULL [NULL] NULL
|
||||
1 [2] 2
|
||||
2 [3] 3
|
||||
3 [4] 4
|
||||
|
||||
# refer to other table in lateral join
|
||||
query II
|
||||
SELECT * FROM integers, (SELECT integers) ORDER BY i
|
||||
----
|
||||
NULL {'i': NULL}
|
||||
1 {'i': 1}
|
||||
2 {'i': 2}
|
||||
3 {'i': 3}
|
||||
|
||||
# FIXME: this works as expected in Postgres
|
||||
statement error
|
||||
SELECT * FROM integers, LATERAL (SELECT integers.*) t2(k) ORDER BY i;
|
||||
----
|
||||
* expression
|
||||
|
||||
statement error
|
||||
SELECT * FROM integers, LATERAL (SELECT *) t2(k) ORDER BY i;
|
||||
----
|
||||
* expression
|
||||
23
external/duckdb/test/sql/subquery/lateral/lateral_join_generated_columns.test
vendored
Normal file
23
external/duckdb/test/sql/subquery/lateral/lateral_join_generated_columns.test
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
# name: test/sql/subquery/lateral/lateral_join_generated_columns.test
|
||||
# description: Test lateral joins with generated columns
|
||||
# group: [lateral]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
CREATE TABLE tbl (
|
||||
x INTEGER,
|
||||
gen_x AS (x + 5)
|
||||
);
|
||||
|
||||
statement ok
|
||||
INSERT INTO tbl VALUES (1), (2), (3), (NULL);
|
||||
|
||||
query III
|
||||
SELECT * FROM tbl, (SELECT gen_x + 10) ORDER BY x NULLS LAST
|
||||
----
|
||||
1 6 16
|
||||
2 7 17
|
||||
3 8 18
|
||||
NULL NULL NULL
|
||||
25
external/duckdb/test/sql/subquery/lateral/lateral_join_macro.test
vendored
Normal file
25
external/duckdb/test/sql/subquery/lateral/lateral_join_macro.test
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
# name: test/sql/subquery/lateral/lateral_join_macro.test
|
||||
# description: Test lateral joins with macros
|
||||
# group: [lateral]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
CREATE FUNCTION my_func(x) AS (x + x)
|
||||
|
||||
statement ok
|
||||
CREATE TABLE tbl (
|
||||
x INTEGER
|
||||
);
|
||||
|
||||
statement ok
|
||||
INSERT INTO tbl VALUES (1), (2), (3), (NULL);
|
||||
|
||||
query II
|
||||
SELECT * FROM tbl, (SELECT my_func(x)) ORDER BY x NULLS LAST
|
||||
----
|
||||
1 2
|
||||
2 4
|
||||
3 6
|
||||
NULL NULL
|
||||
260
external/duckdb/test/sql/subquery/lateral/lateral_join_nested.test_slow
vendored
Normal file
260
external/duckdb/test/sql/subquery/lateral/lateral_join_nested.test_slow
vendored
Normal file
@@ -0,0 +1,260 @@
|
||||
# name: test/sql/subquery/lateral/lateral_join_nested.test_slow
|
||||
# description: Lateral join inside a lateral join
|
||||
# group: [lateral]
|
||||
|
||||
statement ok
|
||||
SET default_null_order='nulls_first';
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
CREATE TABLE integers(i INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO integers VALUES (1), (2), (3), (NULL);
|
||||
|
||||
# nested correlated lateral joins
|
||||
query III
|
||||
SELECT i1.i, SUM(r2.k), COUNT(*) FROM integers i1, LATERAL (SELECT i1.i+i2.i FROM integers i2, LATERAL (SELECT i2.i+i3.i FROM integers i3) r3) r2(k) GROUP BY i1.i ORDER BY i1.i;
|
||||
----
|
||||
NULL NULL 16
|
||||
1 36 16
|
||||
2 48 16
|
||||
3 60 16
|
||||
|
||||
query III
|
||||
SELECT i1.i, SUM(r2.k), COUNT(*) FROM integers i1, LATERAL (SELECT i1.i+i2.i FROM integers i2, LATERAL (SELECT i1.i+i2.i+i3.i FROM integers i3) r3) r2(k) GROUP BY i1.i ORDER BY i1.i;
|
||||
----
|
||||
NULL NULL 16
|
||||
1 36 16
|
||||
2 48 16
|
||||
3 60 16
|
||||
|
||||
# lateral join inside correlated subquery
|
||||
query I
|
||||
SELECT (SELECT k+l FROM (SELECT i1.i + 1) t1(k), LATERAL (SELECT k + 1) t2(l)) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL
|
||||
5
|
||||
7
|
||||
9
|
||||
|
||||
# random stress tests for laterals and subqueries
|
||||
query I
|
||||
SELECT * FROM (SELECT 42) t(i) WHERE i IN (SELECT l FROM (SELECT 42) t(l) , (SELECT i * 2) t2(j), (SELECT i + j) t3(k) WHERE k IN (SELECT l*3 FROM (SELECT 42 l) t4(l) WHERE k-i = j));
|
||||
----
|
||||
42
|
||||
|
||||
query III
|
||||
SELECT * FROM (SELECT 42) t(i), (SELECT * FROM (SELECT 142 k) t3(k), (SELECT 1 WHERE k-i=100) t4(l));
|
||||
----
|
||||
42 142 1
|
||||
|
||||
query III
|
||||
SELECT * FROM (SELECT 42) t1(i), (SELECT 22) t2(j), (SELECT 1 WHERE i+j=64) t3(l);
|
||||
----
|
||||
42 22 1
|
||||
|
||||
query III
|
||||
SELECT * FROM (SELECT 64) t1(i), (SELECT 22) t2(j), (SELECT 1 WHERE i+j=64) t3(l);
|
||||
----
|
||||
|
||||
query III
|
||||
SELECT * FROM (SELECT 42) t1(i), (SELECT 22) t2(j), (SELECT i+j WHERE i+j=64) t3(l);
|
||||
----
|
||||
42 22 64
|
||||
|
||||
query III
|
||||
SELECT * FROM (SELECT i,j,k FROM (SELECT 42) t(i), (SELECT i * 2) t2(j), (SELECT i + j) t3(k));
|
||||
----
|
||||
42 84 126
|
||||
|
||||
query III
|
||||
SELECT * FROM (SELECT i,j,k FROM (SELECT 42) t(i), (SELECT i * 2) t2(j), (SELECT i + j) t3(k));
|
||||
----
|
||||
42 84 126
|
||||
|
||||
query III
|
||||
SELECT * FROM (SELECT 42) t(i), (SELECT * FROM (SELECT 142 k) t3(k), (SELECT 1 WHERE i+k=0) t4(l));
|
||||
----
|
||||
|
||||
query III
|
||||
SELECT * FROM (SELECT * FROM (SELECT 42) t1(i), (SELECT 22) t2(j), (SELECT 1 WHERE i+j=64) t3(l));
|
||||
----
|
||||
42 22 1
|
||||
|
||||
query III
|
||||
SELECT * FROM (SELECT * FROM (SELECT 42) t(i), (SELECT * FROM (SELECT 142 k) t3(k), (SELECT 1 WHERE k-i=100) t4(l)));
|
||||
----
|
||||
42 142 1
|
||||
|
||||
query III
|
||||
SELECT * FROM (SELECT * FROM (SELECT 42) t(i), (SELECT * FROM (SELECT 142 k) t3(k), (SELECT 1 WHERE i-k=-100) t4(l)));
|
||||
----
|
||||
42 142 1
|
||||
|
||||
query IIII
|
||||
SELECT * FROM (SELECT 42) t(i), (SELECT * FROM (SELECT 142 k) t3(k), (SELECT * FROM (SELECT 242 l) t4(l), (SELECT 1 WHERE i+l+k=426) t5(m)));
|
||||
----
|
||||
42 142 242 1
|
||||
|
||||
query I
|
||||
SELECT i FROM (SELECT 42) t(i) WHERE i*2 IN (SELECT j FROM (SELECT i) t(l) , (SELECT l+i) t2(j), (SELECT i+j) t3(k));
|
||||
----
|
||||
42
|
||||
|
||||
query I
|
||||
SELECT * FROM (SELECT 42) t(i) WHERE i IN (SELECT k FROM (SELECT 42) t(k) WHERE k IN (SELECT l FROM (SELECT 42 l) t4(l) WHERE i-k IN (SELECT * FROM (SELECT i+5))));
|
||||
----
|
||||
|
||||
query III
|
||||
SELECT * FROM (SELECT 42) t(i), (SELECT * FROM (SELECT 142 k) t3(k), (SELECT 1 WHERE i+k=0) t4(l));
|
||||
----
|
||||
|
||||
query II
|
||||
SELECT * FROM (SELECT 42) t4(m), (SELECT 64) t5(n) WHERE m IN ( SELECT j FROM (SELECT 21*m*n) t(i), (SELECT m) t2(j));
|
||||
----
|
||||
42 64
|
||||
|
||||
query I
|
||||
SELECT * FROM (SELECT 42) t4(m) WHERE m IN ( SELECT i FROM (SELECT m) t(i), (SELECT i*m/2 * 2/m) t2(j));
|
||||
----
|
||||
42
|
||||
|
||||
query I
|
||||
SELECT * FROM (SELECT 10) t(i) WHERE i IN (SELECT k FROM (SELECT 20) t(k) WHERE k IN (SELECT l FROM (SELECT 30) t4(l) WHERE i-k IN (SELECT * FROM (SELECT i+100))));
|
||||
----
|
||||
|
||||
query I
|
||||
SELECT * FROM (SELECT 42) t(i) WHERE i IN (SELECT k FROM (SELECT 42) t(k) WHERE k IN (SELECT l FROM (SELECT 42 l) t4(l) WHERE i-k IN (SELECT * FROM (SELECT 0))));
|
||||
----
|
||||
42
|
||||
|
||||
query I
|
||||
SELECT * FROM (SELECT 42) t(i) WHERE i IN (SELECT k FROM (SELECT 42) t(k) WHERE k IN (SELECT i FROM (SELECT i) t4 WHERE i*2-k IN (SELECT * FROM (SELECT i))));
|
||||
----
|
||||
42
|
||||
|
||||
query III
|
||||
SELECT * FROM (SELECT 42) t1(i), (SELECT 22) t2(j), (SELECT i+j WHERE i+j=(SELECT 64)) t3(l);
|
||||
----
|
||||
42 22 64
|
||||
|
||||
query I
|
||||
SELECT * FROM (SELECT 42) t(i) WHERE i IN (SELECT k FROM (SELECT i) t(k) WHERE k = 0);
|
||||
----
|
||||
|
||||
query I
|
||||
SELECT * FROM (SELECT 42) t(i) WHERE i IN (SELECT l FROM (SELECT 42) t(l) WHERE l IN (SELECT l FROM (SELECT 42 l) t4(l), (SELECT l+5) t5(n) WHERE i+2*l IN (SELECT k FROM (SELECT i+5), (SELECT i * 2) t2(j), (SELECT i + j) t3(k) WHERE k-l IN (SELECT i*2))));
|
||||
----
|
||||
42
|
||||
|
||||
query I
|
||||
SELECT (SELECT (SELECT k FROM (SELECT i) t2(j), (SELECT j) t3(k))) FROM (SELECT 42) t(i);
|
||||
----
|
||||
42
|
||||
|
||||
query I
|
||||
SELECT i FROM (SELECT 42) t(i) WHERE i IN (SELECT l FROM (SELECT 42) t(l) , (SELECT 42) t2(j), (SELECT i+j+l) t3(k));
|
||||
----
|
||||
42
|
||||
|
||||
query IIII
|
||||
SELECT * FROM (SELECT 42) t(i),
|
||||
(SELECT *
|
||||
FROM (SELECT 142) t3(y),
|
||||
(SELECT *
|
||||
FROM (SELECT 242) t4(z),
|
||||
(SELECT 58 WHERE i+y+z=426) t5(m)))
|
||||
WHERE z-y-m IN (SELECT l FROM (SELECT 42) t(l)
|
||||
WHERE l IN (SELECT l FROM (SELECT 42 l) t4(l),
|
||||
(SELECT l+5) t5(n)
|
||||
WHERE i+2*l IN (SELECT k FROM (SELECT i+5),
|
||||
(SELECT i * 2) t2(j),
|
||||
(SELECT i + j) t3(k)
|
||||
WHERE k-l IN (SELECT i*2))
|
||||
));
|
||||
----
|
||||
42 142 242 58
|
||||
|
||||
query I
|
||||
SELECT (SELECT (SELECT k
|
||||
FROM (SELECT i) t2(j),
|
||||
(SELECT j) t3(k)))
|
||||
FROM (SELECT 42) t(i)
|
||||
WHERE i IN (SELECT l FROM (SELECT 42) t(l)
|
||||
WHERE l IN (SELECT l FROM (SELECT 42 l) t4(l),
|
||||
(SELECT l+5) t5(n)
|
||||
WHERE i+2*l IN (SELECT k FROM (SELECT i+5),
|
||||
(SELECT i * 2) t2(j),
|
||||
(SELECT i + j) t3(k)
|
||||
WHERE k-l IN (SELECT i*2))
|
||||
));
|
||||
----
|
||||
42
|
||||
|
||||
query I
|
||||
SELECT * FROM (SELECT 42) t(i)
|
||||
WHERE i IN (SELECT l FROM (SELECT 42) t4(l)
|
||||
WHERE l IN (SELECT l FROM (SELECT (SELECT z-y As l
|
||||
FROM (SELECT x) t20(y),
|
||||
(SELECT y+x) t21(z))
|
||||
FROM (SELECT 42) t22(x)),
|
||||
(SELECT l+5) t5(n)
|
||||
WHERE i+2*l IN (SELECT k FROM (SELECT i+5),
|
||||
(SELECT i * 2) t2(j),
|
||||
(SELECT i + j) t3(k)
|
||||
WHERE k-l IN (SELECT i*2))
|
||||
));
|
||||
----
|
||||
42
|
||||
|
||||
query I
|
||||
SELECT (SELECT res.*
|
||||
FROM (SELECT 1) AS t2(z),
|
||||
(SELECT (SELECT i
|
||||
FROM (SELECT MAX(k) FROM generate_series(1,10) t(k)) AS t(i)
|
||||
GROUP BY i
|
||||
HAVING (COUNT(*)) = x)
|
||||
) as res
|
||||
)
|
||||
FROM generate_series(1, 5) t(x);
|
||||
----
|
||||
10
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
||||
|
||||
statement ok
|
||||
create view strings as (with recursive t(a) as (select 1 union select a+1 from t where a < 5) select * from t order by a);
|
||||
|
||||
query I
|
||||
select sum(a)
|
||||
from strings
|
||||
where a in (select k
|
||||
from (select 1) t(l) ,
|
||||
(select 1+l) t2(j),
|
||||
(select a-j
|
||||
from strings) t3(k));
|
||||
----
|
||||
6
|
||||
|
||||
statement ok
|
||||
create view strings2 as (with recursive t2(b) as (select 0 union select 10*a from strings where a < 5) select * from t2 order by b);
|
||||
|
||||
query I
|
||||
select *
|
||||
from strings2
|
||||
where b in (select k
|
||||
from (select 10) t(l) ,
|
||||
(select 10+l) t2(j),
|
||||
(select l+10*a
|
||||
from strings) t3(k))
|
||||
group by b
|
||||
having b%20 == 0
|
||||
order by b desc;
|
||||
----
|
||||
40
|
||||
20
|
||||
19
external/duckdb/test/sql/subquery/lateral/lateral_large_lists.test
vendored
Normal file
19
external/duckdb/test/sql/subquery/lateral/lateral_large_lists.test
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
# name: test/sql/subquery/lateral/lateral_large_lists.test
|
||||
# description: Test LATERAL joins with large arrays (inspired by #3593 but with a lateral join)
|
||||
# group: [lateral]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
query I
|
||||
SELECT total_seats
|
||||
FROM (
|
||||
SELECT list(distinct {'key': gen_random_uuid(), 'val': 1 }) as l FROM range(0, 1600)
|
||||
) as m, (
|
||||
select sum(a.val) as value
|
||||
FROM (
|
||||
SELECT UNNEST(l) a
|
||||
) x
|
||||
) as l(total_seats)
|
||||
----
|
||||
1600
|
||||
71
external/duckdb/test/sql/subquery/lateral/lateral_left_join.test
vendored
Normal file
71
external/duckdb/test/sql/subquery/lateral/lateral_left_join.test
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
# name: test/sql/subquery/lateral/lateral_left_join.test
|
||||
# description: Test LATERAL left joins
|
||||
# group: [lateral]
|
||||
|
||||
statement ok
|
||||
SET default_null_order='nulls_first';
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
CREATE TABLE integers(i INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO integers VALUES (1), (2), (3), (NULL);
|
||||
|
||||
query II
|
||||
SELECT * FROM integers LEFT JOIN LATERAL (SELECT integers.i + 1) t(b) ON (i=b) ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 NULL
|
||||
2 NULL
|
||||
3 NULL
|
||||
|
||||
query II
|
||||
SELECT * FROM integers LEFT JOIN LATERAL (SELECT integers.i) t(b) ON (i=b) ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 1
|
||||
2 2
|
||||
3 3
|
||||
|
||||
query II
|
||||
SELECT * FROM integers LEFT JOIN LATERAL (SELECT * FROM integers WHERE i<>integers.i) t(b) ON (i=b) ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 NULL
|
||||
2 NULL
|
||||
3 NULL
|
||||
|
||||
query II
|
||||
SELECT * FROM integers INNER JOIN LATERAL (SELECT integers.i WHERE integers.i IN (1, 3)) t(b) ON (i=b) ORDER BY i;
|
||||
----
|
||||
1 1
|
||||
3 3
|
||||
|
||||
query II
|
||||
SELECT * FROM integers LEFT JOIN LATERAL (SELECT integers.i WHERE integers.i IN (1, 3)) t(b) ON (i=b) ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 1
|
||||
2 NULL
|
||||
3 3
|
||||
|
||||
# left-join on arbitrary expressions not supported
|
||||
statement error
|
||||
SELECT * FROM integers LEFT JOIN LATERAL (SELECT integers.i WHERE integers.i IN (1, 3)) t(b) ON (i+b<b) ORDER BY i;
|
||||
----
|
||||
must be a comparison
|
||||
|
||||
# full-outer join not supported
|
||||
statement error
|
||||
SELECT * FROM (SELECT * FROM integers WHERE i=2) t(i) FULL JOIN LATERAL (SELECT t.i WHERE t.i IN (1, 3)) t2(b) ON (i=b) ORDER BY i, b;
|
||||
----
|
||||
LATERAL
|
||||
|
||||
# right-join not supported
|
||||
statement error
|
||||
SELECT * FROM (SELECT * FROM integers WHERE i=2) t(i) RIGHT JOIN LATERAL (SELECT t.i WHERE t.i IN (1, 3)) t2(b) ON (i=b) ORDER BY i, b;
|
||||
----
|
||||
LATERAL
|
||||
15
external/duckdb/test/sql/subquery/lateral/lateral_qualify.test
vendored
Normal file
15
external/duckdb/test/sql/subquery/lateral/lateral_qualify.test
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
# name: test/sql/subquery/lateral/lateral_qualify.test
|
||||
# description: Test LATERAL joins and QUALIFY clause interaction
|
||||
# group: [lateral]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
query III
|
||||
FROM (SELECT 42) t(x), (SELECT x, row_number() OVER () QUALIFY NULL);
|
||||
----
|
||||
|
||||
query II
|
||||
FROM (SELECT 42) t(x), (SELECT x * 2 QUALIFY row_number() OVER () < 10);
|
||||
----
|
||||
42 84
|
||||
70
external/duckdb/test/sql/subquery/lateral/lateral_unnest.test_slow
vendored
Normal file
70
external/duckdb/test/sql/subquery/lateral/lateral_unnest.test_slow
vendored
Normal file
@@ -0,0 +1,70 @@
|
||||
# name: test/sql/subquery/lateral/lateral_unnest.test_slow
|
||||
# description: Test LATERAL UNNEST
|
||||
# group: [lateral]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
mode skip
|
||||
|
||||
# FIXME: this causes an internal exception to be thrown
|
||||
statement ok
|
||||
PREPARE v1 AS SELECT l, (SELECT SUM(k) FROM UNNEST(l) t(k)) AS sum FROM (SELECT ARRAY [?, ?, ?] UNION ALL SELECT ARRAY[?, ?, ?] UNION ALL SELECT ARRAY[]::INT[]) t(l) ORDER BY sum NULLS LAST
|
||||
|
||||
mode unskip
|
||||
|
||||
# lateral join with unnest
|
||||
query II
|
||||
SELECT * FROM (SELECT ARRAY[1, 2, 3]) t(l), UNNEST(l) t2(k) ORDER BY k
|
||||
----
|
||||
[1, 2, 3] 1
|
||||
[1, 2, 3] 2
|
||||
[1, 2, 3] 3
|
||||
|
||||
# explicit LATERAL
|
||||
query II
|
||||
SELECT * FROM (SELECT ARRAY[1, 2, 3]) t(l), LATERAL UNNEST(l) t2(k) ORDER BY k
|
||||
----
|
||||
[1, 2, 3] 1
|
||||
[1, 2, 3] 2
|
||||
[1, 2, 3] 3
|
||||
|
||||
query II
|
||||
SELECT * FROM (SELECT ARRAY[1, 2, 3] UNION ALL SELECT ARRAY[]::INT[] UNION ALL SELECT ARRAY[4, NULL, 5] UNION ALL SELECT ARRAY[]::INT[]) t(l), UNNEST(l) t2(k) ORDER BY k NULLS LAST
|
||||
----
|
||||
[1, 2, 3] 1
|
||||
[1, 2, 3] 2
|
||||
[1, 2, 3] 3
|
||||
[4, NULL, 5] 4
|
||||
[4, NULL, 5] 5
|
||||
[4, NULL, 5] NULL
|
||||
|
||||
# empty table
|
||||
query II
|
||||
SELECT * FROM (SELECT ARRAY[]::INT[]) t(l), UNNEST(l) t2(k) ORDER BY k NULLS LAST
|
||||
----
|
||||
|
||||
# large table
|
||||
statement ok
|
||||
CREATE TABLE lists AS SELECT ARRAY[i, i + 1, i + 2] l FROM generate_series(0, 999, 1) t(i);
|
||||
|
||||
query I
|
||||
SELECT SUM(k) FROM lists, UNNEST(l) t(k)
|
||||
----
|
||||
1501500
|
||||
|
||||
# table in-out function in correlated scalar subquery
|
||||
query I
|
||||
SELECT (SELECT SUM(k) FROM UNNEST(l) t(k)) FROM (SELECT ARRAY [1, 2, 3]) t(l)
|
||||
----
|
||||
6
|
||||
|
||||
statement ok
|
||||
PRAGMA disable_verification
|
||||
|
||||
query II
|
||||
SELECT l, (SELECT SUM(k) FROM UNNEST(l) t(k)) AS sum FROM (SELECT ARRAY [1, 2, 3] UNION ALL SELECT ARRAY[4, 5, NULL] UNION ALL SELECT ARRAY[]::INT[]) t(l) ORDER BY sum NULLS LAST
|
||||
----
|
||||
[1, 2, 3] 6
|
||||
[4, 5, NULL] 9
|
||||
[] NULL
|
||||
21
external/duckdb/test/sql/subquery/lateral/lateral_unnest_large.test_slow
vendored
Normal file
21
external/duckdb/test/sql/subquery/lateral/lateral_unnest_large.test_slow
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
# name: test/sql/subquery/lateral/lateral_unnest_large.test_slow
|
||||
# description: Test large LATERAL UNNEST
|
||||
# group: [lateral]
|
||||
|
||||
# large table
|
||||
statement ok
|
||||
CREATE TABLE lists AS SELECT ARRAY[i, NULL, i + 1, i + 2, NULL] l FROM generate_series(0, 999999, 1) t(i);
|
||||
|
||||
query I
|
||||
SELECT SUM(k) FROM lists, UNNEST(l) t(k)
|
||||
----
|
||||
1500001500000
|
||||
|
||||
# strings
|
||||
statement ok
|
||||
CREATE TABLE lists_strings AS SELECT ARRAY['longstringprefix_' || i, NULL, 'longstringprefix_' || (i + 1), 'longstringprefix_' || (i + 2), NULL] l FROM generate_series(0, 999999, 1) t(i);
|
||||
|
||||
query I
|
||||
SELECT SUM(replace(k, 'longstringprefix_', '')::BIGINT) FROM lists_strings, UNNEST(l) t(k)
|
||||
----
|
||||
1500001500000
|
||||
43
external/duckdb/test/sql/subquery/lateral/lateral_values.test
vendored
Normal file
43
external/duckdb/test/sql/subquery/lateral/lateral_values.test
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
# name: test/sql/subquery/lateral/lateral_values.test
|
||||
# description: Test LATERAL with values clause
|
||||
# group: [lateral]
|
||||
|
||||
statement ok
|
||||
SET default_null_order='nulls_first';
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
CREATE TABLE integers(i INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO integers VALUES (1), (2), (3), (NULL);
|
||||
|
||||
query II
|
||||
SELECT * FROM integers, LATERAL (VALUES (integers.i + 1)) t(k) ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 2
|
||||
2 3
|
||||
3 4
|
||||
|
||||
query III
|
||||
SELECT * FROM integers a, integers b JOIN LATERAL (VALUES (a.i)) ss(x) ON (true) ORDER BY a.i, b.i;
|
||||
----
|
||||
NULL NULL NULL
|
||||
NULL 1 NULL
|
||||
NULL 2 NULL
|
||||
NULL 3 NULL
|
||||
1 NULL 1
|
||||
1 1 1
|
||||
1 2 1
|
||||
1 3 1
|
||||
2 NULL 2
|
||||
2 1 2
|
||||
2 2 2
|
||||
2 3 2
|
||||
3 NULL 3
|
||||
3 1 3
|
||||
3 2 3
|
||||
3 3 3
|
||||
554
external/duckdb/test/sql/subquery/lateral/pg_lateral.test
vendored
Normal file
554
external/duckdb/test/sql/subquery/lateral/pg_lateral.test
vendored
Normal file
@@ -0,0 +1,554 @@
|
||||
# name: test/sql/subquery/lateral/pg_lateral.test
|
||||
# description: Several LATERAL JOIN tests taken from Postgres
|
||||
# group: [lateral]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
query III
|
||||
select s1, s2, sm
|
||||
from generate_series(1, 3) s1(s1),
|
||||
lateral (select s2, sum(s1 + s2) sm
|
||||
from generate_series(1, 3) s2(s2) group by s2) ss
|
||||
order by 1, 2;
|
||||
----
|
||||
1 1 2
|
||||
1 2 3
|
||||
1 3 4
|
||||
2 1 3
|
||||
2 2 4
|
||||
2 3 5
|
||||
3 1 4
|
||||
3 2 5
|
||||
3 3 6
|
||||
|
||||
statement ok
|
||||
create table agg_data_1k as select g*10 AS g from generate_series(0, 999) g(g);
|
||||
|
||||
query IIII
|
||||
select * from
|
||||
(values (100), (300), (500)) as r(a),
|
||||
lateral (
|
||||
select (g/2)::int as c1,
|
||||
array_agg(g::int) as c2,
|
||||
count(*) as c3
|
||||
from agg_data_1k
|
||||
where g < r.a
|
||||
group by g/2) as s
|
||||
order by 1, 2, 4, 3;
|
||||
----
|
||||
100 0 [0] 1
|
||||
100 5 [10] 1
|
||||
100 10 [20] 1
|
||||
100 15 [30] 1
|
||||
100 20 [40] 1
|
||||
100 25 [50] 1
|
||||
100 30 [60] 1
|
||||
100 35 [70] 1
|
||||
100 40 [80] 1
|
||||
100 45 [90] 1
|
||||
300 0 [0] 1
|
||||
300 5 [10] 1
|
||||
300 10 [20] 1
|
||||
300 15 [30] 1
|
||||
300 20 [40] 1
|
||||
300 25 [50] 1
|
||||
300 30 [60] 1
|
||||
300 35 [70] 1
|
||||
300 40 [80] 1
|
||||
300 45 [90] 1
|
||||
300 50 [100] 1
|
||||
300 55 [110] 1
|
||||
300 60 [120] 1
|
||||
300 65 [130] 1
|
||||
300 70 [140] 1
|
||||
300 75 [150] 1
|
||||
300 80 [160] 1
|
||||
300 85 [170] 1
|
||||
300 90 [180] 1
|
||||
300 95 [190] 1
|
||||
300 100 [200] 1
|
||||
300 105 [210] 1
|
||||
300 110 [220] 1
|
||||
300 115 [230] 1
|
||||
300 120 [240] 1
|
||||
300 125 [250] 1
|
||||
300 130 [260] 1
|
||||
300 135 [270] 1
|
||||
300 140 [280] 1
|
||||
300 145 [290] 1
|
||||
500 0 [0] 1
|
||||
500 5 [10] 1
|
||||
500 10 [20] 1
|
||||
500 15 [30] 1
|
||||
500 20 [40] 1
|
||||
500 25 [50] 1
|
||||
500 30 [60] 1
|
||||
500 35 [70] 1
|
||||
500 40 [80] 1
|
||||
500 45 [90] 1
|
||||
500 50 [100] 1
|
||||
500 55 [110] 1
|
||||
500 60 [120] 1
|
||||
500 65 [130] 1
|
||||
500 70 [140] 1
|
||||
500 75 [150] 1
|
||||
500 80 [160] 1
|
||||
500 85 [170] 1
|
||||
500 90 [180] 1
|
||||
500 95 [190] 1
|
||||
500 100 [200] 1
|
||||
500 105 [210] 1
|
||||
500 110 [220] 1
|
||||
500 115 [230] 1
|
||||
500 120 [240] 1
|
||||
500 125 [250] 1
|
||||
500 130 [260] 1
|
||||
500 135 [270] 1
|
||||
500 140 [280] 1
|
||||
500 145 [290] 1
|
||||
500 150 [300] 1
|
||||
500 155 [310] 1
|
||||
500 160 [320] 1
|
||||
500 165 [330] 1
|
||||
500 170 [340] 1
|
||||
500 175 [350] 1
|
||||
500 180 [360] 1
|
||||
500 185 [370] 1
|
||||
500 190 [380] 1
|
||||
500 195 [390] 1
|
||||
500 200 [400] 1
|
||||
500 205 [410] 1
|
||||
500 210 [420] 1
|
||||
500 215 [430] 1
|
||||
500 220 [440] 1
|
||||
500 225 [450] 1
|
||||
500 230 [460] 1
|
||||
500 235 [470] 1
|
||||
500 240 [480] 1
|
||||
500 245 [490] 1
|
||||
|
||||
|
||||
statement ok
|
||||
CREATE TABLE INT2_TBL(f1 int2);
|
||||
|
||||
statement ok
|
||||
INSERT INTO INT2_TBL(f1) VALUES
|
||||
('0 '),
|
||||
(' 1234 '),
|
||||
(' -1234'),
|
||||
('32767'), -- largest and smallest values
|
||||
('-32767');
|
||||
|
||||
|
||||
statement ok
|
||||
CREATE TABLE INT4_TBL(f1 int4);
|
||||
|
||||
statement ok
|
||||
INSERT INTO INT4_TBL(f1) VALUES
|
||||
(' 0 '),
|
||||
('123456 '),
|
||||
(' -123456'),
|
||||
('2147483647'), -- largest and smallest values
|
||||
('-2147483647');
|
||||
|
||||
statement ok
|
||||
CREATE TABLE INT8_TBL(q1 int8, q2 int8);
|
||||
|
||||
statement ok
|
||||
INSERT INTO INT8_TBL VALUES
|
||||
(' 123 ',' 456'),
|
||||
('123 ','4567890123456789'),
|
||||
('4567890123456789','123'),
|
||||
(+4567890123456789,'4567890123456789'),
|
||||
('+4567890123456789','-4567890123456789');
|
||||
|
||||
statement ok
|
||||
CREATE TABLE TEXT_TBL (f1 text);
|
||||
|
||||
statement ok
|
||||
INSERT INTO TEXT_TBL VALUES
|
||||
('doh!'),
|
||||
('hi de ho neighbor');
|
||||
|
||||
statement ok
|
||||
CREATE TABLE tenk1 (
|
||||
unique1 int4,
|
||||
unique2 int4,
|
||||
two int4,
|
||||
four int4,
|
||||
ten int4,
|
||||
twenty int4,
|
||||
hundred int4,
|
||||
thousand int4,
|
||||
twothousand int4,
|
||||
fivethous int4,
|
||||
tenthous int4,
|
||||
odd int4,
|
||||
even int4,
|
||||
stringu1 varchar,
|
||||
stringu2 varchar,
|
||||
string4 varchar
|
||||
);
|
||||
|
||||
statement ok
|
||||
COPY tenk1 FROM 'data/csv/tenk.tsv.gz' (DELIMITER '\t')
|
||||
|
||||
query II rowsort
|
||||
select * from
|
||||
int4_tbl as i41,
|
||||
lateral
|
||||
(select 1 as x from
|
||||
(select i41.f1 as lat,
|
||||
i42.f1 as loc from
|
||||
int8_tbl as i81, int4_tbl as i42) as ss1
|
||||
right join int4_tbl as i43 on (i43.f1 > 1)
|
||||
where ss1.loc = ss1.lat) as ss2
|
||||
where i41.f1 > 0;
|
||||
----
|
||||
123456 1
|
||||
123456 1
|
||||
123456 1
|
||||
123456 1
|
||||
123456 1
|
||||
123456 1
|
||||
123456 1
|
||||
123456 1
|
||||
123456 1
|
||||
123456 1
|
||||
2147483647 1
|
||||
2147483647 1
|
||||
2147483647 1
|
||||
2147483647 1
|
||||
2147483647 1
|
||||
2147483647 1
|
||||
2147483647 1
|
||||
2147483647 1
|
||||
2147483647 1
|
||||
2147483647 1
|
||||
|
||||
query I
|
||||
select ss1.d1 from
|
||||
tenk1 as t1
|
||||
inner join tenk1 as t2
|
||||
on t1.tenthous = t2.ten
|
||||
inner join
|
||||
int8_tbl as i8
|
||||
left join int4_tbl as i4
|
||||
inner join (select 64 as d1
|
||||
from tenk1 t3,
|
||||
lateral (select abs(t3.unique1) + random()) ss0(x)
|
||||
where t3.fivethous < 0) as ss1
|
||||
on i4.f1 = ss1.d1
|
||||
on i8.q1 = i4.f1
|
||||
on t1.tenthous = ss1.d1
|
||||
where t1.unique1 < i4.f1;
|
||||
----
|
||||
|
||||
query III
|
||||
select * from
|
||||
(select 1 as x) ss1 left join (select 2 as y) ss2 on (true),
|
||||
lateral (select ss2.y as z limit 1) ss3;
|
||||
----
|
||||
1 2 2
|
||||
|
||||
query III
|
||||
select * from
|
||||
(select 0 as z) as t1
|
||||
left join
|
||||
(select true as a) as t2
|
||||
on true,
|
||||
lateral (select true as b
|
||||
union all
|
||||
select a as b) as t3
|
||||
where b;
|
||||
----
|
||||
0 true true
|
||||
0 true true
|
||||
|
||||
query IIIII
|
||||
select * from
|
||||
text_tbl t1
|
||||
left join int8_tbl i8
|
||||
on i8.q2 = 123,
|
||||
lateral (select i8.q1, t2.f1 from text_tbl t2 limit 1) as ss
|
||||
where t1.f1 = ss.f1;
|
||||
----
|
||||
doh! 4567890123456789 123 4567890123456789 doh!
|
||||
|
||||
# FIXME: lateral chain with star
|
||||
mode skip
|
||||
|
||||
query IIIIIII
|
||||
select * from
|
||||
text_tbl t1
|
||||
left join int8_tbl i8
|
||||
on i8.q2 = 123,
|
||||
lateral (select i8.q1, t2.f1 from text_tbl t2 limit 1) as ss1,
|
||||
lateral (select ss1.* from text_tbl t3 limit 1) as ss2
|
||||
where t1.f1 = ss2.f1;
|
||||
----
|
||||
doh! 4567890123456789 123 4567890123456789 doh! 4567890123456789 doh!
|
||||
|
||||
query I
|
||||
select 1 from
|
||||
text_tbl as tt1
|
||||
inner join text_tbl as tt2 on (tt1.f1 = 'foo')
|
||||
left join text_tbl as tt3 on (tt3.f1 = 'foo')
|
||||
left join text_tbl as tt4 on (tt3.f1 = tt4.f1),
|
||||
lateral (select tt4.f1 as c0 from text_tbl as tt5 limit 1) as ss1
|
||||
where tt1.f1 = ss1.c0;
|
||||
----
|
||||
|
||||
query I
|
||||
select ss2.* from
|
||||
int4_tbl i41
|
||||
left join int8_tbl i8
|
||||
join (select i42.f1 as c1, i43.f1 as c2, 42 as c3
|
||||
from int4_tbl i42, int4_tbl i43) ss1
|
||||
on i8.q1 = ss1.c2
|
||||
on i41.f1 = ss1.c1,
|
||||
lateral (select i41.*, i8.*, ss1.* from text_tbl limit 1) ss2
|
||||
where ss1.c2 = 0;
|
||||
----
|
||||
|
||||
|
||||
mode unskip
|
||||
|
||||
query IIII
|
||||
select i8.*, ss.v, t.unique2
|
||||
from int8_tbl i8
|
||||
left join int4_tbl i4 on i4.f1 = 1
|
||||
left join lateral (select i4.f1 + 1 as v) as ss on true
|
||||
left join tenk1 t on t.unique2 = ss.v
|
||||
where q2 = 456;
|
||||
----
|
||||
123 456 NULL NULL
|
||||
|
||||
query II
|
||||
select unique2, x.*
|
||||
from tenk1 a, lateral (select * from int4_tbl b where f1 = a.unique1) x;
|
||||
----
|
||||
9998 0
|
||||
|
||||
query II
|
||||
select unique2, x.*
|
||||
from int4_tbl x, lateral (select unique2 from tenk1 where f1 = unique1) ss;
|
||||
----
|
||||
9998 0
|
||||
|
||||
query II
|
||||
select unique2, x.*
|
||||
from int4_tbl x left join lateral (select unique1, unique2 from tenk1 where f1 = unique1) ss on true
|
||||
order by all;
|
||||
----
|
||||
9998 0
|
||||
NULL -2147483647
|
||||
NULL -123456
|
||||
NULL 123456
|
||||
NULL 2147483647
|
||||
|
||||
# FIXME: INTERNAL Error: Logical operator type "DELIM_JOIN" for dependent join
|
||||
mode skip
|
||||
|
||||
query IIII rowsort qlateral
|
||||
select *, (select r from (select q1 as q2) x, (select q2 as r) y) from int8_tbl;
|
||||
----
|
||||
|
||||
query IIII rowsort qlateral
|
||||
select *, (select r from (select q1 as q2) x, lateral (select q2 as r) y) from int8_tbl;
|
||||
----
|
||||
|
||||
mode unskip
|
||||
|
||||
# FIXME: Not implemented Error: LATERAL not implemented
|
||||
mode skip
|
||||
|
||||
query I
|
||||
select count(*) from tenk1 a, lateral generate_series(1,two) g;
|
||||
----
|
||||
5000
|
||||
|
||||
mode unskip
|
||||
|
||||
|
||||
query III rowsort
|
||||
select * from generate_series(100,200) g(g),
|
||||
lateral (select * from int8_tbl a where g = q1 union all
|
||||
select * from int8_tbl b where g = q2) ss;
|
||||
----
|
||||
123 123 456
|
||||
123 123 4567890123456789
|
||||
123 4567890123456789 123
|
||||
|
||||
query I
|
||||
select count(*) from tenk1 a,
|
||||
tenk1 b join lateral (values(a.unique1)) ss(x) on b.unique2 = ss.x;
|
||||
----
|
||||
10000
|
||||
|
||||
query I
|
||||
select count(*) from tenk1 a,
|
||||
tenk1 b join lateral (values(a.unique1),(-1)) ss(x) on b.unique2 = ss.x;
|
||||
----
|
||||
10000
|
||||
|
||||
query III
|
||||
select * from (select f1/2 as x from int4_tbl) ss1 join int4_tbl i4 on x = f1,
|
||||
lateral (select x) ss2(y);
|
||||
----
|
||||
0 0 0
|
||||
|
||||
query III rowsort
|
||||
select * from (select f1 as x from int4_tbl) ss1 join int4_tbl i4 on x = f1,
|
||||
lateral (values(x)) ss2(y);
|
||||
----
|
||||
-123456 -123456 -123456
|
||||
-2147483647 -2147483647 -2147483647
|
||||
0 0 0
|
||||
123456 123456 123456
|
||||
2147483647 2147483647 2147483647
|
||||
|
||||
query III
|
||||
select * from ((select f1/2 as x from int4_tbl) ss1 join int4_tbl i4 on x = f1) j,
|
||||
lateral (select x) ss2(y);
|
||||
----
|
||||
0 0 0
|
||||
|
||||
# FIXME: Not implemented Error: LATERAL not implemented
|
||||
mode skip
|
||||
|
||||
query II
|
||||
select * from (values(1)) x(lb),
|
||||
lateral generate_series(lb,4) x4
|
||||
ORDER BY ALL;
|
||||
----
|
||||
1 1
|
||||
1 2
|
||||
1 3
|
||||
1 4
|
||||
|
||||
query II
|
||||
select * from (select f1/1000000000 from int4_tbl) x(lb),
|
||||
lateral generate_series(lb,4) x4
|
||||
ORDER BY ALL;
|
||||
----
|
||||
-2 -2
|
||||
-2 -1
|
||||
-2 0
|
||||
-2 1
|
||||
-2 2
|
||||
-2 3
|
||||
-2 4
|
||||
0 0
|
||||
0 1
|
||||
0 2
|
||||
0 3
|
||||
0 4
|
||||
0 0
|
||||
0 1
|
||||
0 2
|
||||
0 3
|
||||
0 4
|
||||
0 0
|
||||
0 1
|
||||
0 2
|
||||
0 3
|
||||
0 4
|
||||
2 2
|
||||
2 3
|
||||
2 4
|
||||
|
||||
mode unskip
|
||||
|
||||
query II
|
||||
select * from (values(1)) x(lb),
|
||||
lateral (values(lb)) y(lbcopy);
|
||||
----
|
||||
1 1
|
||||
|
||||
query II
|
||||
select * from (values(1)) x(lb),
|
||||
lateral (select lb from int4_tbl) y(lbcopy);
|
||||
----
|
||||
1 1
|
||||
1 1
|
||||
1 1
|
||||
1 1
|
||||
1 1
|
||||
|
||||
query II rowsort
|
||||
select x.* from
|
||||
int8_tbl x left join (select q1,coalesce(q2,0) q2 from int8_tbl) y on x.q2 = y.q1,
|
||||
lateral (select x.q1,y.q1,y.q2) v(xq1,yq1,yq2) order by 1, 2;
|
||||
----
|
||||
123 456
|
||||
123 4567890123456789
|
||||
123 4567890123456789
|
||||
123 4567890123456789
|
||||
4567890123456789 -4567890123456789
|
||||
4567890123456789 123
|
||||
4567890123456789 123
|
||||
4567890123456789 4567890123456789
|
||||
4567890123456789 4567890123456789
|
||||
4567890123456789 4567890123456789
|
||||
|
||||
# FIXME: postgres has a better error message here
|
||||
statement error
|
||||
select 1 from tenk1 a, lateral (select max(a.unique1) from int4_tbl b) ss;
|
||||
----
|
||||
Binder Error: LATERAL join cannot contain aggregates
|
||||
|
||||
statement ok
|
||||
create table xx1 as select f1 as x1, -f1 as x2 from int4_tbl;
|
||||
|
||||
query II
|
||||
select * from xx1;
|
||||
----
|
||||
0 0
|
||||
123456 -123456
|
||||
-123456 123456
|
||||
2147483647 -2147483647
|
||||
-2147483647 2147483647
|
||||
|
||||
statement error
|
||||
update xx1 set x2 = f1 from (select * from int4_tbl where f1 = x1) ss;
|
||||
----
|
||||
not found
|
||||
|
||||
statement error
|
||||
update xx1 set x2 = f1 from (select * from int4_tbl where f1 = xx1.x1) ss;
|
||||
----
|
||||
not found
|
||||
|
||||
statement error
|
||||
update xx1 set x2 = f1 from lateral (select * from int4_tbl where f1 = x1) ss;
|
||||
----
|
||||
not found
|
||||
|
||||
statement ok
|
||||
update xx1 set x2 = f1 from xx1 AS xx2, lateral (select * from int4_tbl where f1 = xx2.x1 AND f1=-2147483647) ss;
|
||||
|
||||
query II
|
||||
select * from xx1;
|
||||
----
|
||||
0 -2147483647
|
||||
123456 -2147483647
|
||||
-123456 -2147483647
|
||||
2147483647 -2147483647
|
||||
-2147483647 -2147483647
|
||||
|
||||
statement error
|
||||
delete from xx1 using (select * from int4_tbl where f1 = x1) ss;
|
||||
----
|
||||
not found
|
||||
|
||||
statement error
|
||||
delete from xx1 using (select * from int4_tbl where f1 = xx1.x1) ss;
|
||||
----
|
||||
not found
|
||||
|
||||
statement error
|
||||
delete from xx1 using lateral (select * from int4_tbl where f1 = x1) ss;
|
||||
----
|
||||
not found
|
||||
177
external/duckdb/test/sql/subquery/lateral/test_lateral_join.test
vendored
Normal file
177
external/duckdb/test/sql/subquery/lateral/test_lateral_join.test
vendored
Normal file
@@ -0,0 +1,177 @@
|
||||
# name: test/sql/subquery/lateral/test_lateral_join.test
|
||||
# description: Test lateral join
|
||||
# group: [lateral]
|
||||
|
||||
statement ok
|
||||
SET default_null_order='nulls_first';
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
query I
|
||||
select (select MIN(val) from unnest((select a)) t(val)) from (select ARRAY[1, 2, 3, NULL]) t(a);
|
||||
----
|
||||
1
|
||||
|
||||
query I
|
||||
select (select MIN(val) from unnest((select (select a))) t(val)) from (select ARRAY[1, 2, 3, NULL]) t(a);
|
||||
----
|
||||
1
|
||||
|
||||
query II rowsort
|
||||
select * from (select array[1, 2, 3] a), unnest((select (select (select a))))
|
||||
----
|
||||
[1, 2, 3] 1
|
||||
[1, 2, 3] 2
|
||||
[1, 2, 3] 3
|
||||
|
||||
query I
|
||||
select (select MIN(val) from unnest(a) t(val)) from (select ARRAY[1, 2, 3, NULL]) t(a);
|
||||
----
|
||||
1
|
||||
|
||||
# simplest lateral joins
|
||||
query II
|
||||
select * from (select 42) t(a), (select t.a + 1);
|
||||
----
|
||||
42 43
|
||||
|
||||
query II
|
||||
select * from (select 42) t(a) cross join lateral (select t.a + 1);
|
||||
----
|
||||
42 43
|
||||
|
||||
# more rows
|
||||
query II
|
||||
select * from (select 42 union all select 84) t(a), (select t.a + 1) ORDER BY ALL;
|
||||
----
|
||||
42 43
|
||||
84 85
|
||||
|
||||
query I
|
||||
select (select MIN(val) from unnest(a) t(val)) from (select ARRAY[1, 2, 3, NULL]) t(a);
|
||||
----
|
||||
1
|
||||
|
||||
# unnest
|
||||
query II
|
||||
select * from (select [42, 43, 44]) t(a), (select unnest(t.a)) order by all;
|
||||
----
|
||||
[42, 43, 44] 42
|
||||
[42, 43, 44] 43
|
||||
[42, 43, 44] 44
|
||||
|
||||
query II
|
||||
select * from (select [42, 43, 44]) t(a), (select unnest(t.a)) t2(b) where b=43;
|
||||
----
|
||||
[42, 43, 44] 43
|
||||
|
||||
query II
|
||||
select * from (select [42, 43, 44] union all select [45, NULL, 46]) t(a), (select unnest(t.a)) t2(b) order by all;
|
||||
----
|
||||
[42, 43, 44] 42
|
||||
[42, 43, 44] 43
|
||||
[42, 43, 44] 44
|
||||
[45, NULL, 46] NULL
|
||||
[45, NULL, 46] 45
|
||||
[45, NULL, 46] 46
|
||||
|
||||
query I
|
||||
select sum(b) from (select [42, 43, 44] union all select [45, NULL, 46]) t(a), (select unnest(t.a)) t2(b);
|
||||
----
|
||||
220
|
||||
|
||||
query II
|
||||
select a, sum(b) from (select [42, 43, 44] union all select [45, NULL, 46]) t(a), (select unnest(t.a)) t2(b) group by a order by a;
|
||||
----
|
||||
[42, 43, 44] 129
|
||||
[45, NULL, 46] 91
|
||||
|
||||
# join syntax
|
||||
query II
|
||||
select * from (select array[42, 43, 44]) t(a) join (select unnest(t.a)) t2(b) on (true) order by all;
|
||||
----
|
||||
[42, 43, 44] 42
|
||||
[42, 43, 44] 43
|
||||
[42, 43, 44] 44
|
||||
|
||||
# explicit LATERAL (Postgres syntax)
|
||||
query II
|
||||
select * from (select array[42, 43, 44]) t(a) join lateral (select unnest(t.a)) t2(b) on (true) order by all;
|
||||
----
|
||||
[42, 43, 44] 42
|
||||
[42, 43, 44] 43
|
||||
[42, 43, 44] 44
|
||||
|
||||
|
||||
query II
|
||||
select * from (select array[42, 43, 44]) t(a) join lateral (select unnest(t.a)) t2(b) on (a[1]=b);
|
||||
----
|
||||
[42, 43, 44] 42
|
||||
|
||||
query II
|
||||
select * from (select array[42, 43, 44]) t(a) join lateral (select unnest(t.a)) t2(b) on (a[1]<b) order by all;
|
||||
----
|
||||
[42, 43, 44] 43
|
||||
[42, 43, 44] 44
|
||||
|
||||
query II
|
||||
select * from (select array[42, 43, 44]) t(a) join lateral (select unnest(t.a)) t2(b) on (false) order by all;
|
||||
----
|
||||
|
||||
# postgres syntax
|
||||
query II
|
||||
select * from (select 42) t(a) join lateral (select t.a + 1) t2(b) on (true);
|
||||
----
|
||||
42 43
|
||||
|
||||
# we can use random expressions in join conditions of inner joins
|
||||
query II
|
||||
select * from (select 42) t(a) join lateral (select t.a + 1) t2(b) on (a+b>=80);
|
||||
----
|
||||
42 43
|
||||
|
||||
query II
|
||||
select * from (select ARRAY[42, 43, 44]) t(a) join lateral (select * from unnest(t.a)) t2(b) on (true) ORDER BY b;
|
||||
----
|
||||
[42, 43, 44] 42
|
||||
[42, 43, 44] 43
|
||||
[42, 43, 44] 44
|
||||
|
||||
statement ok
|
||||
CREATE TABLE students(id INTEGER, name VARCHAR, major VARCHAR, year INTEGER)
|
||||
|
||||
statement ok
|
||||
CREATE TABLE exams(sid INTEGER, course VARCHAR, curriculum VARCHAR, grade INTEGER, year INTEGER)
|
||||
|
||||
statement ok
|
||||
INSERT INTO students VALUES (1, 'Mark', 'CS', 2017)
|
||||
|
||||
statement ok
|
||||
INSERT INTO students VALUES (2, 'Dirk', 'CS', 2017)
|
||||
|
||||
statement ok
|
||||
INSERT INTO exams VALUES (1, 'Database Systems', 'CS', 10, 2015)
|
||||
|
||||
statement ok
|
||||
INSERT INTO exams VALUES (1, 'Graphics', 'CS', 9, 2016)
|
||||
|
||||
statement ok
|
||||
INSERT INTO exams VALUES (2, 'Database Systems', 'CS', 7, 2015)
|
||||
|
||||
statement ok
|
||||
INSERT INTO exams VALUES (2, 'Graphics', 'CS', 7, 2016)
|
||||
|
||||
# lateral join with explicit LATERAL added
|
||||
query II
|
||||
SELECT name, total FROM students JOIN LATERAL (SELECT SUM(grade) AS total FROM exams WHERE exams.sid=students.id) grades ON true ORDER BY total DESC;
|
||||
----
|
||||
Mark 19
|
||||
Dirk 14
|
||||
|
||||
# lateral join without explicit LATERAL
|
||||
query II
|
||||
SELECT name, total FROM students, (SELECT SUM(grade) AS total FROM exams WHERE exams.sid=students.id) grades ORDER BY total DESC;
|
||||
----
|
||||
Mark 19
|
||||
Dirk 14
|
||||
Reference in New Issue
Block a user