should be it

This commit is contained in:
2025-10-24 19:21:19 -05:00
parent a4b23fc57c
commit f09560c7b1
14047 changed files with 3161551 additions and 1 deletions

View 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

View 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.*

View 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

View 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

View 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

View 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

View 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

View 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

View 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 []

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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.*

View 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

View 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)

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

View 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]

View 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

View 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

View 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

View 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

View 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

View 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

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

View 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

View 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

View 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

View 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

View 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

View 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

View 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