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