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

Reply via email to