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 -- [email protected]
To unsubscribe send an email to [email protected]