Changeset: 91b4d5bf6144 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/91b4d5bf6144
Modified Files:
        sql/server/rel_unnest.c
        sql/test/prepare/Tests/sqlancer_prepare.sql
        sql/test/prepare/Tests/sqlancer_prepare.stable.err
        sql/test/prepare/Tests/sqlancer_prepare.stable.err.int128
Branch: default
Log Message:

Look for parameters while adding nulls


diffs (103 lines):

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
@@ -1358,6 +1358,8 @@ push_up_join(mvc *sql, sql_rel *rel, lis
                        if (is_outerjoin(j->op) && j->exps && 
!list_empty(rel->attr)) {
                                visitor v = { .sql = sql };
                                rel->r = j = rewrite_outer2inner_union(&v, j);
+                               if (!j)
+                                       return NULL;
                                return rel;
                        }
 
@@ -3843,8 +3845,12 @@ add_null_projects(visitor *v, sql_rel *p
                l = sa_list(v->sql->sa);
        }
        for(; nr; n = n->next, nr--) {
-               sql_exp *e = n->data;
-               sql_exp *ne = exp_atom(v->sql->sa, atom_general(v->sql->sa, 
exp_subtype(e), NULL));
+               sql_exp *e = n->data, *ne;
+               sql_subtype *tp = exp_subtype(e);
+
+               if (!tp)
+                       return sql_error(v->sql, 10, SQLSTATE(42000) "Cannot 
rewrite subquery because of parameter with unknown type");
+               ne = exp_atom(v->sql->sa, atom_general(v->sql->sa, tp, NULL));
                exp_setname(v->sql->sa, ne, exp_relname(e), exp_name(e));
                if (end)
                        append(nilrel->exps, ne);
@@ -3878,6 +3884,9 @@ rewrite_outer2inner_union(visitor *v, sq
                        rel_setop_set_exps(v->sql, except, 
rel_projections(v->sql, rel->l, NULL, 1, 1), false);
                        set_processed(except);
                        sql_rel *nilrel = add_null_projects(v, prel, except, 
true);
+                       if (!nilrel)
+                               return NULL;
+
                        sql_rel *nrel = rel_setop(v->sql->sa, prel, nilrel, 
op_union);
                        rel_setop_set_exps(v->sql, nrel, 
rel_projections(v->sql, rel, NULL, 1, 1), false);
                        set_processed(nrel);
@@ -3898,6 +3907,9 @@ rewrite_outer2inner_union(visitor *v, sq
                        rel_setop_set_exps(v->sql, except, 
rel_projections(v->sql, rel->r, NULL, 1, 1), false);
                        set_processed(except);
                        sql_rel *nilrel = add_null_projects(v, prel, except, 
false);
+                       if (!nilrel)
+                               return NULL;
+
                        sql_rel *nrel = rel_setop(v->sql->sa, prel, nilrel, 
op_union);
                        rel_setop_set_exps(v->sql, nrel, 
rel_projections(v->sql, rel, NULL, 1, 1), false);
                        set_processed(nrel);
@@ -3918,6 +3930,8 @@ rewrite_outer2inner_union(visitor *v, sq
                        rel_setop_set_exps(v->sql, except, 
rel_projections(v->sql, rel->l, NULL, 1, 1), false);
                        set_processed(except);
                        sql_rel *lrel = add_null_projects(v, prel, except, 
true);
+                       if (!lrel)
+                               return NULL;
 
                        except = rel_setop(v->sql->sa,
                                        rel_project(v->sql->sa, 
rel_dup(rel->r), rel_projections(v->sql, rel->r, NULL, 1, 1)),
@@ -3925,6 +3939,8 @@ rewrite_outer2inner_union(visitor *v, sq
                        rel_setop_set_exps(v->sql, except, 
rel_projections(v->sql, rel->r, NULL, 1, 1), false);
                        set_processed(except);
                        sql_rel *rrel = add_null_projects(v, prel, except, 
false);
+                       if (!rrel)
+                               return NULL;
 
                        lrel = rel_setop(v->sql->sa, lrel, rrel, op_union);
                        rel_setop_set_exps(v->sql, lrel, 
rel_projections(v->sql, rel, NULL, 1, 1), false);
@@ -4057,7 +4073,7 @@ rewrite_rel(visitor *v, sql_rel *rel)
                        sql_rel *ir = exp_rel_get_rel(v->sql->sa, e);
 
                        rel = rewrite_outer2inner_union(v, rel);
-                       if (or == rel)
+                       if (!rel || or == rel)
                                return rel;
                        /* change referenced project into join with outer(ir) */
                        sql_rel *nr = rel->l;
diff --git a/sql/test/prepare/Tests/sqlancer_prepare.sql 
b/sql/test/prepare/Tests/sqlancer_prepare.sql
--- a/sql/test/prepare/Tests/sqlancer_prepare.sql
+++ b/sql/test/prepare/Tests/sqlancer_prepare.sql
@@ -83,3 +83,5 @@ ROLLBACK;
 PREPARE WITH y(a,b) AS (SELECT 1, ?) SELECT "json"."filter"(JSON '"a"', y.b) 
FROM y CROSS JOIN ((SELECT 1, 4) EXCEPT (SELECT 1,2)) x(x,y);
 
 PREPARE WITH y(a,b) AS (SELECT 1, ?) SELECT "json"."filter"(JSON '"a"', y.b) 
FROM ((SELECT 1, 4) EXCEPT (SELECT 1,2)) x(x,y) CROSS JOIN y;
+
+PREPARE SELECT 1 FROM (SELECT 1) x(x) LEFT OUTER JOIN (SELECT DISTINCT ?) y(y) 
ON (SELECT TRUE FROM (SELECT 1) z(z)); --error while unnesting because of 
unknown type
diff --git a/sql/test/prepare/Tests/sqlancer_prepare.stable.err 
b/sql/test/prepare/Tests/sqlancer_prepare.stable.err
--- a/sql/test/prepare/Tests/sqlancer_prepare.stable.err
+++ b/sql/test/prepare/Tests/sqlancer_prepare.stable.err
@@ -44,3 +44,6 @@ MAPI  = (monetdb) /var/tmp/mtest-185783/
 QUERY = PREPARE WITH x(x) AS (SELECT ?) SELECT 1 FROM x WHERE COALESCE(FALSE, 
TRUE) OR (SELECT TRUE FROM t0); --error
 ERROR = !Could not determine type for argument number 1
 CODE  = 42000
+QUERY = PREPARE SELECT 1 FROM (SELECT 1) x(x) LEFT OUTER JOIN (SELECT DISTINCT 
?) y(y) ON (SELECT TRUE FROM (SELECT 1) z(z)); --error while unnesting because 
of unknown type
+ERROR = !Cannot rewrite subquery because of parameter with unknown type
+CODE  = 42000
diff --git a/sql/test/prepare/Tests/sqlancer_prepare.stable.err.int128 
b/sql/test/prepare/Tests/sqlancer_prepare.stable.err.int128
--- a/sql/test/prepare/Tests/sqlancer_prepare.stable.err.int128
+++ b/sql/test/prepare/Tests/sqlancer_prepare.stable.err.int128
@@ -44,3 +44,6 @@ MAPI  = (monetdb) /var/tmp/mtest-185783/
 QUERY = PREPARE WITH x(x) AS (SELECT ?) SELECT 1 FROM x WHERE COALESCE(FALSE, 
TRUE) OR (SELECT TRUE FROM t0); --error
 ERROR = !Could not determine type for argument number 1
 CODE  = 42000
+QUERY = PREPARE SELECT 1 FROM (SELECT 1) x(x) LEFT OUTER JOIN (SELECT DISTINCT 
?) y(y) ON (SELECT TRUE FROM (SELECT 1) z(z)); --error while unnesting because 
of unknown type
+ERROR = !Cannot rewrite subquery because of parameter with unknown type
+CODE  = 42000
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to