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