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