Changeset: eb88cc169cc6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/eb88cc169cc6
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/common/sql_types.c
        sql/server/rel_exp.c
        sql/server/rel_unnest.c
        sql/test/BugTracker-2023/Tests/All
Branch: default
Log Message:

Merge 'interval-day-second' into 'default'


diffs (125 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -1518,8 +1518,13 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                }
                if (!l)
                        return NULL;
-               s = stmt_convert(be, l, (!push&&l->nrcols==0)?NULL:sel, from, 
to);
-       }       break;
+               if (from->type->eclass == EC_SEC && to->type->eclass == EC_SEC) 
{
+                       // trivial conversion because EC_SEC is always in 
milliseconds
+                       s = l;
+               } else {
+                       s = stmt_convert(be, l, (!push&&l->nrcols==0)?NULL:sel, 
from, to);
+               }
+       }       break;
        case e_func: {
                node *en;
                list *l = sa_list(sql->sa), *exps = e->l;
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
@@ -421,22 +421,29 @@ subtype_cmp(sql_subtype *t1, sql_subtype
 {
        if (!t1->type || !t2->type)
                return -1;
+       if (t1->type->eclass != t2->type->eclass)
+               return -1;
+       switch (t1->type->eclass) {
+               case EC_SEC:
+               case EC_MONTH:
+                       if (t1->digits != t2->digits)
+                               return -1;
+                       return 0;
+               case EC_NUM:
+                       break;
+               case EC_FLT:
+                       if (t1->digits != t2->digits)
+                               return -1;
+                       break;
+               default:
+                       if (t1->digits != t2->digits)
+                               return -1;
+                       if (t1->scale != t2->scale)
+                               return -1;
+                       break;
+       }
 
-       if (t1->type->eclass == t2->type->eclass && t1->type->eclass == EC_SEC)
-               return 0;
-       if (t1->type->eclass == t2->type->eclass && t1->type->eclass == 
EC_MONTH)
-               return 0;
-       if ( !(t1->type->eclass == t2->type->eclass &&
-             (EC_INTERVAL(t1->type->eclass) || t1->type->eclass == EC_NUM)) &&
-             (t1->digits != t2->digits ||
-             (!(t1->type->eclass == t2->type->eclass &&
-              t1->type->eclass == EC_FLT) &&
-              t1->scale != t2->scale)) )
-               return -1;
-
-       /* subtypes are only equal iff
-          they map onto the same systemtype */
-       return (type_cmp(t1->type, t2->type));
+       return type_cmp(t1->type, t2->type);
 }
 
 int
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -2964,7 +2964,7 @@ exp_scale_algebra(mvc *sql, sql_subfunc 
        sql_subtype *lt = exp_subtype(l);
        sql_subtype *rt = exp_subtype(r);
 
-       if (lt->type->scale == SCALE_FIX && (lt->scale || rt->scale) &&
+       if (!EC_INTERVAL(lt->type->eclass) && lt->type->scale == SCALE_FIX && 
(lt->scale || rt->scale) &&
                strcmp(sql_func_imp(f->func), "/") == 0) {
                sql_subtype *res = f->res->h->data;
                unsigned int scale, digits, digL, scaleL;
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
@@ -2133,17 +2133,7 @@ exp_physical_types(visitor *v, sql_rel *
        if (!e || (e->type != e_func && e->type != e_convert) || !e->l)
                return e;
 
-       if (e->type == e_convert) {
-               sql_subtype *ft = exp_fromtype(e);
-               sql_subtype *tt = exp_totype(e);
-
-               /* complex conversion matrix */
-               if (ft->type->eclass == EC_SEC && tt->type->eclass == EC_SEC && 
ft->type->digits > tt->type->digits) {
-                       /* no conversion needed, just time adjustment */
-                       ne = e->l;
-                       ne->tpe = *tt; // ugh
-               }
-       } else {
+       if (e->type != e_convert) {
                list *args = e->l;
                sql_subfunc *f = e->f;
 
diff --git a/sql/test/BugTracker-2023/Tests/All 
b/sql/test/BugTracker-2023/Tests/All
--- a/sql/test/BugTracker-2023/Tests/All
+++ b/sql/test/BugTracker-2023/Tests/All
@@ -25,3 +25,4 @@ orderby-debug-crash-7416
 newurl-issue-7417
 rel_order_by-assertion-7418
 HAVE_LIBPY3?aggregate-vararg.Bug-7422
+interval-day-and-second.Bug-7353
diff --git 
a/sql/test/BugTracker-2023/Tests/interval-day-and-second.Bug-7353.test 
b/sql/test/BugTracker-2023/Tests/interval-day-and-second.Bug-7353.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2023/Tests/interval-day-and-second.Bug-7353.test
@@ -0,0 +1,11 @@
+query TTI nosort
+SELECT
+    CAST(CAST(value AS TEXT) AS INTERVAL HOUR)    AS hours_col,
+    CAST(CAST(value AS TEXT) AS INTERVAL SECOND)  AS seconds_col,
+    42 AS fortytwo
+FROM sys.generate_series(1, 2);
+----
+1:00:00
+0:00:01
+42
+
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to