Changeset: 658511d22ab3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/658511d22ab3
Modified Files:
        sql/server/rel_select.c
        sql/server/rel_unnest.c
Branch: default
Log Message:

make sure we set the type of 'NULL' when its later used in a e_convert.


diffs (124 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
@@ -3494,10 +3494,19 @@ static sql_exp *
                                else
                                        groupby = subquery = gl;
                        }
-                       if (!exp_subtype(e)) { /* we also do not expect 
parameters here */
+                       sql_subtype *t = exp_subtype(e);
+                       if (!t) { /* we also do not expect parameters here */
                                char *uaname = SA_NEW_ARRAY(sql->ta, char, 
strlen(aname) + 1);
                                return sql_error(sql, 02, SQLSTATE(42000) "%s: 
parameters not allowed as arguments to aggregate functions", 
toUpperCopy(uaname, aname));
                        }
+                       if (!t->type->localtype) {
+                               if (e->type == e_atom && !e->f) {
+                                       t = sql_bind_localtype("bte");
+                                       e->tpe = *t;
+                                       if (e->l)
+                                               e->l = atom_set_type(sql->sa, 
e->l, t);
+                               }
+                       }
 
                        all_aggr &= (exp_card(e) <= CARD_AGGR && 
!exp_is_atom(e) && is_aggr(e->type) && !is_func(e->type) && (!groupby || 
!is_groupby(groupby->op) || !groupby->r || !exps_find_exp(groupby->r, e)));
                        exp_only_freevar(query, e, &arguments_correlated, 
&found_one_freevar, &ungrouped_cols);
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -2284,6 +2284,89 @@ exp_reset_card_and_freevar_set_physical_
        return e;
 }
 
+static sql_exp *
+exp_set_type(sql_allocator *sa, sql_exp *te, sql_exp *e)
+{
+       if (te->type == e_convert) {
+               if (e->type == e_column)  {
+                               return exp_convert(sa, e, exp_subtype(e), 
exp_subtype(te));
+               } else {
+                       e->tpe = *exp_subtype(te);
+                       if (e->l)
+                               e->l = atom_set_type(sa, e->l, &e->tpe);
+               }
+       }
+       return e;
+}
+
+static sql_rel *
+rel_set_type(visitor *v, sql_rel *rel)
+{
+       if (is_project(rel->op) && rel->l) {
+               if (is_set(rel->op)) {
+                       sql_rel *l = rel->l, *r = rel->r;
+                       list *exps = l->exps;
+                       while(exps) {
+                               for(node *n = exps->h, *m = rel->exps->h; n && 
m; n = n->next, m = m->next) {
+                                       sql_exp *e = n->data;
+                                       sql_subtype *t = exp_subtype(e);
+
+                                       if (t && !t->type->localtype)
+                                               n->data = 
exp_set_type(v->sql->sa, m->data, e);
+                               }
+                               if (exps != r->exps)
+                                       exps = r->exps;
+                               else
+                                       exps = NULL;
+                       }
+               } else if ((is_simple_project(rel->op) || is_groupby(rel->op)) 
&& rel->l) {
+                       list *exps = rel->exps;
+                       while(exps) {
+                               for(node *n = exps->h; n; n = n->next) {
+                                       sql_exp *te = n->data;
+                                       if (te->type == e_convert) {
+                                               sql_exp *l = te->l;
+                                               if (l->type == e_column) {
+                                                       sql_exp *e = 
rel_find_exp(rel->l, l);
+                                                       sql_subtype *t = 
exp_subtype(e);
+
+                                                       if (t && 
!t->type->localtype) {
+                                                               if (e && 
e->type == e_column) {
+                                                                       sql_rel 
*l = rel->l;
+                                                                       if 
(is_project(l->op)) {
+                                                                               
for(node *n = l->exps->h; n; n = n->next) {
+                                                                               
        if (n->data == e) {
+                                                                               
                n->data = exp_convert(v->sql->sa, e, t, exp_subtype(te));
+                                                                               
                break;
+                                                                               
        }
+                                                                               
}
+                                                                       }
+                                                               } else {
+                                                                       e->tpe 
= *exp_subtype(te);
+                                                                       if 
(e->l)
+                                                                               
e->l = atom_set_type(v->sql->sa, e->l, &e->tpe);
+                                                               }
+                                                       }
+                                               }
+                                       } else if (te->type == e_atom && 
!te->f) {
+                                               sql_subtype *t = 
exp_subtype(te);
+                                               if (t && !t->type->localtype) {
+                                                       te->tpe = 
*sql_bind_localtype("bte");
+                                                       if (te->l)
+                                                               te->l = 
atom_set_type(v->sql->sa, te->l, &te->tpe);
+                                               }
+                                       }
+                               }
+                               if (is_groupby(rel->op) && exps != rel->r)
+                                       exps = rel->r;
+                               else
+                                       exps = NULL;
+                       }
+               }
+       }
+       return rel;
+}
+
 static list*
 aggrs_split_args(mvc *sql, list *aggrs, list *exps, int is_groupby_list)
 {
@@ -4157,5 +4240,6 @@ rel_unnest(mvc *sql, sql_rel *rel)
        rel = rel_visitor_bottomup(&v, rel, &rewrite_fix_count);        /* fix 
count inside a left join (adds a project (if (cnt IS null) then (0) else (cnt)) 
*/
        rel = rel_visitor_bottomup(&v, rel, &rel_unnest_projects);
        rel = rel_exp_visitor_bottomup(&v, rel, 
&exp_reset_card_and_freevar_set_physical_type, false);
+       rel = rel_visitor_topdown(&v, rel, &rel_set_type);
        return rel;
 }
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to