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

Reply via email to