Changeset: 6a68ec8781f0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6a68ec8781f0
Modified Files:
        sql/server/rel_optimizer.c
        sql/server/rel_rel.c
        sql/server/rel_unnest.c
Branch: default
Log Message:

Merged with Jan2022 (conflict generated)


diffs (142 lines):

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
@@ -9774,9 +9774,11 @@ rel_setjoins_2_joingroupby(visitor *v, s
                        if (p && p->r == pp)
                                pp = NULL;
 
-                       rel->l = l = rel_add_identity(v->sql, l, &lid);
+                       if (!(rel->l = l = rel_add_identity(v->sql, l, &lid)))
+                               return NULL;
                        if (rel->op == op_left) {
-                               p->r = rel_add_identity(v->sql, p->r, &rid);
+                               if (!(p->r = rel_add_identity(v->sql, p->r, 
&rid)))
+                                       return NULL;
                                if (pp)
                                        list_append(pp->exps, exp_ref(v->sql, 
rid));
                        }
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -1448,7 +1448,7 @@ static sql_rel *
 _rel_add_identity(mvc *sql, sql_rel *rel, sql_exp **exp)
 {
        list *exps = rel_projections(sql, rel, NULL, 1, 1);
-       sql_exp *e;
+       sql_exp *e = NULL;
 
        if (list_empty(exps)) {
                *exp = NULL;
@@ -1456,7 +1456,16 @@ static sql_rel *
        }
        if (!is_simple_project(rel->op) || need_distinct(rel) || 
!list_empty(rel->r) || rel_is_ref(rel))
                rel = rel_project(sql->sa, rel, exps);
-       e = rel->exps->h->data;
+       /* filter parameters out */
+       for (node *n = rel->exps->h ; n && !e ; n = n->next) {
+               sql_exp *re = n->data;
+
+               if (exp_subtype(re))
+                       e = re;
+       }
+       if (!e)
+               return sql_error(sql, 10, SQLSTATE(42000) "Query projection 
must have at least one parameter with known SQL type");
+
        e = exp_column(sql->sa, exp_relname(e), exp_name(e), exp_subtype(e), 
rel->card, has_nil(e), is_unique(e), is_intern(e));
        e = exp_unop(sql->sa, e, sql_bind_func(sql, "sys", "identity", 
exp_subtype(e), NULL, F_FUNC));
        set_intern(e);
@@ -1491,7 +1500,8 @@ rel_add_identity2(mvc *sql, sql_rel *rel
                sql_rel *o = rel;
                sql_exp *id;
 
-               p->l = _rel_add_identity(sql, l, exp);
+               if (!(p->l = _rel_add_identity(sql, l, exp)))
+                       return NULL;
                l = p->l;
                id = exp_ref(sql, *exp);
                while (o && o != l) {
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
@@ -1127,7 +1127,8 @@ push_up_groupby(mvc *sql, sql_rel *rel, 
                        /* move groupby up, ie add attributes of left + the old 
expression list */
 
                        if (l && list_length(a) > 1 && !need_distinct(l)) { /* 
add identity call only if there's more than one column in the groupby */
-                               rel->l = rel_add_identity(sql, l, &id); /* add 
identity call for group by */
+                               if (!(rel->l = rel_add_identity(sql, l, &id))) 
/* add identity call for group by */
+                                       return NULL;
                                assert(id);
                        }
 
@@ -1470,7 +1471,8 @@ push_up_table(mvc *sql, sql_rel *rel, li
                                if (l->l) {
                                        sql_exp *tfe = tf->r;
                                        list *ops = tfe->l;
-                                       rel->l = d = rel_add_identity(sql, d, 
&id);
+                                       if (!(rel->l = d = 
rel_add_identity(sql, d, &id)))
+                                               return NULL;
                                        id = exp_ref(sql, id);
                                        l = tf->l = rel_crossproduct(sql->sa, 
rel_dup(d), l, op_join);
                                        set_dependent(l);
@@ -2233,7 +2235,8 @@ rewrite_or_exp(visitor *v, sql_rel *rel)
                                                rel_destroy(rel);
                                                rel = l;
                                        }
-                                       rel = rel_add_identity(v->sql, rel, 
&id); /* identity function needed */
+                                       if (!(rel = rel_add_identity(v->sql, 
rel, &id))) /* identity function needed */
+                                               return NULL;
                                        const char *idrname = exp_relname(id), 
*idname = exp_name(id);
                                        list *tids = NULL, *exps = 
rel_projections(v->sql, rel, NULL, 1, 1);
 
diff --git a/sql/storage/sql_catalog.c b/sql/storage/sql_catalog.c
--- a/sql/storage/sql_catalog.c
+++ b/sql/storage/sql_catalog.c
@@ -551,8 +551,11 @@ atom_copy(sql_allocator *sa, atom *a)
        if (!r)
                return NULL;
 
-       *r = *a;
-       r->tpe = a->tpe;
+       *r = (atom) {
+               .isnull = a->isnull,
+               .tpe = a->tpe,
+               .data = (ValRecord) {.vtype = TYPE_void,},
+       };
        if (!a->isnull)
                SA_VALcopy(sa, &r->data, &a->data);
        return r;
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
@@ -73,3 +73,9 @@ PREPARE SELECT 1 FROM idontexist(?,16); 
 PREPARE WITH x(a) AS (SELECT ?) SELECT x.a FROM x; --error, cannot define type 
for the parameter
 PREPARE WITH x(a) AS (SELECT ?) SELECT CAST(x.a AS INT) FROM x;
 EXEC **(1);
+
+START TRANSACTION;
+CREATE TABLE t0 (c0 INT);
+-- In order to compute the OR, an identity function call is needed, but the 
projection only contains parameters
+PREPARE WITH x(x) AS (SELECT ?) SELECT 1 FROM x WHERE COALESCE(FALSE, TRUE) OR 
(SELECT TRUE FROM t0); --error
+ROLLBACK;
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
@@ -40,3 +40,7 @@ MAPI  = (monetdb) /var/tmp/mtest-185783/
 QUERY = PREPARE WITH x(a) AS (SELECT ?) SELECT x.a FROM x; --error, cannot 
define type for the parameter
 ERROR = !Could not determine type for argument number 1
 CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-185783/.s.monetdb.32587
+QUERY = PREPARE WITH x(x) AS (SELECT ?) SELECT 1 FROM x WHERE COALESCE(FALSE, 
TRUE) OR (SELECT TRUE FROM t0); --error
+ERROR = !Query projection must have at least one parameter with known SQL 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,7 @@ MAPI  = (monetdb) /var/tmp/mtest-185783/
 QUERY = PREPARE WITH x(a) AS (SELECT ?) SELECT x.a FROM x; --error, cannot 
define type for the parameter
 ERROR = !Could not determine type for argument number 1
 CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-185783/.s.monetdb.32587
+QUERY = PREPARE WITH x(x) AS (SELECT ?) SELECT 1 FROM x WHERE COALESCE(FALSE, 
TRUE) OR (SELECT TRUE FROM t0); --error
+ERROR = !Query projection must have at least one parameter with known SQL type
+CODE  = 42000
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to