Changeset: 080514d702c9 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/080514d702c9 Modified Files: sql/common/sql_types.c sql/server/rel_dump.c sql/server/rel_select.c sql/server/sql_semantic.c sql/test/SQLancer/Tests/sqlancer03.test sql/test/mergetables/Tests/mergequery.test sql/test/prepare/Tests/sqlancer_prepare.stable.out sql/test/prepare/Tests/sqlancer_prepare.stable.out.int128 Branch: default Log Message:
Fixes for digit and scale propagation for unary functions. Some string function functions must have the output of the same type as the input diffs (165 lines): diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c --- a/sql/common/sql_types.c +++ b/sql/common/sql_types.c @@ -1436,16 +1436,16 @@ sqltypeinit( sql_allocator *sa) sql_create_func(sa, "length", "str", "length", FALSE, FALSE, SCALE_NONE, 0, INT, 1, *t); sql_create_func(sa, "right", "str", "stringright", FALSE, FALSE, SCALE_NONE, 0, *t, 2, *t, INT); sql_create_func(sa, "left", "str", "stringleft", FALSE, FALSE, SCALE_NONE, 0, *t, 2, *t, INT); - sql_create_func(sa, "upper", "str", "toUpper", FALSE, FALSE, SCALE_NONE, 0, *t, 1, *t); - sql_create_func(sa, "ucase", "str", "toUpper", FALSE, FALSE, SCALE_NONE, 0, *t, 1, *t); - sql_create_func(sa, "lower", "str", "toLower", FALSE, FALSE, SCALE_NONE, 0, *t, 1, *t); - sql_create_func(sa, "lcase", "str", "toLower", FALSE, FALSE, SCALE_NONE, 0, *t, 1, *t); - sql_create_func(sa, "trim", "str", "trim", FALSE, FALSE, SCALE_NONE, 0, *t, 1, *t); - sql_create_func(sa, "trim", "str", "trim2", FALSE, FALSE, SCALE_NONE, 0, *t, 2, *t, *t); - sql_create_func(sa, "ltrim", "str", "ltrim", FALSE, FALSE, SCALE_NONE, 0, *t, 1, *t); - sql_create_func(sa, "ltrim", "str", "ltrim2", FALSE, FALSE, SCALE_NONE, 0, *t, 2, *t, *t); - sql_create_func(sa, "rtrim", "str", "rtrim", FALSE, FALSE, SCALE_NONE, 0, *t, 1, *t); - sql_create_func(sa, "rtrim", "str", "rtrim2", FALSE, FALSE, SCALE_NONE, 0, *t, 2, *t, *t); + sql_create_func(sa, "upper", "str", "toUpper", FALSE, FALSE, INOUT, 0, *t, 1, *t); + sql_create_func(sa, "ucase", "str", "toUpper", FALSE, FALSE, INOUT, 0, *t, 1, *t); + sql_create_func(sa, "lower", "str", "toLower", FALSE, FALSE, INOUT, 0, *t, 1, *t); + sql_create_func(sa, "lcase", "str", "toLower", FALSE, FALSE, INOUT, 0, *t, 1, *t); + sql_create_func(sa, "trim", "str", "trim", FALSE, FALSE, INOUT, 0, *t, 1, *t); + sql_create_func(sa, "trim", "str", "trim2", FALSE, FALSE, INOUT, 0, *t, 2, *t, *t); + sql_create_func(sa, "ltrim", "str", "ltrim", FALSE, FALSE, INOUT, 0, *t, 1, *t); + sql_create_func(sa, "ltrim", "str", "ltrim2", FALSE, FALSE, INOUT, 0, *t, 2, *t, *t); + sql_create_func(sa, "rtrim", "str", "rtrim", FALSE, FALSE, INOUT, 0, *t, 1, *t); + sql_create_func(sa, "rtrim", "str", "rtrim2", FALSE, FALSE, INOUT, 0, *t, 2, *t, *t); sql_create_func(sa, "lpad", "str", "lpad", FALSE, FALSE, SCALE_NONE, 0, *t, 2, *t, INT); sql_create_func(sa, "lpad", "str", "lpad3", FALSE, FALSE, SCALE_NONE, 0, *t, 3, *t, INT, *t); diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c --- a/sql/server/rel_dump.c +++ b/sql/server/rel_dump.c @@ -1418,16 +1418,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re return function_error_string(sql, tname, cname, exps, true, F_FUNC); /* apply scale fixes if needed */ if (f && f->func->type != F_ANALYTIC) { - if (list_length(exps) == 1) { - if (f->func->fix_scale == INOUT) { - sql_subtype *t = exp_subtype(exps->h->data); - sql_subtype *res = f->res->h->data; - - res->digits = t->digits; - res->scale = t->scale; - } else if (!f->func->vararg && !(exps = check_arguments_and_find_largest_any_type(sql, lrel, exps, f, 0))) - return NULL; - } else if (list_length(exps) == 2) { + if (list_length(exps) == 2) { sql_exp *l = exps->h->data; sql_exp *r = exps->h->next->data; 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 @@ -2879,14 +2879,8 @@ rel_unop_(mvc *sql, sql_rel *rel, sql_ex } } if (f) { - if (check_card(card, f)) { - if (f->func->fix_scale == INOUT) { - sql_subtype *res = f->res->h->data; - res->digits = t->digits; - res->scale = t->scale; - } + if (check_card(card, f)) return exp_unop(sql->sa, e, f); - } found = false; /* reset found */ } return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42000) "SELECT: %s unary operator %s%s%s'%s'(%s)", diff --git a/sql/server/sql_semantic.c b/sql/server/sql_semantic.c --- a/sql/server/sql_semantic.c +++ b/sql/server/sql_semantic.c @@ -1143,8 +1143,8 @@ supertype(sql_subtype *super, sql_subtyp tpe = i->type->base.name; eclass = i->type->eclass; } - if (EC_VARCHAR(lsuper.type->eclass)) - scale = 0; /* strings don't have scale */ + if (!EC_SCALE(lsuper.type->eclass)) + scale = 0; /* reset scale for types without it */ if (!lsuper.type->localtype) { tpe = "smallint"; eclass = EC_NUM; diff --git a/sql/test/SQLancer/Tests/sqlancer03.test b/sql/test/SQLancer/Tests/sqlancer03.test --- a/sql/test/SQLancer/Tests/sqlancer03.test +++ b/sql/test/SQLancer/Tests/sqlancer03.test @@ -1060,7 +1060,7 @@ START TRANSACTION statement ok CREATE TABLE t0(c0 DATE, c1 DATE) -statement error 42000!types sec_interval(13,0) and date(2,1) are not equal +statement error 42000!types sec_interval(13,0) and date(0,0) are not equal SELECT ALL least(MIN(ALL CAST('0.3' AS TIME)), COALESCE (CAST("second"(TIMESTAMP '1970-01-19 08:50:25') AS TIME), CAST(TIME '13:00:42' AS TIME))), t0.c0 FROM t0 GROUP BY splitpart(CAST(CAST(COALESCE (CASE t0.c1 WHEN INTERVAL '5' SECOND THEN TIMESTAMP '1969-12-21 20:30:09' WHEN 0.5 THEN TIMESTAMP '1970-01-11 15:00:27' WHEN 0.9 THEN TIMESTAMP '1970-01-03 20:35:51' END, CASE -2 WHEN 0.2 THEN TIMESTAMP '1970-01-02 09:18:35' END, CAST(INTERVAL '3' SECOND AS TIMESTAMP), diff --git a/sql/test/mergetables/Tests/mergequery.test b/sql/test/mergetables/Tests/mergequery.test --- a/sql/test/mergetables/Tests/mergequery.test +++ b/sql/test/mergetables/Tests/mergequery.test @@ -110,7 +110,7 @@ PLAN SELECT * FROM complete where x = 0. project ( | select ( | | table("sys"."part1") [ "part1"."x" as "complete"."x", "part1"."y" as "complete"."y", "part1"."z" as "complete"."z" ] -| ) [ ("complete"."x") = (double(53,1) "0") ] +| ) [ ("complete"."x") = (double(53) "0") ] ) [ "complete"."x", "complete"."y", "complete"."z" ] query RRR rowsort @@ -129,7 +129,7 @@ PLAN SELECT * FROM complete where x = 3. project ( | select ( | | table("sys"."part2") [ "part2"."x" as "complete"."x", "part2"."y" as "complete"."y", "part2"."z" as "complete"."z" ] -| ) [ ("complete"."x") = (double(53,1) "3") ] +| ) [ ("complete"."x") = (double(53) "3") ] ) [ "complete"."x", "complete"."y", "complete"."z" ] query RRR rowsort diff --git a/sql/test/prepare/Tests/sqlancer_prepare.stable.out b/sql/test/prepare/Tests/sqlancer_prepare.stable.out --- a/sql/test/prepare/Tests/sqlancer_prepare.stable.out +++ b/sql/test/prepare/Tests/sqlancer_prepare.stable.out @@ -59,16 +59,16 @@ % .prepare, .prepare, .prepare, .prepare, .prepare, .prepare # table_name % type, digits, scale, schema, table, column # name % varchar, int, int, varchar, varchar, varchar # type -% 7, 1, 1, 0, 2, 2 # length -[ "double", 1, 0, "", "%2", "%2" ] +% 7, 2, 1, 0, 2, 2 # length +[ "double", 53, 0, "", "%2", "%2" ] [ "tinyint", 8, 0, NULL, NULL, NULL ] #PREPARE SELECT sql_max(+ (0.29353363282850464), round(- (sql_min('-Infinity', ?)), ?)) LIMIT 8535194086169274474; #PREPARE SELECT sql_max(+ (0.29353363282850464), round(- (sql_min('-Infinity', ?)), ?)) LIMIT 8535194086169274474; % .prepare, .prepare, .prepare, .prepare, .prepare, .prepare # table_name % type, digits, scale, schema, table, column # name % varchar, int, int, varchar, varchar, varchar # type -% 7, 2, 2, 0, 2, 2 # length -[ "double", 53, 17, "", "%2", "%2" ] +% 7, 2, 1, 0, 2, 2 # length +[ "double", 53, 0, "", "%2", "%2" ] [ "char", 9, 0, NULL, NULL, NULL ] [ "tinyint", 8, 0, NULL, NULL, NULL ] % .prepare, .prepare, .prepare, .prepare, .prepare, .prepare # table_name diff --git a/sql/test/prepare/Tests/sqlancer_prepare.stable.out.int128 b/sql/test/prepare/Tests/sqlancer_prepare.stable.out.int128 --- a/sql/test/prepare/Tests/sqlancer_prepare.stable.out.int128 +++ b/sql/test/prepare/Tests/sqlancer_prepare.stable.out.int128 @@ -59,16 +59,16 @@ % .prepare, .prepare, .prepare, .prepare, .prepare, .prepare # table_name % type, digits, scale, schema, table, column # name % varchar, int, int, varchar, varchar, varchar # type -% 7, 1, 1, 0, 2, 2 # length -[ "double", 1, 0, "", "%2", "%2" ] +% 7, 2, 1, 0, 2, 2 # length +[ "double", 53, 0, "", "%2", "%2" ] [ "tinyint", 8, 0, NULL, NULL, NULL ] #PREPARE SELECT sql_max(+ (0.29353363282850464), round(- (sql_min('-Infinity', ?)), ?)) LIMIT 8535194086169274474; #PREPARE SELECT sql_max(+ (0.29353363282850464), round(- (sql_min('-Infinity', ?)), ?)) LIMIT 8535194086169274474; % .prepare, .prepare, .prepare, .prepare, .prepare, .prepare # table_name % type, digits, scale, schema, table, column # name % varchar, int, int, varchar, varchar, varchar # type -% 7, 2, 2, 0, 2, 2 # length -[ "double", 53, 17, "", "%2", "%2" ] +% 7, 2, 1, 0, 2, 2 # length +[ "double", 53, 0, "", "%2", "%2" ] [ "char", 9, 0, NULL, NULL, NULL ] [ "tinyint", 8, 0, NULL, NULL, NULL ] % .prepare, .prepare, .prepare, .prepare, .prepare, .prepare # table_name _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org