Changeset: 081fc73cb320 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=081fc73cb320
Modified Files:
        sql/server/rel_select.c
        sql/test/subquery/Tests/any.stable.err
        sql/test/subquery/Tests/any.stable.out
Branch: Nov2019
Log Message:

Check for number of expressions on subquery projection


diffs (161 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
@@ -2318,6 +2318,10 @@ rel_logical_value_exp(sql_query *query, 
                                sql_rel *l = *rel;
                                sql_exp *rls = ls;
 
+                               assert(is_project(r->op));
+                               if (list_length(r->exps) != 1)
+                                       return sql_error(sql, 02, 
SQLSTATE(42000) "SELECT: subquery must return only one column\n");
+
                                if (!l) {
                                        l = *rel = rel_project(sql->sa, NULL, 
new_exp_list(sql->sa));
                                        ls = rel_project_add_exp(sql, l, ls);
@@ -2415,7 +2419,7 @@ rel_logical_value_exp(sql_query *query, 
                        *rel = orel->l;
                }
 
-               le = rel_value_exp(query, &sq, lo, f, ek);
+               le = rel_value_exp(query, &sq, lo, f, ek);
                if (!le && sql->session->status != -ERR_AMBIGUOUS) { /* 
correlated */
                        sql_subaggr *ea = NULL;
 
diff --git a/sql/test/subquery/Tests/any.stable.err 
b/sql/test/subquery/Tests/any.stable.err
--- a/sql/test/subquery/Tests/any.stable.err
+++ b/sql/test/subquery/Tests/any.stable.err
@@ -31,6 +31,10 @@ MAPI  = (monetdb) /var/tmp/mtest-22181/.
 QUERY = SELECT i, i >= ANY(SELECT i1.i FROM integers i1, integers i2, integers 
i3, integers i4, integers i5, integers i6 WHERE i1.i IS NOT NULL AND i1.i <> 1 
LIMIT 1) FROM integers ORDER BY i; -- parse error
 ERROR = !syntax error, unexpected LIMIT, expecting UNION or EXCEPT or 
INTERSECT or ')' in: "select i, i >= any(select i1.i from integers i1, integers 
i2, integers i3, integ"
 CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-1269/.s.monetdb.39348
+QUERY = SELECT 1 >= ANY(SELECT 2, 3); --error, subquery should output a single 
column 
+ERROR = !SELECT: subquery must return only one column
+CODE  = 42000
 
 # 08:20:30 >  
 # 08:20:30 >  "Done."
diff --git a/sql/test/subquery/Tests/any.stable.out 
b/sql/test/subquery/Tests/any.stable.out
--- a/sql/test/subquery/Tests/any.stable.out
+++ b/sql/test/subquery/Tests/any.stable.out
@@ -41,8 +41,8 @@ stdout of test 'any` in directory 'sql/t
 [ 2    ]
 [ 3    ]
 #SELECT i, i > ANY(SELECT i FROM integers) FROM integers ORDER BY i;
-% sys.integers,        sys.L10 # table_name
-% i,   L10 # name
+% sys.integers,        sys.L4 # table_name
+% i,   L4 # name
 % int, boolean # type
 % 1,   5 # length
 [ NULL,        NULL    ]
@@ -50,8 +50,8 @@ stdout of test 'any` in directory 'sql/t
 [ 2,   true    ]
 [ 3,   true    ]
 #SELECT i, i > ANY(SELECT i FROM integers WHERE i IS NOT NULL) FROM integers 
ORDER BY i;
-% sys.integers,        sys.L10 # table_name
-% i,   L10 # name
+% sys.integers,        sys.L4 # table_name
+% i,   L4 # name
 % int, boolean # type
 % 1,   5 # length
 [ NULL,        NULL    ]
@@ -59,8 +59,8 @@ stdout of test 'any` in directory 'sql/t
 [ 2,   true    ]
 [ 3,   true    ]
 #SELECT i, NULL > ANY(SELECT i FROM integers) FROM integers ORDER BY i;
-% sys.integers,        .L11 # table_name
-% i,   L11 # name
+% sys.integers,        .L6 # table_name
+% i,   L6 # name
 % int, boolean # type
 % 1,   5 # length
 [ NULL,        NULL    ]
@@ -68,8 +68,8 @@ stdout of test 'any` in directory 'sql/t
 [ 2,   NULL    ]
 [ 3,   NULL    ]
 #SELECT i, NULL > ANY(SELECT i FROM integers WHERE i IS NOT NULL) FROM 
integers ORDER BY i;
-% sys.integers,        .L11 # table_name
-% i,   L11 # name
+% sys.integers,        .L6 # table_name
+% i,   L6 # name
 % int, boolean # type
 % 1,   5 # length
 [ NULL,        NULL    ]
@@ -85,8 +85,8 @@ stdout of test 'any` in directory 'sql/t
 [ 2    ]
 [ 3    ]
 #SELECT i, i = ANY(SELECT i FROM integers WHERE i>2) FROM integers ORDER BY i;
-% .integers,   .L11 # table_name
-% i,   L11 # name
+% .integers,   .L10 # table_name
+% i,   L10 # name
 % int, boolean # type
 % 1,   5 # length
 [ NULL,        NULL    ]
@@ -94,8 +94,8 @@ stdout of test 'any` in directory 'sql/t
 [ 2,   false   ]
 [ 3,   true    ]
 #SELECT i, i = ANY(SELECT i FROM integers WHERE i>2 OR i IS NULL) FROM 
integers ORDER BY i;
-% .integers,   .L11 # table_name
-% i,   L11 # name
+% .integers,   .L10 # table_name
+% i,   L10 # name
 % int, boolean # type
 % 1,   5 # length
 [ NULL,        NULL    ]
@@ -103,8 +103,8 @@ stdout of test 'any` in directory 'sql/t
 [ 2,   NULL    ]
 [ 3,   true    ]
 #SELECT i, i <> ANY(SELECT i FROM integers WHERE i>2) FROM integers ORDER BY i;
-% sys.integers,        sys.L10 # table_name
-% i,   L10 # name
+% sys.integers,        sys.L4 # table_name
+% i,   L4 # name
 % int, boolean # type
 % 1,   5 # length
 [ NULL,        NULL    ]
@@ -112,8 +112,8 @@ stdout of test 'any` in directory 'sql/t
 [ 2,   true    ]
 [ 3,   false   ]
 #SELECT i, i <> ANY(SELECT i FROM integers WHERE i>2 OR i IS NULL) FROM 
integers ORDER BY i;
-% sys.integers,        sys.L10 # table_name
-% i,   L10 # name
+% sys.integers,        sys.L4 # table_name
+% i,   L4 # name
 % int, boolean # type
 % 1,   5 # length
 [ NULL,        NULL    ]
@@ -121,8 +121,8 @@ stdout of test 'any` in directory 'sql/t
 [ 2,   true    ]
 [ 3,   NULL    ]
 #SELECT i, i = ANY(SELECT i1.i FROM integers i1, integers i2, integers i3, 
integers i4, integers i5, integers i6 WHERE i1.i IS NOT NULL) FROM integers 
ORDER BY i;
-% .integers,   .L11 # table_name
-% i,   L11 # name
+% .integers,   .L10 # table_name
+% i,   L10 # name
 % int, boolean # type
 % 1,   5 # length
 [ NULL,        NULL    ]
@@ -130,8 +130,8 @@ stdout of test 'any` in directory 'sql/t
 [ 2,   true    ]
 [ 3,   true    ]
 #SELECT i, i = ANY(SELECT i1.i FROM integers i1, integers i2, integers i3, 
integers i4, integers i5, integers i6 WHERE i1.i IS NOT NULL AND i1.i <> 2) 
FROM integers ORDER BY i;
-% .integers,   .L11 # table_name
-% i,   L11 # name
+% .integers,   .L10 # table_name
+% i,   L10 # name
 % int, boolean # type
 % 1,   5 # length
 [ NULL,        NULL    ]
@@ -139,8 +139,8 @@ stdout of test 'any` in directory 'sql/t
 [ 2,   false   ]
 [ 3,   true    ]
 #SELECT i, i >= ANY(SELECT i1.i FROM integers i1, integers i2, integers i3, 
integers i4, integers i5, integers i6 WHERE i1.i IS NOT NULL) FROM integers 
ORDER BY i;
-% sys.integers,        sys.L10 # table_name
-% i,   L10 # name
+% sys.integers,        sys.L4 # table_name
+% i,   L4 # name
 % int, boolean # type
 % 1,   5 # length
 [ NULL,        NULL    ]
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to