Changeset: 9c38920fe185 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/9c38920fe185
Branch: default
Log Message:
merged
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 -- [email protected]
To unsubscribe send an email to [email protected]