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

Reply via email to