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