Changeset: b2e1d3131d56 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b2e1d3131d56
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/rel_predicates.c
        sql/backends/monet5/rel_predicates.h
        sql/include/sql_catalog.h
        sql/include/sql_relation.h
        sql/server/sql_atom.c
        sql/server/sql_atom.h
        sql/storage/sql_catalog.c
        sql/storage/sql_storage.h
        sql/storage/store.c
Branch: iso
Log Message:

Cleaned predicates and propagate them to the parent transaction


diffs (truncated from 531 to 300 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -3907,22 +3907,10 @@ sql_parse(backend *be, sql_schema *s, co
        return sq;
 }
 
-static list *
-add_predicate(sql_allocator *sa, list *l, sql_column *c)
-{
-       pl *p = SA_ZNEW(sa, pl);
-       p->c = c;
-       if (!l)
-               l = sa_list(sa);
-       list_append(l, p);
-       return l;
-}
-
 static stmt *
 insert_check_ukey(backend *be, list *inserts, sql_key *k, stmt *idx_inserts)
 {
        mvc *sql = be->mvc;
-       sql_trans *tr = sql->session->tr;
 /* pkey's cannot have NULLs, ukeys however can
    current implementation switches on 'NOT NULL' on primary key columns */
 
@@ -3953,7 +3941,8 @@ insert_check_ukey(backend *be, list *ins
                                stmt *cs = list_fetch(inserts, c->c->colnr);
 
                                /* foreach column add predicate */
-                               tr->predicates = add_predicate(sql->pa, 
tr->predicates, c->c);
+                               if (add_column_predicate(be, c->c) != LOG_OK)
+                                       return sql_error(sql, 02, 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
 
                                col = stmt_col(be, c->c, dels, dels->partition);
                                if ((k->type == ukey) && stmt_has_null(col)) {
@@ -3975,7 +3964,8 @@ insert_check_ukey(backend *be, list *ins
                                stmt *cs = list_fetch(inserts, c->c->colnr);
 
                                /* foreach column add predicate */
-                               tr->predicates = add_predicate(sql->pa, 
tr->predicates, c->c);
+                               if (add_column_predicate(be, c->c) != LOG_OK)
+                                       return sql_error(sql, 02, 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
 
                                col = stmt_col(be, c->c, dels, dels->partition);
                                list_append(lje, col);
@@ -4038,7 +4028,8 @@ insert_check_ukey(backend *be, list *ins
                stmt *s = list_fetch(inserts, c->c->colnr), *h = s;
 
                /* add predicate for this column */
-               tr->predicates = add_predicate(sql->pa, tr->predicates, c->c);
+               if (add_column_predicate(be, c->c) != LOG_OK)
+                       return sql_error(sql, 02, SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
 
                s = stmt_col(be, c->c, dels, dels->partition);
                if ((k->type == ukey) && stmt_has_null(s)) {
@@ -4098,7 +4089,6 @@ static stmt *
 insert_check_fkey(backend *be, list *inserts, sql_key *k, stmt *idx_inserts, 
stmt *pin)
 {
        mvc *sql = be->mvc;
-       sql_trans *tr = sql->session->tr;
        char *msg = NULL;
        stmt *cs = list_fetch(inserts, 0), *s = cs;
        sql_subtype *lng = sql_bind_localtype("lng");
@@ -4110,7 +4100,8 @@ insert_check_fkey(backend *be, list *ins
                sql_kc *c = m->data;
 
                /* foreach column add predicate */
-               tr->predicates = add_predicate(sql->pa, tr->predicates, c->c);
+               if (add_column_predicate(be, c->c) != LOG_OK)
+                       return sql_error(sql, 02, SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
        }
 
        if (pin && list_length(pin->op4.lval))
@@ -4210,11 +4201,10 @@ sql_insert_triggers(backend *be, sql_tab
        return res;
 }
 
-static void
+static sql_table *
 sql_insert_check_null(backend *be, sql_table *t, list *inserts)
 {
        mvc *sql = be->mvc;
-       sql_trans *tr = sql->session->tr;
        node *m, *n;
        sql_subfunc *cnt = sql_bind_func(sql, "sys", "count", 
sql_bind_localtype("void"), NULL, F_AGGR);
 
@@ -4228,7 +4218,8 @@ sql_insert_check_null(backend *be, sql_t
                        char *msg = NULL;
 
                        /* foreach column add predicate */
-                       tr->predicates = add_predicate(sql->pa, tr->predicates, 
c);
+                       if (add_column_predicate(be, c) != LOG_OK)
+                               return sql_error(sql, 02, SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
 
                        if (!(s->key && s->nrcols == 0)) {
                                s = stmt_selectnil(be, column(be, i));
@@ -4242,6 +4233,7 @@ sql_insert_check_null(backend *be, sql_t
                        (void)stmt_exception(be, s, msg, 00001);
                }
        }
+       return t; /* return something to say it succeeded */
 }
 
 static stmt **
@@ -4291,8 +4283,8 @@ rel2bin_insert(backend *be, sql_rel *rel
        if (idx_ins)
                pin = refs_find_rel(refs, prel);
 
-       if (constraint)
-               sql_insert_check_null(be, t, inserts->op4.lval);
+       if (constraint && !sql_insert_check_null(be, t, inserts->op4.lval))
+               return NULL;
 
        l = sa_list(sql->sa);
 
@@ -4371,7 +4363,8 @@ rel2bin_insert(backend *be, sql_rel *rel
        if (!sql_insert_triggers(be, t, updates, 1))
                return sql_error(sql, 02, SQLSTATE(27000) "INSERT INTO: 
triggers failed for table '%s'", t->base.name);
        /* update predicate list */
-       rel_predicates(be, rel->r);
+       if (rel->r && !rel_predicates(be, rel->r))
+               return NULL;
        if (ddl) {
                ret = ddl;
                list_prepend(l, ddl);
@@ -5360,7 +5353,8 @@ rel2bin_update(backend *be, sql_rel *rel
 
        if (sql->cascade_action)
                sql->cascade_action = NULL;
-       rel_predicates(be, rel->r);
+       if (rel->r && !rel_predicates(be, rel->r))
+               return NULL;
        return cnt;
 }
 
@@ -5600,7 +5594,8 @@ rel2bin_delete(backend *be, sql_rel *rel
                /* if there are multiple update statements, update total count, 
otherwise use the the current count */
                be->rowcount = be->rowcount ? add_to_rowcount_accumulator(be, 
stdelete->nr) : stdelete->nr;
        }
-       rel_predicates(be, rel->r);
+       if (rel->r && !rel_predicates(be, rel->r))
+               return NULL;
        return stdelete;
 }
 
diff --git a/sql/backends/monet5/rel_predicates.c 
b/sql/backends/monet5/rel_predicates.c
--- a/sql/backends/monet5/rel_predicates.c
+++ b/sql/backends/monet5/rel_predicates.c
@@ -13,35 +13,6 @@
 #include "rel_exp.h"
 #include "mal_backend.h"
 
-#if 0
-static void
-pl_print(mvc *m, list *pls)
-{
-       if (list_empty(pls))
-               return;
-       for (node *n = pls->h; n; n = n->next) {
-               pl *p = n->data;
-               if (p->r) {
-                       printf("# %s %s %s.%s.%s %s %s\n",
-                               p->f?atom2string(m->pa, p->f):"NULL",
-                               compare_func(range2lcompare(p->cmp), 0),
-                               p->c->t->s?p->c->t->s->base.name:"",
-                               p->c->t->base.name,
-                               p->c->base.name,
-                               compare_func(range2rcompare(p->cmp), 0),
-                               atom2string(m->pa, p->r));
-               } else
-                       printf("# %s.%s.%s %s %s %s\n",
-                               p->c->t->s?p->c->t->s->base.name:"",
-                               p->c->t->base.name,
-                               p->c->base.name,
-                               p->f?compare_func(p->cmp, 0):"all" ,
-                               p->f?atom2string(m->pa, p->f):"",
-                               p->r?atom2string(m->pa, p->r):"");
-       }
-}
-#endif
-
 static sql_column *
 bt_find_column( sql_rel *rel, char *tname, char *name)
 {
@@ -64,15 +35,6 @@ exp_find_column( sql_rel *rel, sql_exp *
        return NULL;
 }
 
-static list *
-add_predicate(sql_allocator *sa, list *l, pl *pred)
-{
-       if (!l)
-               l = sa_list(sa);
-       list_append(l, pred);
-       return l;
-}
-
 static sql_rel *
 rel_find_predicates(visitor *v, sql_rel *rel)
 {
@@ -95,15 +57,31 @@ rel_find_predicates(visitor *v, sql_rel 
                                if (!is_compare(e->type) || 
!is_theta_exp(e->flag) || r->type != e_atom || !r->l || (r2 && (r2->type != 
e_atom || !r2->l)) || is_symmetric(e) || !(c = exp_find_column(rel, e->l))) {
                                        needall = true;
                                } else {
-                                       pl *p = SA_ZNEW(v->sql->pa, pl);
-                                       p->c = c;
-                                       p->cmp = e->flag;
-                                       p->anti = is_anti(e);
-                                       p->semantics = is_semantics(e);
-                                       p->r = atom_dup(v->sql->pa, r->l);
-                                       if (r2)
-                                               p->f = atom_dup(v->sql->pa, 
r2->l);
-                                       v->sql->session->tr->predicates = 
add_predicate(v->sql->pa, v->sql->session->tr->predicates, p);
+                                       atom *e1 = r && r->l ? atom_dup(NULL, 
r->l) : NULL, *e2 = r2 && r2->l ? atom_dup(NULL, r2->l) : NULL;
+
+                                       if ((r && r->l && !e1) || (r2 && r2->l 
&& !e2)) {
+                                               if (e1) {
+                                                       VALclear(&e1->data);
+                                                       _DELETE(e1);
+                                               }
+                                               if (e2) {
+                                                       VALclear(&e2->data);
+                                                       _DELETE(e2);
+                                               }
+                                               return sql_error(v->sql, 02, 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                       }
+
+                                       if 
(sql_trans_add_predicate(v->sql->session->tr, c, e->flag, e1, e2, is_anti(e), 
is_semantics(e)) != LOG_OK) {
+                                               if (e1) {
+                                                       VALclear(&e1->data);
+                                                       _DELETE(e1);
+                                               }
+                                               if (e2) {
+                                                       VALclear(&e2->data);
+                                                       _DELETE(e2);
+                                               }
+                                               return sql_error(v->sql, 02, 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                       }
                                        *(int*)v->data = 1;
                                }
                        }
@@ -117,11 +95,13 @@ rel_find_predicates(visitor *v, sql_rel 
                                return rel;
                        for (node *n = rel->exps->h; n; n = n->next) {
                                sql_exp *e = n->data;
+
                                if (!is_intern(e)) {
-                                       pl *p = SA_ZNEW(v->sql->pa, pl);
-                                       p->c = find_sql_column(t, e->r);
-                                       assert(p->c);
-                                       v->sql->session->tr->predicates = 
add_predicate(v->sql->pa, v->sql->session->tr->predicates, p);
+                                       sql_column *c = find_sql_column(t, 
e->r);
+
+                                       assert(c);
+                                       if 
(sql_trans_add_predicate(v->sql->session->tr, c, 0, NULL, NULL, false, false) 
!= LOG_OK)
+                                               return sql_error(v->sql, 02, 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
                                        *(int*)v->data = 1;
                                }
                        }
@@ -130,17 +110,21 @@ rel_find_predicates(visitor *v, sql_rel 
        return rel;
 }
 
-void
+sql_rel *
 rel_predicates(backend *be, sql_rel *rel)
 {
        if (be->mvc->session->level < tr_serializable)
-               return ;
+               return rel;
        int changes = 0;
        visitor v = { .sql = be->mvc, .data = &changes };
        rel = rel_visitor_topdown(&v, rel, &rel_find_predicates);
-#if 0
-       if (changes)
-               pl_print(be->mvc, be->mvc->session->tr->predicates);
-#endif
+       return rel;
 }
 
+int
+add_column_predicate(backend *be, sql_column *c)
+{
+       if (be->mvc->session->level < tr_serializable)
+               return LOG_OK;
+       return sql_trans_add_predicate(be->mvc->session->tr, c, 0, NULL, NULL, 
false, false);
+}
diff --git a/sql/backends/monet5/rel_predicates.h 
b/sql/backends/monet5/rel_predicates.h
--- a/sql/backends/monet5/rel_predicates.h
+++ b/sql/backends/monet5/rel_predicates.h
@@ -13,6 +13,7 @@
 #include "rel_exp.h"
 #include "mal_backend.h"
 
-extern void rel_predicates(backend *be, sql_rel *rel);
+extern sql_rel *rel_predicates(backend *be, sql_rel *rel);
+extern int add_column_predicate(backend *be, sql_column *c);
 
 #endif /*_REL_PREDICATES_H_*/
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to