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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list