Changeset: af96ead55314 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/af96ead55314
Modified Files:
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_cat.c
        sql/backends/monet5/sql_upgrades.c
        sql/server/rel_rel.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        sql/server/sql_partition.c
        sql/storage/sql_storage.h
        sql/storage/store.c
        sql/storage/store_dependency.c
        sql/test/miscellaneous/Tests/transaction_isolation3.SQL.py
Branch: iso
Log Message:

Optimization, check only dependencies only for objects created outside the 
transaction


diffs (truncated from 467 to 300 lines):

diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -362,8 +362,8 @@ create_table_or_view(mvc *sql, char* sna
                        /* For a self incremented column, it's sequence will 
get a BEDROPPED_DEPENDENCY,
                                so no additional dependencies are needed */
                        if (strncmp(c->def, next_value_for, 
strlen(next_value_for)) != 0) {
-                               list *id_l = rel_dependencies(sql, r);
-                               mvc_create_dependencies(sql, id_l, nt->base.id, 
FUNC_DEPENDENCY);
+                               list *blist = rel_dependencies(sql, r);
+                               mvc_create_dependencies(sql, blist, 
nt->base.id, FUNC_DEPENDENCY);
                        }
                        rel_destroy(r);
                        sa_reset(sql->sa);
@@ -476,8 +476,8 @@ create_table_or_view(mvc *sql, char* sna
                if (r)
                        r = sql_processrelation(sql, r, 0, 0);
                if (r) {
-                       list *id_l = rel_dependencies(sql, r);
-                       mvc_create_dependencies(sql, id_l, nt->base.id, 
VIEW_DEPENDENCY);
+                       list *blist = rel_dependencies(sql, r);
+                       mvc_create_dependencies(sql, blist, nt->base.id, 
VIEW_DEPENDENCY);
                }
                sa_reset(sql->ta);
                if (!r) {
diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -527,8 +527,8 @@ create_trigger(mvc *sql, char *sname, ch
                if (r)
                        r = sql_processrelation(sql, r, 0, 0);
                if (r) {
-                       list *id_l = rel_dependencies(sql, r);
-                       mvc_create_dependencies(sql, id_l, tri->base.id, 
TRIGGER_DEPENDENCY);
+                       list *blist = rel_dependencies(sql, r);
+                       mvc_create_dependencies(sql, blist, tri->base.id, 
TRIGGER_DEPENDENCY);
                }
                sa_destroy(sql->sa);
                sql->sa = sa;
@@ -924,14 +924,14 @@ create_func(mvc *sql, char *sname, char 
                        r = sql_processrelation(sql, r, 0, 0);
                if (r) {
                        node *n;
-                       list *id_l = rel_dependencies(sql, r);
+                       list *blist = rel_dependencies(sql, r);
 
                        if (!f->vararg && f->ops) {
                                for (n = f->ops->h; n; n = n->next) {
                                        sql_arg *a = n->data;
 
                                        if (a->type.type->s)
-                                               mvc_create_dependency(sql, 
a->type.type->base.id, nf->base.id, TYPE_DEPENDENCY);
+                                               mvc_create_dependency(sql, 
&a->type.type->base, nf->base.id, TYPE_DEPENDENCY);
                                }
                        }
                        if (!f->varres && f->res) {
@@ -939,10 +939,10 @@ create_func(mvc *sql, char *sname, char 
                                        sql_arg *a = n->data;
 
                                        if (a->type.type->s)
-                                               mvc_create_dependency(sql, 
a->type.type->base.id, nf->base.id, TYPE_DEPENDENCY);
+                                               mvc_create_dependency(sql, 
&a->type.type->base, nf->base.id, TYPE_DEPENDENCY);
                                }
                        }
-                       mvc_create_dependencies(sql, id_l, nf->base.id, 
!IS_PROC(f) ? FUNC_DEPENDENCY : PROC_DEPENDENCY);
+                       mvc_create_dependencies(sql, blist, nf->base.id, 
!IS_PROC(f) ? FUNC_DEPENDENCY : PROC_DEPENDENCY);
                }
                sa_destroy(sql->sa);
                sql->sa = sa;
diff --git a/sql/backends/monet5/sql_upgrades.c 
b/sql/backends/monet5/sql_upgrades.c
--- a/sql/backends/monet5/sql_upgrades.c
+++ b/sql/backends/monet5/sql_upgrades.c
@@ -861,7 +861,7 @@ sql_update_nov2019_missing_dependencies(
                                        list *id_l = rel_dependencies(sql, r);
 
                                        for (node *o = id_l->h ; o ; o = 
o->next) {
-                                               sqlid next = *(sqlid*) o->data;
+                                               sqlid next = ((sql_base*) 
o->data)->id;
                                                if (next != f->base.id) {
                                                        pos += snprintf(buf + 
pos, bufsize - pos, "%s(%d,%d,%d)", first ? "" : ",", next,
                                                                                
        f->base.id, (int)(!IS_PROC(f) ? FUNC_DEPENDENCY : PROC_DEPENDENCY));
@@ -897,7 +897,7 @@ sql_update_nov2019_missing_dependencies(
                                                list *id_l = 
rel_dependencies(sql, r);
 
                                                for (node *o = id_l->h ; o ; o 
= o->next) {
-                                                       sqlid next = *(sqlid*) 
o->data;
+                                                       sqlid next = 
((sql_base*) o->data)->id;
                                                        if (next != t->base.id) 
{
                                                                pos += 
snprintf(buf + pos, bufsize - pos, "%s(%d,%d,%d)", first ? "" : ",",
                                                                                
                next, t->base.id, (int) VIEW_DEPENDENCY);
@@ -925,7 +925,7 @@ sql_update_nov2019_missing_dependencies(
                                                        list *id_l = 
rel_dependencies(sql, r);
 
                                                        for (node *o = id_l->h 
; o ; o = o->next) {
-                                                               sqlid next = 
*(sqlid*) o->data;
+                                                               sqlid next = 
((sql_base*) o->data)->id;
                                                                if (next != 
tr->base.id) {
                                                                        pos += 
snprintf(buf + pos, bufsize - pos, "%s(%d,%d,%d)", first ? "" : ",",
                                                                                
                        next, tr->base.id, (int) TRIGGER_DEPENDENCY);
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
@@ -1590,18 +1590,18 @@ exps_deps(mvc *sql, list *exps, list *re
 }
 
 static int
-id_cmp(sqlid *id1, sqlid *id2)
+id_cmp(sql_base *id1, sql_base *id2)
 {
-       if (*id1 == *id2)
+       if (id1->id == id2->id)
                return 0;
        return -1;
 }
 
 static list *
-cond_append(list *l, sqlid *id)
+cond_append(list *l, sql_base *b)
 {
-       if (*id >= FUNC_OIDS && !list_find(l, id, (fcmp) &id_cmp))
-                list_append(l, id);
+       if (b->id >= FUNC_OIDS && !list_find(l, b, (fcmp) &id_cmp))
+               list_append(l, b);
        return l;
 }
 
@@ -1644,7 +1644,7 @@ exp_deps(mvc *sql, sql_exp *e, list *ref
 
                if (e->l && exps_deps(sql, e->l, refs, l) != 0)
                        return -1;
-               cond_append(l, &f->func->base.id);
+               cond_append(l, &f->func->base);
                if (e->l && list_length(e->l) == 2 && 
strcmp(f->func->base.name, "next_value_for") == 0) {
                        /* add dependency on seq nr */
                        list *nl = e->l;
@@ -1657,7 +1657,7 @@ exp_deps(mvc *sql, sql_exp *e, list *ref
                                if (sche) {
                                        sql_sequence *seq = 
find_sql_sequence(sql->session->tr, sche, seq_name);
                                        if (seq)
-                                               cond_append(l, &seq->base.id);
+                                               cond_append(l, &seq->base);
                                }
                        }
                }
@@ -1667,13 +1667,13 @@ exp_deps(mvc *sql, sql_exp *e, list *ref
 
                if (e->l && exps_deps(sql, e->l, refs, l) != 0)
                        return -1;
-               cond_append(l, &a->func->base.id);
+               cond_append(l, &a->func->base);
        } break;
        case e_cmp: {
                if (e->flag == cmp_or || e->flag == cmp_filter) {
                        if (e->flag == cmp_filter) {
                                sql_subfunc *f = e->f;
-                               cond_append(l, &f->func->base.id);
+                               cond_append(l, &f->func->base);
                        }
                        if (exps_deps(sql, e->l, refs, l) != 0 ||
                                exps_deps(sql, e->r, refs, l) != 0)
@@ -1715,7 +1715,7 @@ rel_deps(mvc *sql, sql_rel *r, list *ref
                if (!t && c)
                        t = c->t;
 
-               cond_append(l, &t->base.id);
+               cond_append(l, &t->base);
                /* find all used columns */
                for (node *en = r->exps->h; en; en = en->next) {
                        sql_exp *exp = en->data;
@@ -1726,10 +1726,10 @@ rel_deps(mvc *sql, sql_rel *r, list *ref
                                continue;
                        } else if (oname[0] == '%') {
                                sql_idx *i = find_sql_idx(t, oname+1);
-                               cond_append(l, &i->base.id);
+                               cond_append(l, &i->base);
                        } else {
                                sql_column *c = find_sql_column(t, oname);
-                               cond_append(l, &c->base.id);
+                               cond_append(l, &c->base);
                        }
                }
        } break;
@@ -1737,7 +1737,7 @@ rel_deps(mvc *sql, sql_rel *r, list *ref
                if ((IS_TABLE_PROD_FUNC(r->flag) || r->flag == 
TABLE_FROM_RELATION) && r->r) { /* table producing function, excluding 
rel_relational_func cases */
                        sql_exp *op = r->r;
                        sql_subfunc *f = op->f;
-                       cond_append(l, &f->func->base.id);
+                       cond_append(l, &f->func->base);
                }
        } break;
        case op_join:
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -63,8 +63,8 @@ mvc_init_create_view(mvc *m, sql_schema 
                if (r)
                        r = sql_processrelation(m, r, 0, 0);
                if (r) {
-                       list *id_l = rel_dependencies(m, r);
-                       mvc_create_dependencies(m, id_l, t->base.id, 
VIEW_DEPENDENCY);
+                       list *blist = rel_dependencies(m, r);
+                       mvc_create_dependencies(m, blist, t->base.id, 
VIEW_DEPENDENCY);
                }
                sa_reset(m->ta);
                assert(r);
@@ -1313,29 +1313,32 @@ mvc_drop_column(mvc *m, sql_table *t, sq
 }
 
 void
-mvc_create_dependency(mvc *m, sqlid id, sqlid depend_id, sql_dependency 
depend_type)
+mvc_create_dependency(mvc *m, sql_base *b, sqlid depend_id, sql_dependency 
depend_type)
 {
-       TRC_DEBUG(SQL_TRANS, "Create dependency: %d %d %d\n", id, depend_id, 
(int) depend_type);
-       if ( (id != depend_id) || (depend_type == BEDROPPED_DEPENDENCY) )
-               sql_trans_create_dependency(m->session->tr, id, depend_id, 
depend_type);
+       TRC_DEBUG(SQL_TRANS, "Create dependency: %d %d %d\n", b->id, depend_id, 
(int) depend_type);
+       if ( (b->id != depend_id) || (depend_type == BEDROPPED_DEPENDENCY) ) {
+               if (!b->new)
+                       sql_trans_add_dependency(m->session->tr, b->id);
+               sql_trans_create_dependency(m->session->tr, b->id, depend_id, 
depend_type);
+       }
 }
 
 void
-mvc_create_dependencies(mvc *m, list *id_l, sqlid depend_id, sql_dependency 
dep_type)
+mvc_create_dependencies(mvc *m, list *blist, sqlid depend_id, sql_dependency 
dep_type)
 {
-       node *n = id_l->h;
-       int i;
-
        TRC_DEBUG(SQL_TRANS, "Create dependencies on '%d' of type: %d\n", 
depend_id, (int) dep_type);
-       for (i = 0; i < list_length(id_l); i++)
-       {
-               mvc_create_dependency(m, *(sqlid *) n->data, depend_id, 
dep_type);
-               n = n->next;
+       if (!list_empty(blist)) {
+               for (node *n = blist->h ; n ; n = n->next) {
+                       sql_base *b = n->data;
+                       if (!b->new) /* only add old objects to the transaction 
dependency list */
+                               sql_trans_add_dependency(m->session->tr, b->id);
+                       mvc_create_dependency(m, b, depend_id, dep_type);
+               }
        }
 }
 
 int
-mvc_check_dependency(mvc * m, sqlid id, sql_dependency type, list *ignore_ids)
+mvc_check_dependency(mvc *m, sqlid id, sql_dependency type, list *ignore_ids)
 {
        list *dep_list = NULL;
 
diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h
--- a/sql/server/sql_mvc.h
+++ b/sql/server/sql_mvc.h
@@ -237,8 +237,8 @@ extern sql_trigger * mvc_create_trigger(
 extern int mvc_drop_trigger(mvc *m, sql_schema *s, sql_trigger * tri);
 
 /*dependency control*/
-extern void mvc_create_dependency(mvc *m, sqlid id, sqlid depend_id, 
sql_dependency depend_type);
-extern void mvc_create_dependencies(mvc *m, list *id_l, sqlid depend_id, 
sql_dependency dep_type);
+extern void mvc_create_dependency(mvc *m, sql_base *b, sqlid depend_id, 
sql_dependency depend_type);
+extern void mvc_create_dependencies(mvc *m, list *blist, sqlid depend_id, 
sql_dependency dep_type);
 extern int mvc_check_dependency(mvc *m, sqlid id, sql_dependency type, list 
*ignore_ids);
 
 /* variable management */
diff --git a/sql/server/sql_partition.c b/sql/server/sql_partition.c
--- a/sql/server/sql_partition.c
+++ b/sql/server/sql_partition.c
@@ -284,8 +284,8 @@ bootstrap_partition_expression(mvc *sql,
 
                nr = sql_processrelation(sql, nr, 0, 0);
                if (nr) {
-                       list *id_l = rel_dependencies(sql, nr);
-                       mvc_create_dependencies(sql, id_l, mt->base.id, 
FUNC_DEPENDENCY);
+                       list *blist = rel_dependencies(sql, nr);
+                       mvc_create_dependencies(sql, blist, mt->base.id, 
FUNC_DEPENDENCY);
                }
                r->l = base;
        }
diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h
--- a/sql/storage/sql_storage.h
+++ b/sql/storage/sql_storage.h
@@ -410,8 +410,8 @@ extern int sql_session_reset(sql_session
 extern int sql_trans_begin(sql_session *s);
 extern int sql_trans_end(sql_session *s, int commit /* rollback=0, or commit=1 
temporaries */);
 
+extern int sql_trans_add_dependency(sql_trans* tr, sqlid id);
 extern list* sql_trans_schema_user_dependencies(sql_trans *tr, sqlid 
schema_id);
-extern int sql_trans_add_dependency(sql_trans* tr, sqlid id);
 extern int sql_trans_create_dependency(sql_trans *tr, sqlid id, sqlid 
depend_id, sql_dependency depend_type);
 extern int sql_trans_drop_dependencies(sql_trans *tr, sqlid depend_id);
 extern int sql_trans_drop_dependency(sql_trans *tr, sqlid id, sqlid depend_id, 
sql_dependency depend_type);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -261,6 +261,17 @@ schema_destroy(sqlstore *store, sql_sche
        _DELETE(s);
 }
 
+int
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to