Changeset: ec29946a6608 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ec29946a6608
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/common/sql_types.c
        sql/server/rel_rel.h
        sql/server/rel_select.c
        sql/server/rel_select.h
        sql/test/BugTracker-2014/Tests/aggregates-intervals.Bug-3533.sql
        sql/test/BugTracker-2014/Tests/aggregates-intervals.Bug-3533.stable.err
        sql/test/BugTracker-2014/Tests/aggregates-intervals.Bug-3533.stable.out
        sql/test/emptydb-upgrade-chain-hge/Tests/package.py
        sql/test/emptydb-upgrade-chain/Tests/package.py
        sql/test/emptydb/Tests/package-hge.py
        sql/test/emptydb/Tests/package.py
        sql/test/testdb-upgrade-chain-hge/Tests/package.py
        sql/test/testdb-upgrade-chain/Tests/package.py
        sql/test/testdb/Tests/package-hge.py
        sql/test/testdb/Tests/package.py
        testing/Mtest.py.in
Branch: default
Log Message:

Merge with Nov2019


diffs (truncated from 559 to 300 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
@@ -1166,11 +1166,6 @@ check_types(backend *be, sql_subtype *ct
        int c = 0;
        sql_subtype *t = NULL, *st = NULL;
 
-       /*
-       if (ct->types) 
-               return check_table_types(sql, ct->types, s, tpe);
-               */
-
        st = tail_type(s);
        if ((!st || !st->type) && stmt_set_type_param(sql, ct, s) == 0) {
                return s;
@@ -1188,14 +1183,17 @@ check_types(backend *be, sql_subtype *ct
        }
 
        if (!t) {       /* try to convert if needed */
-               c = sql_type_convert(st->type->eclass, ct->type->eclass);
-               if (!c || (c == 2 && tpe == type_set) || 
-                   (c == 3 && tpe != type_cast)) { 
-                       s = NULL;
+               if (EC_INTERVAL(st->type->eclass) && (ct->type->eclass == 
EC_NUM || ct->type->eclass == EC_POS) && ct->digits < st->digits) {
+                       s = NULL; /* conversion from interval to num depends on 
the number of digits */
                } else {
-                       s = stmt_convert(be, s, st, ct, NULL);
+                       c = sql_type_convert(st->type->eclass, 
ct->type->eclass);
+                       if (!c || (c == 2 && tpe == type_set) || (c == 3 && tpe 
!= type_cast)) { 
+                               s = NULL;
+                       } else {
+                               s = stmt_convert(be, s, st, ct, NULL);
+                       }
                }
-       } 
+       }
        if (!s) {
                stmt *res = sql_error(
                        sql, 03,
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
@@ -409,7 +409,7 @@ subtype2string(sql_subtype *t)
                        snprintf(buf, BUFSIZ, "%s(%u)", 
                                t->type->sqlname, t->digits);
        } else {
-                       snprintf(buf, BUFSIZ, "%s", t->type->sqlname);
+               snprintf(buf, BUFSIZ, "%s", t->type->sqlname);
        }
        return _STRDUP(buf);
 }
@@ -440,7 +440,7 @@ int
 subaggr_cmp( sql_subaggr *a1, sql_subaggr *a2)
 {
        if (a1->aggr == a2->aggr) 
-           return list_cmp(a1->res, a2->res, (fcmp) &subtype_cmp);
+               return list_cmp(a1->res, a2->res, (fcmp) &subtype_cmp);
        return -1;
 }
 
@@ -448,7 +448,7 @@ int
 subfunc_cmp( sql_subfunc *f1, sql_subfunc *f2)
 {
        if (f1->func == f2->func) 
-           return list_cmp(f1->res, f2->res, (fcmp) &subtype_cmp);
+               return list_cmp(f1->res, f2->res, (fcmp) &subtype_cmp);
        return -1;
 }
 
@@ -460,7 +460,6 @@ arg_subtype_cmp(sql_arg *a, sql_subtype 
        return (is_subtype(t, &a->type )?0:-1);
 }
 
-
 static sql_subaggr *
 _dup_subaggr(sql_allocator *sa, sql_func *a, sql_subtype *member)
 {
@@ -507,8 +506,8 @@ sql_bind_aggr(sql_allocator *sa, sql_sch
                        arg = a->ops->h->data;
 
                if (strcmp(a->base.name, sqlaname) == 0 && (!arg ||
-                   arg->type.type->eclass == EC_ANY || 
-                   (type && is_subtype(type, &arg->type )))) 
+                       arg->type.type->eclass == EC_ANY || 
+                       (type && is_subtype(type, &arg->type )))) 
                        return _dup_subaggr(sa, a, type);
                n = n->next;
        }
@@ -526,8 +525,8 @@ sql_bind_aggr(sql_allocator *sa, sql_sch
                                arg = a->ops->h->data;
 
                        if (strcmp(a->base.name, sqlaname) == 0 && (!arg ||
-                               arg->type.type->eclass == EC_ANY || 
-                               (type && is_subtype(type, &arg->type )))) 
+                               arg->type.type->eclass == EC_ANY || 
+                               (type && is_subtype(type, &arg->type )))) 
                                return _dup_subaggr(sa, a, type);
                }
        }
@@ -547,7 +546,7 @@ sql_bind_aggr_(sql_allocator *sa, sql_sc
                sql_func *a = n->data;
 
                if (strcmp(a->base.name, sqlaname) == 0 &&  
-                   list_cmp(a->ops, ops, (fcmp) &arg_subtype_cmp) == 0)
+                       list_cmp(a->ops, ops, (fcmp) &arg_subtype_cmp) == 0)
                        return _dup_subaggr(sa, a, type);
                n = n->next;
        }
@@ -561,7 +560,7 @@ sql_bind_aggr_(sql_allocator *sa, sql_sc
                                continue;
 
                        if (strcmp(a->base.name, sqlaname) == 0 &&  
-                           list_cmp(a->ops, ops, (fcmp) &arg_subtype_cmp) == 0)
+                               list_cmp(a->ops, ops, (fcmp) &arg_subtype_cmp) 
== 0)
                                return _dup_subaggr(sa, a, type);
                }
        }
@@ -577,7 +576,7 @@ sql_bind_member_aggr(sql_allocator *sa, 
                sql_func *a = n->data;
 
                if (strcmp(a->base.name, sqlaname) == 0 && list_length(a->ops) 
== nrargs &&
-                   arg_subtype_cmp(a->ops->h->data, type) == 0)
+                       arg_subtype_cmp(a->ops->h->data, type) == 0)
                        return _dup_subaggr(sa, a, NULL);
                n = n->next;
        }
@@ -591,7 +590,7 @@ sql_bind_member_aggr(sql_allocator *sa, 
                                continue;
 
                        if (strcmp(a->base.name, sqlaname) == 0 && 
list_length(a->ops) == nrargs &&
-                           arg_subtype_cmp(a->ops->h->data, type) == 0)
+                               arg_subtype_cmp(a->ops->h->data, type) == 0)
                                return _dup_subaggr(sa, a, NULL);
                }
        }
@@ -603,7 +602,6 @@ sql_find_aggr(sql_allocator *sa, sql_sch
 {
        node *n = aggrs->h;
 
-       (void)s;
        while (n) {
                sql_func *a = n->data;
 
@@ -915,7 +913,6 @@ sql_find_funcs(sql_allocator *sa, sql_sc
        return res;
 }
 
-
 /* find function based on first argument */
 sql_subfunc *
 sql_bind_member(sql_allocator *sa, sql_schema *s, const char *sqlfname, 
sql_subtype *tp, int nrargs, sql_subfunc *prev)
@@ -1003,7 +1000,6 @@ sql_bind_func_(sql_allocator *sa, sql_sc
        node *n = funcs->h;
        sql_ftype filt = (type == F_FUNC)?F_FILT:type;
 
-       (void)s;
        for (; n; n = n->next) {
                sql_func *f = n->data;
 
@@ -1093,7 +1089,6 @@ sql_bind_func_result3(sql_allocator *sa,
        return fres;
 }
 
-
 static void
 sql_create_alias(sql_allocator *sa, const char *name, const char *alias)
 {
diff --git a/sql/server/rel_rel.h b/sql/server/rel_rel.h
--- a/sql/server/rel_rel.h
+++ b/sql/server/rel_rel.h
@@ -9,8 +9,9 @@
 #ifndef _REL_REL_H_
 #define _REL_REL_H_
 
+#include "sql_mvc.h"
 #include "sql_relation.h"
-#include "sql_mvc.h"
+#include "sql_semantic.h"
 
 #define sql_from     1
 #define sql_where    2
@@ -57,7 +58,7 @@ extern sql_rel *rel_inplace_setop(sql_re
 extern sql_rel *rel_inplace_project(sql_allocator *sa, sql_rel *rel, sql_rel 
*l, list *e);
 extern sql_rel *rel_inplace_groupby(sql_rel *rel, sql_rel *l, list 
*groupbyexps, list *exps );
 
-extern int rel_convert_types(mvc *sql, sql_rel *ll, sql_rel *rr, sql_exp **L, 
sql_exp **R, int scale_fixing, int tpe);
+extern int rel_convert_types(mvc *sql, sql_rel *ll, sql_rel *rr, sql_exp **L, 
sql_exp **R, int scale_fixing, check_type tpe);
 extern sql_rel *rel_setop(sql_allocator *sa, sql_rel *l, sql_rel *r, 
operator_type setop);
 extern sql_rel *rel_setop_check_types(mvc *sql, sql_rel *l, sql_rel *r, list 
*ls, list *rs, operator_type op);
 extern sql_rel *rel_crossproduct(sql_allocator *sa, sql_rel *l, sql_rel *r, 
operator_type join);
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -1307,9 +1307,9 @@ rel_numeric_supertype(mvc *sql, sql_exp 
 }
 
 sql_exp *
-rel_check_type(mvc *sql, sql_subtype *t, sql_rel *rel, sql_exp *exp, int tpe)
+rel_check_type(mvc *sql, sql_subtype *t, sql_rel *rel, sql_exp *exp, 
check_type tpe)
 {
-       int err = 0;
+       int c, err = 0;
        sql_exp* nexp = NULL;
        sql_subtype *fromtype = exp_subtype(exp);
 
@@ -1321,12 +1321,15 @@ rel_check_type(mvc *sql, sql_subtype *t,
                return nexp;
 
        if (fromtype && subtype_cmp(t, fromtype) != 0) {
-               int c = sql_type_convert(fromtype->type->eclass, 
t->type->eclass);
-               if (!c ||
-                  (c == 2 && tpe == type_set) || (c == 3 && tpe != type_cast)){
-                       err = 1;
+               if (EC_INTERVAL(fromtype->type->eclass) && (t->type->eclass == 
EC_NUM || t->type->eclass == EC_POS) && t->digits < fromtype->digits) {
+                       err = 1; /* conversion from interval to num depends on 
the number of digits */
                } else {
-                       exp = exp_convert(sql->sa, exp, fromtype, t);
+                       c = sql_type_convert(fromtype->type->eclass, 
t->type->eclass);
+                       if (!c || (c == 2 && tpe == type_set) || (c == 3 && tpe 
!= type_cast)) {
+                               err = 1;
+                       } else {
+                               exp = exp_convert(sql->sa, exp, fromtype, t);
+                       }
                }
        }
        if (err) {
@@ -1390,7 +1393,7 @@ exp_scale_algebra(mvc *sql, sql_subfunc 
 }
 
 int
-rel_convert_types(mvc *sql, sql_rel *ll, sql_rel *rr, sql_exp **L, sql_exp 
**R, int scale_fixing, int tpe)
+rel_convert_types(mvc *sql, sql_rel *ll, sql_rel *rr, sql_exp **L, sql_exp 
**R, int scale_fixing, check_type tpe)
 {
        sql_exp *ls = *L;
        sql_exp *rs = *R;
diff --git a/sql/server/rel_select.h b/sql/server/rel_select.h
--- a/sql/server/rel_select.h
+++ b/sql/server/rel_select.h
@@ -24,7 +24,7 @@ extern sql_exp * rel_value_exp(sql_query
 extern sql_exp * rel_value_exp2(sql_query *query, sql_rel **rel, symbol *se, 
int f, exp_kind ek, int *is_last);
 
 /* TODO rename to exp_check_type + move to rel_exp.c */
-extern sql_exp *rel_check_type(mvc *sql, sql_subtype *t, sql_rel *rel, sql_exp 
*exp, int tpe);
+extern sql_exp *rel_check_type(mvc *sql, sql_subtype *t, sql_rel *rel, sql_exp 
*exp, check_type tpe);
 
 extern sql_exp *rel_unop_(sql_query *query, sql_rel *rel, sql_exp *e, 
sql_schema *s, char *fname, int card);
 extern sql_exp *rel_binop_(sql_query *query, sql_rel *rel, sql_exp *l, sql_exp 
*r, sql_schema *s, char *fname, int card);
diff --git a/sql/test/BugTracker-2014/Tests/aggregates-intervals.Bug-3533.sql 
b/sql/test/BugTracker-2014/Tests/aggregates-intervals.Bug-3533.sql
--- a/sql/test/BugTracker-2014/Tests/aggregates-intervals.Bug-3533.sql
+++ b/sql/test/BugTracker-2014/Tests/aggregates-intervals.Bug-3533.sql
@@ -1,4 +1,3 @@
-START TRANSACTION;
 CREATE TABLE INTERVAL_TBL (f1 interval second);
 INSERT INTO INTERVAL_TBL (f1) VALUES (1), (2), (3), (4);
 SELECT count(f1), cast(sum(f1) as bigint), avg(f1), median(f1), max(f1), 
min(f1) FROM INTERVAL_TBL;
@@ -6,4 +5,9 @@ SELECT count(f1), cast(sum(f1) as bigint
 CREATE TABLE INTERVAL_TBL2 (f1 interval month);
 INSERT INTO INTERVAL_TBL2 (f1) VALUES (1), (2), (3), (4);
 SELECT count(f1), cast(sum(f1) as bigint), avg(f1), median(f1), max(f1), 
min(f1) FROM INTERVAL_TBL2;
-ROLLBACK;
+
+SELECT median_avg(f1) from INTERVAL_TBL; --error, median_avg is not available 
yet for sec_interval
+SELECT median_avg(f1) from INTERVAL_TBL2;
+
+DROP TABLE INTERVAL_TBL;
+DROP TABLE INTERVAL_TBL2;
diff --git 
a/sql/test/BugTracker-2014/Tests/aggregates-intervals.Bug-3533.stable.err 
b/sql/test/BugTracker-2014/Tests/aggregates-intervals.Bug-3533.stable.err
--- a/sql/test/BugTracker-2014/Tests/aggregates-intervals.Bug-3533.stable.err
+++ b/sql/test/BugTracker-2014/Tests/aggregates-intervals.Bug-3533.stable.err
@@ -23,6 +23,10 @@ stderr of test 'aggregates-intervals.Bug
 # 16:49:00 >  "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-284678" "--port=34676"
 # 16:49:00 >  
 
+MAPI  = (monetdb) /var/tmp/mtest-281202/.s.monetdb.31954
+QUERY = SELECT median_avg(f1) from INTERVAL_TBL; --error, median_avg is not 
available yet for sec_interval
+ERROR = !SELECT: no such unary operator 'median_avg(sec_interval)'
+CODE  = 42000
 
 # 16:49:01 >  
 # 16:49:01 >  "Done."
diff --git 
a/sql/test/BugTracker-2014/Tests/aggregates-intervals.Bug-3533.stable.out 
b/sql/test/BugTracker-2014/Tests/aggregates-intervals.Bug-3533.stable.out
--- a/sql/test/BugTracker-2014/Tests/aggregates-intervals.Bug-3533.stable.out
+++ b/sql/test/BugTracker-2014/Tests/aggregates-intervals.Bug-3533.stable.out
@@ -81,7 +81,14 @@ stdout of test 'aggregates-intervals.Bug
 % bigint,      bigint, double, month_interval, month_interval, month_interval 
# type
 % 1,   2,      24,     1,      1,      1 # length
 [ 4,   10,     2.5,    2,      4,      1       ]
-#ROLLBACK;
+#SELECT median_avg(f1) from INTERVAL_TBL2;
+% sys.L2 # table_name
+% L2 # name
+% double # type
+% 24 # length
+[ 2.5  ]
+#DROP TABLE INTERVAL_TBL;
+#DROP TABLE INTERVAL_TBL2;
 
 # 16:49:01 >  
 # 16:49:01 >  "Done."
diff --git a/sql/test/emptydb-upgrade-chain-hge/Tests/package.py 
b/sql/test/emptydb-upgrade-chain-hge/Tests/package.py
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to