Changeset: f7e6c57ad0b9 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f7e6c57ad0b9
Modified Files:
        sql/common/sql_types.c
        sql/server/rel_select.c
Branch: typing
Log Message:

Merged with Oct2020


diffs (137 lines):

diff --git a/sql/benchmarks/tpcds/Tests/54.stable.out 
b/sql/benchmarks/tpcds/Tests/54.stable.out
--- a/sql/benchmarks/tpcds/Tests/54.stable.out
+++ b/sql/benchmarks/tpcds/Tests/54.stable.out
@@ -39,7 +39,7 @@ stdout of test '54` in directory 'sql/be
 #        date_dim,
 #        customer
 #   WHERE sold_date_sk = d_date_sk
-% sys.segments,        sys.,   sys. # table_name
+% .segments,   .,      . # table_name
 % segment,     num_customers,  segment_base # name
 % int, bigint, bigint # type
 % 5,   1,      6 # length
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
@@ -585,11 +585,12 @@ sql_dup_subfunc(sql_allocator *sa, sql_f
 
                        if (ops) for (tn = ops->h, m = f->ops->h; tn; tn = 
tn->next, m = m->next) {
                                sql_arg *s = m->data;
+                               sql_subtype *opt = tn->data;
 
                                if (s->type.type->eclass == EC_ANY) {
                                        if (!st || st->type->eclass == EC_ANY) 
/* if input parameter is ANY, skip validation */
                                                st = tn->data;
-                                       else if (subtype_cmp(st, tn->data))
+                                       else if (opt && subtype_cmp(st, opt))
                                                return NULL;
                                }
                        }
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -4670,14 +4670,18 @@ rel_push_select_down_join(visitor *v, sq
                        sql_exp *e = n->data;
                        if (rel_rebind_exp(v->sql, rel->l, e)) {
                                sql_rel *l = rel->l;
-                               if (!is_select(l->op))
+                               if (!is_select(l->op)) {
+                                       set_processed(l);
                                        rel->l = l = rel_select(v->sql->sa, 
rel->l, NULL);
+                               }
                                rel_select_add_exp(v->sql->sa, rel->l, e);
                                v->changes++;
                        } else if (rel_rebind_exp(v->sql, rel->r, e)) {
                                sql_rel *r = rel->r;
-                               if (!is_select(r->op))
+                               if (!is_select(r->op)) {
+                                       set_processed(r);
                                        rel->r = r = rel_select(v->sql->sa, 
rel->r, NULL);
+                               }
                                rel_select_add_exp(v->sql->sa, rel->r, e);
                                v->changes++;
                        } else {
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
@@ -2790,10 +2790,18 @@ rel_binop_(mvc *sql, sql_rel *rel, sql_e
        if (!t1 || !t2) {
                f = sql_resolve_function_with_undefined_parameters(sql->sa, s, 
fname, list_append(list_append(sa_list(sql->sa), t1), t2), type);
                if (f) { /* add types using f */
-                       if (!t1)
-                               rel_set_type_param(sql, 
arg_type(f->func->ops->h->data), rel, l, 1);
-                       if (!t2)
-                               rel_set_type_param(sql, 
arg_type(f->func->ops->h->next->data), rel, r, 1);
+                       if (!t1) {
+                               sql_subtype *t = 
arg_type(f->func->ops->h->data);
+                               if (t->type->eclass == EC_ANY && t2)
+                                       t = t2;
+                               rel_set_type_param(sql, t, rel, l, 1);
+                       }
+                       if (!t2) {
+                               sql_subtype *t = 
arg_type(f->func->ops->h->next->data);
+                               if (t->type->eclass == EC_ANY && t1)
+                                       t = t1;
+                               rel_set_type_param(sql, t, rel, r, 1);
+                       }
                        f = NULL;
 
                        if (!exp_subtype(l) || !exp_subtype(r))
diff --git a/sql/test/SQLancer/Tests/sqlancer07.sql 
b/sql/test/SQLancer/Tests/sqlancer07.sql
--- a/sql/test/SQLancer/Tests/sqlancer07.sql
+++ b/sql/test/SQLancer/Tests/sqlancer07.sql
@@ -1,6 +1,6 @@
 START TRANSACTION;
 CREATE TABLE "t1" ("c0" DECIMAL(18,3),"c1" BINARY LARGE OBJECT NOT NULL,"c2" 
DECIMAL(18,3),CONSTRAINT "t1_c1_unique" UNIQUE ("c1"));
-PREPARE SELECT DISTINCT (SELECT DISTINCT r'|m<kv' FROM t1 WHERE ((t1.c0)<(?)) 
GROUP BY t1.c2, ?), ?, t1.c2 FROM t1 WHERE CAST(? AS BOOLEAN) LIMIT 
2103332269785059850;
+PREPARE SELECT DISTINCT (SELECT DISTINCT r'|m<v' FROM t1 WHERE ((t1.c0)<(?)) 
GROUP BY t1.c2, ?), ?, t1.c2 FROM t1 WHERE CAST(? AS BOOLEAN) LIMIT 
2103332269785059850;
        -- Could not determine type for argument number 2
 ROLLBACK;
 
@@ -159,3 +159,6 @@ DROP TABLE t2;
 
 SELECT 1 WHERE (SELECT 1 WHERE FALSE) IS NULL;
        -- 1
+
+PREPARE SELECT 1 WHERE greatest(true, ?);
+       -- ? should be set to boolean
diff --git a/sql/test/SQLancer/Tests/sqlancer07.stable.err 
b/sql/test/SQLancer/Tests/sqlancer07.stable.err
--- a/sql/test/SQLancer/Tests/sqlancer07.stable.err
+++ b/sql/test/SQLancer/Tests/sqlancer07.stable.err
@@ -5,8 +5,8 @@ stderr of test 'sqlancer07` in directory
 # 10:16:14 >  "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-52758" "--port=31957"
 # 10:16:14 >  
 
-MAPI  = (monetdb) /var/tmp/mtest-52758/.s.monetdb.31957
-QUERY = PREPARE SELECT DISTINCT (SELECT DISTINCT r'|m<kv' FROM t1 WHERE 
((t1.c0)<(?)) GROUP BY t1.c2, ?), ?, t1.c2 FROM t1 WHERE CAST(? AS BOOLEAN) 
LIMIT 2103332269785059850;
+MAPI  = (monetdb) /var/tmp/mtest-1050883/.s.monetdb.36353
+QUERY = PREPARE SELECT DISTINCT (SELECT DISTINCT r'|m<v' FROM t1 WHERE 
((t1.c0)<(?)) GROUP BY t1.c2, ?), ?, t1.c2 FROM t1 WHERE CAST(? AS BOOLEAN) 
LIMIT 2103332269785059850;
 ERROR = !Could not determine type for argument number 2
 CODE  = 42000
 MAPI  = (monetdb) /var/tmp/mtest-81449/.s.monetdb.32416
diff --git a/sql/test/SQLancer/Tests/sqlancer07.stable.out 
b/sql/test/SQLancer/Tests/sqlancer07.stable.out
--- a/sql/test/SQLancer/Tests/sqlancer07.stable.out
+++ b/sql/test/SQLancer/Tests/sqlancer07.stable.out
@@ -206,7 +206,7 @@ stdout of test 'sqlancer07` in directory
 % tinyint # type
 % 1 # length
 #SELECT t1.c0 FROM t2, t0 CROSS JOIN t1 WHERE ((((t0.c0)%((SELECT DISTINCT 
t0.c0 FROM t1, t0, t2 WHERE FALSE))))<=(t1.c0));
-% sys.t1 # table_name
+% .t1 # table_name
 % c0 # name
 % bigint # type
 % 1 # length
@@ -225,6 +225,13 @@ stdout of test 'sqlancer07` in directory
 % tinyint # type
 % 1 # length
 [ 1    ]
+#PREPARE SELECT 1 WHERE greatest(true, ?);
+% .prepare,    .prepare,       .prepare,       .prepare,       .prepare,       
.prepare # table_name
+% type,        digits, scale,  schema, table,  column # name
+% varchar,     int,    int,    str,    str,    str # type
+% 7,   1,      1,      0,      2,      2 # length
+[ "tinyint",   1,      0,      "",     "%2",   "%2"    ]
+[ "boolean",   1,      0,      NULL,   NULL,   NULL    ]
 
 # 10:16:14 >  
 # 10:16:14 >  "Done."
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to