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