Changeset: befeaffcf1f2 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=befeaffcf1f2 Modified Files: sql/server/rel_select.c sql/server/rel_unnest.c sql/test/miscellaneous/Tests/groupby_error.stable.out sql/test/subquery/Tests/subquery3.sql sql/test/subquery/Tests/subquery3.stable.err sql/test/subquery/Tests/subquery3.stable.out Branch: default Log Message:
Merge with linear-hashing diffs (173 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 @@ -680,6 +680,61 @@ rel_op_(mvc *sql, sql_schema *s, char *f } } +static sql_exp* +exp_values_set_supertype(mvc *sql, sql_exp *values) +{ + list *vals = values->f, *nexps; + sql_subtype *tpe = exp_subtype(vals->h->data); + + if (tpe) + values->tpe = *tpe; + + for (node *m = vals->h; m; m = m->next) { + sql_exp *e = m->data; + sql_subtype super, *ttpe; + + /* if the expression is a parameter set its type */ + if (tpe && e->type == e_atom && !e->l && !e->r && !e->f && !e->tpe.type) { + if (set_type_param(sql, tpe, e->flag) == 0) + e->tpe = *tpe; + else + return NULL; + } + ttpe = exp_subtype(e); + if (tpe && ttpe) { + supertype(&super, tpe, ttpe); + values->tpe = super; + tpe = &values->tpe; + } else { + tpe = ttpe; + } + } + + if (tpe) { + /* if the expression is a parameter set its type */ + for (node *m = vals->h; m; m = m->next) { + sql_exp *e = m->data; + if (e->type == e_atom && !e->l && !e->r && !e->f && !e->tpe.type) { + if (set_type_param(sql, tpe, e->flag) == 0) + e->tpe = *tpe; + else + return NULL; + } + } + values->tpe = *tpe; + nexps = sa_list(sql->sa); + for (node *m = vals->h; m; m = m->next) { + sql_exp *e = m->data; + e = rel_check_type(sql, &values->tpe, NULL, e, type_equal); + if (!e) + return NULL; + append(nexps, e); + } + values->f = nexps; + } + return values; +} + static sql_rel * rel_values(sql_query *query, symbol *tableref) { @@ -723,59 +778,9 @@ rel_values(sql_query *query, symbol *tab } } /* loop to check types */ - for (m = exps->h; m; m = m->next) { - node *n; - sql_exp *vals = m->data; - list *vals_list = vals->f; - list *nexps = sa_list(sql->sa); - sql_subtype *tpe = exp_subtype(vals_list->h->data); - - if (tpe) - vals->tpe = *tpe; - - /* first get super type */ - for (n = vals_list->h; n; n = n->next) { - sql_exp *e = n->data; - sql_subtype super, *ttpe; - - /* if the expression is a parameter set its type */ - if (tpe && e->type == e_atom && !e->l && !e->r && !e->f && !e->tpe.type) { - if (set_type_param(sql, tpe, e->flag) == 0) - e->tpe = *tpe; - else - return NULL; - } - ttpe = exp_subtype(e); - if (tpe && ttpe) { - supertype(&super, tpe, ttpe); - vals->tpe = super; - tpe = &vals->tpe; - } else { - tpe = ttpe; - } - } - if (!tpe) - continue; - /* if the expression is a parameter set its type */ - for (n = vals_list->h; n; n = n->next) { - sql_exp *e = n->data; - if (e->type == e_atom && !e->l && !e->r && !e->f && !e->tpe.type) { - if (set_type_param(sql, tpe, e->flag) == 0) - e->tpe = *tpe; - else - return NULL; - } - } - vals->tpe = *tpe; - for (n = vals_list->h; n; n = n->next) { - sql_exp *e = n->data; - e = rel_check_type(sql, &vals->tpe, NULL, e, type_equal); - if (!e) - return NULL; - append(nexps, e); - } - vals->f = nexps; - } + for (m = exps->h; m; m = m->next) + m->data = exp_values_set_supertype(sql, (sql_exp*) m->data); + r = rel_project(sql->sa, NULL, exps); r->nrcols = list_length(exps); r->card = dlist_length(rowlist) == 1 ? CARD_ATOM : CARD_MULTI; @@ -1965,7 +1970,7 @@ rel_in_value_exp(sql_query *query, sql_r symbol *lo = NULL; dnode *n = dl->h->next, *dn = NULL; sql_exp *le = NULL, *re, *e = NULL; - list *vals = NULL, *ll = sa_list(sql->sa); + list *ll = sa_list(sql->sa); int is_tuple = 0; /* complex case */ @@ -1992,7 +1997,9 @@ rel_in_value_exp(sql_query *query, sql_r } /* list of values or subqueries */ if (n->type == type_list) { - vals = sa_list(sql->sa); + sql_exp *values; + list *vals = sa_list(sql->sa); + n = dl->h->next; n = n->data.lval->h; @@ -2006,7 +2013,11 @@ rel_in_value_exp(sql_query *query, sql_r re = exp_rel_label(sql, re); append(vals, re); } - e = exp_in_func(sql, le, exp_values(sql->sa, vals), (sc->token == SQL_IN), is_tuple); + + values = exp_values(sql->sa, vals); + if (!is_tuple) /* if it's not a tuple, enforce coersion on the type for every element on the list */ + values = exp_values_set_supertype(sql, values); + e = exp_in_func(sql, le, values, (sc->token == SQL_IN), is_tuple); } if (e && le) e->card = le->card; diff --git a/sql/test/miscellaneous/Tests/groupby_error.stable.out b/sql/test/miscellaneous/Tests/groupby_error.stable.out --- a/sql/test/miscellaneous/Tests/groupby_error.stable.out +++ b/sql/test/miscellaneous/Tests/groupby_error.stable.out @@ -77,7 +77,7 @@ stdout of test 'groupby_error` in direct % bigint # type % 1 # length #SELECT DISTINCT + 40 / + + col0 AS col2 FROM tab0 GROUP BY col0, col0, col2 HAVING NOT ( NOT + - 80 BETWEEN NULL AND + - 73 ) OR NOT ( + col0 >= - COUNT ( * ) + - COUNT ( DISTINCT - col0 ) ); -% .L1 # table_name +% . # table_name % col2 # name % int # type % 1 # length _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list