should be it
This commit is contained in:
47
external/duckdb/test/sql/subquery/complex/complex_correlated_subquery_issue.test
vendored
Normal file
47
external/duckdb/test/sql/subquery/complex/complex_correlated_subquery_issue.test
vendored
Normal 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;
|
||||
179
external/duckdb/test/sql/subquery/complex/correlated_internal_issue_5975.test
vendored
Normal file
179
external/duckdb/test/sql/subquery/complex/correlated_internal_issue_5975.test
vendored
Normal 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;
|
||||
279
external/duckdb/test/sql/subquery/complex/correlated_list_aggregate.test_slow
vendored
Normal file
279
external/duckdb/test/sql/subquery/complex/correlated_list_aggregate.test_slow
vendored
Normal 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
|
||||
|
||||
79
external/duckdb/test/sql/subquery/complex/correlated_list_any_join.test
vendored
Normal file
79
external/duckdb/test/sql/subquery/complex/correlated_list_any_join.test
vendored
Normal 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
|
||||
75
external/duckdb/test/sql/subquery/complex/expensive_deduplication_3593.test_slow
vendored
Normal file
75
external/duckdb/test/sql/subquery/complex/expensive_deduplication_3593.test_slow
vendored
Normal 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
|
||||
333
external/duckdb/test/sql/subquery/complex/nested_correlated_list.test_slow
vendored
Normal file
333
external/duckdb/test/sql/subquery/complex/nested_correlated_list.test_slow
vendored
Normal 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
|
||||
|
||||
37
external/duckdb/test/sql/subquery/complex/nested_unnest_subquery.test
vendored
Normal file
37
external/duckdb/test/sql/subquery/complex/nested_unnest_subquery.test
vendored
Normal 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
|
||||
Reference in New Issue
Block a user