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