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