Changeset: 88c5411431c2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=88c5411431c2
Modified Files:
        sql/server/rel_select.c
        sql/test/subquery/Tests/subquery4.sql
        sql/test/subquery/Tests/subquery4.stable.err
        sql/test/subquery/Tests/subquery4.stable.out
Branch: linear-hashing
Log Message:

Union, except and intersect operators on a subquery must return only one column


diffs (85 lines):

diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -2358,16 +2358,20 @@ rel_logical_value_exp(sql_query *query, 
        case SQL_UNION:
        case SQL_EXCEPT:
        case SQL_INTERSECT: {
+               sql_rel *sq;
+
                if (is_psm_call(f))
                        return sql_error(sql, 02, SQLSTATE(42000) "CALL: 
subqueries not allowed inside CALL statements");
                if (rel && *rel)
                        query_push_outer(query, *rel, f);
-               sql_rel *sq = rel_setquery(query, sc);
+               sq = rel_setquery(query, sc);
                if (rel && *rel)
                        *rel = query_pop_outer(query);
-               if (sq)
-                       return exp_rel(sql, sq);
-               return NULL;
+               if (!sq)
+                       return NULL;
+               if (ek.card <= card_set && is_project(sq->op) && 
list_length(sq->exps) > 1)
+                       return sql_error(sql, 02, SQLSTATE(42000) "SELECT: 
subquery must return only one column");
+               return exp_rel(sql, sq);
        }
        case SQL_DEFAULT:
                return sql_error(sql, 02, SQLSTATE(42000) "DEFAULT keyword not 
allowed outside insert and update statements");
diff --git a/sql/test/subquery/Tests/subquery4.sql 
b/sql/test/subquery/Tests/subquery4.sql
--- a/sql/test/subquery/Tests/subquery4.sql
+++ b/sql/test/subquery/Tests/subquery4.sql
@@ -33,6 +33,14 @@ FROM integers i1;
        -- 1
 
 SELECT
+       (SELECT 1,1 UNION ALL SELECT 2,2)
+FROM integers i1; --error, subquery must return only one column
+
+SELECT
+       (SELECT 1 UNION ALL SELECT 2)
+FROM integers i1; --error, more than one row returned by a subquery used as an 
expression
+
+SELECT
        (SELECT i2.i FROM evilfunction(MIN(1)) as i2(i))
 FROM integers i1; -- error, aggregate functions are not allowed in functions 
in FROM
 
@@ -51,7 +59,7 @@ FROM integers i1;
 SELECT 1 FROM evilfunction((SELECT MAX(1) OVER ()));
        -- 1
 
-SELECT 1 FROM evilfunction((SELECT MAX(1) OVER () UNION ALL SELECT 1)); 
--error, more than one row returned by a subquery used as an expression
+SELECT 1 FROM evilfunction((SELECT MAX(1) OVER () UNION ALL SELECT 1));
 
 SELECT 
        (SELECT 1 FROM evilfunction((SELECT MAX(1) OVER () UNION ALL SELECT 1)))
diff --git a/sql/test/subquery/Tests/subquery4.stable.err 
b/sql/test/subquery/Tests/subquery4.stable.err
--- a/sql/test/subquery/Tests/subquery4.stable.err
+++ b/sql/test/subquery/Tests/subquery4.stable.err
@@ -30,7 +30,13 @@ QUERY = PREPARE SELECT
         FROM another_T;
 ERROR = !Could not determine type for argument number 1
 CODE  = 42000
-MAPI  = (monetdb) /var/tmp/mtest-120241/.s.monetdb.31512
+MAPI  = (monetdb) /var/tmp/mtest-99553/.s.monetdb.37320
+QUERY = SELECT
+               (SELECT 1,1 UNION ALL SELECT 2,2)
+        FROM integers i1; --error, subquery must return only one column
+ERROR = !SELECT: subquery must return only one column
+CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-99553/.s.monetdb.37320
 QUERY = SELECT
                (SELECT i2.i FROM evilfunction(MIN(1)) as i2(i))
         FROM integers i1; -- error, aggregate functions are not allowed in 
functions in FROM
diff --git a/sql/test/subquery/Tests/subquery4.stable.out 
b/sql/test/subquery/Tests/subquery4.stable.out
--- a/sql/test/subquery/Tests/subquery4.stable.out
+++ b/sql/test/subquery/Tests/subquery4.stable.out
@@ -83,7 +83,7 @@ stdout of test 'subquery4` in directory 
 % tinyint # type
 % 1 # length
 [ 1    ]
-#SELECT 1 FROM evilfunction((SELECT MAX(1) OVER () UNION ALL SELECT 1)); 
--error, more than one row returned by a subquery used as an expression
+#SELECT 1 FROM evilfunction((SELECT MAX(1) OVER () UNION ALL SELECT 1));
 % . # table_name
 % single_value # name
 % tinyint # type
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to