Changeset: 59e2338cf95b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=59e2338cf95b
Modified Files:
        sql/server/rel_exp.c
        sql/server/rel_select.c
        
sql/test/BugTracker-2012/Tests/case_evaluated_too_early.Bug-3186.stable.out
Branch: default
Log Message:

More programming, less hacking. Set output function type just where is needed, 
ie when all input types are ANY


diffs (89 lines):

diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -322,7 +322,6 @@ exp_convert(sql_allocator *sa, sql_exp *
 sql_exp *
 exp_op( sql_allocator *sa, list *l, sql_subfunc *f )
 {
-       sql_subtype *fres;
        sql_exp *e = exp_create(sa, e_func);
        if (e == NULL)
                return NULL;
@@ -330,13 +329,6 @@ exp_op( sql_allocator *sa, list *l, sql_
        e->l = l;
        e->f = f;
        e->semantics = f->func->semantics;
-
-       fres = exp_subtype(e);
-        /* corner case if the output of the function is void, set the type to 
one of the inputs */
-       if (!f->func->varres && list_length(l) > 0 && list_length(f->func->res) 
== 1 && fres && !subtype_cmp(fres, sql_bind_localtype("void"))) {
-               sql_subtype *t = exp_subtype(l->t->data);
-               f->res->h->data = sql_create_subtype(sa, t->type, t->digits, 
t->scale);
-       }
        return e;
 }
 
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
@@ -2931,18 +2931,24 @@ rel_binop_(mvc *sql, sql_rel *rel, sql_e
                if (t1->type->eclass == EC_ANY || t2->type->eclass == EC_ANY) {
                        sql_exp *ol = l;
                        sql_exp *or = r;
+                       sql_subtype *s = sql_bind_localtype("str");
 
                        if (t1->type->eclass == EC_ANY && t2->type->eclass == 
EC_ANY) {
-                               sql_subtype *s = sql_bind_localtype("str");
                                l = exp_check_type(sql, s, rel, l, type_equal);
                                r = exp_check_type(sql, s, rel, r, type_equal);
                        } else if (t1->type->eclass == EC_ANY) {
-                               l = exp_check_type(sql, t2, rel, l, type_equal);
+                               s = t2;
+                               l = exp_check_type(sql, s, rel, l, type_equal);
                        } else {
-                               r = exp_check_type(sql, t1, rel, r, type_equal);
+                               s = t1;
+                               r = exp_check_type(sql, s, rel, r, type_equal);
                        }
-                       if (l && r)
-                               return exp_binop(sql->sa, l, r, f);
+                       if (l && r) {
+                               res = exp_binop(sql->sa, l, r, f);
+                               /* needs the hack */
+                               ((sql_subfunc*)res->f)->res->h->data = 
sql_create_subtype(sql->sa, s->type, s->digits, s->scale);
+                               return res;
+                       }
 
                        /* reset error */
                        sql->session->status = 0;
@@ -3749,6 +3755,7 @@ rel_complex_case(sql_query *query, sql_r
        exp_kind ek = {type_value, card_column, FALSE};
        list *args = sa_list(query->sql->sa);
        sql_subtype *restype = NULL, rtype;
+       sql_exp *res;
 
        /* generate nested func calls */
        for(dnode *dn = case_args->h; dn; dn = dn->next) {
@@ -3779,7 +3786,9 @@ rel_complex_case(sql_query *query, sql_r
        }
        list *types = append(append(sa_list(query->sql->sa), restype), restype);
        sql_subfunc *fnc = find_func(query->sql, NULL, func, 
list_length(types), F_FUNC, NULL);
-       return exp_op(query->sql->sa, nargs, fnc);
+       res = exp_op(query->sql->sa, nargs, fnc);
+       ((sql_subfunc*)res->f)->res->h->data = 
sql_create_subtype(query->sql->sa, restype->type, restype->digits, 
restype->scale);
+       return res;
 }
 
 static sql_exp *
diff --git 
a/sql/test/BugTracker-2012/Tests/case_evaluated_too_early.Bug-3186.stable.out 
b/sql/test/BugTracker-2012/Tests/case_evaluated_too_early.Bug-3186.stable.out
--- 
a/sql/test/BugTracker-2012/Tests/case_evaluated_too_early.Bug-3186.stable.out
+++ 
b/sql/test/BugTracker-2012/Tests/case_evaluated_too_early.Bug-3186.stable.out
@@ -33,7 +33,7 @@ stdout of test 'case_evaluated_too_early
 % .%3 # table_name
 % %3 # name
 % decimal # type
-% 3 # length
+% 4 # length
 [ -10  ]
 
 # 17:10:20 >  
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to