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,47 @@
# name: test/sql/subquery/complex/complex_correlated_subquery_issue.test
# description: Test complex correlated subquery
# group: [complex]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE t0(c0 INT);
statement ok
CREATE TABLE t1(c0 INT);
statement ok
CREATE TABLE t2(c0 INT);
statement ok
SELECT * FROM t2, t1, ( SELECT t2.c0 AS col_1, t1.c0 AS col_2) as subQuery0 INNER JOIN t0 ON ((subQuery0.col_2)) CROSS JOIN (SELECT t0.c0 AS col_1);
statement ok
INSERT INTO t2(c0) VALUES (2);
statement ok
INSERT INTO t1(c0) VALUES (1);
statement ok
INSERT INTO t0(c0) VALUES (1);
query IIII
SELECT * FROM t2, t0 LEFT JOIN Lateral(SELECT t0.c0 AS col_0, t2.c0 AS col_1) as subQuery1 ON ((subQuery1.col_1)<(t0.c0));
----
2 1 NULL NULL
statement ok
drop table t0;
statement ok
drop table t1;
statement ok
CREATE TABLE t0(c0 DATE);
statement ok
CREATE TABLE t1(c0 DATETIME, c1 DOUBLE);
statement ok
SELECT * FROM t0, t1 CROSS JOIN (SELECT t0.c0 AS col_0 WHERE t1.c1) as subQuery0;

View File

@@ -0,0 +1,179 @@
# name: test/sql/subquery/complex/correlated_internal_issue_5975.test
# description: Test internal issue 5975 - INTERNAL Error: Failed to bind column reference ""
# group: [complex]
statement ok
CREATE TABLE my_logs (
featherEventId UUID,
"duckInfo.gooseEmail" VARCHAR,
"duckInfo.gooseSubject" VARCHAR
);
statement ok
CREATE TYPE MY_ENUM AS ENUM (
'EnumField1',
'EnumField2',
'EnumField3',
'EnumField4',
'EnumField5',
'EnumField6',
'EnumField7',
'EnumField8'
);
statement ok
CREATE OR REPLACE MACRO swan_MY_ENUM (sa) AS (
WITH sa_parts AS (
SELECT STRING_SPLIT(sa, '@') AS emailParts
)
SELECT 'EnumField2'::MY_ENUM
FROM sa_parts
);
statement ok
CREATE OR REPLACE MACRO swan_email_info (duckEmail) AS (
SELECT
CASE
WHEN ENDS_WITH(duckEmail, 'duckdblabs.com') THEN STRUCT_PACK(
subject := 'serviceAccount:' || duckEmail,
type := swan_MY_ENUM (duckEmail)
)
WHEN duckEmail = 'my@duckdblabs.com'
OR duckEmail = 'EnumField8' THEN STRUCT_PACK(
subject := 'EnumField8',
type := 'EnumField8'::MY_ENUM
)
WHEN REGEXP_MATCHES(duckEmail, '[\w-.+]+@(([\w-]+).)+[\w-]{2,4}') THEN STRUCT_PACK(
subject := 'user:' || duckEmail,
type := 'EnumField1'::MY_ENUM
)
END AS duckInfo
);
statement ok
CREATE OR REPLACE MACRO swan_subject_info (duckSubject) AS (
WITH
subjectComponents AS (
SELECT
duckSubject AS subject,
STRING_SPLIT(duckSubject, ':') AS parts
)
SELECT
CASE
WHEN parts[1] = 'EnumField2' THEN STRUCT_PACK(
subject := subject,
type := swan_MY_ENUM (parts[2])
)
WHEN parts[1] = 'EnumField1' THEN STRUCT_PACK(subject := subject, type := 'EnumField1'::MY_ENUM)
WHEN REGEXP_MATCHES(
subject,
'duckdb.org'
) THEN STRUCT_PACK(
subject := subject,
type := 'EnumField6'::MY_ENUM
)
WHEN NOT REGEXP_FULL_MATCH(subject, '.+@.+\..+') THEN STRUCT_PACK(
subject := subject,
type := 'EnumField7'::MY_ENUM
)
END AS duckInfo
FROM
subjectComponents
);
statement ok
WITH
duck_info AS (
SELECT
featherEventId,
"duckInfo.gooseEmail" AS email,
"duckInfo.gooseSubject" AS subject,
HASH('email' || "duckInfo.gooseEmail") AS emailHash,
HASH(
'subject' || "duckInfo.gooseSubject"
) AS subjectHash,
FROM
my_logs
),
unique_emails AS (
SELECT
email,
emailHash
FROM
duck_info
WHERE
email IS NOT NULL
GROUP BY
1,
2
),
email_info AS (
SELECT
emailHash AS swanHash,
swan_email_info (email) AS swanInfo
FROM
unique_emails
),
unique_subjects AS (
SELECT
subject,
subjectHash
FROM
duck_info
WHERE
subject IS NOT NULL
GROUP BY
1,
2
),
subject_info AS (
SELECT
subjectHash AS swanHash,
swan_subject_info (subject) AS swanInfo
FROM
unique_subjects
),
swan_info AS (
SELECT
*
FROM
email_info
UNION ALL
SELECT
*
FROM
subject_info
),
goose_id AS (
SELECT
featherEventId,
CASE
WHEN subject IS NOT NULL THEN subjectHash
WHEN email IS NOT NULL THEN emailHash
END AS swanHash,
FROM
duck_info
),
normalized_ids AS (
SELECT
featherEventId,
swanInfo.subject AS featherIdentityId,
swanInfo.type AS featherIdentityType,
FROM
goose_id
LEFT JOIN swan_info USING (swanHash)
),
chicken_info AS (
SELECT
featherEventId,
featherIdentityId,
featherIdentityType,
FROM
normalized_ids
)
SELECT
featherEventId,
featherIdentityId,
featherIdentityType,
FROM
chicken_info;

View File

@@ -0,0 +1,279 @@
# name: test/sql/subquery/complex/correlated_list_aggregate.test_slow
# description: Test correlated aggregate subqueries
# group: [complex]
statement ok
SET default_null_order='nulls_first';
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE lists(l INTEGER[]);
statement ok
INSERT INTO lists VALUES (ARRAY[1]), (ARRAY[2]), (ARRAY[3]), (NULL), (ARRAY[NULL]::INT[]);
# aggregate with correlation in final projection
query II
SELECT l, (SELECT MIN(l[1])+i1.l[1] FROM lists) FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 2
[2] 3
[3] 4
[NULL] NULL
# aggregate with correlation inside aggregation
query II
SELECT l, (SELECT MIN(l[1]+2*i1.l[1]) FROM lists) FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 3
[2] 5
[3] 7
[NULL] NULL
query IRR
SELECT l, SUM(l[1]), (SELECT SUM(l[1])+SUM(i1.l[1]) FROM lists) FROM lists i1 GROUP BY l ORDER BY l;
----
NULL NULL NULL
[1] 1.000000 7.000000
[2] 2.000000 8.000000
[3] 3.000000 9.000000
[NULL] NULL NULL
query IRR
SELECT l, SUM(l[1]), (SELECT SUM(l[1])+COUNT(i1.l[1]) FROM lists) FROM lists i1 GROUP BY l ORDER BY l;
----
NULL NULL 6.000000
[1] 1.000000 7.000000
[2] 2.000000 7.000000
[3] 3.000000 7.000000
[NULL] NULL 6.000000
# correlated COUNT(*)
query II
SELECT l, (SELECT COUNT(*) FROM lists i2 WHERE i2.l[1]>i1.l[1]) FROM lists i1 ORDER BY l;
----
NULL 0
[1] 2
[2] 1
[3] 0
[NULL] 0
# aggregate with correlation inside aggregation
query II
SELECT l, (SELECT MIN(l[1]+2*i1.l[1]) FROM lists) FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 3
[2] 5
[3] 7
[NULL] NULL
# aggregate ONLY inside subquery
query R
SELECT (SELECT SUM(i1.l[1])) FROM lists i1;
----
6.000000
# aggregate ONLY inside subquery, with column reference outside of subquery
query IR
SELECT MIN(l[1]), (SELECT SUM(i1.l[1])) FROM lists i1;
----
1 6.000000
# this will fail, because "l[1]" is not an aggregate but the SUM(i1.l[1]) turns this query into an aggregate
statement error
SELECT l, (SELECT SUM(i1.l[1])) FROM lists i1;
----
statement error
SELECT l[1]+1, (SELECT SUM(i1.l[1])) FROM lists i1;
----
query IR
SELECT MIN(l[1]), (SELECT SUM(i1.l[1])) FROM lists i1;
----
1 6.000000
query RR
SELECT (SELECT SUM(i1.l[1])), (SELECT SUM(i1.l[1])) FROM lists i1;
----
6.000000 6.000000
# subquery inside aggregation
query RR
SELECT SUM(l[1]), SUM((SELECT l[1] FROM lists WHERE l[1]=i1.l[1])) FROM lists i1;
----
6.000000 6.000000
query RR
SELECT SUM(l[1]), (SELECT SUM(l[1]) FROM lists WHERE l[1]>SUM(i1.l[1])) FROM lists i1;
----
6.000000 NULL
# subquery with aggregation inside aggregation should fail
statement error
SELECT SUM((SELECT SUM(l[1]))) FROM lists
----
# aggregate with correlation in filter
query II
SELECT l, (SELECT MIN(l[1]) FROM lists WHERE l[1]>i1.l[1]) FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 2
[2] 3
[3] NULL
[NULL] NULL
# aggregate with correlation in both filter and projection
query II
SELECT l, (SELECT MIN(l[1])+i1.l[1] FROM lists WHERE l[1]>i1.l[1]) FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 3
[2] 5
[3] NULL
[NULL] NULL
# aggregate with correlation in GROUP BY
query II
SELECT l, (SELECT MIN(l[1]) FROM lists GROUP BY i1.l[1]) AS j FROM lists i1 ORDER BY l;
----
NULL 1
[1] 1
[2] 1
[3] 1
[NULL] 1
# aggregate with correlation in HAVING clause
query II
SELECT l, (SELECT l[1] FROM lists GROUP BY l[1] HAVING l[1]=i1.l[1]) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 1
[2] 2
[3] 3
[NULL] NULL
# correlated subquery in HAVING
query IR
SELECT i1.l, SUM(l[1]) FROM lists i1 GROUP BY i1.l HAVING SUM(l[1])=(SELECT MIN(l[1]) FROM lists WHERE l[1]<>i1.l[1]+1) ORDER BY 1;
----
[1] 1.000000
query IR
SELECT l[1] % 2 AS j, SUM(l[1]) FROM lists i1 GROUP BY j HAVING SUM(l[1])=(SELECT SUM(l[1]) FROM lists WHERE l[1]<>j+1) ORDER BY 1;
----
1 4.000000
# aggregate query with non-aggregate subquery without group by
query R
SELECT (SELECT l[1]+SUM(i1.l[1]) FROM lists WHERE l[1]=1 LIMIT 1) FROM lists i1;
----
7.000000
query R
SELECT (SELECT SUM(l[1])+SUM(i1.l[1]) FROM lists) FROM lists i1 ORDER BY 1;
----
12.000000
# aggregate query with non-aggregate subquery with group by
query IR
SELECT l, (SELECT l[1]+SUM(i1.l[1]) FROM lists WHERE l[1]=1) FROM lists i1 GROUP BY l ORDER BY l;
----
NULL NULL
[1] 2.000000
[2] 3.000000
[3] 4.000000
[NULL] NULL
# subquery inside aggregate
query R
SELECT SUM((SELECT l[1]+i1.l[1] FROM lists WHERE l[1]=1)) FROM lists i1;
----
9.000000
query IRR
SELECT l, SUM(i1.l[1]), (SELECT SUM(i1.l[1])) AS k FROM lists i1 GROUP BY l ORDER BY l;
----
NULL NULL NULL
[1] 1.000000 1.000000
[2] 2.000000 2.000000
[3] 3.000000 3.000000
[NULL] NULL NULL
# aggregation of both entries inside subquery
# aggregate on group inside subquery
query IR
SELECT i1.l AS j, (SELECT SUM(j[1]+l[1]) FROM lists) AS k FROM lists i1 GROUP BY j ORDER BY j;
----
NULL NULL
[1] 9.000000
[2] 12.000000
[3] 15.000000
[NULL] NULL
query R
SELECT (SELECT SUM(i1.l[1]*l[1]) FROM lists) FROM lists i1 ORDER BY l;
----
NULL
6.000000
12.000000
18.000000
NULL
# ORDER BY correlated subquery
query IR
SELECT l, SUM(i1.l[1]) FROM lists i1 GROUP BY l ORDER BY (SELECT SUM(i1.l[1])), l;
----
NULL NULL
[NULL] NULL
[1] 1.000000
[2] 2.000000
[3] 3.000000
# LIMIT 0 on correlated subquery
query IR
SELECT l, SUM((SELECT SUM(l[1])*i1.l[1] FROM lists LIMIT 0)) AS k FROM lists i1 GROUP BY l ORDER BY l;
----
NULL NULL
[1] NULL
[2] NULL
[3] NULL
[NULL] NULL
# GROUP BY correlated subquery
query IR
SELECT (SELECT l[1]+i1.l[1] FROM lists WHERE l[1]=1) AS k, SUM(l[1]) AS j FROM lists 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(l[1]) FROM lists i1 WHERE l[1]>(SELECT (l[1]+i1.l[1])/2 FROM lists WHERE l[1]=1);
----
5.000000
# correlated aggregate in WHERE
query R
SELECT SUM(l[1]) FROM lists i1 WHERE l[1]>(SELECT (SUM(l[1])+i1.l[1])/2 FROM lists WHERE l[1]=1);
----
5.000000
# use scalar subquery as argument to ALL/ANY
query IT
SELECT l, (SELECT MIN(l[1]) FROM lists WHERE l[1]=i1.l[1]) >= ALL(SELECT l[1] FROM lists WHERE l[1] IS NOT NULL) FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 0
[2] 0
[3] 1
[NULL] NULL

View File

@@ -0,0 +1,79 @@
# name: test/sql/subquery/complex/correlated_list_any_join.test
# description: Test subqueries on ANY join with correlated lists
# group: [complex]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE lists(l INTEGER[]);
statement ok
INSERT INTO lists VALUES (ARRAY[1]), (ARRAY[2]), (ARRAY[3]), (NULL);
# correlated expressions in inner/left/right joins
query II
SELECT l, l IN (SELECT i1.l FROM (SELECT * FROM lists i1 WHERE i1.l=lists.l) i1 JOIN generate_series(1, 2, 1) tbl(s) ON i1.l=ARRAY[tbl.s]) FROM lists ORDER BY l NULLS LAST;
----
[1] True
[2] True
[3] False
NULL False
query I
SELECT l IN (SELECT i1.l FROM (SELECT * FROM lists i1 WHERE i1.l=lists.l) i1 LEFT JOIN generate_series(1, 2, 1) tbl(s) ON i1.l=ARRAY[tbl.s]) FROM lists ORDER BY l NULLS LAST;
----
true
true
true
false
query I
SELECT l IN (SELECT i1.l FROM (SELECT * FROM lists i1 WHERE i1.l=lists.l) i1 RIGHT JOIN generate_series(1, 2, 1) tbl(s) ON i1.l=ARRAY[tbl.s]) FROM lists ORDER BY l NULLS LAST;
----
true
true
NULL
NULL
# other way around
query I
SELECT l IN (SELECT i1.l FROM generate_series(1, 2, 1) tbl(s) LEFT JOIN (SELECT * FROM lists i1 WHERE i1.l=lists.l) i1 ON i1.l=ARRAY[tbl.s]) FROM lists ORDER BY l NULLS LAST;
----
true
true
NULL
NULL
query I
SELECT l IN (SELECT i1.l FROM generate_series(1, 2, 1) tbl(s) RIGHT JOIN (SELECT * FROM lists i1 WHERE i1.l=lists.l) i1 ON i1.l=ARRAY[tbl.s]) FROM lists ORDER BY l NULLS LAST;
----
true
true
true
false
# complex join condition
query I
SELECT l IN (SELECT i1.l FROM (SELECT * FROM lists i1 WHERE i1.l IS NOT DISTINCT FROM lists.l) i1 JOIN generate_series(1, 2, 1) tbl(s) ON i1.l=ARRAY[tbl.s] OR (i1.l IS NULL AND tbl.s IS NULL)) FROM lists ORDER BY l NULLS LAST;
----
true
true
false
false
query I
SELECT l IN (SELECT i1.l FROM (SELECT * FROM lists i1 WHERE i1.l IS NOT DISTINCT FROM lists.l) i1 LEFT JOIN generate_series(1, 2, 1) tbl(s) ON i1.l=ARRAY[tbl.s] OR (i1.l IS NULL AND tbl.s IS NULL)) FROM lists ORDER BY l NULLS LAST;
----
true
true
true
NULL
query I
SELECT l IN (SELECT i1.l FROM (SELECT * FROM lists i1 WHERE i1.l IS NOT DISTINCT FROM lists.l) i1 RIGHT JOIN generate_series(1, 2, 1) tbl(s) ON i1.l=ARRAY[tbl.s] OR (i1.l IS NULL AND tbl.s IS NULL)) FROM lists ORDER BY l NULLS LAST;
----
true
true
NULL
NULL

View File

@@ -0,0 +1,75 @@
# name: test/sql/subquery/complex/expensive_deduplication_3593.test_slow
# description: Issue #3593: Macros causes crash: memory consumption or recursion or something
# group: [complex]
statement ok
PRAGMA enable_verification
query I
SELECT
(
select count(*) as value
FROM (
SELECT UNNEST(array_agg(distinct id))
) a
)
as total_seats
FROM (
SELECT gen_random_uuid() id, 1 as val FROM generate_series(0, 160)
) as m;
----
161
query II
SELECT
z%2 AS k,
(
select count(*) as value
FROM (
SELECT UNNEST(array_agg(distinct id))
) a
)
as total_seats
FROM (
SELECT row_number() over () AS z, gen_random_uuid() id, 1 as val FROM generate_series(0, 160)
) as m
GROUP BY k
ORDER BY k;
----
0 80
1 81
# disable verification for these queries, they are too slow to run without the deduplication
statement ok
PRAGMA disable_verification
query I
SELECT
(
select count(*) as value
FROM (
SELECT UNNEST(array_agg(distinct id))
) a
)
as total_seats
FROM (
SELECT gen_random_uuid() id, 1 as val FROM generate_series(0, 100000)
) as m;
----
100001
query I
SELECT
(
select sum(a.val) as value
FROM (
SELECT UNNEST(list(distinct {key:m.id, val: m.val})) a
) x
)
as total_seats
FROM (
SELECT gen_random_uuid() id, 1 as val FROM range(0, 100000)
) as m
cross join (select * FROM range(0,3)) as r
----
100000

View File

@@ -0,0 +1,333 @@
# name: test/sql/subquery/complex/nested_correlated_list.test_slow
# description: Test nested correlated list subqueries
# group: [complex]
statement ok
SET default_null_order='nulls_first';
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE lists(l INTEGER[]);
statement ok
INSERT INTO lists VALUES (ARRAY[1]), (ARRAY[2]), (ARRAY[3]), (NULL);
# nested correlated queries
query II
SELECT l, (SELECT (SELECT 42+i1.l[1])+42+i1.l[1]) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 86
[2] 88
[3] 90
query II
SELECT l, (SELECT (SELECT (SELECT (SELECT 42+i1.l[1])++i1.l[1])+42+i1.l[1])+42+i1.l[1]) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 130
[2] 134
[3] 138
query IR
SELECT l, (SELECT (SELECT i1.l[1]+SUM(i2.l[1])) FROM lists i2) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 7.000000
[2] 8.000000
[3] 9.000000
# correlated query inside uncorrelated query
query II
SELECT l, (SELECT (SELECT (SELECT (SELECT i1.l[1]+i1.l[1]+i1.l[1]+i1.l[1]+i1.l[1])))) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 5
[2] 10
[3] 15
query IR
SELECT l, (SELECT SUM(l[1])+(SELECT 42+i1.l[1]) FROM lists) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 49.000000
[2] 50.000000
[3] 51.000000
query IR
SELECT l, (SELECT ((SELECT ((SELECT ((SELECT SUM(l[1])+SUM(i4.l[1])+SUM(i3.l[1])+SUM(i2.l[1])+SUM(i1.l[1]) FROM lists i5)) FROM lists i4)) FROM lists i3)) FROM lists i2) AS j FROM lists i1 GROUP BY l ORDER BY l;
----
NULL NULL
[1] 25.000000
[2] 26.000000
[3] 27.000000
query II
SELECT l, (SELECT (SELECT (SELECT (SELECT i1.l[1]+i1.l[1]+i1.l[1]+i1.l[1]+i1.l[1]+i2.l[1]) FROM lists i2 WHERE i2.l=i1.l))) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 6
[2] 12
[3] 18
query R
SELECT (SELECT (SELECT SUM(i1.l[1])+SUM(i2.l[1])+SUM(i3.l[1]) FROM lists i3) FROM lists i2) FROM lists i1 ORDER BY 1
----
18.000000
# explicit join on subquery
query IR
SELECT l, (SELECT SUM(s1.l[1]) FROM lists s1 INNER JOIN lists s2 ON (SELECT i1.l[1]+s1.l[1])=(SELECT i1.l[1]+s2.l[1])) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 6.000000
[2] 6.000000
[3] 6.000000
# nested aggregate queries
query IRR
SELECT l, SUM(l[1]), (SELECT (SELECT SUM(l[1])+SUM(i1.l[1])+SUM(i2.l[1]) FROM lists) FROM lists i2) FROM lists i1 GROUP BY l ORDER BY l;
----
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 l, (SELECT SUM(ss1.l[1]) FROM (SELECT l FROM lists s1 WHERE l[1]>ANY(SELECT l[1] FROM lists WHERE l<>s1.l)) ss1) AS j FROM lists i1 ORDER BY l;
----
NULL 5.000000
[1] 5.000000
[2] 5.000000
[3] 5.000000
query IR
SELECT l, (SELECT SUM(ss2.l[1]) FROM (SELECT l FROM lists s1 WHERE l=i1.l AND l=ANY(SELECT l FROM lists WHERE l=s1.l)) ss2) AS j FROM lists i1 ORDER BY l;
----
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 l, (SELECT SUM(s1.l[1]) FROM lists s1 LEFT OUTER JOIN lists s2 ON (SELECT i1.l[1]+s1.l[1])=(SELECT i1.l[1]+s2.l[1])) AS j FROM lists i1 ORDER BY l;
----
# REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3}));
# REQUIRE(CHECK_COLUMN(result, 1, {6, 6, 6, 6}));
query IR
SELECT l, (SELECT SUM(ss1.l[1])+SUM(ss2.l[1]) FROM (SELECT l FROM lists s1 WHERE l>ANY(SELECT l FROM lists WHERE l<>s1.l)) ss1 LEFT OUTER JOIN (SELECT l FROM lists s1 WHERE l=ANY(SELECT l FROM lists WHERE l=s1.l)) ss2 ON ss1.l=ss2.l) AS j FROM lists i1 ORDER BY l;
----
NULL 10.000000
[1] 10.000000
[2] 10.000000
[3] 10.000000
# left outer join with correlation on LHS
query IR
SELECT l, (SELECT SUM(s1.l[1]) FROM (SELECT l FROM lists WHERE l=i1.l) s1 LEFT OUTER JOIN lists s2 ON s1.l=s2.l) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 1.000000
[2] 2.000000
[3] 3.000000
query IR
SELECT l, (SELECT SUM(s1.l[1]) FROM (SELECT l FROM lists WHERE l<>i1.l) s1 LEFT OUTER JOIN lists s2 ON s1.l=s2.l) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 5.000000
[2] 4.000000
[3] 3.000000
# left outer join with correlation on RHS
query IR
SELECT l, (SELECT SUM(s2.l[1]) FROM lists s1 LEFT OUTER JOIN (SELECT l FROM lists WHERE l=i1.l) s2 ON s1.l=s2.l) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 1.000000
[2] 2.000000
[3] 3.000000
query IR
SELECT l, (SELECT SUM(s2.l[1]) FROM lists s1 LEFT OUTER JOIN (SELECT l FROM lists WHERE l<>i1.l) s2 ON s1.l=s2.l) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 5.000000
[2] 4.000000
[3] 3.000000
query IR
SELECT l, (SELECT SUM(ss2.l[1]) FROM (SELECT l FROM lists s1 WHERE CASE WHEN (l=i1.l AND l=ANY(SELECT l FROM lists WHERE l=s1.l)) THEN true ELSE false END) ss2) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 1.000000
[2] 2.000000
[3] 3.000000
query IR
SELECT l, (SELECT SUM(ss2.l[1]) FROM (SELECT l FROM lists s1 WHERE l=i1.l AND l=ANY(SELECT l FROM lists WHERE l=s1.l)) ss2) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 1.000000
[2] 2.000000
[3] 3.000000
query IR
SELECT l, (SELECT SUM(ss2.l[1]) FROM (SELECT l FROM lists s1 WHERE l=i1.l) ss2) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 1.000000
[2] 2.000000
[3] 3.000000
query IR
SELECT l, (SELECT SUM(ss2.l[1]) FROM (SELECT l FROM lists s1 WHERE l=ANY(SELECT l FROM lists WHERE l=s1.l)) ss2) AS j FROM lists i1 ORDER BY l;
----
NULL 6.000000
[1] 6.000000
[2] 6.000000
[3] 6.000000
query IT
SELECT l, (SELECT l=ANY(SELECT l FROM lists WHERE l=s1.l) FROM lists s1 WHERE l=i1.l) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 1
[2] 1
[3] 1
query IR
SELECT l, (SELECT SUM(ss2.l[1]) FROM (SELECT l FROM lists s1 WHERE l=i1.l OR l=ANY(SELECT l FROM lists WHERE l=s1.l)) ss2) AS j FROM lists i1 ORDER BY l;
----
NULL 6.000000
[1] 6.000000
[2] 6.000000
[3] 6.000000
query IR
SELECT l, (SELECT SUM(ss2.l[1]) FROM (SELECT l FROM lists s1 WHERE CASE WHEN (l=i1.l AND l=ANY(SELECT l FROM lists WHERE l=s1.l)) THEN true ELSE false END) ss2) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 1.000000
[2] 2.000000
[3] 3.000000
query IR
SELECT l, (SELECT SUM(ss2.l[1]) FROM (SELECT l FROM lists s1 WHERE l=i1.l AND EXISTS(SELECT l FROM lists WHERE l=s1.l)) ss2) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 1.000000
[2] 2.000000
[3] 3.000000
# complex left outer join with correlation on RHS
query IR
SELECT l, (SELECT SUM(ss1.l[1]) FROM (SELECT l FROM lists s1 WHERE l>ANY(SELECT l FROM lists WHERE l<>s1.l)) ss1) AS j FROM lists i1 ORDER BY l;
----
NULL 5.000000
[1] 5.000000
[2] 5.000000
[3] 5.000000
query IR
SELECT l, (SELECT SUM(ss1.l[1]) FROM (SELECT l FROM lists s1 WHERE l>ANY(SELECT l FROM lists WHERE l<>s1.l)) ss1 LEFT OUTER JOIN (SELECT l FROM lists s1 WHERE l=i1.l AND l=ANY(SELECT l FROM lists WHERE l=s1.l)) ss2 ON ss1.l=ss2.l) AS j FROM lists i1 ORDER BY l;
----
NULL 5.000000
[1] 5.000000
[2] 5.000000
[3] 5.000000
query IR
SELECT l, (SELECT SUM(ss2.l[1]) FROM (SELECT l FROM lists s1 WHERE l>ANY(SELECT l FROM lists WHERE l<>s1.l)) ss1 LEFT OUTER JOIN (SELECT l FROM lists s1 WHERE l=i1.l AND l=ANY(SELECT l FROM lists WHERE l=s1.l)) ss2 ON ss1.l=ss2.l) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] NULL
[2] 2.000000
[3] 3.000000
query IR
SELECT l, (SELECT SUM(ss1.l[1])+SUM(ss2.l[1]) FROM (SELECT l FROM lists s1 WHERE l>ANY(SELECT l FROM lists WHERE l<>s1.l)) ss1 LEFT OUTER JOIN (SELECT l FROM lists s1 WHERE l=i1.l AND l=ANY(SELECT l FROM lists WHERE l=s1.l)) ss2 ON ss1.l=ss2.l) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] NULL
[2] 7.000000
[3] 8.000000
# complex left outer join with correlation on LHS
query IR
SELECT l, (SELECT SUM(ss1.l[1])+SUM(ss2.l[1]) FROM (SELECT l FROM lists s1 WHERE l=i1.l AND l>ANY(SELECT l FROM lists WHERE l<>s1.l)) ss1 LEFT OUTER JOIN (SELECT l FROM lists s1 WHERE l=ANY(SELECT l FROM lists WHERE l=s1.l)) ss2 ON ss1.l=ss2.l) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] NULL
[2] 4.000000
[3] 6.000000
# complex left outer join with correlation on both sides
query IR
SELECT l, (SELECT SUM(ss1.l[1])+SUM(ss2.l[1]) FROM (SELECT l FROM lists s1 WHERE l=i1.l AND l>ANY(SELECT l FROM lists WHERE l<>s1.l)) ss1 LEFT OUTER JOIN (SELECT l FROM lists s1 WHERE l<>i1.l OR l=ANY(SELECT l FROM lists WHERE l=s1.l)) ss2 ON ss1.l=ss2.l) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] NULL
[2] 4.000000
[3] 6.000000
# test correlated queries with correlated expressions inside FROM clause
# subquery
query II
SELECT l, (SELECT * FROM (SELECT (SELECT 42+i1.l[1])) s1) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 43
[2] 44
[3] 45
# cross product
query II
SELECT l, (SELECT s1.k+s2.k FROM (SELECT (SELECT 42+i1.l[1]) AS k) s1, (SELECT (SELECT 42+i1.l[1]) AS k) s2) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 86
[2] 88
[3] 90
# join
query II
SELECT l, (SELECT s1.k+s2.k FROM (SELECT (SELECT 42+i1.l[1]) AS k) s1 LEFT OUTER JOIN (SELECT (SELECT 42+i1.l[1]) AS k) s2 ON s1.k=s2.k) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 86
[2] 88
[3] 90
# IN list inside correlated subquery
query IT
SELECT l, (SELECT i1.l[1] IN (1, 2, 3, 4, 5, 6, 7, 8)) AS j FROM lists i1 ORDER BY l;
----
NULL NULL
[1] 1
[2] 1
[3] 1
# nested correlated subqueries with multiple aggregate parameters
query R
SELECT (SELECT (SELECT COVAR_POP(i1.l[1], i3.l[1]) FROM lists i3) FROM lists i2 LIMIT 1) FROM lists i1 ORDER BY 1
----
NULL
0.000000
0.000000
0.000000
query R
SELECT (SELECT (SELECT COVAR_POP(i2.l[1], i3.l[1]) FROM lists i3) FROM lists i2 LIMIT 1) FROM lists i1 ORDER BY 1
----
0.000000
0.000000
0.000000
0.000000

View File

@@ -0,0 +1,37 @@
# name: test/sql/subquery/complex/nested_unnest_subquery.test
# description: Test nested correlated unnest subqueries
# group: [complex]
statement ok
SET default_null_order='nulls_first';
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE nested_lists(l INTEGER[][]);
statement ok
INSERT INTO nested_lists VALUES (ARRAY[ARRAY[0], ARRAY[1]]), (ARRAY[ARRAY[2], ARRAY[NULL, 3]]), (ARRAY[ARRAY[4, 5], ARRAY[6, 7], ARRAY[], ARRAY[8]]), (NULL), (ARRAY[NULL]::INT[][]);
query I
SELECT UNNEST(l) FROM nested_lists
----
[0]
[1]
[2]
[NULL, 3]
[4, 5]
[6, 7]
[]
[8]
NULL
query II
SELECT l, (SELECT SUM(a) FROM (SELECT UNNEST(b) AS a FROM (SELECT UNNEST(l) AS b))) FROM nested_lists ORDER BY l
----
NULL NULL
[[0], [1]] 1
[[2], [NULL, 3]] 5
[[4, 5], [6, 7], [], [8]] 30
[NULL] NULL