Changeset: 683efc2e3ad6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=683efc2e3ad6
Modified Files:
sql/server/rel_select.c
sql/server/rel_unnest.c
sql/test/SQLancer/Tests/sqlancer07.stable.err
sql/test/SQLancer/Tests/sqlancer07.stable.err.int128
sql/test/SQLancer/Tests/sqlancer07.stable.out
sql/test/SQLancer/Tests/sqlancer07.stable.out.int128
Branch: Oct2020
Log Message:
Changeset 2f950c1e77d2 added a solution too late in the query processing. Set
parameters under exists operator earlier
diffs (101 lines):
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
@@ -1774,8 +1774,16 @@ exp_exist(sql_query *query, sql_rel *rel
if (!exp_name(le))
exp_label(sql->sa, le, ++sql->label);
- if (!exp_subtype(le) && rel_set_type_param(sql,
sql_bind_localtype("bit"), rel, le, 0) < 0) /* workaround */
+ if (!exp_subtype(le) && rel_set_type_param(sql,
sql_bind_localtype("bit"), rel, le, 0) < 0) { /* workaround */
return NULL;
+ } else if (exp_is_rel(le)) { /* for the subquery case, propagate to the
inner query */
+ sql_rel *r = exp_rel_get_rel(sql->sa, le);
+ if (is_simple_project(r->op) || is_groupby(r->op)) {
+ for (node *n = r->exps->h; n; n = n->next)
+ if (!exp_subtype(n->data) &&
rel_set_type_param(sql, sql_bind_localtype("bit"), r, n->data, 0) < 0) /*
workaround */
+ return NULL;
+ }
+ }
t = exp_subtype(le);
if (exists)
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
@@ -2769,8 +2769,6 @@ rewrite_exists(visitor *v, sql_rel *rel,
if (exp_is_rel(ie))
ie->l = sq;
- if (!exp_subtype(le) &&
rel_set_type_param(v->sql, sql_bind_localtype("bit"), rel, le, 0) < 0) /*
workaround */
- return NULL;
ea = sql_bind_func(v->sql->sa,
v->sql->session->schema, is_exists(sf)?"exist":"not_exist", exp_subtype(le),
NULL, F_AGGR);
le = exp_aggr1(v->sql->sa, le, ea, 0, 0,
CARD_AGGR, 0);
le = rel_groupby_add_aggr(v->sql, sq, le);
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
@@ -56,10 +56,6 @@ MAPI = (monetdb) /var/tmp/mtest-20193/.
QUERY = PREPARE SELECT (1 + CAST(l0t0.c0 AS BIGINT)) * scale_up(?, 2) FROM
(select 1) AS l0t0(c0);
ERROR = !SELECT: no such binary operator 'sql_mul(bigint,month_interval)'
CODE = 42000
-MAPI = (monetdb) /var/tmp/mtest-299030/.s.monetdb.30707
-QUERY = prepare select case when true then false when ? then not exists
(select ?, ?, 6) end from v10 as l0v10;
-ERROR = !Could not determine type for argument number 3
-CODE = 42000
# 10:16:14 >
# 10:16:14 > "Done."
diff --git a/sql/test/SQLancer/Tests/sqlancer07.stable.err.int128
b/sql/test/SQLancer/Tests/sqlancer07.stable.err.int128
--- a/sql/test/SQLancer/Tests/sqlancer07.stable.err.int128
+++ b/sql/test/SQLancer/Tests/sqlancer07.stable.err.int128
@@ -56,10 +56,6 @@ MAPI = (monetdb) /var/tmp/mtest-14251/.
QUERY = PREPARE SELECT DISTINCT ((((CAST(l0t0.c0 AS INT))-(CAST(? AS
BIGINT))))*(scale_up(?, ((-438139776)*(-813129345))))) FROM (select 1) AS
l0t0(c0);
ERROR = !SELECT: no such binary operator 'sql_mul(hugeint,day_interval)'
CODE = 42000
-MAPI = (monetdb) /var/tmp/mtest-299030/.s.monetdb.30707
-QUERY = prepare select case when true then false when ? then not exists
(select ?, ?, 6) end from v10 as l0v10;
-ERROR = !Could not determine type for argument number 3
-CODE = 42000
# 10:16:14 >
# 10:16:14 > "Done."
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
@@ -478,6 +478,16 @@ stdout of test 'sqlancer07` in directory
[ 1 ]
#START TRANSACTION;
#create view v10(vc0) as (select l0v0.vc0 from (values (1, 2)) as l0v0(vc0,
vc1));
+#prepare select case when true then false when ? then not exists (select ?, ?,
6) end from v10 as l0v10;
+#prepare select case when true then false when ? then not exists (select ?, ?,
6) end from v10 as l0v10;
+% .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, 3, 3 # length
+[ "boolean", 1, 0, "", "%11", "%11" ]
+[ "boolean", 1, 0, NULL, NULL, NULL ]
+[ "boolean", 1, 0, NULL, NULL, NULL ]
+[ "boolean", 1, 0, NULL, NULL, NULL ]
#ROLLBACK;
#prepare values (0.34, (values ((select ? from (select 1) as t1(x))))), (3, 2);
#prepare values (0.34, (values ((select ? from (select 1) as t1(x))))), (3, 2);
diff --git a/sql/test/SQLancer/Tests/sqlancer07.stable.out.int128
b/sql/test/SQLancer/Tests/sqlancer07.stable.out.int128
--- a/sql/test/SQLancer/Tests/sqlancer07.stable.out.int128
+++ b/sql/test/SQLancer/Tests/sqlancer07.stable.out.int128
@@ -475,6 +475,16 @@ stdout of test 'sqlancer07` in directory
[ 1 ]
#START TRANSACTION;
#create view v10(vc0) as (select l0v0.vc0 from (values (1, 2)) as l0v0(vc0,
vc1));
+#prepare select case when true then false when ? then not exists (select ?, ?,
6) end from v10 as l0v10;
+#prepare select case when true then false when ? then not exists (select ?, ?,
6) end from v10 as l0v10;
+% .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, 3, 3 # length
+[ "boolean", 1, 0, "", "%11", "%11" ]
+[ "boolean", 1, 0, NULL, NULL, NULL ]
+[ "boolean", 1, 0, NULL, NULL, NULL ]
+[ "boolean", 1, 0, NULL, NULL, NULL ]
#ROLLBACK;
#prepare values (0.34, (values ((select ? from (select 1) as t1(x))))), (3, 2);
#prepare values (0.34, (values ((select ? from (select 1) as t1(x))))), (3, 2);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list