Changeset: 944ebb346fe0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=944ebb346fe0
Modified Files:
        sql/test/subquery/Tests/correlated.sql
        sql/test/subquery/Tests/correlated.stable.err
        sql/test/subquery/Tests/correlated.stable.out
Branch: Nov2019
Log Message:

More subqueries tests


diffs (truncated from 819 to 300 lines):

diff --git a/sql/test/subquery/Tests/correlated.sql 
b/sql/test/subquery/Tests/correlated.sql
--- a/sql/test/subquery/Tests/correlated.sql
+++ b/sql/test/subquery/Tests/correlated.sql
@@ -165,145 +165,144 @@ SELECT i, (SELECT MIN(i)+i1.i FROM integ
        -- 2, 5
        -- 3, NULL
 
-SELECT (SELECT SUM(i + i1.i), 1 FROM integers) FROM integers i1; --error, the 
subquery should output only one column
+SELECT (SELECT SUM(i + i1.i), 1 FROM integers) FROM integers i1; --error, the 
subquery must output only one column
 
 SELECT (SELECT SUM(i1.i) FROM integers) AS k FROM integers i1 GROUP BY i ORDER 
BY i; --cardinality violation, scalar expression expected
 
-/*
--- exit
-       // aggregate with correlation in GROUP BY
-       result = con.Query("SELECT i, (SELECT MIN(i) FROM integers GROUP BY 
i1.i) AS j FROM integers i1 ORDER BY i;");
-       REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3}));
-       REQUIRE(CHECK_COLUMN(result, 1, {1, 1, 1, 1}));
-       // aggregate with correlation in HAVING clause
-       result = con.Query("SELECT i, (SELECT i FROM integers GROUP BY i HAVING 
i=i1.i) AS j FROM integers i1 ORDER BY i;");
-       REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3}));
-       REQUIRE(CHECK_COLUMN(result, 1, {Value(), 1, 2, 3}));
-       // correlated subquery in HAVING
-       result = con.Query("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;");
-       REQUIRE(CHECK_COLUMN(result, 0, {1}));
-       REQUIRE(CHECK_COLUMN(result, 1, {1}));
-       result = con.Query("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;");
-       REQUIRE(CHECK_COLUMN(result, 0, {1}));
-       REQUIRE(CHECK_COLUMN(result, 1, {4}));
+SELECT i, (SELECT MIN(i) FROM integers GROUP BY i1.i) AS j FROM integers i1 
ORDER BY i;
+--1    1
+--2    1
+--3    1
+--NULL 1
+
+SELECT i, (SELECT i FROM integers GROUP BY i HAVING i=i1.i) AS j FROM integers 
i1 ORDER BY i;
+--1    1
+--2    2
+--3    3
+--NULL NULL
+
+SELECT i1.i, CAST(SUM(i) AS BIGINT) 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
+
+SELECT i % 2 AS j, CAST(SUM(i) AS BIGINT) FROM integers i1 GROUP BY j HAVING 
SUM(i)=(SELECT SUM(i) FROM integers WHERE i<>j+1) ORDER BY 1;
+--1 4
+
+SELECT CAST((SELECT i+SUM(i1.i) FROM integers WHERE i=1 LIMIT 1) AS BIGINT) 
FROM integers i1; --error, no LIMIT on subqueries
+
+SELECT CAST((SELECT SUM(i)+SUM(i1.i) FROM integers) AS BIGINT) FROM integers 
i1 ORDER BY 1;
+--12
+
+/*Wrong results
+SELECT CAST((SELECT SUM(i)+SUM((CASE WHEN i IS NOT NULL THEN i*0 ELSE 0 
END)+i1.i) FROM integers) AS BIGINT) FROM integers i1 ORDER BY 1;*/
+--10
+--14
+--18
+--NULL
 
-       // aggregate query with non-aggregate subquery without group by
-       result = con.Query("SELECT (SELECT i+SUM(i1.i) FROM integers WHERE i=1 
LIMIT 1) FROM integers i1;");
-       REQUIRE(CHECK_COLUMN(result, 0, {7}));
+SELECT i, CAST((SELECT i+SUM(i1.i) FROM integers WHERE i=1) AS BIGINT) FROM 
integers i1 GROUP BY i ORDER BY i;
+--1    2
+--2    3
+--3    4
+--NULL NULL
 
-       result = con.Query("SELECT (SELECT SUM(i)+SUM(i1.i) FROM integers) FROM 
integers i1 ORDER BY 1;");
-       REQUIRE(CHECK_COLUMN(result, 0, {12}));
-       result = con.Query("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;");
-       REQUIRE(CHECK_COLUMN(result, 0, {Value(), 10, 14, 18}));
+SELECT CAST(SUM((SELECT i+i1.i FROM integers WHERE i=1)) AS BIGINT) FROM 
integers i1;
+--9
+
+SELECT i, CAST(SUM(i1.i) AS BIGINT), CAST((SELECT SUM(i1.i) FROM integers) AS 
BIGINT) AS k FROM integers i1 GROUP BY i ORDER BY i; --error, cardinality 
violation, scalar expression expected
+
+SELECT i1.i AS j, CAST((SELECT SUM(j+i) FROM integers) AS BIGINT) AS k FROM 
integers i1 GROUP BY j ORDER BY j;
+--1    9
+--2    12
+--3    15
+--NULL NULL
 
-       // aggregate query with non-aggregate subquery with group by
-       result =
-           con.Query("SELECT i, (SELECT i+SUM(i1.i) FROM integers WHERE i=1) 
FROM integers i1 GROUP BY i ORDER BY i;");
-       REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3}));
-       REQUIRE(CHECK_COLUMN(result, 1, {Value(), 2, 3, 4}));
+/*BROKEN
+SELECT CAST((SELECT SUM(i1.i*i) FROM integers) AS BIGINT) FROM integers i1 
ORDER BY i;*/
+--6
+--12
+--18
+--NULL
 
-       // subquery inside aggregate
-       result = con.Query("SELECT SUM((SELECT i+i1.i FROM integers WHERE i=1)) 
FROM integers i1;");
-       REQUIRE(CHECK_COLUMN(result, 0, {9}));
+SELECT i, CAST((SELECT SUM(i1.i)) AS BIGINT) AS k, CAST((SELECT SUM(i1.i)) AS 
BIGINT) AS l FROM integers i1 GROUP BY i ORDER BY i;
+--1    1       1
+--2    2       2
+--3    3       3
+--NULL NULL    NULL
 
-       result =
-           con.Query("SELECT i, SUM(i1.i), (SELECT SUM(i1.i) FROM integers) AS 
k FROM integers i1 GROUP BY i ORDER BY i;");
-       REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3}));
-       REQUIRE(CHECK_COLUMN(result, 1, {Value(), 1, 2, 3}));
-       REQUIRE(CHECK_COLUMN(result, 2, {Value(), 1, 2, 3}));
+SELECT i, CAST((SELECT SUM(i1.i)*SUM(i) FROM integers) AS BIGINT) AS k FROM 
integers i1 GROUP BY i ORDER BY i;
+--1    6
+--2    12
+--3    18
+--NULL NULL
 
-       // aggregation of both entries inside subquery
-       // aggregate on group inside subquery
-       result =
-           con.Query("SELECT i1.i AS j, (SELECT SUM(j+i) FROM integers) AS k 
FROM integers i1 GROUP BY j ORDER BY j;");
-       REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3}));
-       REQUIRE(CHECK_COLUMN(result, 1, {Value(), 9, 12, 15}));
-       result = con.Query("SELECT (SELECT SUM(i1.i*i) FROM integers) FROM 
integers i1 ORDER BY i;");
-       REQUIRE(CHECK_COLUMN(result, 0, {Value(), 6, 12, 18}));
-       result =
-           con.Query("SELECT i, (SELECT SUM(i1.i)) AS k, (SELECT SUM(i1.i)) AS 
l FROM integers i1 GROUP BY i ORDER BY i;");
-       REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3}));
-       REQUIRE(CHECK_COLUMN(result, 1, {Value(), 1, 2, 3}));
-       REQUIRE(CHECK_COLUMN(result, 2, {Value(), 1, 2, 3}));
-       // refer aggregation inside subquery
-       result =
-           con.Query("SELECT i, (SELECT SUM(i1.i)*SUM(i) FROM integers) AS k 
FROM integers i1 GROUP BY i ORDER BY i;");
-       REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3}));
-       REQUIRE(CHECK_COLUMN(result, 1, {Value(), 6, 12, 18}));
-       // refer to GROUP BY inside subquery
-       result = con.Query("SELECT i AS j, (SELECT j*SUM(i) FROM integers) AS k 
FROM integers i1 GROUP BY j ORDER BY j;");
-       REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3}));
-       REQUIRE(CHECK_COLUMN(result, 1, {Value(), 6, 12, 18}));
-       // refer to GROUP BY without alias but with full name
-       result =
-           con.Query("SELECT i AS j, (SELECT i1.i*SUM(i) FROM integers) AS k 
FROM integers i1 GROUP BY j ORDER BY j;");
-       REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3}));
-       REQUIRE(CHECK_COLUMN(result, 1, {Value(), 6, 12, 18}));
-       // perform SUM on subquery
-       result =
-           con.Query("SELECT i, SUM((SELECT SUM(i)*i1.i FROM integers)) AS k 
FROM integers i1 GROUP BY i ORDER BY i;");
-       REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3}));
-       REQUIRE(CHECK_COLUMN(result, 1, {Value(), 6, 12, 18}));
+SELECT i AS j, CAST((SELECT j*SUM(i) FROM integers) AS BIGINT) AS k FROM 
integers i1 GROUP BY j ORDER BY j;
+--1    6
+--2    12
+--3    18
+--NULL NULL
+
+/*Wrong result, cannot find column
+SELECT i AS j, CAST((SELECT i1.i*SUM(i) FROM integers) AS BIGINT) AS k FROM 
integers i1 GROUP BY j ORDER BY j;*/
+--1    6
+--2    12
+--3    18
+--NULL NULL
 
-       // aggregate subqueries cannot be nested
-       REQUIRE_FAIL(con.Query(
-           "SELECT i, SUM((SELECT SUM(i)*SUM(i1.i) FROM integers)) AS k FROM 
integers i1 GROUP BY i ORDER BY i;"));
+SELECT i, CAST(SUM((SELECT SUM(i)*i1.i FROM integers)) AS BIGINT) AS k FROM 
integers i1 GROUP BY i ORDER BY i;
+--1    6
+--2    12
+--3    18
+--NULL NULL
+
+/*Wrong results, aggregation functions cannot be nested
+SELECT i, SUM((SELECT SUM(i)*SUM(i1.i) FROM integers)) AS k FROM integers i1 
GROUP BY i ORDER BY i; --error*/
 
-       // aggregation but ONLY inside subquery results in implicit aggregation
-       result = con.Query("SELECT (SELECT SUM(i1.i)) FROM integers i1;");
-       REQUIRE(CHECK_COLUMN(result, 0, {6}));
-       result = con.Query("SELECT FIRST(i), (SELECT SUM(i1.i)) FROM integers 
i1;");
-       REQUIRE(CHECK_COLUMN(result, 0, {1}));
-       REQUIRE(CHECK_COLUMN(result, 1, {6}));
+SELECT CAST((SELECT SUM(i1.i)) AS BIGINT) FROM integers i1;
+--6
+
+SELECT FIRST(i), CAST((SELECT SUM(i1.i)) AS BIGINT) FROM integers i1; --error, 
no first aggregate available yet
+
+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;
+--1    1
+--2    2
+--3    3
+--NULL NULL
 
-       // aggregate that uses correlated column in aggregation
-       result = con.Query("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;");
-       REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3}));
-       REQUIRE(CHECK_COLUMN(result, 1, {Value(), 1, 2, 3}));
+SELECT i, SUM(i1.i) FROM integers i1 GROUP BY i ORDER BY (SELECT SUM(i1.i) 
FROM integers); --error, cardinality violation, scalar expression expected
 
-       // ORDER BY correlated subquery
-       result = con.Query("SELECT i, SUM(i1.i) FROM integers i1 GROUP BY i 
ORDER BY (SELECT SUM(i1.i) FROM integers);");
-       REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3}));
-       REQUIRE(CHECK_COLUMN(result, 1, {Value(), 1, 2, 3}));
+SELECT i, SUM((SELECT SUM(i)*i1.i FROM integers LIMIT 0)) AS k FROM integers 
i1 GROUP BY i ORDER BY i; --error, no LIMIT on subqueries
 
-       // LIMIT 0 on correlated subquery
-       result = con.Query(
-           "SELECT i, SUM((SELECT SUM(i)*i1.i FROM integers LIMIT 0)) AS k 
FROM integers i1 GROUP BY i ORDER BY i;");
-       REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3}));
-       REQUIRE(CHECK_COLUMN(result, 1, {Value(), Value(), Value(), Value()}));
+SELECT (SELECT i+i1.i FROM integers WHERE i=1) AS k, CAST(SUM(i) AS BIGINT) AS 
j FROM integers i1 GROUP BY k ORDER BY 1;
+--2    1
+--3    2
+--4    3
+--NULL NULL
 
-       // GROUP BY correlated subquery
-       result = con.Query(
-           "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;");
-       REQUIRE(CHECK_COLUMN(result, 0, {Value(), 2, 3, 4}));
-       REQUIRE(CHECK_COLUMN(result, 1, {Value(), 1, 2, 3}));
+SELECT CAST(SUM(i) AS BIGINT) FROM integers i1 WHERE i>(SELECT (i+i1.i)/2 FROM 
integers WHERE i=1);
+--5
+
+SELECT CAST(SUM(i) AS BIGINT) FROM integers i1 WHERE i>(SELECT (SUM(i)+i1.i)/2 
FROM integers WHERE i=1);
+--5
 
-       // correlated subquery in WHERE
-       result = con.Query("SELECT SUM(i) FROM integers i1 WHERE i>(SELECT 
(i+i1.i)/2 FROM integers WHERE i=1);");
-       REQUIRE(CHECK_COLUMN(result, 0, {5}));
-       // correlated aggregate in WHERE
-       result = con.Query("SELECT SUM(i) FROM integers i1 WHERE i>(SELECT 
(SUM(i)+i1.i)/2 FROM integers WHERE i=1);");
-       REQUIRE(CHECK_COLUMN(result, 0, {5}));
+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;
+--1    False
+--2    False
+--3    True
+--NULL NULL
 
-       // use scalar subquery as argument to ALL/ANY
-       result = con.Query("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;");
-       REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3}));
-       REQUIRE(CHECK_COLUMN(result, 1, {Value(), false, false, true}));
-       result = con.Query("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;");
-       REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3}));
-       REQUIRE(CHECK_COLUMN(result, 1, {Value(), true, false, false}));
-       result = con.Query("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;");
-       REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3}));
-       REQUIRE(CHECK_COLUMN(result, 1, {Value(), false, true, true}));
-}
+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;
+--1    True
+--2    False
+--3    False
+--NULL NULL
 
+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;
+--1    False
+--2    True
+--3    True
+--NULL NULL
+
+/*
 TEST_CASE("Test correlated EXISTS subqueries", "[subquery]") {
        unique_ptr<DuckDBResult> result;
        DuckDB db(nullptr);
@@ -415,78 +414,104 @@ TEST_CASE("Test correlated ANY/ALL subqu
        // zero results for all
        result = con.Query("SELECT i=ANY(SELECT i FROM integers WHERE i=i1.i 
AND i>10) FROM integers i1 ORDER BY i;");
        REQUIRE(CHECK_COLUMN(result, 0, {false, false, false, false}));
-}
-
-TEST_CASE("Test for COUNT(*) and SUM(i) IS NULL in subqueries", "[subquery]") {
-       unique_ptr<DuckDBResult> result;
-       DuckDB db(nullptr);
-       DuckDBConnection con(db);
-
-       con.EnableQueryVerification();
-       con.EnableProfiling();
-
-       REQUIRE_NO_FAIL(con.Query("CREATE TABLE integers(i INTEGER)"));
-       REQUIRE_NO_FAIL(con.Query("INSERT INTO integers VALUES (1), (2), (3), 
(NULL)"));
-
-       // COUNT(*) and SUM(i) IS NULL aggregates
-       result = con.Query("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;");
-       REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3}));
-       REQUIRE(CHECK_COLUMN(result, 1, {Value(), Value(), 3, Value()}));
-       result =
-           con.Query("SELECT i, (SELECT SUM(i) IS NULL FROM integers i2 WHERE 
i2.i>i1.i) FROM integers i1 ORDER BY i;");
-       REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3}));
-       REQUIRE(CHECK_COLUMN(result, 1, {true, false, false, true}));
-       result = con.Query("SELECT i, (SELECT COUNT(*) FROM integers i2 WHERE 
i2.i>i1.i) FROM integers i1 ORDER BY i;");
-       REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3}));
-       REQUIRE(CHECK_COLUMN(result, 1, {0, 2, 1, 0}));
-       result = con.Query(
-           "SELECT i, (SELECT COUNT(i) FROM integers i2 WHERE i2.i>i1.i OR 
i2.i IS NULL) FROM integers i1 ORDER BY i;");
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to