should be it
This commit is contained in:
121
external/duckdb/test/sql/subquery/scalar/array_order_subquery.test
vendored
Normal file
121
external/duckdb/test/sql/subquery/scalar/array_order_subquery.test
vendored
Normal file
@@ -0,0 +1,121 @@
|
||||
# name: test/sql/subquery/scalar/array_order_subquery.test
|
||||
# description: Issue #11293: Unstable ordering of array(subquery) function when using DISTINCT and ORDER BY in subquery
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
create table t (i int);
|
||||
|
||||
statement ok
|
||||
insert into t values (1),(2),(3),(4),(4);
|
||||
|
||||
query III
|
||||
select
|
||||
array(select distinct i from t order by i desc) as a,
|
||||
array(select distinct i from t order by i desc) as b,
|
||||
array(select distinct i from t order by i desc) as c;
|
||||
----
|
||||
[4, 3, 2, 1] [4, 3, 2, 1] [4, 3, 2, 1]
|
||||
|
||||
# correlated
|
||||
query I
|
||||
select array(select unnest(l) AS i order by i desc nulls last) as a from (values ([NULL, 1, 2, 3, 4]), ([5, 6, NULL, 7, 8]), ([]), ([10, 11, 12])) t(l);
|
||||
----
|
||||
[4, 3, 2, 1, NULL]
|
||||
[8, 7, 6, 5, NULL]
|
||||
[]
|
||||
[12, 11, 10]
|
||||
|
||||
query I
|
||||
select array(select unnest(l) AS i order by i desc nulls first) as a from (values ([NULL, 1, 2, 3, 4]), ([5, 6, NULL, 7, 8]), ([]), ([10, 11, 12])) t(l);
|
||||
----
|
||||
[NULL, 4, 3, 2, 1]
|
||||
[NULL, 8, 7, 6, 5]
|
||||
[]
|
||||
[12, 11, 10]
|
||||
|
||||
# row id
|
||||
query I
|
||||
SELECT ARRAY(SELECT i FROM t ORDER BY rowid DESC)
|
||||
----
|
||||
[4, 4, 3, 2, 1]
|
||||
|
||||
# qualified name
|
||||
query I
|
||||
SELECT ARRAY(SELECT i FROM t ORDER BY t.rowid)
|
||||
----
|
||||
[1, 2, 3, 4, 4]
|
||||
|
||||
# use integer literals
|
||||
query I
|
||||
SELECT ARRAY
|
||||
(SELECT 1 UNION ALL
|
||||
SELECT 2 UNION ALL
|
||||
SELECT 3
|
||||
ORDER by 1) AS new_array;
|
||||
----
|
||||
[1, 2, 3]
|
||||
|
||||
# qualified names
|
||||
query I
|
||||
select
|
||||
array(select distinct i from t order by t.i desc) as a
|
||||
----
|
||||
[4, 3, 2, 1]
|
||||
|
||||
query I
|
||||
select
|
||||
array(select distinct i from t union all select distinct i from t order by t.i desc) as a
|
||||
----
|
||||
[4, 4, 3, 3, 2, 2, 1, 1]
|
||||
|
||||
statement error
|
||||
select
|
||||
array(select distinct i from t order by x.i desc) as a
|
||||
----
|
||||
Referenced table "x" not found
|
||||
|
||||
query I
|
||||
SELECT ARRAY
|
||||
(SELECT 1 UNION ALL
|
||||
SELECT 2 UNION ALL
|
||||
SELECT 3
|
||||
ORDER by 1 DESC) AS new_array;
|
||||
----
|
||||
[3, 2, 1]
|
||||
|
||||
query I
|
||||
select array(select * from unnest(['a', 'b']) as _t(u) order by if(u='a',100, 1)) as out;
|
||||
----
|
||||
[b, a]
|
||||
|
||||
query I
|
||||
select array(select * from unnest(['a', 'b']) as _t(u) order by if(u='a',100, 1) desc) as out;
|
||||
----
|
||||
[a, b]
|
||||
|
||||
statement error
|
||||
SELECT ARRAY
|
||||
(SELECT 1 UNION ALL
|
||||
SELECT 2 UNION ALL
|
||||
SELECT 3
|
||||
ORDER by -1) AS new_array;
|
||||
----
|
||||
ORDER term out of range
|
||||
|
||||
statement error
|
||||
SELECT ARRAY
|
||||
(SELECT 1 UNION ALL
|
||||
SELECT 2 UNION ALL
|
||||
SELECT 3
|
||||
ORDER by 2) AS new_array;
|
||||
----
|
||||
ORDER term out of range
|
||||
|
||||
statement error
|
||||
SELECT ARRAY
|
||||
(SELECT 1 UNION ALL
|
||||
SELECT 2 UNION ALL
|
||||
SELECT 3
|
||||
ORDER by 'hello world') AS new_array;
|
||||
----
|
||||
ORDER BY non-integer literal has no effect
|
||||
96
external/duckdb/test/sql/subquery/scalar/array_subquery.test
vendored
Normal file
96
external/duckdb/test/sql/subquery/scalar/array_subquery.test
vendored
Normal file
@@ -0,0 +1,96 @@
|
||||
# name: test/sql/subquery/scalar/array_subquery.test
|
||||
# description: Test ARRAY subquery
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
SET default_null_order='nulls_first';
|
||||
|
||||
statement ok
|
||||
CREATE TABLE integers(i INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO integers VALUES (1), (2), (3), (NULL);
|
||||
|
||||
# uncorrelated
|
||||
query II
|
||||
SELECT i, ARRAY(
|
||||
SELECT 42
|
||||
) top
|
||||
FROM integers i1
|
||||
ORDER BY i
|
||||
----
|
||||
NULL [42]
|
||||
1 [42]
|
||||
2 [42]
|
||||
3 [42]
|
||||
|
||||
# single element
|
||||
query II
|
||||
SELECT i, ARRAY(
|
||||
SELECT i FROM integers WHERE i1.i=i
|
||||
) top
|
||||
FROM integers i1
|
||||
ORDER BY i
|
||||
----
|
||||
NULL []
|
||||
1 [1]
|
||||
2 [2]
|
||||
3 [3]
|
||||
|
||||
# multiple elements
|
||||
query II
|
||||
SELECT i, ARRAY(
|
||||
SELECT i FROM integers WHERE i>i1.i ORDER BY i ASC NULLS FIRST
|
||||
) top
|
||||
FROM integers i1
|
||||
ORDER BY i
|
||||
----
|
||||
NULL []
|
||||
1 [2, 3]
|
||||
2 [3]
|
||||
3 []
|
||||
|
||||
# array with limit
|
||||
query II
|
||||
SELECT i, ARRAY(
|
||||
SELECT i1.i FROM integers i1, integers i2, integers i3, integers i4 WHERE i1.i=integers.i LIMIT 3
|
||||
) top
|
||||
FROM integers
|
||||
ORDER BY i
|
||||
----
|
||||
NULL []
|
||||
1 [1, 1, 1]
|
||||
2 [2, 2, 2]
|
||||
3 [3, 3, 3]
|
||||
|
||||
# array with limit and offset
|
||||
query II
|
||||
SELECT i, ARRAY(
|
||||
SELECT i1.i FROM integers i1, integers i2, integers i3, integers i4 WHERE i1.i=integers.i LIMIT 3 OFFSET 3
|
||||
) top
|
||||
FROM integers
|
||||
ORDER BY i
|
||||
----
|
||||
NULL []
|
||||
1 [1, 1, 1]
|
||||
2 [2, 2, 2]
|
||||
3 [3, 3, 3]
|
||||
|
||||
# offset on the edge
|
||||
query II
|
||||
SELECT i, ARRAY(
|
||||
SELECT i1.i FROM integers i1, integers i2, integers i3, integers i4 WHERE i1.i=integers.i LIMIT 3 OFFSET 62
|
||||
) top
|
||||
FROM integers
|
||||
ORDER BY i
|
||||
----
|
||||
NULL []
|
||||
1 [1, 1]
|
||||
2 [2, 2]
|
||||
3 [3, 3]
|
||||
|
||||
# should only allow one column in array subquery
|
||||
statement error
|
||||
select array(select 1,2)
|
||||
----
|
||||
<REGEX>:.*inder Error.*Subquery returns 2 columns.*
|
||||
8
external/duckdb/test/sql/subquery/scalar/coalesce_subquery.test
vendored
Normal file
8
external/duckdb/test/sql/subquery/scalar/coalesce_subquery.test
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
# name: test/sql/subquery/scalar/coalesce_subquery.test
|
||||
# description: Issue #2452: Coalesce operator with subquery throws error
|
||||
# group: [scalar]
|
||||
|
||||
query I
|
||||
SELECT 1 FROM (select 4) v1(vc0) WHERE (3) NOT IN (COALESCE((SELECT 1 WHERE FALSE), v1.vc0));
|
||||
----
|
||||
1
|
||||
54
external/duckdb/test/sql/subquery/scalar/correlated_missing_columns.test
vendored
Normal file
54
external/duckdb/test/sql/subquery/scalar/correlated_missing_columns.test
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
# name: test/sql/subquery/scalar/correlated_missing_columns.test
|
||||
# description: Test correlated missing columns
|
||||
# group: [scalar]
|
||||
|
||||
require tpch
|
||||
|
||||
statement ok
|
||||
CALL dbgen(sf=0);
|
||||
|
||||
# verify that we can grab missing columns from either the correlated subquery or the outer (uncorrelated) subquery
|
||||
statement error
|
||||
SELECT (SELECT l_linestat FROM orders) FROM lineitem
|
||||
----
|
||||
l_linestatus
|
||||
|
||||
statement error
|
||||
SELECT (SELECT l_returnfla FROM orders) FROM lineitem
|
||||
----
|
||||
l_returnflag
|
||||
|
||||
statement error
|
||||
SELECT (SELECT o_totalp FROM orders) FROM lineitem
|
||||
----
|
||||
o_totalprice
|
||||
|
||||
# column exists in outer query but is used in an aggregate
|
||||
statement error
|
||||
SELECT * FROM lineitem WHERE (SELECT SUM(l_orderkey) > 0)
|
||||
----
|
||||
cannot contain aggregates
|
||||
|
||||
# prefer missing column over unsupported
|
||||
# where clause
|
||||
statement error
|
||||
SELECT * FROM lineitem WHERE (SELECT SUM(o_orderke) FROM orders)
|
||||
----
|
||||
o_orderkey
|
||||
|
||||
statement error
|
||||
SELECT * FROM lineitem WHERE (SELECT SUM(o_orderke) OVER () FROM orders)
|
||||
----
|
||||
o_orderkey
|
||||
|
||||
# group by
|
||||
statement error
|
||||
SELECT * FROM lineitem GROUP BY (SELECT SUM(o_orderke) OVER () FROM orders)
|
||||
----
|
||||
o_orderkey
|
||||
|
||||
# limit
|
||||
statement error
|
||||
SELECT * FROM lineitem LIMIT (SELECT SUM(o_orderke) FROM orders LIMIT 1)
|
||||
----
|
||||
o_orderkey
|
||||
68
external/duckdb/test/sql/subquery/scalar/correlated_pivot.test
vendored
Normal file
68
external/duckdb/test/sql/subquery/scalar/correlated_pivot.test
vendored
Normal file
@@ -0,0 +1,68 @@
|
||||
# name: test/sql/subquery/scalar/correlated_pivot.test
|
||||
# description: Test using PIVOT in correlated subqueries
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
CREATE TABLE Product(DaysToManufacture int, StandardCost int);
|
||||
|
||||
statement ok
|
||||
INSERT INTO Product VALUES (0, 5.0885), (1, 223.88), (2, 359.1082), (4, 949.4105);
|
||||
|
||||
statement ok
|
||||
SET pivot_filter_threshold=0
|
||||
|
||||
# pivot
|
||||
statement error
|
||||
SELECT DaysToManufacture, StandardCost, (SELECT ["0", "1", "2", "3", "4"] FROM
|
||||
(SELECT DaysToManufacture, StandardCost) AS SourceTable
|
||||
PIVOT
|
||||
(
|
||||
AVG(StandardCost)
|
||||
FOR DaysToManufacture IN (0, 1, 2, 3, 4)
|
||||
) AS PivotTable
|
||||
)
|
||||
FROM Product
|
||||
----
|
||||
PIVOT is not supported in correlated subqueries yet
|
||||
|
||||
# unpivot with exclude nulls (default)
|
||||
statement error
|
||||
SELECT DaysToManufacture, StandardCost, (SELECT cost FROM
|
||||
(SELECT DaysToManufacture, StandardCost) AS SourceTable
|
||||
PIVOT
|
||||
(
|
||||
AVG(StandardCost)
|
||||
FOR DaysToManufacture IN (0, 1, 2, 3, 4)
|
||||
) AS PivotTable
|
||||
UNPIVOT
|
||||
(
|
||||
cost FOR days IN (0, 1, 2, 3, 4)
|
||||
)
|
||||
)
|
||||
FROM Product
|
||||
----
|
||||
PIVOT is not supported in correlated subqueries yet
|
||||
|
||||
# unpivot with include nulls
|
||||
statement error
|
||||
SELECT DaysToManufacture, StandardCost, (SELECT LIST(cost) FROM
|
||||
(SELECT DaysToManufacture, StandardCost) AS SourceTable
|
||||
PIVOT
|
||||
(
|
||||
AVG(StandardCost)
|
||||
FOR DaysToManufacture IN (0, 1, 2, 3, 4)
|
||||
) AS PivotTable
|
||||
UNPIVOT INCLUDE NULLS
|
||||
(
|
||||
cost FOR days IN (0, 1, 2, 3, 4)
|
||||
)
|
||||
)
|
||||
FROM Product
|
||||
----
|
||||
PIVOT is not supported in correlated subqueries yet
|
||||
|
||||
statement ok
|
||||
SET pivot_filter_threshold TO DEFAULT
|
||||
|
||||
statement ok
|
||||
RESET SESSION pivot_filter_threshold
|
||||
104
external/duckdb/test/sql/subquery/scalar/expression_get.test_slow
vendored
Normal file
104
external/duckdb/test/sql/subquery/scalar/expression_get.test_slow
vendored
Normal file
@@ -0,0 +1,104 @@
|
||||
# name: test/sql/subquery/scalar/expression_get.test_slow
|
||||
# description: Issue #2701: Nested selecting max from column values gives dependent join internal error
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
SET default_null_order='nulls_first';
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
# basic correlated VALUES clause in subquery
|
||||
statement ok
|
||||
CREATE TABLE test AS SELECT CAST((i % 10) AS INTEGER) AS i, CAST(((i * 2) % 10) AS INTEGER) AS j FROM generate_series(0, 9, 1) tbl(i);
|
||||
|
||||
query III
|
||||
SELECT i, j, (SELECT max(x) FROM (VALUES (i), (j)) AS X(x)) as maxn FROM test ORDER BY ALL;
|
||||
----
|
||||
0 0 0
|
||||
1 2 2
|
||||
2 4 4
|
||||
3 6 6
|
||||
4 8 8
|
||||
5 0 5
|
||||
6 2 6
|
||||
7 4 7
|
||||
8 6 8
|
||||
9 8 9
|
||||
|
||||
# mix of correlated and non-correlated values
|
||||
query III
|
||||
SELECT i, j, (SELECT max(x) FROM (VALUES (i), (j), (3), (NULL), (5)) AS X(x)) as maxn FROM test ORDER BY ALL;
|
||||
----
|
||||
0 0 5
|
||||
1 2 5
|
||||
2 4 5
|
||||
3 6 6
|
||||
4 8 8
|
||||
5 0 5
|
||||
6 2 6
|
||||
7 4 7
|
||||
8 6 8
|
||||
9 8 9
|
||||
|
||||
# more complex correlated queries involving VALUES lists
|
||||
statement ok
|
||||
CREATE TABLE integers(i INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO integers VALUES (1), (2), (3), (NULL);
|
||||
|
||||
# subquery within correlated values list
|
||||
query I
|
||||
SELECT (SELECT max(x) FROM (VALUES ((SELECT i))) tbl(x)) FROM integers ORDER BY i;
|
||||
----
|
||||
NULL
|
||||
1
|
||||
2
|
||||
3
|
||||
|
||||
# correlated values list within correlated values list
|
||||
query I
|
||||
SELECT (SELECT max(x) FROM (VALUES ((SELECT * FROM (VALUES (i)) tbl3(x)))) tbl(x)) FROM integers ORDER BY i;
|
||||
----
|
||||
NULL
|
||||
1
|
||||
2
|
||||
3
|
||||
|
||||
# join between correlated values lists
|
||||
query I
|
||||
SELECT (SELECT max(x) FROM (VALUES (i)) tbl(x) JOIN (VALUES (i)) tbl2(x) USING (x)) FROM integers ORDER BY i;
|
||||
----
|
||||
NULL
|
||||
1
|
||||
2
|
||||
3
|
||||
|
||||
# many rows
|
||||
statement ok
|
||||
CREATE TABLE test2 AS SELECT (i % 10)::INTEGER AS i, ((i * 2) % 10)::INTEGER AS j FROM generate_series(0, 99999, 1) tbl(i);
|
||||
|
||||
query IIII
|
||||
SELECT SUM(i), SUM(j), SUM(GREATEST(i, j)), SUM((SELECT max(x) FROM (VALUES (i), (j)) AS X(x))) as maxn FROM test2;
|
||||
----
|
||||
450000 400000 550000 550000
|
||||
|
||||
query IIII
|
||||
SELECT SUM(i), SUM(j), SUM(GREATEST(i, j)), SUM((SELECT max(x) FROM (VALUES (i), (j), (i), (j), (i), (j)) AS X(x))) as maxn FROM test2;
|
||||
----
|
||||
450000 400000 550000 550000
|
||||
|
||||
# NULLs
|
||||
statement ok
|
||||
CREATE TABLE test3 AS SELECT CASE WHEN i%7=2 THEN NULL ELSE (i % 10)::INTEGER END AS i, CASE WHEN i%9=2 THEN NULL ELSE ((i * 2) % 10)::INTEGER END AS j FROM generate_series(0, 99999, 1) tbl(i);
|
||||
|
||||
query III
|
||||
SELECT SUM(i), SUM(j), SUM((SELECT max(x) FROM (VALUES (i), (j)) AS X(x))) as maxn FROM test3;
|
||||
----
|
||||
385713 355556 512700
|
||||
|
||||
query III
|
||||
SELECT SUM(i), SUM(j), SUM((SELECT max(x) FROM (VALUES (i), (j), (NULL), (NULL), (6)) AS X(x))) as maxn FROM test3;
|
||||
----
|
||||
385713 355556 671748
|
||||
21
external/duckdb/test/sql/subquery/scalar/in_multiple_columns.test
vendored
Normal file
21
external/duckdb/test/sql/subquery/scalar/in_multiple_columns.test
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
# name: test/sql/subquery/scalar/in_multiple_columns.test
|
||||
# description: Test IN operator with multiple columns
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
CREATE TABLE table1(x INTEGER, y INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO table1 VALUES (NULL, 2), (1, NULL);
|
||||
|
||||
statement ok
|
||||
CREATE TABLE table2(i INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO table2 VALUES (1), (2), (3);
|
||||
|
||||
query I
|
||||
SELECT (x, y) IN (SELECT i, i + 1 FROM table2) from table1;
|
||||
----
|
||||
NULL
|
||||
NULL
|
||||
18
external/duckdb/test/sql/subquery/scalar/nested_subquery_window.test
vendored
Normal file
18
external/duckdb/test/sql/subquery/scalar/nested_subquery_window.test
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
# name: test/sql/subquery/scalar/nested_subquery_window.test
|
||||
# description: Fuzzer issue - nested subquery inside a window function
|
||||
# group: [scalar]
|
||||
|
||||
query I
|
||||
SELECT (SELECT max((SELECT subq_0.c0 AS c1))) FROM (SELECT NULL AS c0) AS subq_0;
|
||||
----
|
||||
NULL
|
||||
|
||||
query I
|
||||
SELECT (SELECT max(42) OVER (PARTITION BY (SELECT subq_0.c0 AS c1)) AS c6) FROM (SELECT NULL AS c0) AS subq_0;
|
||||
----
|
||||
42
|
||||
|
||||
query I
|
||||
SELECT (SELECT max((SELECT subq_0.c0 AS c1)) OVER () AS c6) FROM (SELECT NULL AS c0) AS subq_0;
|
||||
----
|
||||
NULL
|
||||
50
external/duckdb/test/sql/subquery/scalar/order_by_correlated.test
vendored
Normal file
50
external/duckdb/test/sql/subquery/scalar/order_by_correlated.test
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
# name: test/sql/subquery/scalar/order_by_correlated.test
|
||||
# description: Test ORDER BY in correlated subqueries
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
SET default_null_order='nulls_first';
|
||||
|
||||
statement ok
|
||||
CREATE TABLE integers(i INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO integers VALUES (1), (2), (3), (NULL);
|
||||
|
||||
# order by with limit
|
||||
query II
|
||||
SELECT i, (
|
||||
SELECT * FROM integers WHERE i>i1.i ORDER BY i ASC NULLS FIRST LIMIT 1
|
||||
) top
|
||||
FROM integers i1
|
||||
ORDER BY i
|
||||
----
|
||||
NULL NULL
|
||||
1 2
|
||||
2 3
|
||||
3 NULL
|
||||
|
||||
query II
|
||||
SELECT i, (
|
||||
SELECT * FROM integers WHERE i>i1.i ORDER BY i DESC NULLS FIRST LIMIT 1
|
||||
) top
|
||||
FROM integers i1
|
||||
ORDER BY i
|
||||
----
|
||||
NULL NULL
|
||||
1 3
|
||||
2 3
|
||||
3 NULL
|
||||
|
||||
# stand-alone order, with array expression
|
||||
query II
|
||||
SELECT i, ARRAY(
|
||||
SELECT * FROM integers WHERE i>i1.i ORDER BY i
|
||||
) top
|
||||
FROM integers i1
|
||||
ORDER BY i
|
||||
----
|
||||
NULL []
|
||||
1 [2, 3]
|
||||
2 [3]
|
||||
3 []
|
||||
81
external/duckdb/test/sql/subquery/scalar/subquery_row_in_any.test
vendored
Normal file
81
external/duckdb/test/sql/subquery/scalar/subquery_row_in_any.test
vendored
Normal file
@@ -0,0 +1,81 @@
|
||||
# name: test/sql/subquery/scalar/subquery_row_in_any.test
|
||||
# description: Test (a, b) IN (SELECT a, b ...)
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
CREATE TABLE integers(i INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO integers VALUES (1), (2), (3), (NULL);
|
||||
|
||||
query I
|
||||
SELECT (1, 2) IN (SELECT i, i + 1 FROM integers)
|
||||
----
|
||||
true
|
||||
|
||||
# mixed types
|
||||
query I
|
||||
SELECT (date '1992-01-02', 2) IN (SELECT date '1992-01-01' + interval (i) days, i + 1 FROM integers)
|
||||
----
|
||||
true
|
||||
|
||||
# it still works with the row inside the subquery
|
||||
query I
|
||||
SELECT (1, 2) IN (SELECT (i, i + 1) FROM integers)
|
||||
----
|
||||
true
|
||||
|
||||
query I
|
||||
SELECT row(1) IN (SELECT i FROM integers)
|
||||
----
|
||||
true
|
||||
|
||||
# also works with explicit row function
|
||||
query I
|
||||
SELECT ROW(1, 2) IN (SELECT i, i + 1 FROM integers)
|
||||
----
|
||||
true
|
||||
|
||||
# NULL semantics
|
||||
query I
|
||||
SELECT ROW(1, 2) IN (SELECT i, i + 2 FROM integers)
|
||||
----
|
||||
NULL
|
||||
|
||||
query I
|
||||
SELECT ROW(1, 2) IN (SELECT i, i + 2 FROM integers WHERE i IS NOT NULL)
|
||||
----
|
||||
false
|
||||
|
||||
query I
|
||||
select 1 where (1,2) in (select 1,2);
|
||||
----
|
||||
1
|
||||
|
||||
query I
|
||||
select 1 where (1,2) not in (select 1,2);
|
||||
----
|
||||
|
||||
statement error
|
||||
SELECT (1, 2) IN (SELECT (i, i + 1, i + 2) FROM integers)
|
||||
----
|
||||
Cannot compare values of type
|
||||
|
||||
# FIXME: correlated not yet supported
|
||||
statement error
|
||||
SELECT ROW(1, 2) IN (SELECT i1.i, i1.i + 1)
|
||||
FROM integers i1
|
||||
----
|
||||
not yet supported
|
||||
|
||||
mode skip
|
||||
|
||||
# correlated
|
||||
query I
|
||||
SELECT ROW(1, 2) IN (SELECT i1.i, i1.i + 1)
|
||||
FROM integers i1
|
||||
----
|
||||
true
|
||||
false
|
||||
false
|
||||
NULL
|
||||
162
external/duckdb/test/sql/subquery/scalar/test_complex_correlated_subquery.test
vendored
Normal file
162
external/duckdb/test/sql/subquery/scalar/test_complex_correlated_subquery.test
vendored
Normal file
@@ -0,0 +1,162 @@
|
||||
# name: test/sql/subquery/scalar/test_complex_correlated_subquery.test
|
||||
# description: Test complex correlated subqueries
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
SET default_null_order='nulls_first';
|
||||
|
||||
statement ok
|
||||
CREATE TABLE integers(i INTEGER)
|
||||
|
||||
statement ok
|
||||
INSERT INTO integers VALUES (1), (2), (3), (NULL)
|
||||
|
||||
# correlated expression in subquery
|
||||
query II
|
||||
SELECT i, (SELECT s1.i FROM (SELECT * FROM integers WHERE i=i1.i) s1) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 1
|
||||
2 2
|
||||
3 3
|
||||
|
||||
# join on two subqueries that both have a correlated expression in them
|
||||
query II
|
||||
SELECT i, (SELECT s1.i FROM (SELECT i FROM integers WHERE i=i1.i) s1 INNER JOIN (SELECT i FROM integers WHERE i=4-i1.i) s2 ON s1.i>s2.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 NULL
|
||||
2 NULL
|
||||
3 3
|
||||
|
||||
# implicit join with correlated expression in filter
|
||||
query II
|
||||
SELECT i, (SELECT s1.i FROM integers s1, integers s2 WHERE s1.i=s2.i AND s1.i=4-i1.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 3
|
||||
2 2
|
||||
3 1
|
||||
|
||||
# join with a correlated expression in the join condition
|
||||
query II
|
||||
SELECT i, (SELECT s1.i FROM integers s1 INNER JOIN integers s2 ON s1.i=s2.i AND s1.i=4-i1.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 3
|
||||
2 2
|
||||
3 1
|
||||
|
||||
# inner join on correlated subquery
|
||||
query II
|
||||
SELECT * FROM integers s1 INNER JOIN integers s2 ON (SELECT 2*SUM(i)*s1.i FROM integers)=(SELECT SUM(i)*s2.i FROM integers) ORDER BY s1.i;
|
||||
----
|
||||
1 2
|
||||
|
||||
# inner join on non-equality subquery
|
||||
query II
|
||||
SELECT * FROM integers s1 INNER JOIN integers s2 ON (SELECT s1.i=s2.i) ORDER BY s1.i;
|
||||
----
|
||||
1 1
|
||||
2 2
|
||||
3 3
|
||||
|
||||
query II
|
||||
SELECT * FROM integers s1 INNER JOIN integers s2 ON (SELECT s1.i=i FROM integers WHERE s2.i=i) ORDER BY s1.i;
|
||||
----
|
||||
1 1
|
||||
2 2
|
||||
3 3
|
||||
|
||||
# left outer join on comparison between correlated subqueries
|
||||
query TT
|
||||
SELECT * FROM integers s1 LEFT OUTER JOIN integers s2 ON (SELECT 2*SUM(i)*s1.i FROM integers)=(SELECT SUM(i)*s2.i FROM integers) ORDER BY s1.i;
|
||||
----
|
||||
NULL NULL
|
||||
1 2
|
||||
2 NULL
|
||||
3 NULL
|
||||
|
||||
# left outer join on arbitrary correlated subquery: not supported
|
||||
statement error
|
||||
SELECT * FROM integers s1 LEFT OUTER JOIN integers s2 ON (SELECT CASE WHEN s1.i+s2.i>10 THEN TRUE ELSE FALSE END) ORDER BY s1.i;
|
||||
----
|
||||
|
||||
# left outer join on subquery only involving RHS works
|
||||
query TT
|
||||
SELECT * FROM integers s1 LEFT OUTER JOIN integers s2 ON s1.i=s2.i AND (SELECT CASE WHEN s2.i>2 THEN TRUE ELSE FALSE END) ORDER BY s1.i;
|
||||
----
|
||||
NULL NULL
|
||||
1 NULL
|
||||
2 NULL
|
||||
3 3
|
||||
|
||||
# left outer join on subquery only involving LHS is not supported
|
||||
statement error
|
||||
SELECT * FROM integers s1 LEFT OUTER JOIN integers s2 ON s1.i=s2.i AND (SELECT CASE WHEN s1.i>2 THEN TRUE ELSE FALSE END) ORDER BY s1.i;
|
||||
----
|
||||
|
||||
# left outer join in correlated expression
|
||||
statement error
|
||||
SELECT i, (SELECT SUM(s1.i) FROM integers s1 LEFT OUTER JOIN integers s2 ON s1.i=s2.i OR s1.i=i1.i-1) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
|
||||
# REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3}));
|
||||
# REQUIRE(CHECK_COLUMN(result, 1, {Value(), 6, 9, 12}));
|
||||
# full outer join: both sqlite and postgres actually cannot run this one
|
||||
statement error
|
||||
SELECT i, (SELECT SUM(s1.i) FROM integers s1 FULL OUTER JOIN integers s2 ON s1.i=s2.i OR s1.i=i1.i-1) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
|
||||
# REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3}));
|
||||
# REQUIRE(CHECK_COLUMN(result, 1, {6, 6, 9, 12}));
|
||||
|
||||
# correlated expression inside window function not supported
|
||||
statement error
|
||||
SELECT i, (SELECT row_number() OVER (ORDER BY i)) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
|
||||
# union with correlated expression
|
||||
query II
|
||||
SELECT i, (SELECT i FROM integers WHERE i=i1.i UNION SELECT i FROM integers WHERE i=i1.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 1
|
||||
2 2
|
||||
3 3
|
||||
|
||||
# except with correlated expression
|
||||
query II
|
||||
SELECT i, (SELECT i FROM integers WHERE i IS NOT NULL EXCEPT SELECT i FROM integers WHERE i<>i1.i) AS j FROM integers i1 WHERE i IS NOT NULL ORDER BY i;
|
||||
----
|
||||
1 1
|
||||
2 2
|
||||
3 3
|
||||
|
||||
# intersect with correlated expression
|
||||
query II
|
||||
SELECT i, (SELECT i FROM integers WHERE i=i1.i INTERSECT SELECT i FROM integers WHERE i=i1.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 1
|
||||
2 2
|
||||
3 3
|
||||
|
||||
# multiple setops
|
||||
query II
|
||||
SELECT i, (SELECT i FROM integers WHERE i=i1.i UNION SELECT i FROM integers WHERE i<>i1.i EXCEPT SELECT i FROM integers WHERE i<>i1.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 1
|
||||
2 2
|
||||
3 3
|
||||
|
||||
# uncorrelated query inside correlated query
|
||||
query IR
|
||||
SELECT i, (SELECT (SELECT SUM(i) FROM integers)+42+i1.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 49.000000
|
||||
2 50.000000
|
||||
3 51.000000
|
||||
|
||||
45
external/duckdb/test/sql/subquery/scalar/test_complex_nested_correlated_subquery.test
vendored
Normal file
45
external/duckdb/test/sql/subquery/scalar/test_complex_nested_correlated_subquery.test
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
# name: test/sql/subquery/scalar/test_complex_nested_correlated_subquery.test
|
||||
# description: Test nested correlated subqueries with multiple columns
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
CREATE TABLE tbl(a TINYINT, b SMALLINT, c INTEGER, d BIGINT, e VARCHAR, f DATE, g TIMESTAMP)
|
||||
|
||||
statement ok
|
||||
INSERT INTO tbl VALUES (1, 2, 3, 4, '5', DATE '1992-01-01', TIMESTAMP '1992-01-01 00:00:00')
|
||||
|
||||
query T
|
||||
SELECT EXISTS(SELECT t1.b+t1.c) FROM tbl t1
|
||||
----
|
||||
1
|
||||
|
||||
query I
|
||||
SELECT t1.c+(SELECT t1.b FROM tbl t2 WHERE EXISTS(SELECT t1.b+t2.a)) FROM tbl t1
|
||||
----
|
||||
5
|
||||
|
||||
query I
|
||||
SELECT 1 FROM tbl t1 JOIN tbl t2 ON (t1.d=t2.d) WHERE EXISTS(SELECT t1.c FROM tbl t3 WHERE t1.d+t3.c<100 AND EXISTS(SELECT t2.f < DATE '2000-01-01'))
|
||||
----
|
||||
1
|
||||
|
||||
query T
|
||||
SELECT EXISTS(SELECT 1 WHERE (t1.c>100 OR 1) AND t1.d<100) FROM tbl t1
|
||||
----
|
||||
1
|
||||
|
||||
query T
|
||||
SELECT EXISTS(SELECT t1.c,t1.d WHERE t1.d<100) FROM tbl t1
|
||||
----
|
||||
1
|
||||
|
||||
query TTTTTTTTTTTTTT
|
||||
SELECT * FROM tbl t1 LEFT JOIN tbl t2 ON (SELECT t2.a)<100
|
||||
----
|
||||
1 2 3 4 5 1992-01-01 1992-01-01 00:00:00 1 2 3 4 5 1992-01-01 1992-01-01 00:00:00
|
||||
|
||||
query TTTTTTTTTTTTTT
|
||||
SELECT * FROM tbl t1 LEFT JOIN tbl t2 ON (SELECT t2.a)>100
|
||||
----
|
||||
1 2 3 4 5 1992-01-01 1992-01-01 00:00:00 NULL NULL NULL NULL NULL NULL NULL
|
||||
|
||||
390
external/duckdb/test/sql/subquery/scalar/test_correlated_aggregate_subquery.test_slow
vendored
Normal file
390
external/duckdb/test/sql/subquery/scalar/test_correlated_aggregate_subquery.test_slow
vendored
Normal file
@@ -0,0 +1,390 @@
|
||||
# name: test/sql/subquery/scalar/test_correlated_aggregate_subquery.test_slow
|
||||
# description: Test correlated aggregate subqueries
|
||||
# group: [scalar]
|
||||
|
||||
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)
|
||||
|
||||
# aggregate with correlation in final projection
|
||||
query II
|
||||
SELECT i, (SELECT MIN(i)+i1.i FROM integers) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 2
|
||||
2 3
|
||||
3 4
|
||||
|
||||
# aggregate with correlation inside aggregation
|
||||
query II
|
||||
SELECT i, (SELECT MIN(i+2*i1.i) FROM integers) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 3
|
||||
2 5
|
||||
3 7
|
||||
|
||||
query IRR
|
||||
SELECT i, SUM(i), (SELECT SUM(i)+SUM(i1.i) FROM integers) FROM integers i1 GROUP BY i ORDER BY i;
|
||||
----
|
||||
NULL NULL NULL
|
||||
1 1.000000 7.000000
|
||||
2 2.000000 8.000000
|
||||
3 3.000000 9.000000
|
||||
|
||||
query IRR
|
||||
SELECT i, SUM(i), (SELECT SUM(i)+COUNT(i1.i) FROM integers) FROM integers i1 GROUP BY i ORDER BY i;
|
||||
----
|
||||
NULL NULL 6.000000
|
||||
1 1.000000 7.000000
|
||||
2 2.000000 7.000000
|
||||
3 3.000000 7.000000
|
||||
|
||||
# correlated COUNT(*)
|
||||
query II
|
||||
SELECT i, (SELECT COUNT(*) FROM integers i2 WHERE i2.i>i1.i) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 0
|
||||
1 2
|
||||
2 1
|
||||
3 0
|
||||
|
||||
# aggregate with correlation inside aggregation
|
||||
query II
|
||||
SELECT i, (SELECT MIN(i+2*i1.i) FROM integers) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 3
|
||||
2 5
|
||||
3 7
|
||||
|
||||
# aggregate ONLY inside subquery
|
||||
query R
|
||||
SELECT (SELECT SUM(i1.i)) FROM integers i1;
|
||||
----
|
||||
6.000000
|
||||
|
||||
# aggregate ONLY inside subquery, with column reference outside of subquery
|
||||
query IR
|
||||
SELECT MIN(i), (SELECT SUM(i1.i)) FROM integers i1;
|
||||
----
|
||||
1 6.000000
|
||||
|
||||
# this will fail, because "i" is not an aggregate but the SUM(i1.i) turns this query into an aggregate
|
||||
statement error
|
||||
SELECT i, (SELECT SUM(i1.i)) FROM integers i1;
|
||||
----
|
||||
|
||||
statement error
|
||||
SELECT i+1, (SELECT SUM(i1.i)) FROM integers i1;
|
||||
----
|
||||
|
||||
query IR
|
||||
SELECT MIN(i), (SELECT SUM(i1.i)) FROM integers i1;
|
||||
----
|
||||
1 6.000000
|
||||
|
||||
query RR
|
||||
SELECT (SELECT SUM(i1.i)), (SELECT SUM(i1.i)) FROM integers i1;
|
||||
----
|
||||
6.000000 6.000000
|
||||
|
||||
# subquery inside aggregation
|
||||
query RR
|
||||
SELECT SUM(i), SUM((SELECT i FROM integers WHERE i=i1.i)) FROM integers i1;
|
||||
----
|
||||
6.000000 6.000000
|
||||
|
||||
query RR
|
||||
SELECT SUM(i), (SELECT SUM(i) FROM integers WHERE i>SUM(i1.i)) FROM integers i1;
|
||||
----
|
||||
6.000000 NULL
|
||||
|
||||
# subquery with aggregation inside aggregation should fail
|
||||
statement error
|
||||
SELECT SUM((SELECT SUM(i))) FROM integers
|
||||
----
|
||||
|
||||
# aggregate with correlation in filter
|
||||
query II
|
||||
SELECT i, (SELECT MIN(i) FROM integers WHERE i>i1.i) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 2
|
||||
2 3
|
||||
3 NULL
|
||||
|
||||
# aggregate with correlation in both filter and projection
|
||||
query II
|
||||
SELECT i, (SELECT MIN(i)+i1.i FROM integers WHERE i>i1.i) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 3
|
||||
2 5
|
||||
3 NULL
|
||||
|
||||
# aggregate with correlation in GROUP BY
|
||||
query II
|
||||
SELECT i, (SELECT MIN(i) FROM integers GROUP BY i1.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 1
|
||||
1 1
|
||||
2 1
|
||||
3 1
|
||||
|
||||
# aggregate with correlation in HAVING clause
|
||||
query II
|
||||
SELECT i, (SELECT i FROM integers GROUP BY i HAVING i=i1.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 1
|
||||
2 2
|
||||
3 3
|
||||
|
||||
# correlated subquery in HAVING
|
||||
query IR
|
||||
SELECT i1.i, SUM(i) FROM integers i1 GROUP BY i1.i HAVING SUM(i)=(SELECT MIN(i) FROM integers WHERE i<>i1.i+1) ORDER BY 1;
|
||||
----
|
||||
1 1.000000
|
||||
|
||||
query IR
|
||||
SELECT i % 2 AS j, SUM(i) FROM integers i1 GROUP BY j HAVING SUM(i)=(SELECT SUM(i) FROM integers WHERE i<>j+1) ORDER BY 1;
|
||||
----
|
||||
1 4.000000
|
||||
|
||||
# aggregate query with non-aggregate subquery without group by
|
||||
query R
|
||||
SELECT (SELECT i+SUM(i1.i) FROM integers WHERE i=1 LIMIT 1) FROM integers i1;
|
||||
----
|
||||
7.000000
|
||||
|
||||
query R
|
||||
SELECT (SELECT SUM(i)+SUM(i1.i) FROM integers) FROM integers i1 ORDER BY 1;
|
||||
----
|
||||
12.000000
|
||||
|
||||
query R
|
||||
SELECT (SELECT SUM(i)+SUM((CASE WHEN i IS NOT NULL THEN i*0 ELSE 0 END)+i1.i) FROM integers) FROM integers i1 ORDER BY 1;
|
||||
----
|
||||
NULL
|
||||
10.000000
|
||||
14.000000
|
||||
18.000000
|
||||
|
||||
# aggregate query with non-aggregate subquery with group by
|
||||
query IR
|
||||
SELECT i, (SELECT i+SUM(i1.i) FROM integers WHERE i=1) FROM integers i1 GROUP BY i ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 2.000000
|
||||
2 3.000000
|
||||
3 4.000000
|
||||
|
||||
# subquery inside aggregate
|
||||
query R
|
||||
SELECT SUM((SELECT i+i1.i FROM integers WHERE i=1)) FROM integers i1;
|
||||
----
|
||||
9.000000
|
||||
|
||||
query IRR
|
||||
SELECT i, SUM(i1.i), (SELECT SUM(i1.i)) AS k FROM integers i1 GROUP BY i ORDER BY i;
|
||||
----
|
||||
NULL NULL NULL
|
||||
1 1.000000 1.000000
|
||||
2 2.000000 2.000000
|
||||
3 3.000000 3.000000
|
||||
|
||||
statement error
|
||||
SELECT i, SUM(i1.i), (SELECT SUM(i1.i) FROM integers) AS k FROM integers i1 GROUP BY i ORDER BY i;
|
||||
----
|
||||
More than one row returned by a subquery
|
||||
|
||||
# aggregation of both entries inside subquery
|
||||
# aggregate on group inside subquery
|
||||
query IR
|
||||
SELECT i1.i AS j, (SELECT SUM(j+i) FROM integers) AS k FROM integers i1 GROUP BY j ORDER BY j;
|
||||
----
|
||||
NULL NULL
|
||||
1 9.000000
|
||||
2 12.000000
|
||||
3 15.000000
|
||||
|
||||
query R
|
||||
SELECT (SELECT SUM(i1.i*i) FROM integers) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL
|
||||
6.000000
|
||||
12.000000
|
||||
18.000000
|
||||
|
||||
query IRR
|
||||
SELECT i, (SELECT SUM(i1.i)) AS k, (SELECT SUM(i1.i)) AS l FROM integers i1 GROUP BY i ORDER BY i;
|
||||
----
|
||||
NULL NULL NULL
|
||||
1 1.000000 1.000000
|
||||
2 2.000000 2.000000
|
||||
3 3.000000 3.000000
|
||||
|
||||
# refer aggregation inside subquery
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(i1.i)*SUM(i) FROM integers) AS k FROM integers i1 GROUP BY i ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 6.000000
|
||||
2 12.000000
|
||||
3 18.000000
|
||||
|
||||
# refer to GROUP BY inside subquery
|
||||
query IR
|
||||
SELECT i AS j, (SELECT j*SUM(i) FROM integers) AS k FROM integers i1 GROUP BY j ORDER BY j;
|
||||
----
|
||||
NULL NULL
|
||||
1 6.000000
|
||||
2 12.000000
|
||||
3 18.000000
|
||||
|
||||
# refer to GROUP BY without alias but with full name
|
||||
query IR
|
||||
SELECT i AS j, (SELECT i1.i*SUM(i) FROM integers) AS k FROM integers i1 GROUP BY j ORDER BY j;
|
||||
----
|
||||
NULL NULL
|
||||
1 6.000000
|
||||
2 12.000000
|
||||
3 18.000000
|
||||
|
||||
# perform SUM on subquery
|
||||
query IR
|
||||
SELECT i, SUM((SELECT SUM(i)*i1.i FROM integers)) AS k FROM integers i1 GROUP BY i ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 6.000000
|
||||
2 12.000000
|
||||
3 18.000000
|
||||
|
||||
# aggregate subqueries cannot be nested
|
||||
statement error
|
||||
SELECT i, SUM((SELECT SUM(i)*SUM(i1.i) FROM integers)) AS k FROM integers i1 GROUP BY i ORDER BY i;
|
||||
----
|
||||
|
||||
# aggregation but ONLY inside subquery results in implicit aggregation
|
||||
query R
|
||||
SELECT (SELECT SUM(i1.i)) FROM integers i1;
|
||||
----
|
||||
6.000000
|
||||
|
||||
query IR
|
||||
SELECT FIRST(i), (SELECT SUM(i1.i)) FROM integers i1;
|
||||
----
|
||||
1 6.000000
|
||||
|
||||
# aggregate that uses correlated column in aggregation
|
||||
query II
|
||||
SELECT i AS j, (SELECT MIN(i1.i) FROM integers GROUP BY i HAVING i=j) FROM integers i1 GROUP BY j ORDER BY j;
|
||||
----
|
||||
NULL NULL
|
||||
1 1
|
||||
2 2
|
||||
3 3
|
||||
|
||||
# ORDER BY correlated subquery
|
||||
query IR
|
||||
SELECT i, SUM(i1.i) FROM integers i1 GROUP BY i ORDER BY (SELECT SUM(i1.i));
|
||||
----
|
||||
NULL NULL
|
||||
1 1.000000
|
||||
2 2.000000
|
||||
3 3.000000
|
||||
|
||||
statement error
|
||||
SELECT i, SUM(i1.i) FROM integers i1 GROUP BY i ORDER BY (SELECT SUM(i1.i) FROM integers);
|
||||
----
|
||||
More than one row returned by a subquery
|
||||
|
||||
# LIMIT 0 on correlated subquery
|
||||
query IR
|
||||
SELECT i, SUM((SELECT SUM(i)*i1.i FROM integers LIMIT 0)) AS k FROM integers i1 GROUP BY i ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 NULL
|
||||
2 NULL
|
||||
3 NULL
|
||||
|
||||
# GROUP BY correlated subquery
|
||||
query IR
|
||||
SELECT (SELECT i+i1.i FROM integers WHERE i=1) AS k, SUM(i) AS j FROM integers i1 GROUP BY k ORDER BY 1;
|
||||
----
|
||||
NULL NULL
|
||||
2 1.000000
|
||||
3 2.000000
|
||||
4 3.000000
|
||||
|
||||
# correlated subquery in WHERE
|
||||
query R
|
||||
SELECT SUM(i) FROM integers i1 WHERE i>(SELECT (i+i1.i)/2 FROM integers WHERE i=1);
|
||||
----
|
||||
5.000000
|
||||
|
||||
# correlated aggregate in WHERE
|
||||
query R
|
||||
SELECT SUM(i) FROM integers i1 WHERE i>(SELECT (SUM(i)+i1.i)/2 FROM integers WHERE i=1);
|
||||
----
|
||||
5.000000
|
||||
|
||||
# use scalar subquery as argument to ALL/ANY
|
||||
query IT
|
||||
SELECT i, (SELECT MIN(i) FROM integers WHERE i=i1.i) >= ALL(SELECT i FROM integers WHERE i IS NOT NULL) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 0
|
||||
2 0
|
||||
3 1
|
||||
|
||||
query IT
|
||||
SELECT i, (SELECT MIN(i) FROM integers WHERE i<>i1.i) > ANY(SELECT i FROM integers WHERE i IS NOT NULL) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 1
|
||||
2 0
|
||||
3 0
|
||||
|
||||
query IT
|
||||
SELECT i, NOT((SELECT MIN(i) FROM integers WHERE i<>i1.i) > ANY(SELECT i FROM integers WHERE i IS NOT NULL)) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 0
|
||||
2 1
|
||||
3 1
|
||||
|
||||
# aggregates with multiple parameters
|
||||
query R
|
||||
SELECT (SELECT COVAR_POP(i1.i, i2.i) FROM integers i2) FROM integers i1 ORDER BY 1
|
||||
----
|
||||
NULL
|
||||
0.000000
|
||||
0.000000
|
||||
0.000000
|
||||
|
||||
query R
|
||||
SELECT (SELECT COVAR_POP(i2.i, i1.i) FROM integers i2) FROM integers i1 ORDER BY 1
|
||||
----
|
||||
NULL
|
||||
0.000000
|
||||
0.000000
|
||||
0.000000
|
||||
|
||||
query R
|
||||
SELECT (SELECT COVAR_POP(i1.i+i2.i, i1.i+i2.i) FROM integers i2) FROM integers i1 ORDER BY 1
|
||||
----
|
||||
NULL
|
||||
0.666667
|
||||
0.666667
|
||||
0.666667
|
||||
|
||||
62
external/duckdb/test/sql/subquery/scalar/test_correlated_grouping_set.test
vendored
Normal file
62
external/duckdb/test/sql/subquery/scalar/test_correlated_grouping_set.test
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
# name: test/sql/subquery/scalar/test_correlated_grouping_set.test
|
||||
# description: Test correlated aggregate subqueries
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
SET default_null_order='nulls_first';
|
||||
|
||||
statement ok
|
||||
CREATE TABLE integers(i INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO integers VALUES (1), (2), (3), (NULL);
|
||||
|
||||
# aggregate with correlation in GROUPING SET
|
||||
query II
|
||||
SELECT i, (SELECT COUNT(*) FROM (SELECT i1.i FROM integers GROUP BY GROUPING SETS(i1.i)) tbl) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 1
|
||||
1 1
|
||||
2 1
|
||||
3 1
|
||||
|
||||
# many grouping sets
|
||||
query II
|
||||
SELECT i, (SELECT COUNT(*) FROM (SELECT i1.i FROM integers GROUP BY GROUPING SETS((i1.i), (), (i1.i), (i1.i, i1.i))) tbl) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 4
|
||||
1 4
|
||||
2 4
|
||||
3 4
|
||||
|
||||
# rollup
|
||||
query II
|
||||
SELECT i, (SELECT COUNT(*) FROM (SELECT i1.i FROM integers GROUP BY ROLLUP (i1.i, i1.i, i1.i, i1.i)) tbl) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 5
|
||||
1 5
|
||||
2 5
|
||||
3 5
|
||||
|
||||
# cube
|
||||
query II
|
||||
SELECT i, (SELECT COUNT(*) FROM (SELECT i1.i FROM integers GROUP BY CUBE (i1.i, i1.i, i1.i, i1.i)) tbl) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 16
|
||||
1 16
|
||||
2 16
|
||||
3 16
|
||||
|
||||
# aggregate with correlation in GROUPING SET and HAVING
|
||||
# FIXME: this is borked, related to #2335
|
||||
mode skip
|
||||
|
||||
query II
|
||||
SELECT i, (SELECT MIN(i) FROM integers GROUP BY GROUPING SETS(i1.i, i) HAVING i1.i=i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 NULL
|
||||
2 NULL
|
||||
3 NULL
|
||||
|
||||
mode unskip
|
||||
37
external/duckdb/test/sql/subquery/scalar/test_correlated_set_op.test
vendored
Normal file
37
external/duckdb/test/sql/subquery/scalar/test_correlated_set_op.test
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
# name: test/sql/subquery/scalar/test_correlated_set_op.test
|
||||
# description: Test correlated subqueries with set operations
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
SET default_null_order='nulls_first';
|
||||
|
||||
statement ok
|
||||
CREATE TABLE integers(i INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO integers VALUES (1), (2), (3), (NULL);
|
||||
|
||||
# scalar select with correlation in different UNION ALL branches
|
||||
query II
|
||||
SELECT i, (SELECT SUM(x) FROM (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT i1.i) t(x)) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 3
|
||||
1 4
|
||||
2 5
|
||||
3 6
|
||||
|
||||
query II
|
||||
SELECT i, (SELECT SUM(x) FROM (SELECT i1.i UNION ALL SELECT 2 UNION ALL SELECT 1) t(x)) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 3
|
||||
1 4
|
||||
2 5
|
||||
3 6
|
||||
|
||||
query II
|
||||
SELECT i, (SELECT SUM(x) FROM (SELECT 2 UNION ALL SELECT i1.i UNION ALL SELECT 1) t(x)) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 3
|
||||
1 4
|
||||
2 5
|
||||
3 6
|
||||
15
external/duckdb/test/sql/subquery/scalar/test_correlated_side_effects.test
vendored
Normal file
15
external/duckdb/test/sql/subquery/scalar/test_correlated_side_effects.test
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
# name: test/sql/subquery/scalar/test_correlated_side_effects.test
|
||||
# description: Test correlated subqueries with side effects
|
||||
# group: [scalar]
|
||||
|
||||
# FIXME: we should not perform duplicate elimination for subqueries that have side-effects
|
||||
|
||||
mode skip
|
||||
|
||||
query I
|
||||
SELECT COUNT(DISTINCT
|
||||
(SELECT concat(gen_random_uuid()::VARCHAR, r::VARCHAR))
|
||||
) as total_seats
|
||||
FROM (SELECT 1 FROM generate_series(1, 100, 1)) AS t(r)
|
||||
----
|
||||
100
|
||||
198
external/duckdb/test/sql/subquery/scalar/test_correlated_subquery.test
vendored
Normal file
198
external/duckdb/test/sql/subquery/scalar/test_correlated_subquery.test
vendored
Normal file
@@ -0,0 +1,198 @@
|
||||
# name: test/sql/subquery/scalar/test_correlated_subquery.test
|
||||
# description: Test correlated subqueries
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
SET default_null_order='nulls_first';
|
||||
|
||||
statement ok
|
||||
CREATE TABLE integers(i INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO integers VALUES (1), (2), (3), (NULL);
|
||||
|
||||
# scalar select with correlation
|
||||
query II
|
||||
SELECT i, (SELECT 42+i1.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 43
|
||||
2 44
|
||||
3 45
|
||||
|
||||
# ORDER BY correlated subquery
|
||||
query I
|
||||
SELECT i FROM integers i1 ORDER BY (SELECT 100-i1.i);
|
||||
----
|
||||
NULL
|
||||
3
|
||||
2
|
||||
1
|
||||
|
||||
# subquery returning multiple results
|
||||
statement error
|
||||
SELECT i, (SELECT 42+i1.i FROM integers) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
More than one row returned by a subquery used as an expression
|
||||
|
||||
statement ok
|
||||
SET scalar_subquery_error_on_multiple_rows=false
|
||||
|
||||
query II
|
||||
SELECT i, (SELECT 42+i1.i FROM integers) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 43
|
||||
2 44
|
||||
3 45
|
||||
|
||||
statement ok
|
||||
SET scalar_subquery_error_on_multiple_rows=true
|
||||
|
||||
# subquery with LIMIT
|
||||
query II
|
||||
SELECT i, (SELECT 42+i1.i FROM integers LIMIT 1) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 43
|
||||
2 44
|
||||
3 45
|
||||
|
||||
# subquery with LIMIT 0
|
||||
query II
|
||||
SELECT i, (SELECT 42+i1.i FROM integers LIMIT 0) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 NULL
|
||||
2 NULL
|
||||
3 NULL
|
||||
|
||||
# subquery with WHERE clause that is always FALSE
|
||||
query II
|
||||
SELECT i, (SELECT i FROM integers WHERE 1=0 AND i1.i=i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 NULL
|
||||
2 NULL
|
||||
3 NULL
|
||||
|
||||
# correlated EXISTS with WHERE clause that is always FALSE
|
||||
query IT
|
||||
SELECT i, EXISTS(SELECT i FROM integers WHERE 1=0 AND i1.i=i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 0
|
||||
1 0
|
||||
2 0
|
||||
3 0
|
||||
|
||||
# correlated ANY with WHERE clause that is always FALSE
|
||||
query IT
|
||||
SELECT i, i=ANY(SELECT i FROM integers WHERE 1=0 AND i1.i=i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 0
|
||||
1 0
|
||||
2 0
|
||||
3 0
|
||||
|
||||
# subquery with OFFSET
|
||||
query II
|
||||
SELECT i, (SELECT i+i1.i FROM integers ORDER BY ALL LIMIT 1 OFFSET 1) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 2
|
||||
2 3
|
||||
3 4
|
||||
|
||||
# subquery with OFFSET and without LIMIT
|
||||
query I
|
||||
select (select val + i from generate_series(1, 2, 1) t(i) offset 1) from (select 42 val) t;
|
||||
----
|
||||
44
|
||||
|
||||
# subquery with OFFSET and without LIMIT with ORDER BY
|
||||
query II
|
||||
select i, (select i1.i + i + i from generate_series(1, 100, 1) t(i) ORDER BY i DESC OFFSET 99) from integers i1 order by i;
|
||||
----
|
||||
NULL NULL
|
||||
1 3
|
||||
2 4
|
||||
3 5
|
||||
|
||||
# subquery with ORDER BY
|
||||
query II
|
||||
SELECT i, (SELECT i+i1.i FROM integers ORDER BY i NULLS LAST LIMIT 1) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 2
|
||||
2 3
|
||||
3 4
|
||||
|
||||
query II
|
||||
SELECT i, (SELECT i+i1.i FROM integers ORDER BY i NULLS LAST LIMIT 1 OFFSET 1) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 3
|
||||
2 4
|
||||
3 5
|
||||
|
||||
# correlated filter without FROM clause
|
||||
query II
|
||||
SELECT i, (SELECT 42 WHERE i1.i>2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 NULL
|
||||
2 NULL
|
||||
3 42
|
||||
|
||||
# correlated filter with matching entry on NULL
|
||||
query II
|
||||
SELECT i, (SELECT 42 WHERE i1.i IS NULL) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 42
|
||||
1 NULL
|
||||
2 NULL
|
||||
3 NULL
|
||||
|
||||
# scalar select with correlation in projection
|
||||
query II
|
||||
SELECT i, (SELECT i+i1.i FROM integers WHERE i=1) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 2
|
||||
2 3
|
||||
3 4
|
||||
|
||||
# scalar select with correlation in filter
|
||||
query II
|
||||
SELECT i, (SELECT i FROM integers WHERE i=i1.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 1
|
||||
2 2
|
||||
3 3
|
||||
|
||||
# scalar select with operation in projection
|
||||
query II
|
||||
SELECT i, (SELECT i+1 FROM integers WHERE i=i1.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 2
|
||||
2 3
|
||||
3 4
|
||||
|
||||
# correlated scalar select with constant in projection
|
||||
query II
|
||||
SELECT i, (SELECT 42 FROM integers WHERE i=i1.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 42
|
||||
2 42
|
||||
3 42
|
||||
|
||||
query II
|
||||
SELECT i, (SELECT CASE WHEN sum(i) > 1 THEN 0 ELSE 1 END FROM integers WHERE i=i1.i) FROM integers i1;
|
||||
----
|
||||
1 1
|
||||
2 0
|
||||
3 0
|
||||
NULL 1
|
||||
167
external/duckdb/test/sql/subquery/scalar/test_correlated_subquery_cte.test
vendored
Normal file
167
external/duckdb/test/sql/subquery/scalar/test_correlated_subquery_cte.test
vendored
Normal file
@@ -0,0 +1,167 @@
|
||||
# name: test/sql/subquery/scalar/test_correlated_subquery_cte.test
|
||||
# description: Test correlated subqueries
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
SET default_null_order='nulls_first';
|
||||
|
||||
statement ok
|
||||
CREATE TABLE integers(i INTEGER)
|
||||
|
||||
statement ok
|
||||
INSERT INTO integers VALUES (1), (2), (3), (NULL)
|
||||
|
||||
require no_alternative_verify
|
||||
|
||||
# scalar select with correlation
|
||||
query II
|
||||
SELECT i, (WITH i2 AS (SELECT 42+i1.i AS j) SELECT j FROM i2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 43
|
||||
2 44
|
||||
3 45
|
||||
|
||||
# ORDER BY correlated subquery
|
||||
query I
|
||||
SELECT i FROM integers i1 ORDER BY (WITH i2 AS (SELECT 100-i1.i as j) SELECT j FROM i2);
|
||||
----
|
||||
NULL
|
||||
3
|
||||
2
|
||||
1
|
||||
|
||||
# subquery returning multiple results
|
||||
statement error
|
||||
SELECT i, (WITH i2 AS (SELECT 42+i1.i AS j FROM integers) SELECT j FROM i2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
More than one row returned by a subquery
|
||||
|
||||
statement ok
|
||||
SET scalar_subquery_error_on_multiple_rows=false
|
||||
|
||||
query II
|
||||
SELECT i, (WITH i2 AS (SELECT 42+i1.i AS j FROM integers) SELECT j FROM i2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 43
|
||||
2 44
|
||||
3 45
|
||||
|
||||
# subquery with LIMIT
|
||||
query II
|
||||
SELECT i, (WITH i2 AS (SELECT 42+i1.i AS j FROM integers) SELECT j FROM i2 LIMIT 1) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 43
|
||||
2 44
|
||||
3 45
|
||||
|
||||
# subquery with LIMIT 0
|
||||
query II
|
||||
SELECT i, (WITH i2 AS (SELECT 42+i1.i AS j FROM integers) SELECT j FROM i2 LIMIT 0) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 NULL
|
||||
2 NULL
|
||||
3 NULL
|
||||
|
||||
# subquery with WHERE clause that is always FALSE
|
||||
query II
|
||||
SELECT i, (WITH i2 AS (SELECT i FROM integers WHERE 1=0 AND i1.i=i) SELECT i FROM i2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 NULL
|
||||
2 NULL
|
||||
3 NULL
|
||||
|
||||
# correlated EXISTS with WHERE clause that is always FALSE
|
||||
query IT
|
||||
SELECT i, EXISTS(WITH i2 AS (SELECT i FROM integers WHERE 1=0 AND i1.i=i) SELECT i FROM i2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 0
|
||||
1 0
|
||||
2 0
|
||||
3 0
|
||||
|
||||
# correlated ANY with WHERE clause that is always FALSE
|
||||
query IT
|
||||
SELECT i, i=ANY(WITH i2 AS (SELECT i FROM integers WHERE 1=0 AND i1.i=i) SELECT i FROM i2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 0
|
||||
1 0
|
||||
2 0
|
||||
3 0
|
||||
|
||||
# subquery with OFFSET
|
||||
query II
|
||||
SELECT i, (WITH i2 AS (SELECT i+i1.i FROM integers ORDER BY ALL LIMIT 1 OFFSET 1) SELECT * FROM i2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 2
|
||||
2 3
|
||||
3 4
|
||||
|
||||
# subquery with ORDER BY
|
||||
query II
|
||||
SELECT i, (WITH i2 AS (SELECT i+i1.i FROM integers ORDER BY 1 NULLS LAST LIMIT 1 OFFSET 1) SELECT * FROM i2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 3
|
||||
2 4
|
||||
3 5
|
||||
|
||||
# correlated filter without FROM clause
|
||||
query II
|
||||
SELECT i, (WITH i2 AS (SELECT 42 WHERE i1.i>2) SELECT * FROM i2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 NULL
|
||||
2 NULL
|
||||
3 42
|
||||
|
||||
# correlated filter with matching entry on NULL
|
||||
query II
|
||||
SELECT i, (WITH i2 AS (SELECT 42 WHERE i1.i IS NULL) SELECT * FROM i2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 42
|
||||
1 NULL
|
||||
2 NULL
|
||||
3 NULL
|
||||
|
||||
# scalar select with correlation in projection
|
||||
query II
|
||||
SELECT i, (WITH i2 AS (SELECT i+i1.i FROM integers WHERE i=1) SELECT * FROM i2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 2
|
||||
2 3
|
||||
3 4
|
||||
|
||||
# scalar select with correlation in filter
|
||||
query II
|
||||
SELECT i, (WITH i2 AS (SELECT i FROM integers WHERE i=i1.i) SELECT * FROM i2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 1
|
||||
2 2
|
||||
3 3
|
||||
|
||||
# scalar select with operation in projection
|
||||
query II
|
||||
SELECT i, (WITH i2 AS (SELECT i+1 FROM integers WHERE i=i1.i) SELECT * FROM i2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 2
|
||||
2 3
|
||||
3 4
|
||||
|
||||
# correlated scalar select with constant in projection
|
||||
query II
|
||||
SELECT i, (WITH i2 AS (SELECT 42 FROM integers WHERE i=i1.i) SELECT * FROM i2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 42
|
||||
2 42
|
||||
3 42
|
||||
|
||||
20
external/duckdb/test/sql/subquery/scalar/test_correlated_subquery_where.test
vendored
Normal file
20
external/duckdb/test/sql/subquery/scalar/test_correlated_subquery_where.test
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
# name: test/sql/subquery/scalar/test_correlated_subquery_where.test
|
||||
# description: Test correlated subqueries in WHERE clause
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
CREATE TABLE test AS FROM VALUES (1, 22), (1, 21), (2, 22) v(id, b);
|
||||
|
||||
# correlated subquery with one correlated expression
|
||||
query II rowsort
|
||||
SELECT * FROM test WHERE b=(SELECT MIN(b) FROM test AS a WHERE a.id=test.id)
|
||||
----
|
||||
1 21
|
||||
2 22
|
||||
|
||||
# correlated subquery with two correlated expressions
|
||||
query II rowsort
|
||||
SELECT * FROM test WHERE b=(SELECT MIN(b) FROM test AS a WHERE a.id=test.id AND a.id < test.b)
|
||||
----
|
||||
1 21
|
||||
2 22
|
||||
51
external/duckdb/test/sql/subquery/scalar/test_correlated_window.test
vendored
Normal file
51
external/duckdb/test/sql/subquery/scalar/test_correlated_window.test
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
# name: test/sql/subquery/scalar/test_correlated_window.test
|
||||
# description: Test correlated window functions
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
SET default_null_order='nulls_first';
|
||||
|
||||
statement ok
|
||||
CREATE TABLE integers(i INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO integers VALUES (1), (2), (3), (NULL);
|
||||
|
||||
# FIXME - why not?
|
||||
statement error
|
||||
SELECT i, (SELECT SUM(i + 1) OVER ()) FROM integers ORDER BY i
|
||||
----
|
||||
not supported
|
||||
|
||||
query II
|
||||
SELECT i, (SELECT SUM((SELECT i + 1)) OVER ()) FROM integers ORDER BY i
|
||||
----
|
||||
NULL NULL
|
||||
1 2
|
||||
2 3
|
||||
3 4
|
||||
|
||||
query II
|
||||
SELECT i, (SELECT SUM((SELECT i + 1)) OVER () WHERE i>=2) FROM integers ORDER BY i
|
||||
----
|
||||
NULL NULL
|
||||
1 NULL
|
||||
2 3
|
||||
3 4
|
||||
|
||||
# mix of aggregates and windows
|
||||
query II
|
||||
SELECT i, (SELECT SUM((SELECT SUM(i))) OVER ()) FROM integers GROUP BY i ORDER BY i
|
||||
----
|
||||
NULL NULL
|
||||
1 1
|
||||
2 2
|
||||
3 3
|
||||
|
||||
query II
|
||||
SELECT i, (SELECT SUM(win) FROM (SELECT SUM((SELECT i1.i + integers.i)) OVER () AS win FROM integers i1) t) FROM integers ORDER BY i
|
||||
----
|
||||
NULL NULL
|
||||
1 36
|
||||
2 48
|
||||
3 60
|
||||
100
external/duckdb/test/sql/subquery/scalar/test_count_star_subquery.test
vendored
Normal file
100
external/duckdb/test/sql/subquery/scalar/test_count_star_subquery.test
vendored
Normal file
@@ -0,0 +1,100 @@
|
||||
# name: test/sql/subquery/scalar/test_count_star_subquery.test
|
||||
# description: Test for COUNT(*) and SUM(i) IS NULL in subqueries
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
SET default_null_order='nulls_first';
|
||||
|
||||
statement ok
|
||||
CREATE TABLE integers(i INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO integers VALUES (1), (2), (3), (NULL);
|
||||
|
||||
# COUNT(*) and SUM(i) IS NULL aggregates
|
||||
query II
|
||||
SELECT i, (SELECT i FROM integers i2 WHERE i=(SELECT SUM(i) FROM integers i2 WHERE i2.i>i1.i)) FROM integers i1 ORDER BY 1;
|
||||
----
|
||||
NULL NULL
|
||||
1 NULL
|
||||
2 3
|
||||
3 NULL
|
||||
|
||||
query IT
|
||||
SELECT i, (SELECT SUM(i) IS NULL FROM integers i2 WHERE i2.i>i1.i) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 1
|
||||
1 0
|
||||
2 0
|
||||
3 1
|
||||
|
||||
query II
|
||||
SELECT i, (SELECT COUNT(*) FROM integers i2 WHERE i2.i>i1.i) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 0
|
||||
1 2
|
||||
2 1
|
||||
3 0
|
||||
|
||||
query II
|
||||
SELECT i, (SELECT COUNT(i) FROM integers i2 WHERE i2.i>i1.i OR i2.i IS NULL) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 0
|
||||
1 2
|
||||
2 1
|
||||
3 0
|
||||
|
||||
query II
|
||||
SELECT i, (SELECT COUNT(*) FROM integers i2 WHERE i2.i>i1.i OR i2.i IS NULL) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 1
|
||||
1 3
|
||||
2 2
|
||||
3 1
|
||||
|
||||
query II
|
||||
SELECT i, (SELECT COUNT(*) FROM integers i2 WHERE i2.i>i1.i OR (i1.i IS NULL AND i2.i IS NULL)) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 1
|
||||
1 2
|
||||
2 1
|
||||
3 0
|
||||
|
||||
query I
|
||||
SELECT i FROM integers i1 WHERE (SELECT COUNT(*) FROM integers i2 WHERE i2.i>i1.i)=0 ORDER BY i;
|
||||
----
|
||||
NULL
|
||||
3
|
||||
|
||||
query II
|
||||
SELECT i, (SELECT i FROM integers i2 WHERE i-2=(SELECT COUNT(*) FROM integers i2 WHERE i2.i>i1.i)) FROM integers i1 ORDER BY 1;
|
||||
----
|
||||
NULL 2
|
||||
1 NULL
|
||||
2 3
|
||||
3 2
|
||||
|
||||
query II
|
||||
SELECT i, (SELECT COUNT(*) FROM integers i2 WHERE i2.i>i1.i GROUP BY i1.i) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 2
|
||||
2 1
|
||||
3 NULL
|
||||
|
||||
query II
|
||||
SELECT i, (SELECT CASE WHEN (SELECT COUNT(*) FROM integers i2 WHERE i2.i>i1.i)=0 THEN 1 ELSE 0 END) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 1
|
||||
1 0
|
||||
2 0
|
||||
3 1
|
||||
|
||||
query II
|
||||
SELECT i, (SELECT COUNT(*) FROM integers i2 WHERE i2.i>i1.i) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 0
|
||||
1 2
|
||||
2 1
|
||||
3 0
|
||||
|
||||
31
external/duckdb/test/sql/subquery/scalar/test_delete_subquery.test
vendored
Normal file
31
external/duckdb/test/sql/subquery/scalar/test_delete_subquery.test
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
# name: test/sql/subquery/scalar/test_delete_subquery.test
|
||||
# description: Test subqueries in delete
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
CREATE TABLE integers(id INTEGER, i INTEGER)
|
||||
|
||||
statement ok
|
||||
INSERT INTO integers VALUES (1, 1), (2, 2), (3, 3), (4, NULL)
|
||||
|
||||
# correlated subquery in delete
|
||||
statement ok
|
||||
DELETE FROM integers i1 WHERE i>(SELECT MAX(i) FROM integers WHERE i1.i<>i)
|
||||
|
||||
query II
|
||||
SELECT id, i FROM integers ORDER BY id
|
||||
----
|
||||
1 1
|
||||
2 2
|
||||
4 NULL
|
||||
|
||||
# uncorrelated subquery in delete
|
||||
statement ok
|
||||
DELETE FROM integers i1 WHERE i=(SELECT MAX(i) FROM integers)
|
||||
|
||||
query II
|
||||
SELECT id, i FROM integers ORDER BY id
|
||||
----
|
||||
1 1
|
||||
4 NULL
|
||||
|
||||
141
external/duckdb/test/sql/subquery/scalar/test_grouped_correlated_subquery.test
vendored
Normal file
141
external/duckdb/test/sql/subquery/scalar/test_grouped_correlated_subquery.test
vendored
Normal file
@@ -0,0 +1,141 @@
|
||||
# name: test/sql/subquery/scalar/test_grouped_correlated_subquery.test
|
||||
# description: Test correlated subquery with grouping columns
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
CREATE TABLE tbl_ProductSales (ColID int, Product_Category varchar(64), Product_Name varchar(64), TotalSales int);
|
||||
|
||||
statement ok
|
||||
CREATE TABLE another_T (col1 INT, col2 INT, col3 INT, col4 INT, col5 INT, col6 INT, col7 INT, col8 INT);
|
||||
|
||||
statement ok
|
||||
INSERT INTO tbl_ProductSales VALUES (1,'Game','Mobo Game',200),(2,'Game','PKO Game',400),(3,'Fashion','Shirt',500),(4,'Fashion','Shorts',100);
|
||||
|
||||
statement ok
|
||||
INSERT INTO another_T VALUES (1,2,3,4,5,6,7,8), (11,22,33,44,55,66,77,88), (111,222,333,444,555,666,777,888), (1111,2222,3333,4444,5555,6666,7777,8888);
|
||||
|
||||
query T
|
||||
SELECT col1 IN (SELECT ColID FROM tbl_ProductSales) FROM another_T;
|
||||
----
|
||||
1
|
||||
0
|
||||
0
|
||||
0
|
||||
|
||||
query T
|
||||
SELECT col1 IN (SELECT ColID + col1 FROM tbl_ProductSales) FROM another_T;
|
||||
----
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
|
||||
query T
|
||||
SELECT col1 IN (SELECT ColID + col1 FROM tbl_ProductSales) FROM another_T GROUP BY col1;
|
||||
----
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
|
||||
query T
|
||||
SELECT col1 IN (SELECT ColID + another_T.col1 FROM tbl_ProductSales) FROM another_T GROUP BY col1;
|
||||
----
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
|
||||
query IT
|
||||
SELECT (col1 + 1) AS k, k IN (SELECT ColID + k FROM tbl_ProductSales) FROM another_T GROUP BY k ORDER BY 1;
|
||||
----
|
||||
2 0
|
||||
12 0
|
||||
112 0
|
||||
1112 0
|
||||
|
||||
# controversial: this fails in postgres but succeeds in sqlite
|
||||
# col1 + 1 is a grouping column so could theoretically be used in the subquery
|
||||
# but as it is not a column reference directly we fail to bind it here
|
||||
statement error
|
||||
SELECT (col1 + 1) IN (SELECT ColID + (col1 + 1) FROM tbl_ProductSales) FROM another_T GROUP BY (col1 + 1);
|
||||
----
|
||||
<REGEX>:.*Binder Error.*must be part of an aggregate function.*
|
||||
|
||||
# this should fail, col1 + 42 is not a grouping column
|
||||
statement error
|
||||
SELECT col1+1, col1+42 FROM another_T GROUP BY col1+1;
|
||||
----
|
||||
<REGEX>:.*Binder Error.*must be part of an aggregate function.*
|
||||
|
||||
# this should also fail, col1 + 42 is not a grouping column
|
||||
statement error
|
||||
SELECT (col1 + 1) IN (SELECT ColID + (col1 + 42) FROM tbl_ProductSales) FROM another_T GROUP BY (col1 + 1);
|
||||
----
|
||||
<REGEX>:.*Binder Error.*must be part of an aggregate function.*
|
||||
|
||||
# having without GROUP BY in subquery
|
||||
query T
|
||||
SELECT col5 = ALL (SELECT 1 FROM tbl_ProductSales HAVING MIN(col8) IS NULL) FROM another_T GROUP BY col1, col2, col5, col8;
|
||||
----
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
|
||||
query I
|
||||
SELECT CASE WHEN 1 IN (SELECT MAX(col7) UNION ALL (SELECT MIN(ColID) FROM tbl_ProductSales INNER JOIN another_T t2 ON t2.col5 = t2.col1)) THEN 2 ELSE NULL END FROM another_T t1;
|
||||
----
|
||||
NULL
|
||||
|
||||
query I
|
||||
SELECT CASE WHEN 1 IN (SELECT (SELECT MAX(col7))) THEN 2 ELSE NULL END FROM another_T t1;
|
||||
----
|
||||
NULL
|
||||
|
||||
# UNION ALL with correlated subquery on either side
|
||||
query I
|
||||
SELECT CASE WHEN 1 IN (SELECT (SELECT MAX(col7)) UNION ALL (SELECT MIN(ColID) FROM tbl_ProductSales INNER JOIN another_T t2 ON t2.col5 = t2.col1)) THEN 2 ELSE NULL END FROM another_T t1;
|
||||
----
|
||||
NULL
|
||||
|
||||
query I
|
||||
SELECT CASE WHEN 1 IN (SELECT (SELECT MIN(ColID) FROM tbl_ProductSales INNER JOIN another_T t2 ON t2.col5 = t2.col1) UNION ALL (SELECT MAX(col7))) THEN 2 ELSE NULL END FROM another_T t1;
|
||||
----
|
||||
NULL
|
||||
|
||||
# correlated column comparison with correlated subquery
|
||||
query I
|
||||
SELECT (SELECT MIN(ColID) FROM tbl_ProductSales INNER JOIN another_T t2 ON t1.col7 <> (SELECT MAX(t1.col1 + t3.col4) FROM another_T t3)) FROM another_T t1;
|
||||
----
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
|
||||
query I
|
||||
SELECT (SELECT MIN(ColID) FROM tbl_ProductSales INNER JOIN another_T t2 ON t1.col7 <> ANY(SELECT MAX(t1.col1 + t3.col4) FROM another_T t3)) FROM another_T t1;
|
||||
----
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
|
||||
# LEFT JOIN between correlated columns not supported for now
|
||||
statement error
|
||||
SELECT CASE WHEN NOT col1 NOT IN (SELECT (SELECT MAX(col7)) UNION (SELECT MIN(ColID) FROM tbl_ProductSales LEFT JOIN another_T t2 ON t2.col5 = t1.col1)) THEN 1 ELSE 2 END FROM another_T t1 GROUP BY col1 ORDER BY 1;
|
||||
----
|
||||
<REGEX>:.*Not implemented Error.*Non-inner join on correlated columns not supported.*
|
||||
|
||||
# REQUIRE(CHECK_COLUMN(result, 0, {1, 2, 2, 2}));
|
||||
# correlated columns in window functions not supported yet
|
||||
statement error
|
||||
SELECT EXISTS (SELECT RANK() OVER (PARTITION BY SUM(DISTINCT col5))) FROM another_T t1;
|
||||
----
|
||||
<REGEX>:.*Binder Error.*not supported.*
|
||||
|
||||
# REQUIRE(CHECK_COLUMN(result, 0, {true}));
|
||||
statement error
|
||||
SELECT (SELECT SUM(col2) OVER (PARTITION BY SUM(col2) ORDER BY MAX(col1 + ColID) ROWS UNBOUNDED PRECEDING) FROM tbl_ProductSales) FROM another_T t1 GROUP BY col1
|
||||
----
|
||||
<REGEX>:.*Binder Error.*not supported.*
|
||||
29
external/duckdb/test/sql/subquery/scalar/test_issue_4216.test
vendored
Normal file
29
external/duckdb/test/sql/subquery/scalar/test_issue_4216.test
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
# name: test/sql/subquery/scalar/test_issue_4216.test
|
||||
# description: Issue 4216: DELIM_JOIN doesn't propagate statistics correctly.
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
CREATE TABLE test (x INT, y INT)
|
||||
|
||||
statement ok
|
||||
INSERT INTO test VALUES (1, 1), (2, 2)
|
||||
|
||||
query I
|
||||
SELECT (SELECT y FROM test t2 WHERE t1.x = 5) FROM test t1
|
||||
----
|
||||
NULL
|
||||
NULL
|
||||
|
||||
query I
|
||||
SELECT (SELECT y FROM test t2 WHERE t1.x = 5) IS NULL FROM test t1
|
||||
----
|
||||
TRUE
|
||||
TRUE
|
||||
|
||||
|
||||
query I
|
||||
SELECT (SELECT y FROM test t2 WHERE t1.x = 5) IS NOT NULL FROM test t1
|
||||
----
|
||||
FALSE
|
||||
FALSE
|
||||
|
||||
61
external/duckdb/test/sql/subquery/scalar/test_issue_6136.test
vendored
Normal file
61
external/duckdb/test/sql/subquery/scalar/test_issue_6136.test
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
# name: test/sql/subquery/scalar/test_issue_6136.test
|
||||
# description: Issue 6136: Segfault when running query with correlated subqueries
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
create table r as select * from values (1, 1, 'a', 'A'), (1, null, 'b', 'B'), (1, 2, 'c', 'C'), (2, null, 'd', 'D') t(ra, rb, x, y);
|
||||
|
||||
statement ok
|
||||
create table b as select * from values (1, 1, 1), (2, 1, 2), (3, 1, 3), (4, 1, null), (5, 2, 1), (6, 2, null), (7, 99, 99) t(id, ba, bb);
|
||||
|
||||
statement ok
|
||||
select
|
||||
(select {'__matches': count(*)} from r where ba = ra and bb = rb group by ra, rb) as ref1,
|
||||
from b;
|
||||
|
||||
statement error
|
||||
select
|
||||
id,
|
||||
ba,
|
||||
bb,
|
||||
coalesce((select {'x': first(x), 'y': first(y), '__matches': count(*)} from r where ba = ra and bb = rb group by ra, rb), {'x': null, 'y': null, '__matches': 0}) as ref1,
|
||||
coalesce((select {'x': first(x), 'y': first(y), '__matches': count(*)} from r where ba = ra and (bb = rb or rb is null) group by ra, rb order by bb = rb), {'x': null, 'y': null, '__matches': 0}) as ref2,
|
||||
coalesce((select {'x': first(x), 'y': first(y), '__matches': count(*)} from r where (ba = ra or ra is null) and (bb = rb or rb is null) group by ra, rb order by ba = ra, bb = rb), {'x': null, 'y': null, '__matches': 0}) as ref3,
|
||||
coalesce((select {'x': first(x), 'y': first(y), '__matches': count(*)} from r where (ba = ra or ra is null) group by ra order by ba = ra), {'x': null, 'y': null, '__matches': 0}) as ref4,
|
||||
from b
|
||||
----
|
||||
More than one row returned by a subquery
|
||||
|
||||
statement ok
|
||||
SET scalar_subquery_error_on_multiple_rows=false
|
||||
|
||||
# this is non-deterministic since the subqueries return multiple rows
|
||||
statement ok
|
||||
select
|
||||
id,
|
||||
ba,
|
||||
bb,
|
||||
coalesce((select {'x': first(x), 'y': first(y), '__matches': count(*)} from r where ba = ra and bb = rb group by ra, rb), {'x': null, 'y': null, '__matches': 0}) as ref1,
|
||||
coalesce((select {'x': first(x), 'y': first(y), '__matches': count(*)} from r where ba = ra and (bb = rb or rb is null) group by ra, rb order by bb = rb), {'x': null, 'y': null, '__matches': 0}) as ref2,
|
||||
coalesce((select {'x': first(x), 'y': first(y), '__matches': count(*)} from r where (ba = ra or ra is null) and (bb = rb or rb is null) group by ra, rb order by ba = ra, bb = rb), {'x': null, 'y': null, '__matches': 0}) as ref3,
|
||||
coalesce((select {'x': first(x), 'y': first(y), '__matches': count(*)} from r where (ba = ra or ra is null) group by ra order by ba = ra), {'x': null, 'y': null, '__matches': 0}) as ref4,
|
||||
from b
|
||||
|
||||
# postgres compatible variant
|
||||
query IIIII
|
||||
select
|
||||
id,
|
||||
ba,
|
||||
bb,
|
||||
coalesce((select ROW(min(x), min(y), count(*)) from r where ba = ra and bb = rb group by ra, rb), ROW(null, null, 0)) as ref1,
|
||||
coalesce((select ROW(min(x), min(y), count(*)) from r where (ba = ra or ra is null) group by ra order by ba = ra), ROW(null, null, 0)) as ref4
|
||||
from b
|
||||
ORDER BY 1, 2, 3;
|
||||
----
|
||||
1 1 1 (a, A, 1) (a, A, 3)
|
||||
2 1 2 (c, C, 1) (a, A, 3)
|
||||
3 1 3 (NULL, NULL, 0) (a, A, 3)
|
||||
4 1 NULL (NULL, NULL, 0) (a, A, 3)
|
||||
5 2 1 (NULL, NULL, 0) (d, D, 1)
|
||||
6 2 NULL (NULL, NULL, 0) (d, D, 1)
|
||||
7 99 99 (NULL, NULL, 0) (NULL, NULL, 0)
|
||||
84
external/duckdb/test/sql/subquery/scalar/test_issue_6184.test
vendored
Normal file
84
external/duckdb/test/sql/subquery/scalar/test_issue_6184.test
vendored
Normal file
@@ -0,0 +1,84 @@
|
||||
# name: test/sql/subquery/scalar/test_issue_6184.test
|
||||
# description: Issue 6184: INTERNAL Error: Invalid PhysicalType for GetTypeIdSize for certain queries
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
CREATE TABLE t1(fuel_type VARCHAR, location_country VARCHAR);
|
||||
|
||||
statement ok
|
||||
INSERT INTO t1 VALUES('natural_gas', 'US');
|
||||
|
||||
statement ok
|
||||
CREATE TABLE t2(__input_row_id BIGINT, "__input.fuel" VARCHAR);
|
||||
|
||||
statement ok
|
||||
INSERT INTO t2 VALUES(1, 'natural_gas');
|
||||
|
||||
query I
|
||||
SELECT (
|
||||
SELECT NULL
|
||||
FROM
|
||||
(
|
||||
SELECT fuel_type, location_country
|
||||
FROM "t1"
|
||||
WHERE "fuel_type" IS NOT DISTINCT FROM "__input.fuel"
|
||||
LIMIT 1
|
||||
) t1)
|
||||
FROM t2 AS __p;
|
||||
----
|
||||
NULL
|
||||
|
||||
require json
|
||||
|
||||
statement ok
|
||||
WITH __activity_data AS
|
||||
(
|
||||
SELECT *
|
||||
FROM
|
||||
(
|
||||
VALUES ( 'natural_gas', 'US', 'PGE', 'CA', 'SF', json('{}'))
|
||||
) AS t("fuel", "country", "grid", "state", "city", tags)
|
||||
), "fuel_kgco2e_per_mmbtu" AS
|
||||
(
|
||||
SELECT *
|
||||
,ROW_NUMBER() over () AS row_id
|
||||
FROM
|
||||
( VALUES ('natural_gas', 'US', NULL, 'CA', 'SF', 2),
|
||||
) AS t( fuel_type, location_country, location_grid, location_state, location_city, kgco2e_per_mmbtu)
|
||||
), __input AS
|
||||
(
|
||||
SELECT *
|
||||
,ROW_NUMBER() OVER () AS __input_row_id
|
||||
FROM "__activity_data"
|
||||
), "fuel_kgco2e_per_mmbtu__1" AS
|
||||
(
|
||||
SELECT *
|
||||
,ROW_NUMBER() OVER () AS __row_id
|
||||
FROM "fuel_kgco2e_per_mmbtu"
|
||||
), __stage0 AS
|
||||
(
|
||||
SELECT __input_row_id
|
||||
,fuel AS "__input.fuel"
|
||||
,country AS "__input.country"
|
||||
,grid AS "__input.grid"
|
||||
,state AS "__input.state"
|
||||
,city AS "__input.city"
|
||||
FROM __input
|
||||
)
|
||||
SELECT __p.*
|
||||
,(
|
||||
SELECT { 'kgco2e_per_mmbtu': FIRST("kgco2e_per_mmbtu")
|
||||
,__row_id: FIRST(__row_id)
|
||||
,__candidates: LIST(__row_id) }
|
||||
FROM
|
||||
(
|
||||
SELECT *
|
||||
FROM "fuel_kgco2e_per_mmbtu__1"
|
||||
WHERE "fuel_type" IS NOT DISTINCT
|
||||
FROM "__input.fuel"
|
||||
ORDER BY "location_country" IS NOT NULL DESC, "location_grid" IS NOT NULL DESC, "location_state" IS NOT NULL DESC, "location_city" IS NOT NULL DESC
|
||||
LIMIT 1
|
||||
)
|
||||
GROUP BY TRUE ) AS __ref1
|
||||
,CAST(1 AS DOUBLE) AS "__p.__functional_unit__"
|
||||
FROM __stage0 AS __p;
|
||||
43
external/duckdb/test/sql/subquery/scalar/test_issue_7079.test
vendored
Normal file
43
external/duckdb/test/sql/subquery/scalar/test_issue_7079.test
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
# name: test/sql/subquery/scalar/test_issue_7079.test
|
||||
# description: Issue 7079: Coalesce function not functioning properly in DuckDB macro function
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
CREATE MACRO array_rv(arr) AS (
|
||||
SELECT CASE WHEN l IS NOT NULL THEN l ELSE arr END
|
||||
FROM (
|
||||
SELECT array_agg(elm ORDER BY g DESC) as l
|
||||
FROM (SELECT generate_subscripts(arr, 1) AS g, arr[g] AS elm)
|
||||
)
|
||||
);
|
||||
|
||||
statement ok
|
||||
CREATE MACRO array_rv_coal(arr) AS (
|
||||
SELECT COALESCE(l,arr)
|
||||
FROM (
|
||||
SELECT array_agg(elm ORDER BY g DESC) as l
|
||||
FROM (SELECT generate_subscripts(arr, 1) AS g, arr[g] AS elm)
|
||||
)
|
||||
);
|
||||
|
||||
statement ok
|
||||
CREATE TABLE t AS (
|
||||
SELECT [1, 2, 3] AS arr UNION ALL
|
||||
SELECT [4, 5] AS arr UNION ALL
|
||||
SELECT [] AS arr
|
||||
);
|
||||
|
||||
|
||||
query I
|
||||
SELECT array_rv(arr) FROM t ORDER BY arr;
|
||||
----
|
||||
[]
|
||||
[3, 2, 1]
|
||||
[5, 4]
|
||||
|
||||
query I
|
||||
SELECT array_rv_coal(arr) FROM t ORDER BY arr;
|
||||
----
|
||||
[]
|
||||
[3, 2, 1]
|
||||
[5, 4]
|
||||
19
external/duckdb/test/sql/subquery/scalar/test_join_in_subquery.test
vendored
Normal file
19
external/duckdb/test/sql/subquery/scalar/test_join_in_subquery.test
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
# name: test/sql/subquery/scalar/test_join_in_subquery.test
|
||||
# description: Joins in subqueries
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
CREATE TABLE test AS FROM VALUES (1, 22), (1, 21), (2, 22) v(id, test_value);
|
||||
|
||||
statement ok
|
||||
CREATE TABLE test2 AS FROM VALUES (1, 44), (2, 42) v(id, test2_value);
|
||||
|
||||
query IIII rowsort
|
||||
SELECT * FROM test, test2 WHERE test.id=test2.id AND test_value*test2_value=(SELECT MIN(test_value*test2_value) FROM test AS a, test2 WHERE a.id=test.id AND a.id=test2.id)
|
||||
----
|
||||
1 21 1 44
|
||||
2 22 2 42
|
||||
|
||||
68
external/duckdb/test/sql/subquery/scalar/test_many_correlated_columns.test
vendored
Normal file
68
external/duckdb/test/sql/subquery/scalar/test_many_correlated_columns.test
vendored
Normal file
@@ -0,0 +1,68 @@
|
||||
# name: test/sql/subquery/scalar/test_many_correlated_columns.test
|
||||
# description: Test multiple correlated columns and strings
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
SET default_null_order='nulls_first';
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
# multiple correlated columns and strings
|
||||
statement ok
|
||||
CREATE TABLE test (a INTEGER, b INTEGER, str VARCHAR);
|
||||
|
||||
statement ok
|
||||
INSERT INTO test VALUES (11, 1, 'a'), (12, 2, 'b'), (13, 3, 'c')
|
||||
|
||||
statement ok
|
||||
CREATE TABLE test2 (a INTEGER, c INTEGER, str2 VARCHAR);
|
||||
|
||||
statement ok
|
||||
INSERT INTO test2 VALUES (11, 1, 'a'), (12, 1, 'b'), (13, 4, 'b')
|
||||
|
||||
query IRR
|
||||
SELECT a, SUM(a), (SELECT SUM(a)+SUM(t1.b) FROM test) FROM test t1 GROUP BY a ORDER BY a;
|
||||
----
|
||||
11 11.000000 37.000000
|
||||
12 12.000000 38.000000
|
||||
13 13.000000 39.000000
|
||||
|
||||
# scalar query with multiple correlated columns
|
||||
query R
|
||||
SELECT (SELECT test.a+test.b+SUM(test2.a) FROM test2 WHERE str=str2) FROM test ORDER BY 1;
|
||||
----
|
||||
NULL
|
||||
23.000000
|
||||
39.000000
|
||||
|
||||
# exists with multiple correlated columns
|
||||
query IIT
|
||||
SELECT * FROM test WHERE EXISTS(SELECT * FROM test2 WHERE test.a=test2.a AND test.b<>test2.c) order by b;
|
||||
----
|
||||
12 2 b
|
||||
13 3 c
|
||||
|
||||
# ANY with multiple correlated columns
|
||||
query IT
|
||||
SELECT a, a>=ANY(SELECT test2.a+c-b FROM test2 WHERE c>=b AND str=str2) FROM test ORDER BY 1;
|
||||
----
|
||||
11 1
|
||||
12 0
|
||||
13 0
|
||||
|
||||
# string comparison
|
||||
query TT
|
||||
SELECT str, str=ANY(SELECT str2 FROM test2) FROM test
|
||||
----
|
||||
a 1
|
||||
b 1
|
||||
c 0
|
||||
|
||||
query TT
|
||||
SELECT str, str=ANY(SELECT str2 FROM test2 WHERE test.a<>test2.a) FROM test
|
||||
----
|
||||
a 0
|
||||
b 1
|
||||
c 0
|
||||
|
||||
333
external/duckdb/test/sql/subquery/scalar/test_nested_correlated_subquery.test_slow
vendored
Normal file
333
external/duckdb/test/sql/subquery/scalar/test_nested_correlated_subquery.test_slow
vendored
Normal file
@@ -0,0 +1,333 @@
|
||||
# name: test/sql/subquery/scalar/test_nested_correlated_subquery.test_slow
|
||||
# description: Test nested correlated subqueries
|
||||
# group: [scalar]
|
||||
|
||||
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 queries
|
||||
query II
|
||||
SELECT i, (SELECT (SELECT 42+i1.i)+42+i1.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 86
|
||||
2 88
|
||||
3 90
|
||||
|
||||
query II
|
||||
SELECT i, (SELECT (SELECT (SELECT (SELECT 42+i1.i)++i1.i)+42+i1.i)+42+i1.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 130
|
||||
2 134
|
||||
3 138
|
||||
|
||||
query IR
|
||||
SELECT i, (SELECT (SELECT i1.i+SUM(i2.i)) FROM integers i2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 7.000000
|
||||
2 8.000000
|
||||
3 9.000000
|
||||
|
||||
# correlated query inside uncorrelated query
|
||||
query II
|
||||
SELECT i, (SELECT (SELECT (SELECT (SELECT i1.i+i1.i+i1.i+i1.i+i1.i)))) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 5
|
||||
2 10
|
||||
3 15
|
||||
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(i)+(SELECT 42+i1.i) FROM integers) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 49.000000
|
||||
2 50.000000
|
||||
3 51.000000
|
||||
|
||||
query IR
|
||||
SELECT i, (SELECT ((SELECT ((SELECT ((SELECT SUM(i)+SUM(i4.i)+SUM(i3.i)+SUM(i2.i)+SUM(i1.i) FROM integers i5)) FROM integers i4)) FROM integers i3)) FROM integers i2) AS j FROM integers i1 GROUP BY i ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 25.000000
|
||||
2 26.000000
|
||||
3 27.000000
|
||||
|
||||
query II
|
||||
SELECT i, (SELECT (SELECT (SELECT (SELECT i1.i+i1.i+i1.i+i1.i+i1.i+i2.i) FROM integers i2 WHERE i2.i=i1.i))) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 6
|
||||
2 12
|
||||
3 18
|
||||
|
||||
query R
|
||||
SELECT (SELECT (SELECT SUM(i1.i)+SUM(i2.i)+SUM(i3.i) FROM integers i3) FROM integers i2) FROM integers i1 ORDER BY 1
|
||||
----
|
||||
18.000000
|
||||
|
||||
# explicit join on subquery
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(s1.i) FROM integers s1 INNER JOIN integers s2 ON (SELECT i1.i+s1.i)=(SELECT i1.i+s2.i)) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 6.000000
|
||||
2 6.000000
|
||||
3 6.000000
|
||||
|
||||
# nested aggregate queries
|
||||
query IRR
|
||||
SELECT i, SUM(i), (SELECT (SELECT SUM(i)+SUM(i1.i)+SUM(i2.i) FROM integers) FROM integers i2) FROM integers i1 GROUP BY i ORDER BY i;
|
||||
----
|
||||
NULL NULL NULL
|
||||
1 1.000000 13.000000
|
||||
2 2.000000 14.000000
|
||||
3 3.000000 15.000000
|
||||
|
||||
# correlated ANY inside subquery
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(ss1.i) FROM (SELECT i FROM integers s1 WHERE i>ANY(SELECT i FROM integers WHERE i<>s1.i)) ss1) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 5.000000
|
||||
1 5.000000
|
||||
2 5.000000
|
||||
3 5.000000
|
||||
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(ss2.i) FROM (SELECT i FROM integers s1 WHERE i=i1.i AND i=ANY(SELECT i FROM integers WHERE i=s1.i)) ss2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 1.000000
|
||||
2 2.000000
|
||||
3 3.000000
|
||||
|
||||
# left outer join on correlated subquery within subquery
|
||||
# not supported yet: left outer join on JoinSide::BOTH
|
||||
statement error
|
||||
SELECT i, (SELECT SUM(s1.i) FROM integers s1 LEFT OUTER JOIN integers s2 ON (SELECT i1.i+s1.i)=(SELECT i1.i+s2.i)) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
|
||||
# REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3}));
|
||||
# REQUIRE(CHECK_COLUMN(result, 1, {6, 6, 6, 6}));
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(ss1.i)+SUM(ss2.i) FROM (SELECT i FROM integers s1 WHERE i>ANY(SELECT i FROM integers WHERE i<>s1.i)) ss1 LEFT OUTER JOIN (SELECT i FROM integers s1 WHERE i=ANY(SELECT i FROM integers WHERE i=s1.i)) ss2 ON ss1.i=ss2.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 10.000000
|
||||
1 10.000000
|
||||
2 10.000000
|
||||
3 10.000000
|
||||
|
||||
# left outer join with correlation on LHS
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(s1.i) FROM (SELECT i FROM integers WHERE i=i1.i) s1 LEFT OUTER JOIN integers s2 ON s1.i=s2.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 1.000000
|
||||
2 2.000000
|
||||
3 3.000000
|
||||
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(s1.i) FROM (SELECT i FROM integers WHERE i<>i1.i) s1 LEFT OUTER JOIN integers s2 ON s1.i=s2.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 5.000000
|
||||
2 4.000000
|
||||
3 3.000000
|
||||
|
||||
# left outer join with correlation on RHS
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(s2.i) FROM integers s1 LEFT OUTER JOIN (SELECT i FROM integers WHERE i=i1.i) s2 ON s1.i=s2.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 1.000000
|
||||
2 2.000000
|
||||
3 3.000000
|
||||
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(s2.i) FROM integers s1 LEFT OUTER JOIN (SELECT i FROM integers WHERE i<>i1.i) s2 ON s1.i=s2.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 5.000000
|
||||
2 4.000000
|
||||
3 3.000000
|
||||
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(ss2.i) FROM (SELECT i FROM integers s1 WHERE CASE WHEN (i=i1.i AND i=ANY(SELECT i FROM integers WHERE i=s1.i)) THEN true ELSE false END) ss2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 1.000000
|
||||
2 2.000000
|
||||
3 3.000000
|
||||
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(ss2.i) FROM (SELECT i FROM integers s1 WHERE i=i1.i AND i=ANY(SELECT i FROM integers WHERE i=s1.i)) ss2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 1.000000
|
||||
2 2.000000
|
||||
3 3.000000
|
||||
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(ss2.i) FROM (SELECT i FROM integers s1 WHERE i=i1.i) ss2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 1.000000
|
||||
2 2.000000
|
||||
3 3.000000
|
||||
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(ss2.i) FROM (SELECT i FROM integers s1 WHERE i=ANY(SELECT i FROM integers WHERE i=s1.i)) ss2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 6.000000
|
||||
1 6.000000
|
||||
2 6.000000
|
||||
3 6.000000
|
||||
|
||||
query IT
|
||||
SELECT i, (SELECT i=ANY(SELECT i FROM integers WHERE i=s1.i) FROM integers s1 WHERE i=i1.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 1
|
||||
2 1
|
||||
3 1
|
||||
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(ss2.i) FROM (SELECT i FROM integers s1 WHERE i=i1.i OR i=ANY(SELECT i FROM integers WHERE i=s1.i)) ss2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 6.000000
|
||||
1 6.000000
|
||||
2 6.000000
|
||||
3 6.000000
|
||||
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(ss2.i) FROM (SELECT i FROM integers s1 WHERE CASE WHEN (i=i1.i AND i=ANY(SELECT i FROM integers WHERE i=s1.i)) THEN true ELSE false END) ss2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 1.000000
|
||||
2 2.000000
|
||||
3 3.000000
|
||||
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(ss2.i) FROM (SELECT i FROM integers s1 WHERE i=i1.i AND EXISTS(SELECT i FROM integers WHERE i=s1.i)) ss2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 1.000000
|
||||
2 2.000000
|
||||
3 3.000000
|
||||
|
||||
# complex left outer join with correlation on RHS
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(ss1.i) FROM (SELECT i FROM integers s1 WHERE i>ANY(SELECT i FROM integers WHERE i<>s1.i)) ss1) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 5.000000
|
||||
1 5.000000
|
||||
2 5.000000
|
||||
3 5.000000
|
||||
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(ss1.i) FROM (SELECT i FROM integers s1 WHERE i>ANY(SELECT i FROM integers WHERE i<>s1.i)) ss1 LEFT OUTER JOIN (SELECT i FROM integers s1 WHERE i=i1.i AND i=ANY(SELECT i FROM integers WHERE i=s1.i)) ss2 ON ss1.i=ss2.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL 5.000000
|
||||
1 5.000000
|
||||
2 5.000000
|
||||
3 5.000000
|
||||
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(ss2.i) FROM (SELECT i FROM integers s1 WHERE i>ANY(SELECT i FROM integers WHERE i<>s1.i)) ss1 LEFT OUTER JOIN (SELECT i FROM integers s1 WHERE i=i1.i AND i=ANY(SELECT i FROM integers WHERE i=s1.i)) ss2 ON ss1.i=ss2.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 NULL
|
||||
2 2.000000
|
||||
3 3.000000
|
||||
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(ss1.i)+SUM(ss2.i) FROM (SELECT i FROM integers s1 WHERE i>ANY(SELECT i FROM integers WHERE i<>s1.i)) ss1 LEFT OUTER JOIN (SELECT i FROM integers s1 WHERE i=i1.i AND i=ANY(SELECT i FROM integers WHERE i=s1.i)) ss2 ON ss1.i=ss2.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 NULL
|
||||
2 7.000000
|
||||
3 8.000000
|
||||
|
||||
# complex left outer join with correlation on LHS
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(ss1.i)+SUM(ss2.i) FROM (SELECT i FROM integers s1 WHERE i=i1.i AND i>ANY(SELECT i FROM integers WHERE i<>s1.i)) ss1 LEFT OUTER JOIN (SELECT i FROM integers s1 WHERE i=ANY(SELECT i FROM integers WHERE i=s1.i)) ss2 ON ss1.i=ss2.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 NULL
|
||||
2 4.000000
|
||||
3 6.000000
|
||||
|
||||
# complex left outer join with correlation on both sides
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(ss1.i)+SUM(ss2.i) FROM (SELECT i FROM integers s1 WHERE i=i1.i AND i>ANY(SELECT i FROM integers WHERE i<>s1.i)) ss1 LEFT OUTER JOIN (SELECT i FROM integers s1 WHERE i<>i1.i OR i=ANY(SELECT i FROM integers WHERE i=s1.i)) ss2 ON ss1.i=ss2.i) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 NULL
|
||||
2 4.000000
|
||||
3 6.000000
|
||||
|
||||
# test correlated queries with correlated expressions inside FROM clause
|
||||
# subquery
|
||||
query II
|
||||
SELECT i, (SELECT * FROM (SELECT (SELECT 42+i1.i)) s1) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 43
|
||||
2 44
|
||||
3 45
|
||||
|
||||
# cross product
|
||||
query II
|
||||
SELECT i, (SELECT s1.k+s2.k FROM (SELECT (SELECT 42+i1.i) AS k) s1, (SELECT (SELECT 42+i1.i) AS k) s2) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 86
|
||||
2 88
|
||||
3 90
|
||||
|
||||
# join
|
||||
query II
|
||||
SELECT i, (SELECT s1.k+s2.k FROM (SELECT (SELECT 42+i1.i) AS k) s1 LEFT OUTER JOIN (SELECT (SELECT 42+i1.i) AS k) s2 ON s1.k=s2.k) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 86
|
||||
2 88
|
||||
3 90
|
||||
|
||||
# IN list inside correlated subquery
|
||||
query IT
|
||||
SELECT i, (SELECT i1.i IN (1, 2, 3, 4, 5, 6, 7, 8)) AS j FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 1
|
||||
2 1
|
||||
3 1
|
||||
|
||||
# nested correlated subqueries with multiple aggregate parameters
|
||||
query R
|
||||
SELECT (SELECT (SELECT COVAR_POP(i1.i, i3.i) FROM integers i3) FROM integers i2 LIMIT 1) FROM integers i1 ORDER BY 1
|
||||
----
|
||||
NULL
|
||||
0.000000
|
||||
0.000000
|
||||
0.000000
|
||||
|
||||
query R
|
||||
SELECT (SELECT (SELECT COVAR_POP(i2.i, i3.i) FROM integers i3) FROM integers i2 ORDER BY i NULLS LAST LIMIT 1) FROM integers i1 ORDER BY 1
|
||||
----
|
||||
0.000000
|
||||
0.000000
|
||||
0.000000
|
||||
0.000000
|
||||
|
||||
163
external/duckdb/test/sql/subquery/scalar/test_scalar_subquery.test
vendored
Normal file
163
external/duckdb/test/sql/subquery/scalar/test_scalar_subquery.test
vendored
Normal file
@@ -0,0 +1,163 @@
|
||||
# name: test/sql/subquery/scalar/test_scalar_subquery.test
|
||||
# description: Test subqueries
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
query I
|
||||
SELECT 1+(SELECT 1)
|
||||
----
|
||||
2
|
||||
|
||||
query T
|
||||
SELECT 1=(SELECT 1)
|
||||
----
|
||||
1
|
||||
|
||||
query T
|
||||
SELECT 1<>(SELECT 1)
|
||||
----
|
||||
0
|
||||
|
||||
query T
|
||||
SELECT 1=(SELECT NULL)
|
||||
----
|
||||
NULL
|
||||
|
||||
query T
|
||||
SELECT NULL=(SELECT 1)
|
||||
----
|
||||
NULL
|
||||
|
||||
# scalar subquery
|
||||
query I
|
||||
SELECT (SELECT 42)
|
||||
----
|
||||
42
|
||||
|
||||
# nested subquery
|
||||
query I
|
||||
SELECT (SELECT (SELECT 42))
|
||||
----
|
||||
42
|
||||
|
||||
# test aliasing of subquery
|
||||
query I
|
||||
SELECT * FROM (SELECT 42) v1(a);
|
||||
----
|
||||
42
|
||||
|
||||
# not enough aliases: defaults to using names for missing columns
|
||||
query II
|
||||
SELECT * FROM (SELECT 42, 41 AS x) v1(a);
|
||||
----
|
||||
42 41
|
||||
|
||||
# too many aliases: fails
|
||||
statement error
|
||||
SELECT * FROM (SELECT 42, 41 AS x) v1(a, b, c);
|
||||
----
|
||||
|
||||
statement ok
|
||||
CREATE TABLE test (a INTEGER, b INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO test VALUES (11, 22)
|
||||
|
||||
statement ok
|
||||
INSERT INTO test VALUES (12, 21)
|
||||
|
||||
statement ok
|
||||
INSERT INTO test VALUES (13, 22)
|
||||
|
||||
# select single tuple only in scalar subquery
|
||||
statement error
|
||||
SELECT (SELECT a * 42 FROM test)
|
||||
----
|
||||
More than one row returned by a subquery used as an expression
|
||||
|
||||
statement ok
|
||||
SET scalar_subquery_error_on_multiple_rows=false
|
||||
|
||||
query I
|
||||
SELECT (SELECT a * 42 FROM test)
|
||||
----
|
||||
462
|
||||
|
||||
# operations on subquery
|
||||
query I
|
||||
SELECT a*(SELECT 42) FROM test
|
||||
----
|
||||
462
|
||||
504
|
||||
546
|
||||
|
||||
statement ok
|
||||
CREATE TABLE t1(a INTEGER, b INTEGER, c INTEGER, d INTEGER, e INTEGER)
|
||||
|
||||
statement ok
|
||||
INSERT INTO t1(e,c,b,d,a) VALUES(103,102,100,101,104)
|
||||
|
||||
statement ok
|
||||
INSERT INTO t1(a,c,d,e,b) VALUES(107,106,108,109,105)
|
||||
|
||||
query R
|
||||
SELECT c-(SELECT sum(c) FROM t1) FROM t1
|
||||
----
|
||||
-106.000000
|
||||
-102.000000
|
||||
|
||||
query I
|
||||
SELECT CASE WHEN c>(SELECT sum(c)/count(*) FROM t1) THEN a*2 ELSE b*10 END FROM t1
|
||||
----
|
||||
1000
|
||||
214
|
||||
|
||||
# correlated subqueries
|
||||
query IR
|
||||
SELECT a, (SELECT SUM(b) FROM test tsub WHERE test.a=tsub.a) FROM test
|
||||
----
|
||||
11 22.000000
|
||||
12 21.000000
|
||||
13 22.000000
|
||||
|
||||
query II
|
||||
SELECT a, (SELECT CASE WHEN test.a=11 THEN 22 ELSE NULL END) FROM test ORDER BY a
|
||||
----
|
||||
11 22
|
||||
12 NULL
|
||||
13 NULL
|
||||
|
||||
query II
|
||||
SELECT a, (SELECT CASE WHEN test.a=11 THEN b ELSE NULL END FROM test tsub) FROM test ORDER BY a
|
||||
----
|
||||
11 22
|
||||
12 NULL
|
||||
13 NULL
|
||||
|
||||
query II
|
||||
SELECT a, (SELECT CASE WHEN test.a=11 THEN b ELSE NULL END FROM test tsub LIMIT 1) FROM test ORDER BY a
|
||||
----
|
||||
11 22
|
||||
12 NULL
|
||||
13 NULL
|
||||
|
||||
query II
|
||||
SELECT * from test where a=(SELECT MIN(a) FROM test t WHERE t.b=test.b) ORDER BY a
|
||||
----
|
||||
11 22
|
||||
12 21
|
||||
|
||||
# exists / in / any subqueries
|
||||
query II
|
||||
SELECT * FROM test WHERE EXISTS (SELECT a FROM test ts WHERE ts.a = test.a AND b>21)
|
||||
----
|
||||
11 22
|
||||
13 22
|
||||
|
||||
# duplicate name in subquery
|
||||
query II
|
||||
SELECT * FROM (SELECT 42 AS a, 44 AS a) tbl1
|
||||
----
|
||||
42 44
|
||||
169
external/duckdb/test/sql/subquery/scalar/test_scalar_subquery_cte.test
vendored
Normal file
169
external/duckdb/test/sql/subquery/scalar/test_scalar_subquery_cte.test
vendored
Normal file
@@ -0,0 +1,169 @@
|
||||
# name: test/sql/subquery/scalar/test_scalar_subquery_cte.test
|
||||
# description: Test subqueries with CTEs
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
query I
|
||||
SELECT 1+(WITH cte AS (SELECT 1) SELECT * FROM cte)
|
||||
----
|
||||
2
|
||||
|
||||
query T
|
||||
SELECT 1=(WITH cte AS (SELECT 1) SELECT * FROM cte)
|
||||
----
|
||||
1
|
||||
|
||||
query T
|
||||
SELECT 1<>(WITH cte AS (SELECT 1) SELECT * FROM cte)
|
||||
----
|
||||
0
|
||||
|
||||
query T
|
||||
SELECT 1=(WITH cte AS (SELECT NULL) SELECT * FROM cte)
|
||||
----
|
||||
NULL
|
||||
|
||||
query T
|
||||
SELECT NULL=(SELECT 1)
|
||||
----
|
||||
NULL
|
||||
|
||||
# scalar subquery
|
||||
query I
|
||||
SELECT (WITH cte AS (SELECT 42) SELECT * FROM cte)
|
||||
----
|
||||
42
|
||||
|
||||
# nested subquery
|
||||
query I
|
||||
SELECT (WITH cte1 AS (WITH cte2 AS (SELECT 42) SELECT * FROM cte2) SELECT * FROM cte1)
|
||||
----
|
||||
42
|
||||
|
||||
# test aliasing of subquery
|
||||
query I
|
||||
SELECT * FROM (WITH cte(x) AS (SELECT 42) SELECT x FROM cte) v1(a);
|
||||
----
|
||||
42
|
||||
|
||||
# not enough aliases: defaults to using names for missing columns
|
||||
query II
|
||||
SELECT * FROM (WITH cte AS (SELECT 42, 41 AS x) SELECT * FROM cte) v1(a);
|
||||
----
|
||||
42 41
|
||||
|
||||
# too many aliases: fails
|
||||
statement error
|
||||
SELECT * FROM (WITH cte AS (SELECT 42, 41 AS x) SELECT * FROM cte) v1(a, b, c);
|
||||
----
|
||||
|
||||
statement ok
|
||||
CREATE TABLE test (a INTEGER, b INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO test VALUES (11, 22)
|
||||
|
||||
statement ok
|
||||
INSERT INTO test VALUES (12, 21)
|
||||
|
||||
statement ok
|
||||
INSERT INTO test VALUES (13, 22)
|
||||
|
||||
# select single tuple only in scalar subquery
|
||||
statement error
|
||||
SELECT (WITH cte AS (SELECT a * 42 FROM test) SELECT * FROM cte)
|
||||
----
|
||||
More than one row returned by a subquery
|
||||
|
||||
statement ok
|
||||
SET scalar_subquery_error_on_multiple_rows=false
|
||||
|
||||
# the result is non-deterministic, so any of the values can be returned
|
||||
query I
|
||||
SELECT (WITH cte AS (SELECT a * 42 FROM test) SELECT * FROM cte) IN (462, 504, 546)
|
||||
----
|
||||
true
|
||||
|
||||
# operations on subquery
|
||||
query I
|
||||
SELECT a*(WITH cte AS (SELECT 42) SELECT * FROM cte) FROM test
|
||||
----
|
||||
462
|
||||
504
|
||||
546
|
||||
|
||||
statement ok
|
||||
CREATE TABLE t1(a INTEGER, b INTEGER, c INTEGER, d INTEGER, e INTEGER)
|
||||
|
||||
statement ok
|
||||
INSERT INTO t1(e,c,b,d,a) VALUES(103,102,100,101,104)
|
||||
|
||||
statement ok
|
||||
INSERT INTO t1(a,c,d,e,b) VALUES(107,106,108,109,105)
|
||||
|
||||
query R
|
||||
SELECT c-(WITH cte AS (SELECT sum(c) FROM t1) SELECT * FROM cte) FROM t1
|
||||
----
|
||||
-106.000000
|
||||
-102.000000
|
||||
|
||||
query I
|
||||
SELECT CASE WHEN c>(WITH cte AS (SELECT sum(c)/count(*) FROM t1) SELECT * FROM cte) THEN a*2 ELSE b*10 END FROM t1
|
||||
----
|
||||
1000
|
||||
214
|
||||
|
||||
# temporary solution until decorrelation of materialized CTEs is implemented
|
||||
require no_alternative_verify
|
||||
|
||||
# correlated subqueries
|
||||
query IR
|
||||
SELECT a, (WITH cte AS (SELECT SUM(b) FROM test tsub WHERE test.a=tsub.a) SELECT * FROM cte) FROM test
|
||||
----
|
||||
11 22.000000
|
||||
12 21.000000
|
||||
13 22.000000
|
||||
|
||||
query II
|
||||
SELECT a, (WITH cte AS (SELECT CASE WHEN test.a=11 THEN 22 ELSE NULL END) SELECT * FROM cte) FROM test ORDER BY a
|
||||
----
|
||||
11 22
|
||||
12 NULL
|
||||
13 NULL
|
||||
|
||||
# This test case is broken with PR #17459. Without CTE inlining, the result is arbitrary due to the materialization of the CTE.
|
||||
# Previously no_alternative_verify prevented that, but now it does not suffice anymore.
|
||||
# query II
|
||||
# SELECT a, (WITH cte AS (SELECT CASE WHEN test.a=11 THEN b ELSE NULL END FROM test tsub) SELECT * FROM cte) FROM test ORDER BY a
|
||||
# ----
|
||||
# 11 22
|
||||
# 12 NULL
|
||||
# 13 NULL
|
||||
|
||||
query II
|
||||
SELECT a, (WITH cte AS (SELECT CASE WHEN test.a=11 THEN b ELSE NULL END FROM test tsub LIMIT 1) SELECT * FROM cte) FROM test ORDER BY a
|
||||
----
|
||||
11 22
|
||||
12 NULL
|
||||
13 NULL
|
||||
|
||||
query II
|
||||
SELECT * from test where a=(WITH cte AS (SELECT a FROM test t WHERE t.b=test.b) SELECT min(a) FROM cte)
|
||||
----
|
||||
11 22
|
||||
12 21
|
||||
|
||||
# exists / in / any subqueries
|
||||
query II
|
||||
SELECT * FROM test WHERE EXISTS (WITH cte AS (SELECT * FROM test ts WHERE ts.a = test.a AND b>21) SELECT a FROM cte)
|
||||
----
|
||||
11 22
|
||||
13 22
|
||||
|
||||
# duplicate name in subquery
|
||||
query II
|
||||
SELECT * FROM (WITH cte AS (SELECT 42 AS a, 44 AS a) SELECT * FROM cte) tbl1
|
||||
----
|
||||
42 44
|
||||
79
external/duckdb/test/sql/subquery/scalar/test_subquery_any_join.test
vendored
Normal file
79
external/duckdb/test/sql/subquery/scalar/test_subquery_any_join.test
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
# name: test/sql/subquery/scalar/test_subquery_any_join.test
|
||||
# description: Test subqueries on ANY join
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
CREATE TABLE integers(i INTEGER);
|
||||
|
||||
statement ok
|
||||
INSERT INTO integers VALUES (1), (2), (3), (NULL);
|
||||
|
||||
# correlated expressions in inner/left/right joins
|
||||
query I
|
||||
SELECT i IN (SELECT i1.i FROM (SELECT * FROM integers i1 WHERE i1.i=integers.i) i1 JOIN generate_series(1, 2, 1) tbl(i) ON i1.i=tbl.i) FROM integers ORDER BY i NULLS LAST;
|
||||
----
|
||||
true
|
||||
true
|
||||
false
|
||||
false
|
||||
|
||||
query I
|
||||
SELECT i IN (SELECT i1.i FROM (SELECT * FROM integers i1 WHERE i1.i=integers.i) i1 LEFT JOIN generate_series(1, 2, 1) tbl(i) ON i1.i=tbl.i) FROM integers ORDER BY i NULLS LAST;
|
||||
----
|
||||
true
|
||||
true
|
||||
true
|
||||
false
|
||||
|
||||
query I
|
||||
SELECT i IN (SELECT i1.i FROM (SELECT * FROM integers i1 WHERE i1.i=integers.i) i1 RIGHT JOIN generate_series(1, 2, 1) tbl(i) ON i1.i=tbl.i) FROM integers ORDER BY i NULLS LAST;
|
||||
----
|
||||
true
|
||||
true
|
||||
NULL
|
||||
NULL
|
||||
|
||||
# other way around
|
||||
query I
|
||||
SELECT i IN (SELECT i1.i FROM generate_series(1, 2, 1) tbl(i) LEFT JOIN (SELECT * FROM integers i1 WHERE i1.i=integers.i) i1 ON i1.i=tbl.i) FROM integers ORDER BY i NULLS LAST;
|
||||
----
|
||||
true
|
||||
true
|
||||
NULL
|
||||
NULL
|
||||
|
||||
query I
|
||||
SELECT i IN (SELECT i1.i FROM generate_series(1, 2, 1) tbl(i) RIGHT JOIN (SELECT * FROM integers i1 WHERE i1.i=integers.i) i1 ON i1.i=tbl.i) FROM integers ORDER BY i NULLS LAST;
|
||||
----
|
||||
true
|
||||
true
|
||||
true
|
||||
false
|
||||
|
||||
# complex join condition
|
||||
query I
|
||||
SELECT i IN (SELECT i1.i FROM (SELECT * FROM integers i1 WHERE i1.i IS NOT DISTINCT FROM integers.i) i1 JOIN generate_series(1, 2, 1) tbl(i) ON i1.i=tbl.i OR (i1.i IS NULL AND tbl.i IS NULL)) FROM integers ORDER BY i NULLS LAST;
|
||||
----
|
||||
true
|
||||
true
|
||||
false
|
||||
false
|
||||
|
||||
query I
|
||||
SELECT i IN (SELECT i1.i FROM (SELECT * FROM integers i1 WHERE i1.i IS NOT DISTINCT FROM integers.i) i1 LEFT JOIN generate_series(1, 2, 1) tbl(i) ON i1.i=tbl.i OR (i1.i IS NULL AND tbl.i IS NULL)) FROM integers ORDER BY i NULLS LAST;
|
||||
----
|
||||
true
|
||||
true
|
||||
true
|
||||
NULL
|
||||
|
||||
query I
|
||||
SELECT i IN (SELECT i1.i FROM (SELECT * FROM integers i1 WHERE i1.i IS NOT DISTINCT FROM integers.i) i1 RIGHT JOIN generate_series(1, 2, 1) tbl(i) ON i1.i=tbl.i OR (i1.i IS NULL AND tbl.i IS NULL)) FROM integers ORDER BY i NULLS LAST;
|
||||
----
|
||||
true
|
||||
true
|
||||
NULL
|
||||
NULL
|
||||
18
external/duckdb/test/sql/subquery/scalar/test_tpcds_correlated_subquery.test
vendored
Normal file
18
external/duckdb/test/sql/subquery/scalar/test_tpcds_correlated_subquery.test
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
# name: test/sql/subquery/scalar/test_tpcds_correlated_subquery.test
|
||||
# description: Test correlated subqueries based on TPC-DS
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
CREATE TABLE item(i_manufact INTEGER)
|
||||
|
||||
query I
|
||||
SELECT * FROM item i1 WHERE (SELECT count(*) AS item_cnt FROM item WHERE (i_manufact = i1.i_manufact AND i_manufact=3) OR (i_manufact = i1.i_manufact AND i_manufact=3)) > 0 ORDER BY 1 LIMIT 100;
|
||||
----
|
||||
|
||||
query I
|
||||
SELECT * FROM item i1 WHERE (SELECT count(*) AS item_cnt FROM item WHERE (i_manufact = i1.i_manufact AND i_manufact=3) OR (i_manufact = i1.i_manufact AND i_manufact=3)) ORDER BY 1 LIMIT 100;
|
||||
----
|
||||
|
||||
141
external/duckdb/test/sql/subquery/scalar/test_uncorrelated_scalar_subquery.test
vendored
Normal file
141
external/duckdb/test/sql/subquery/scalar/test_uncorrelated_scalar_subquery.test
vendored
Normal file
@@ -0,0 +1,141 @@
|
||||
# name: test/sql/subquery/scalar/test_uncorrelated_scalar_subquery.test
|
||||
# description: Test uncorrelated subqueries
|
||||
# group: [scalar]
|
||||
|
||||
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)
|
||||
|
||||
# scalar subqueries
|
||||
query I
|
||||
SELECT * FROM integers WHERE i=(SELECT 1)
|
||||
----
|
||||
1
|
||||
|
||||
query I
|
||||
SELECT * FROM integers WHERE i=(SELECT SUM(1))
|
||||
----
|
||||
1
|
||||
|
||||
query I
|
||||
SELECT * FROM integers WHERE i=(SELECT MIN(i) FROM integers)
|
||||
----
|
||||
1
|
||||
|
||||
query I
|
||||
SELECT * FROM integers WHERE i=(SELECT MAX(i) FROM integers)
|
||||
----
|
||||
3
|
||||
|
||||
query II
|
||||
SELECT *, (SELECT MAX(i) FROM integers) FROM integers ORDER BY i
|
||||
----
|
||||
NULL 3
|
||||
1 3
|
||||
2 3
|
||||
3 3
|
||||
|
||||
# group by on subquery
|
||||
query II
|
||||
SELECT (SELECT 42) AS k, MAX(i) FROM integers GROUP BY k
|
||||
----
|
||||
42 3
|
||||
|
||||
# subquery as parameter to aggregate
|
||||
query II
|
||||
SELECT i, MAX((SELECT 42)) FROM integers GROUP BY i ORDER BY i
|
||||
----
|
||||
NULL 42
|
||||
1 42
|
||||
2 42
|
||||
3 42
|
||||
|
||||
# scalar subquery returning zero results should result in NULL
|
||||
query I
|
||||
SELECT (SELECT * FROM integers WHERE i>10) FROM integers
|
||||
----
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
||||
|
||||
# return more than one row in a scalar subquery
|
||||
# controversial: in postgres this gives an error
|
||||
# but SQLite accepts it and just uses the first value
|
||||
# we choose to agree with Postgres here
|
||||
statement error
|
||||
SELECT * FROM integers WHERE i=(SELECT i FROM integers WHERE i IS NOT NULL ORDER BY i)
|
||||
----
|
||||
More than one row returned by a subquery
|
||||
|
||||
statement ok
|
||||
SET scalar_subquery_error_on_multiple_rows=false
|
||||
|
||||
query I
|
||||
SELECT * FROM integers WHERE i=(SELECT i FROM integers WHERE i IS NOT NULL ORDER BY i)
|
||||
----
|
||||
1
|
||||
|
||||
# i.e. the above query is equivalent to this query
|
||||
query I
|
||||
SELECT * FROM integers WHERE i=(SELECT i FROM integers WHERE i IS NOT NULL ORDER BY i LIMIT 1)
|
||||
----
|
||||
1
|
||||
|
||||
# returning multiple columns should fail though
|
||||
statement error
|
||||
SELECT * FROM integers WHERE i=(SELECT 1, 2)
|
||||
----
|
||||
|
||||
statement error
|
||||
SELECT * FROM integers WHERE i=(SELECT i, i + 2 FROM integers)
|
||||
----
|
||||
|
||||
# but not for EXISTS queries!
|
||||
query I
|
||||
SELECT * FROM integers WHERE EXISTS (SELECT 1, 2)
|
||||
----
|
||||
1
|
||||
2
|
||||
3
|
||||
NULL
|
||||
|
||||
query I
|
||||
SELECT * FROM integers WHERE EXISTS (SELECT i, i + 2 FROM integers)
|
||||
----
|
||||
1
|
||||
2
|
||||
3
|
||||
NULL
|
||||
|
||||
# SELECT * should be fine if the star only expands to a single column
|
||||
query I
|
||||
SELECT (SELECT * FROM integers WHERE i=1)
|
||||
----
|
||||
1
|
||||
|
||||
# but not if the star expands to more than one column!
|
||||
statement error
|
||||
SELECT (SELECT * FROM integers i1, integers i2)
|
||||
----
|
||||
|
||||
# uncorrelated subquery in SELECT
|
||||
query I
|
||||
SELECT (SELECT i FROM integers WHERE i=1)
|
||||
----
|
||||
1
|
||||
|
||||
query I
|
||||
SELECT * FROM integers WHERE i > (SELECT i FROM integers WHERE i=1) ORDER BY 1
|
||||
----
|
||||
2
|
||||
3
|
||||
|
||||
68
external/duckdb/test/sql/subquery/scalar/test_uncorrelated_varchar_subquery.test
vendored
Normal file
68
external/duckdb/test/sql/subquery/scalar/test_uncorrelated_varchar_subquery.test
vendored
Normal file
@@ -0,0 +1,68 @@
|
||||
# name: test/sql/subquery/scalar/test_uncorrelated_varchar_subquery.test
|
||||
# description: Test uncorrelated VARCHAR subqueries
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
CREATE TABLE integers(i INTEGER)
|
||||
|
||||
statement ok
|
||||
INSERT INTO integers VALUES (1), (2), (3), (NULL)
|
||||
|
||||
# varchar tests
|
||||
statement ok
|
||||
CREATE TABLE strings(v VARCHAR)
|
||||
|
||||
statement ok
|
||||
INSERT INTO strings VALUES ('hello'), ('world'), (NULL)
|
||||
|
||||
# ANY
|
||||
query T
|
||||
SELECT NULL IN (SELECT * FROM strings)
|
||||
----
|
||||
NULL
|
||||
|
||||
query T
|
||||
SELECT 'hello' IN (SELECT * FROM strings)
|
||||
----
|
||||
1
|
||||
|
||||
query T
|
||||
SELECT 'bla' IN (SELECT * FROM strings)
|
||||
----
|
||||
NULL
|
||||
|
||||
query T
|
||||
SELECT 'bla' IN (SELECT * FROM strings WHERE v IS NOT NULL)
|
||||
----
|
||||
0
|
||||
|
||||
# EXISTS
|
||||
query T
|
||||
SELECT * FROM strings WHERE EXISTS(SELECT NULL)
|
||||
----
|
||||
hello
|
||||
world
|
||||
NULL
|
||||
|
||||
query T
|
||||
SELECT * FROM strings WHERE EXISTS(SELECT v FROM strings WHERE v='bla')
|
||||
----
|
||||
|
||||
# scalar query
|
||||
query T
|
||||
SELECT (SELECT v FROM strings WHERE v='hello') FROM strings
|
||||
----
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
|
||||
query T
|
||||
SELECT (SELECT v FROM strings WHERE v='bla') FROM strings
|
||||
----
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
||||
|
||||
114
external/duckdb/test/sql/subquery/scalar/test_unnest_subquery.test
vendored
Normal file
114
external/duckdb/test/sql/subquery/scalar/test_unnest_subquery.test
vendored
Normal file
@@ -0,0 +1,114 @@
|
||||
# name: test/sql/subquery/scalar/test_unnest_subquery.test
|
||||
# description: Test unnest in subqueries
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
# uncorrelated
|
||||
query I
|
||||
SELECT (SELECT UNNEST([1]))
|
||||
----
|
||||
1
|
||||
|
||||
query I
|
||||
SELECT (SELECT UNNEST([NULL]))
|
||||
----
|
||||
NULL
|
||||
|
||||
query I
|
||||
SELECT (SELECT UNNEST([]))
|
||||
----
|
||||
NULL
|
||||
|
||||
# correlated
|
||||
query I
|
||||
SELECT (SELECT UNNEST(i)) FROM (VALUES ([1])) tbl(i);
|
||||
----
|
||||
1
|
||||
|
||||
query I
|
||||
SELECT (SELECT UNNEST(i)) FROM (VALUES ([NULL])) tbl(i);
|
||||
----
|
||||
NULL
|
||||
|
||||
query I
|
||||
SELECT (SELECT UNNEST(i)) FROM (VALUES ([])) tbl(i);
|
||||
----
|
||||
NULL
|
||||
|
||||
# now with an aggregate
|
||||
query I
|
||||
SELECT (SELECT SUM(k) FROM (SELECT UNNEST(i)) tbl(k)) FROM (VALUES ([1, 2, 3])) tbl(i);
|
||||
----
|
||||
6
|
||||
|
||||
query I
|
||||
SELECT (SELECT SUM(k)+SUM(l) FROM (SELECT UNNEST(i), UNNEST(j) FROM (VALUES ([1, 2, 3])) tbl(j)) tbl(k, l)) FROM (VALUES ([1, 2, 3])) tbl(i);
|
||||
----
|
||||
12
|
||||
|
||||
# ANY
|
||||
query I
|
||||
SELECT 1=ANY(SELECT UNNEST(i)) FROM (VALUES ([1, 2, 3])) tbl(i);
|
||||
----
|
||||
true
|
||||
|
||||
query I
|
||||
SELECT 4=ANY(SELECT UNNEST(i)) FROM (VALUES ([1, 2, 3])) tbl(i);
|
||||
----
|
||||
false
|
||||
|
||||
query I
|
||||
SELECT NULL=ANY(SELECT UNNEST(i)) FROM (VALUES ([1, 2, 3])) tbl(i);
|
||||
----
|
||||
NULL
|
||||
|
||||
query I
|
||||
SELECT 4=ANY(SELECT UNNEST(i)) FROM (VALUES ([1, 2, 3, NULL])) tbl(i);
|
||||
----
|
||||
NULL
|
||||
|
||||
# IN
|
||||
query I
|
||||
SELECT 1 IN (SELECT UNNEST(i)) FROM (VALUES ([1, 2, 3])) tbl(i);
|
||||
----
|
||||
true
|
||||
|
||||
# INSIDE a subquery
|
||||
query I
|
||||
SELECT (SELECT 1=ANY(SELECT UNNEST(i))) FROM (VALUES ([1, 2, 3])) tbl(i);
|
||||
----
|
||||
true
|
||||
|
||||
query I
|
||||
SELECT (SELECT 4=ANY(SELECT UNNEST(i))) FROM (VALUES ([1, 2, 3])) tbl(i);
|
||||
----
|
||||
false
|
||||
|
||||
query I
|
||||
SELECT (SELECT 4=ANY(SELECT UNNEST(i))) FROM (VALUES ([1, 2, 3, NULL])) tbl(i);
|
||||
----
|
||||
NULL
|
||||
|
||||
# INSIDE a subquery
|
||||
query I
|
||||
SELECT (SELECT 1=ANY(SELECT UNNEST(i))) FROM (VALUES ([1, 2, 3])) tbl(i);
|
||||
----
|
||||
true
|
||||
|
||||
query I
|
||||
SELECT (SELECT 4=ANY(SELECT UNNEST(i))) FROM (VALUES ([1, 2, 3])) tbl(i);
|
||||
----
|
||||
false
|
||||
|
||||
query I
|
||||
SELECT (SELECT 4=ANY(SELECT UNNEST(i))) FROM (VALUES ([1, 2, 3, NULL])) tbl(i);
|
||||
----
|
||||
NULL
|
||||
|
||||
# double correlated subqueries
|
||||
query I
|
||||
SELECT (SELECT 1+i[1]=ANY(SELECT UNNEST(i))) FROM (VALUES ([1, 2, 3])) tbl(i);
|
||||
----
|
||||
true
|
||||
73
external/duckdb/test/sql/subquery/scalar/test_update_subquery.test
vendored
Normal file
73
external/duckdb/test/sql/subquery/scalar/test_update_subquery.test
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
# name: test/sql/subquery/scalar/test_update_subquery.test
|
||||
# description: Test subqueries in update
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
CREATE TABLE integers(id INTEGER, i INTEGER)
|
||||
|
||||
statement ok
|
||||
INSERT INTO integers VALUES (1, 1), (2, 2), (3, 3), (4, NULL)
|
||||
|
||||
# correlated subquery in update
|
||||
statement ok
|
||||
UPDATE integers i1 SET i=(SELECT MAX(i) FROM integers WHERE i1.i<>i)
|
||||
|
||||
query II
|
||||
SELECT id, i FROM integers ORDER BY id
|
||||
----
|
||||
1 3
|
||||
2 3
|
||||
3 2
|
||||
4 NULL
|
||||
|
||||
# uncorrelated subquery in update
|
||||
statement ok
|
||||
UPDATE integers i1 SET i=(SELECT MAX(i) FROM integers) WHERE i=(SELECT MIN(i) FROM integers)
|
||||
|
||||
query II
|
||||
SELECT id, i FROM integers ORDER BY id
|
||||
----
|
||||
1 3
|
||||
2 3
|
||||
3 3
|
||||
4 NULL
|
||||
|
||||
# use different correlated column in subquery
|
||||
statement ok
|
||||
UPDATE integers i1 SET i=(SELECT MAX(id) FROM integers WHERE id<i1.id)
|
||||
|
||||
query II
|
||||
SELECT id, i FROM integers ORDER BY id
|
||||
----
|
||||
1 NULL
|
||||
2 1
|
||||
3 2
|
||||
4 3
|
||||
|
||||
# correlated subquery in WHERE
|
||||
statement ok
|
||||
UPDATE integers i1 SET i=2 WHERE i<(SELECT MAX(id) FROM integers WHERE i1.id<id);
|
||||
|
||||
query II
|
||||
SELECT id, i FROM integers ORDER BY id
|
||||
----
|
||||
1 NULL
|
||||
2 2
|
||||
3 2
|
||||
4 3
|
||||
|
||||
# use DEFAULT with correlated subquery in WHERE
|
||||
statement ok
|
||||
UPDATE integers i1 SET i=DEFAULT WHERE i=(SELECT MIN(i) FROM integers WHERE i1.id<id);
|
||||
|
||||
query II
|
||||
SELECT id, i FROM integers ORDER BY id
|
||||
----
|
||||
1 NULL
|
||||
2 NULL
|
||||
3 2
|
||||
4 3
|
||||
|
||||
101
external/duckdb/test/sql/subquery/scalar/test_varchar_correlated_subquery.test
vendored
Normal file
101
external/duckdb/test/sql/subquery/scalar/test_varchar_correlated_subquery.test
vendored
Normal file
@@ -0,0 +1,101 @@
|
||||
# name: test/sql/subquery/scalar/test_varchar_correlated_subquery.test
|
||||
# description: Test varchar correlated subqueries
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
SET default_null_order='nulls_first';
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
# varchar tests
|
||||
statement ok
|
||||
CREATE TABLE strings(v VARCHAR)
|
||||
|
||||
statement ok
|
||||
INSERT INTO strings VALUES ('hello'), ('world'), (NULL)
|
||||
|
||||
# ANY
|
||||
query T
|
||||
SELECT NULL IN (SELECT * FROM strings WHERE v=s1.v) FROM strings s1 ORDER BY v
|
||||
----
|
||||
0
|
||||
NULL
|
||||
NULL
|
||||
|
||||
statement error
|
||||
SELECT 3 IN (SELECT * FROM strings WHERE v=s1.v) FROM strings s1 ORDER BY v
|
||||
----
|
||||
explicit cast is required
|
||||
|
||||
query T
|
||||
SELECT '3' IN (SELECT * FROM strings WHERE v=s1.v) FROM strings s1 ORDER BY v
|
||||
----
|
||||
0
|
||||
0
|
||||
0
|
||||
|
||||
query T
|
||||
SELECT 'hello' IN (SELECT * FROM strings WHERE v=s1.v) FROM strings s1 ORDER BY v
|
||||
----
|
||||
0
|
||||
1
|
||||
0
|
||||
|
||||
query T
|
||||
SELECT 'bla' IN (SELECT * FROM strings WHERE v=s1.v) FROM strings s1 ORDER BY v
|
||||
----
|
||||
0
|
||||
0
|
||||
0
|
||||
|
||||
query T
|
||||
SELECT 'hello' IN (SELECT * FROM strings WHERE v=s1.v or v IS NULL) FROM strings s1 ORDER BY v
|
||||
----
|
||||
NULL
|
||||
1
|
||||
NULL
|
||||
|
||||
query T
|
||||
SELECT 'bla' IN (SELECT * FROM strings WHERE v=s1.v or v IS NULL) FROM strings s1 ORDER BY v
|
||||
----
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
||||
|
||||
# EXISTS
|
||||
query T
|
||||
SELECT * FROM strings WHERE EXISTS(SELECT NULL, v) ORDER BY v
|
||||
----
|
||||
NULL
|
||||
hello
|
||||
world
|
||||
|
||||
query T
|
||||
SELECT * FROM strings s1 WHERE EXISTS(SELECT v FROM strings WHERE v=s1.v OR v IS NULL) ORDER BY v
|
||||
----
|
||||
NULL
|
||||
hello
|
||||
world
|
||||
|
||||
query T
|
||||
SELECT * FROM strings s1 WHERE EXISTS(SELECT v FROM strings WHERE v=s1.v) ORDER BY v
|
||||
----
|
||||
hello
|
||||
world
|
||||
|
||||
# scalar query
|
||||
query T
|
||||
SELECT (SELECT v FROM strings WHERE v=s1.v) FROM strings s1 ORDER BY v
|
||||
----
|
||||
NULL
|
||||
hello
|
||||
world
|
||||
|
||||
query T
|
||||
SELECT (SELECT v FROM strings WHERE v=s1.v OR (v='hello' AND s1.v IS NULL)) FROM strings s1 ORDER BY v
|
||||
----
|
||||
hello
|
||||
hello
|
||||
world
|
||||
|
||||
81
external/duckdb/test/sql/subquery/scalar/test_window_function_subquery.test
vendored
Normal file
81
external/duckdb/test/sql/subquery/scalar/test_window_function_subquery.test
vendored
Normal file
@@ -0,0 +1,81 @@
|
||||
# name: test/sql/subquery/scalar/test_window_function_subquery.test
|
||||
# description: Test window functions in correlated subqueries
|
||||
# group: [scalar]
|
||||
|
||||
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)
|
||||
|
||||
# window functions in correlated subquery
|
||||
query II
|
||||
SELECT i, (SELECT row_number() OVER (ORDER BY i) FROM integers WHERE i1.i=i) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 1
|
||||
2 1
|
||||
3 1
|
||||
|
||||
query II
|
||||
SELECT i1.i, (SELECT rank() OVER (ORDER BY i) FROM integers WHERE i1.i=i) FROM integers i1, integers i2 ORDER BY i1.i;
|
||||
----
|
||||
NULL NULL
|
||||
NULL NULL
|
||||
NULL NULL
|
||||
NULL NULL
|
||||
1 1
|
||||
1 1
|
||||
1 1
|
||||
1 1
|
||||
2 1
|
||||
2 1
|
||||
2 1
|
||||
2 1
|
||||
3 1
|
||||
3 1
|
||||
3 1
|
||||
3 1
|
||||
|
||||
query II
|
||||
SELECT i1.i, (SELECT row_number() OVER (ORDER BY i) FROM integers WHERE i1.i=i) FROM integers i1, integers i2 ORDER BY i1.i;
|
||||
----
|
||||
NULL NULL
|
||||
NULL NULL
|
||||
NULL NULL
|
||||
NULL NULL
|
||||
1 1
|
||||
1 1
|
||||
1 1
|
||||
1 1
|
||||
2 1
|
||||
2 1
|
||||
2 1
|
||||
2 1
|
||||
3 1
|
||||
3 1
|
||||
3 1
|
||||
3 1
|
||||
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(i) OVER (ORDER BY i) FROM integers WHERE i1.i=i) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 1.000000
|
||||
2 2.000000
|
||||
3 3.000000
|
||||
|
||||
query IR
|
||||
SELECT i, (SELECT SUM(s1.i) OVER (ORDER BY s1.i) FROM integers s1, integers s2 WHERE i1.i=s1.i LIMIT 1) FROM integers i1 ORDER BY i;
|
||||
----
|
||||
NULL NULL
|
||||
1 4.000000
|
||||
2 8.000000
|
||||
3 12.000000
|
||||
|
||||
11
external/duckdb/test/sql/subquery/scalar/values_list_large.test_slow
vendored
Normal file
11
external/duckdb/test/sql/subquery/scalar/values_list_large.test_slow
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
# name: test/sql/subquery/scalar/values_list_large.test_slow
|
||||
# description: Test large correlated subquery with VALUES list
|
||||
# group: [scalar]
|
||||
|
||||
statement ok
|
||||
CREATE TABLE test AS SELECT CASE WHEN i%7=2 THEN NULL ELSE i::INTEGER END AS i, CASE WHEN i%9=2 THEN NULL ELSE i::INTEGER+2 END AS j FROM generate_series(0, 9999999, 1) tbl(i);
|
||||
|
||||
query III
|
||||
SELECT SUM(i), SUM(j), SUM((SELECT max(x) FROM (VALUES (i), (j)) AS X(x))) as maxn FROM test;
|
||||
----
|
||||
42857134285714 44444461111111 49206358253971
|
||||
Reference in New Issue
Block a user