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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list