Changeset: 01b4043119e6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=01b4043119e6
Modified Files:
sql/server/rel_select.c
sql/test/subquery/Tests/subquery.sql
sql/test/subquery/Tests/subquery.stable.err
sql/test/subquery/Tests/subquery.stable.out
sql/test/subquery/Tests/subquery3.stable.out
Branch: default
Log Message:
Merge with Nov2019
diffs (167 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
@@ -776,6 +776,7 @@ rel_values(sql_query *query, symbol *tab
}
r = rel_project(sql->sa, NULL, exps);
r->nrcols = list_length(exps);
+ r->card = dlist_length(rowlist) == 1 ? CARD_ATOM : CARD_MULTI;
return rel_table_optname(sql, r, optname);
}
@@ -3809,18 +3810,20 @@ static sql_exp *
rel_selection_ref(sql_query *query, sql_rel **rel, symbol *grp, dlist
*selection )
{
sql_allocator *sa = query->sql->sa;
- dnode *n;
- dlist *gl = grp->data.lval;
+ dlist *gl;
char *name = NULL;
exp_kind ek = {type_value, card_column, FALSE};
+ if (grp->token != SQL_COLUMN && grp->token != SQL_IDENT)
+ return NULL;
+ gl = grp->data.lval;
if (dlist_length(gl) > 1)
return NULL;
if (!selection)
return NULL;
name = gl->h->data.sval;
- for (n = selection->h; n; n = n->next) {
+ for (dnode *n = selection->h; n; n = n->next) {
/* we only look for columns */
tokens to = n->data.sym->token;
if (to == SQL_COLUMN || to == SQL_IDENT) {
@@ -4058,8 +4061,8 @@ rel_partition_groupings(sql_query *query
return NULL;
}
}
- if(e->type != e_column) { //store group by expressions in the
stack
- if(!stack_push_groupby_expression(sql, grp, e))
+ if (e->type != e_column) { //store group by expressions in the
stack
+ if (!stack_push_groupby_expression(sql, grp, e))
return NULL;
}
if (e->card > CARD_AGGR)
@@ -4878,21 +4881,25 @@ rel_value_exp2(sql_query *query, sql_rel
return rel_column_ref(query, rel, se, f );
case SQL_NAME:
return rel_var_ref(sql, se->data.sval, 1);
+ case SQL_VALUES:
case SQL_WITH:
case SQL_SELECT: {
sql_rel *r;
if (se->token == SQL_WITH) {
r = rel_with_query(query, se);
+ } else if (se->token == SQL_VALUES) {
+ r = rel_values(query, se);
} else {
+ assert(se->token == SQL_SELECT);
if (rel && *rel)
query_push_outer(query, *rel, f);
r = rel_subquery(query, NULL, se, ek);
if (rel && *rel)
*rel = query_pop_outer(query);
- if (!r)
- return NULL;
}
+ if (!r)
+ return NULL;
if (ek.card <= card_set && is_project(r->op) &&
list_length(r->exps) > 1)
return sql_error(sql, 02, SQLSTATE(42000) "SELECT:
subquery must return only one column");
if (list_length(r->exps) == 1) { /* for now don't rename multi
attribute results */
diff --git a/sql/test/subquery/Tests/subquery.sql
b/sql/test/subquery/Tests/subquery.sql
--- a/sql/test/subquery/Tests/subquery.sql
+++ b/sql/test/subquery/Tests/subquery.sql
@@ -81,6 +81,20 @@ SELECT SUM(SUM(i)) FROM integers; -- agg
SELECT i1.i FROM integers i1 WHERE i1.i >= (SELECT i1.i, i2.i FROM integers i2
WHERE i2.i > 1); --error, subquery must return a single column
+SELECT i1.i FROM integers i1 GROUP BY (SELECT SUM(i1.i) + i2.i FROM integers
i2); --error, cannot use non GROUP BY column 'i2.i' in query results without an
aggregate function
+
+SELECT i1.i FROM integers i1 GROUP BY (SELECT i2.i FROM integers i2); --error,
column "i1.i" must appear in the GROUP BY clause or be used in an aggregate
function
+
+SELECT 1 FROM integers i1 GROUP BY (VALUES(1), (2)); --error, more than one
row returned by a subquery used as an expression
+
+SELECT 1 FROM integers i1 GROUP BY (VALUES(1,2,3)); --error, subquery must
return only one column
+
+SELECT (VALUES(1));
+
+SELECT (VALUES(1),(2)); --error, cardinality violation, scalar value expected
+
+SELECT (VALUES(1,2,3)); --error, subquery must return only one column
+
drop TABLE integers;
-- varchar tests
diff --git a/sql/test/subquery/Tests/subquery.stable.err
b/sql/test/subquery/Tests/subquery.stable.err
--- a/sql/test/subquery/Tests/subquery.stable.err
+++ b/sql/test/subquery/Tests/subquery.stable.err
@@ -58,6 +58,30 @@ MAPI = (monetdb) /var/tmp/mtest-8966/.s
QUERY = SELECT i1.i FROM integers i1 WHERE i1.i >= (SELECT i1.i, i2.i FROM
integers i2 WHERE i2.i > 1); --error, subquery must return a single column
ERROR = !SELECT: subquery must return only one column
CODE = 42000
+MAPI = (monetdb) /var/tmp/mtest-338558/.s.monetdb.33733
+QUERY = SELECT i1.i FROM integers i1 GROUP BY (SELECT SUM(i1.i) + i2.i FROM
integers i2); --error, cannot use non GROUP BY column 'i2.i' in query results
without an aggregate function
+
+CODE = 42S22
+MAPI = (monetdb) /var/tmp/mtest-367512/.s.monetdb.35898
+QUERY = SELECT i1.i FROM integers i1 GROUP BY (SELECT i2.i FROM integers i2);
--error, column "i1.i" must appear in the GROUP BY clause or be used in an
aggregate function
+
+CODE = 42S22
+MAPI = (monetdb) /var/tmp/mtest-367512/.s.monetdb.35898
+QUERY = SELECT 1 FROM integers i1 GROUP BY (VALUES(1), (2)); --error, more
than one row returned by a subquery used as an expression
+ERROR = !Cardinality violation, scalar value expected
+CODE = 21000
+MAPI = (monetdb) /var/tmp/mtest-269616/.s.monetdb.32681
+QUERY = SELECT 1 FROM integers i1 GROUP BY (VALUES(1,2,3)); --error, subquery
must return only one column
+ERROR = !SELECT: subquery must return only one column
+CODE = 42000
+MAPI = (monetdb) /var/tmp/mtest-269616/.s.monetdb.32681
+QUERY = SELECT (VALUES(1),(2)); --error, cardinality violation, scalar value
expected
+ERROR = !Cardinality violation, scalar value expected
+CODE = 21000
+MAPI = (monetdb) /var/tmp/mtest-269215/.s.monetdb.36194
+QUERY = SELECT (VALUES(1,2,3)); --error, subquery must return only one column
+ERROR = !SELECT: subquery must return only one column
+CODE = 42000
# 17:27:37 >
# 17:27:37 > "Done."
diff --git a/sql/test/subquery/Tests/subquery.stable.out
b/sql/test/subquery/Tests/subquery.stable.out
--- a/sql/test/subquery/Tests/subquery.stable.out
+++ b/sql/test/subquery/Tests/subquery.stable.out
@@ -301,6 +301,12 @@ stdout of test 'subquery` in directory '
% bigint, tinyint # type
% 1, 2 # length
[ 6, 42 ]
+#SELECT (VALUES(1));
+% .%1 # table_name
+% %1 # name
+% tinyint # type
+% 1 # length
+[ 1 ]
#drop TABLE integers;
#CREATE TABLE strings(v VARCHAR(128));
#INSERT INTO strings VALUES ('hello'), ('world'), (NULL);
diff --git a/sql/test/subquery/Tests/subquery3.stable.out
b/sql/test/subquery/Tests/subquery3.stable.out
--- a/sql/test/subquery/Tests/subquery3.stable.out
+++ b/sql/test/subquery/Tests/subquery3.stable.out
@@ -335,6 +335,15 @@ stdout of test 'subquery3` in directory
% %4 # name
% int # type
% 1 # length
+#SELECT
+# 1
+#FROM integers i1
+#GROUP BY (VALUES(1));
+% . # table_name
+% single_value # name
+% tinyint # type
+% 1 # length
+[ 1 ]
#DROP TABLE tbl_ProductSales;
#DROP TABLE another_T;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list