Changeset: 7ed376826c20 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7ed376826c20 Modified Files: sql/server/rel_unnest.c sql/test/BugTracker-2020/Tests/interval-math.Bug-6935.sql sql/test/BugTracker-2020/Tests/interval-math.Bug-6935.stable.out Branch: typing Log Message:
Allow multiplication between month intervals and decimals by scaling down the decimal, ie rounding to the nearest integer diffs (118 lines): diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c --- a/sql/server/rel_unnest.c +++ b/sql/server/rel_unnest.c @@ -1760,26 +1760,39 @@ exp_physical_types(visitor *v, sql_rel * sql_exp *le = args->h->data; sql_subtype *lt = exp_subtype(le); - if (lt->type->eclass == EC_SEC) { + if (lt->type->eclass == EC_SEC || lt->type->eclass == EC_MONTH) { sql_exp *re = args->h->next->data; sql_subtype *rt = exp_subtype(re); if (rt->type->eclass == EC_DEC && rt->scale) { int scale = rt->scale; /* shift with scale */ - sql_subtype *it = sql_bind_localtype(lt->type->base.name); - sql_subfunc *c = sql_bind_func(v->sql->sa, v->sql->session->schema, "scale_up", lt, it, F_FUNC); - - if (!c) { - TRC_CRITICAL(SQL_PARSER, "scale_up missing (%s)\n", lt->type->base.name); - return NULL; - } #ifdef HAVE_HGE hge val = scale2value(scale); #else lng val = scale2value(scale); #endif - atom *a = atom_int(v->sql->sa, it, val); - ne = exp_binop(v->sql->sa, e, exp_atom(v->sql->sa, a), c); + + if (lt->type->eclass == EC_SEC) { + sql_subtype *it = sql_bind_localtype(lt->type->base.name); + sql_subfunc *c = sql_bind_func(v->sql->sa, v->sql->session->schema, "scale_up", lt, it, F_FUNC); + + if (!c) { + TRC_CRITICAL(SQL_PARSER, "scale_up missing (%s)\n", lt->type->base.name); + return NULL; + } + atom *a = atom_int(v->sql->sa, it, val); + ne = exp_binop(v->sql->sa, e, exp_atom(v->sql->sa, a), c); + } else { /* EC_MONTH */ + sql_subtype *it = sql_bind_localtype(rt->type->base.name); + sql_subfunc *c = sql_bind_func(v->sql->sa, v->sql->session->schema, "scale_down", rt, it, F_FUNC); + + if (!c) { + TRC_CRITICAL(SQL_PARSER, "scale_down missing (%s)\n", lt->type->base.name); + return NULL; + } + atom *a = atom_int(v->sql->sa, it, val); + args->h->next->data = exp_binop(v->sql->sa, args->h->next->data, exp_atom(v->sql->sa, a), c); + } } } } diff --git a/sql/test/BugTracker-2020/Tests/interval-math.Bug-6935.sql b/sql/test/BugTracker-2020/Tests/interval-math.Bug-6935.sql --- a/sql/test/BugTracker-2020/Tests/interval-math.Bug-6935.sql +++ b/sql/test/BugTracker-2020/Tests/interval-math.Bug-6935.sql @@ -3,9 +3,12 @@ SELECT INTERVAL '1' HOUR / 2.0; -- 1800. SELECT INTERVAL '1' HOUR * 1000.0 / 2000.0; --1800.000 SELECT INTERVAL '1' HOUR * 1000 / 1800000; -- 2.000 SELECT INTERVAL '1' HOUR * CAST(1000 AS DOUBLE); --cannot multiply interval with floating-point +SELECT INTERVAL '4' MONTH * 2.03; -- 8 SELECT INTERVAL '1' MONTH * 1.2; -- 1 SELECT INTERVAL '1' MONTH / 2.0; -- 0 +SELECT INTERVAL '1' MONTH / 1.5; -- 0 SELECT INTERVAL '1' MONTH / 1.0; -- 1 SELECT INTERVAL '1' SECOND * 1.2; --1.200 +SELECT INTERVAL '2' MONTH / -1.4; -- 2 SELECT INTERVAL '1' HOUR / INTERVAL '1800' SECOND; --error on typing branch, cannot divide intervals select mya + interval '2' second from (select interval '3' second * 1.2) as mya(mya); -- 5.600 diff --git a/sql/test/BugTracker-2020/Tests/interval-math.Bug-6935.stable.out b/sql/test/BugTracker-2020/Tests/interval-math.Bug-6935.stable.out --- a/sql/test/BugTracker-2020/Tests/interval-math.Bug-6935.stable.out +++ b/sql/test/BugTracker-2020/Tests/interval-math.Bug-6935.stable.out @@ -29,7 +29,31 @@ stdout of test 'interval-math.Bug-6935` % sec_interval # type % 5 # length [ 2.000 ] -#SELECT INTERVAL '1' MONTH * 1.2; +#SELECT INTERVAL '4' MONTH * 2.03; -- 8 +% .%2 # table_name +% %2 # name +% month_interval # type +% 1 # length +[ 8 ] +#SELECT INTERVAL '1' MONTH * 1.2; -- 1 +% .%2 # table_name +% %2 # name +% month_interval # type +% 1 # length +[ 1 ] +#SELECT INTERVAL '1' MONTH / 2.0; -- 0 +% .%2 # table_name +% %2 # name +% month_interval # type +% 1 # length +[ 0 ] +#SELECT INTERVAL '1' MONTH / 1.5; -- 0 +% .%2 # table_name +% %2 # name +% month_interval # type +% 1 # length +[ 0 ] +#SELECT INTERVAL '1' MONTH / 1.0; -- 1 % .%2 # table_name % %2 # name % month_interval # type @@ -41,6 +65,12 @@ stdout of test 'interval-math.Bug-6935` % sec_interval # type % 5 # length [ 1.200 ] +#SELECT INTERVAL '2' MONTH / -1.4; -- 2 +% .%2 # table_name +% %2 # name +% month_interval # type +% 2 # length +[ -2 ] #select mya + interval '2' second from (select interval '3' second * 1.2) as mya(mya); -- 5.600 % .%2 # table_name % %2 # name _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list