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

Reply via email to