Changeset: 627b01610456 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=627b01610456
Modified Files:
        sql/server/rel_select.c
        sql/test/miscellaneous/Tests/simple_selects.sql
        sql/test/miscellaneous/Tests/simple_selects.stable.out
Branch: Oct2020
Log Message:

My early solution was not completly right. Compute the supertype instead


diffs (70 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
@@ -449,7 +449,7 @@ static list *
 check_arguments_and_find_largest_any_type(mvc *sql, sql_rel *rel, list *exps, 
sql_subfunc *sf, int maybe_zero_or_one)
 {
        list *nexps = new_exp_list(sql->sa);
-       sql_subtype *atp = NULL;
+       sql_subtype *atp = NULL, super;
 
        /* find largest any type argument */
        for (node *n = exps->h, *m = sf->func->ops->h; n && m; n = n->next, m = 
m->next) {
@@ -457,10 +457,17 @@ check_arguments_and_find_largest_any_typ
                sql_exp *e = n->data;
                sql_subtype *t = exp_subtype(e);
 
-               if (a->type.type->eclass == EC_ANY && t &&
-                       (!atp || (t->type->localtype > atp->type->localtype || 
(t->type->localtype == atp->type->localtype && t->digits > atp->digits))))
-                       atp = t;
-       }
+               if (a->type.type->eclass == EC_ANY) {
+                       if (t && atp) {
+                               result_datatype(&super, t, atp);
+                               atp = &super;
+                       } else if (t) {
+                               atp = t;
+                       }
+               }
+       }
+       if (atp && atp->type->localtype == TYPE_void) /* NULL */
+               atp = sql_bind_localtype("str");
        for (node *n = exps->h, *m = sf->func->ops->h; n && m; n = n->next, m = 
m->next) {
                sql_arg *a = m->data;
                sql_exp *e = n->data;
diff --git a/sql/test/miscellaneous/Tests/simple_selects.sql 
b/sql/test/miscellaneous/Tests/simple_selects.sql
--- a/sql/test/miscellaneous/Tests/simple_selects.sql
+++ b/sql/test/miscellaneous/Tests/simple_selects.sql
@@ -234,8 +234,8 @@ select 1, null except select 1, null;
 select 1, null intersect select 1, null;
        -- 1 NULL
 
-select ifthenelse(false, 'abc', 'abcd');
-       -- abcd
+select ifthenelse(false, 'abc', 'abcd'), ifthenelse(false, 1.23, 12.3);
+       -- abcd 12.30
 
 start transaction;
 create or replace function ups() returns int begin if null > 1 then return 1; 
else return 2; end if; end;
diff --git a/sql/test/miscellaneous/Tests/simple_selects.stable.out 
b/sql/test/miscellaneous/Tests/simple_selects.stable.out
--- a/sql/test/miscellaneous/Tests/simple_selects.stable.out
+++ b/sql/test/miscellaneous/Tests/simple_selects.stable.out
@@ -441,12 +441,12 @@ project (
 % tinyint,     char # type
 % 1,   0 # length
 [ 1,   NULL    ]
-#select ifthenelse(false, 'abc', 'abcd');
-% .%2 # table_name
-% %2 # name
-% char # type
-% 4 # length
-[ "abcd"       ]
+#select ifthenelse(false, 'abc', 'abcd'), ifthenelse(false, 1.23, 12.3);
+% .%2, .%3 # table_name
+% %2,  %3 # name
+% char,        decimal # type
+% 4,   40 # length
+[ "abcd",      12.30   ]
 #start transaction;
 #create or replace function ups() returns int begin if null > 1 then return 1; 
else return 2; end if; end;
 #select ups();
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to