Changeset: 97c62b87bcdb for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=97c62b87bcdb Modified Files: sql/backends/monet5/rel_bin.c sql/backends/monet5/sql.c sql/backends/monet5/sql_cat.c sql/include/sql_catalog.h sql/server/sql_mvc.c sql/storage/bat/bat_storage.c sql/storage/bat/bat_storage.h sql/storage/bat/bat_table.c sql/storage/sql_catalog.c sql/storage/sql_storage.h sql/storage/store.c sql/test/BugTracker-2010/Tests/All Branch: nospare Log Message:
initial steps for - temp schema (just keep the temp schema copied (not the tables)) - savepoints, keep eye on the recursive (parent) transaction. diffs (truncated from 1109 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 @@ -1325,10 +1325,11 @@ exp_bin(backend *be, sql_exp *e, stmt *l static stmt * stmt_col( backend *be, sql_column *c, stmt *del, int part) { + sql_trans *tr = be->mvc->session->tr; stmt *sc = stmt_bat(be, c, RDONLY, part); if (isTable(c->t) && c->t->access != TABLE_READONLY && - (!isNew(c) || !isNew(c->t) /* alter */) && + (!isNew(c) || !inTransaction(tr, c) || !isNew(c->t) /* alter */) && (c->t->persistence == SQL_PERSIST || c->t->s) && !c->t->commit_action) { stmt *i = stmt_bat(be, c, RD_INS, 0); stmt *u = stmt_bat(be, c, RD_UPD_ID, part); @@ -1344,10 +1345,11 @@ stmt_col( backend *be, sql_column *c, st static stmt * stmt_idx( backend *be, sql_idx *i, stmt *del, int part) { + sql_trans *tr = be->mvc->session->tr; stmt *sc = stmt_idxbat(be, i, RDONLY, part); if (isTable(i->t) && i->t->access != TABLE_READONLY && - (!isNew(i) || !isNew(i->t) /* alter */) && + (!isNew(i) || !inTransaction(tr, i) || !isNew(i->t) /* alter */) && (i->t->persistence == SQL_PERSIST || i->t->s) && !i->t->commit_action) { stmt *ic = stmt_idxbat(be, i, RD_INS, 0); stmt *u = stmt_idxbat(be, i, RD_UPD_ID, part); @@ -4056,6 +4058,7 @@ static stmt * update_check_ukey(backend *be, stmt **updates, sql_key *k, stmt *tids, stmt *idx_updates, int updcol) { mvc *sql = be->mvc; + //sql_trans *tr = sql->session->tr; char *msg = NULL; stmt *res = NULL; @@ -4076,7 +4079,7 @@ update_check_ukey(backend *be, stmt **up This is done using a relation join and a count (which should be zero) */ - if (!isNew(k)) { + if (!isNew(k) /*|| !inTransaction(tr, k)*/) { stmt *nu_tids = stmt_tdiff(be, dels, tids, NULL); /* not updated ids */ list *lje = sa_list(sql->sa); list *rje = sa_list(sql->sa); @@ -4189,7 +4192,7 @@ update_check_ukey(backend *be, stmt **up stmt *s = NULL, *h = NULL, *o; /* s should be empty */ - if (!isNew(k)) { + if (!isNew(k) /*|| !inTransaction(tr, k)*/) { stmt *nu_tids = stmt_tdiff(be, dels, tids, NULL); /* not updated ids */ assert (updates); 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 @@ -2353,10 +2353,10 @@ SQLtid(Client cntxt, MalBlkPtr mb, MalSt throw(SQL, "sql.tid", SQLSTATE(42S02) "Table missing %s.%s",sname,tname); c = t->columns.set->h->data; - sqlstore *store = m->session->tr->store; + sqlstore *store = m->store; nr = store->storage_api.count_col(tr, c, 1); - if (isTable(t) && t->access == TABLE_WRITABLE && (!isNew(t) /* alter */ ) && + if (isTable(t) && t->access == TABLE_WRITABLE && (!isNew(t) /* alter */ || !inTransaction(tr, t)) && t->persistence == SQL_PERSIST && !t->commit_action) inr = store->storage_api.count_col(tr, c, 0); nr -= inr; 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 @@ -68,7 +68,7 @@ table_has_updates(sql_trans *tr, sql_tab if ( b == 0) return -1; cnt |= BATcount(b) > 0; - if (isTable(t) && t->access != TABLE_READONLY && (!isNew(t) /* alter */ ) && + if (isTable(t) && t->access != TABLE_READONLY && (!isNew(t) /* alter */ /*|| !inTransaction(tr, t)*/) && t->persistence == SQL_PERSIST && !t->commit_action) cnt |= store->storage_api.count_col(tr, c, 0) > 0; BBPunfix(b->batCacheid); diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h --- a/sql/include/sql_catalog.h +++ b/sql/include/sql_catalog.h @@ -730,6 +730,8 @@ extern void column_destroy(sql_column *c extern void key_destroy(sql_key *k); extern void idx_destroy(sql_idx * i); +extern int tr_version_of_parent(sql_trans *tr, ulng ts); + extern int base_key(sql_base *b); extern node *list_find_name(list *l, const char *name); extern node *list_find_id(list *l, sqlid id); 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 @@ -479,7 +479,7 @@ mvc_trans(mvc *m) str mvc_commit(mvc *m, int chain, const char *name, bool enabling_auto_commit) { - sql_trans *cur, *tr = m->session->tr, *ctr; + sql_trans *tr = m->session->tr; int ok = SQL_OK; str msg = NULL, other; char operation[BUFSIZ]; @@ -501,7 +501,7 @@ mvc_commit(mvc *m, int chain, const char return msg; } - /* savepoint then simply make a copy of the current transaction */ + /* savepoint, simply make a new sub transaction */ if (name && name[0] != '\0') { sql_trans *tr = m->session->tr; TRC_DEBUG(SQL_TRANS, "Savepoint\n"); @@ -514,13 +514,7 @@ mvc_commit(mvc *m, int chain, const char freeException(other); return msg; } - msg = WLCcommit(m->clientid); store_unlock(m->store); - if (msg != MAL_SUCCEED) { - if ((other = mvc_rollback(m, chain, name, false)) != MAL_SUCCEED) - freeException(other); - return msg; - } m->type = Q_TRANS; m->session->schema = find_sql_schema(m->session->tr, m->session->schema_name); TRC_INFO(SQL_TRANS, "Savepoint commit '%s' done\n", name); @@ -535,28 +529,28 @@ mvc_commit(mvc *m, int chain, const char msg = createException(SQL, "sql.commit", SQLSTATE(40000) "%s transaction is aborted because of concurrency conflicts, will ROLLBACK instead", operation); return msg; } + msg = WLCcommit(m->clientid); store_unlock(m->store); + if (msg != MAL_SUCCEED) { + if ((other = mvc_rollback(m, chain, name, false)) != MAL_SUCCEED) + freeException(other); + return msg; + } return msg; } - /* first release all intermediate savepoints */ - ctr = cur = tr; - tr = tr->parent; + /* commit and cleanup nested transactions */ if (tr->parent) { store_lock(m->store); - /* change to sql_trans_commit */ - while (ctr->parent->parent != NULL && ok == SQL_OK) { - if ((ok = sql_trans_commit(ctr)) != SQL_OK) { + while (tr->parent != NULL && ok == SQL_OK) { + if ((ok = sql_trans_commit(tr)) != SQL_OK) { GDKfatal("%s transaction commit failed (perhaps your disk is full?) exiting (kernel error: %s)", operation, GDKerrbuf); } - cur = ctr = sql_trans_destroy(ctr); - tr = cur->parent; + tr = sql_trans_destroy(tr); } store_unlock(m->store); - m->session->tr = cur; + m->session->tr = tr; } - cur -> parent = tr; - tr = cur; store_lock(m->store); /* if there is nothing to commit reuse the current transaction */ @@ -564,6 +558,7 @@ mvc_commit(mvc *m, int chain, const char if (!chain) (void)sql_trans_end(m->session, 1); m->type = Q_TRANS; + /* save points not handled by WLC... msg = WLCcommit(m->clientid); store_unlock(m->store); if (msg != MAL_SUCCEED) { @@ -571,6 +566,8 @@ mvc_commit(mvc *m, int chain, const char freeException(other); return msg; } + */ + store_unlock(m->store); TRC_INFO(SQL_TRANS, "Commit done (no changes)\n"); return msg; @@ -579,6 +576,7 @@ mvc_commit(mvc *m, int chain, const char if ((ok = sql_trans_commit(tr)) != SQL_OK) { GDKfatal("%s transaction commit failed (perhaps your disk is full?) exiting (kernel error: %s)", operation, GDKerrbuf); } + /* msg = WLCcommit(m->clientid); if (msg != MAL_SUCCEED) { store_unlock(m->store); @@ -586,6 +584,7 @@ mvc_commit(mvc *m, int chain, const char freeException(other); return msg; } + */ (void)sql_trans_end(m->session, 1); if (chain) sql_trans_begin(m->session); @@ -628,13 +627,10 @@ mvc_rollback(mvc *m, int chain, const ch if (tr->name) tr->name = NULL; m->session->schema = find_sql_schema(m->session->tr, m->session->schema_name); - } else { //if (tr->parent) { + } else { /* first release all intermediate savepoints */ - /* savepoints ! - while (tr->parent->parent != NULL) { + while (tr->parent != NULL) tr = sql_trans_destroy(tr); - } - */ m->session-> tr = tr; /* make sure we do not reuse changed data */ if (tr->changes) diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c --- a/sql/storage/bat/bat_storage.c +++ b/sql/storage/bat/bat_storage.c @@ -12,8 +12,6 @@ #include "sql_string.h" #include "gdk_atoms.h" -#define inTransaction(tr, obj) (((sql_base*)obj)->ts == tr->tid) - static int log_update_col( sql_trans *tr, sql_change *c, ulng commit_ts, ulng oldest); static int log_update_idx( sql_trans *tr, sql_change *c, ulng commit_ts, ulng oldest); static int log_update_del( sql_trans *tr, sql_change *c, ulng commit_ts, ulng oldest); @@ -28,17 +26,17 @@ sql_dbat *tobe_destroyed_dbat = NULL; sql_delta *tobe_destroyed_delta = NULL; sql_delta * -timestamp_delta( sql_delta *d, ulng tid, ulng ts) +timestamp_delta( sql_trans *tr, sql_delta *d) { - while (d->next && d->ts != tid && d->ts > ts) + while (d->next && d->ts != tr->tid && (tr->parent && !tr_version_of_parent(tr, d->ts)) && d->ts > tr->ts) d = d->next; return d; } sql_dbat * -timestamp_dbat( sql_dbat *d, ulng tid, ulng ts) +timestamp_dbat( sql_trans *tr, sql_dbat *d) { - while (d->next && d->ts != tid && d->ts > ts) + while (d->next && d->ts != tr->tid && (tr->parent && !tr_version_of_parent(tr, d->ts)) && d->ts > tr->ts) d = d->next; return d; } @@ -63,7 +61,7 @@ bind_del(sql_trans *tr, sql_table *t, in assert(access == QUICK || tr->active); if (!t->data) { sql_table *ot = tr_find_table(tr->parent, t); - t->data = timestamp_dbat(ot->data, tr->tid, tr->ts); + t->data = timestamp_dbat(tr, ot->data); } return delta_bind_del(t->data, access); } @@ -105,11 +103,11 @@ bind_ucol(sql_trans *tr, sql_column *c, assert(tr->active); if (!c->data) { sql_column *oc = tr_find_column(tr->parent, c); - c->data = timestamp_delta(oc->data, tr->tid, tr->ts); + c->data = timestamp_delta(tr, oc->data); } if (!c->t->data) { sql_table *ot = tr_find_table(tr->parent, c->t); - c->t->data = timestamp_dbat(ot->data, tr->tid, tr->ts); + c->t->data = timestamp_dbat(tr, ot->data); } u = delta_bind_ubat(c->data, access, c->type.type->localtype); return u; @@ -123,11 +121,11 @@ bind_uidx(sql_trans *tr, sql_idx * i, in assert(tr->active); if (!i->data) { sql_idx *oi = tr_find_idx(tr->parent, i); - i->data = timestamp_delta(oi->data, tr->tid, tr->ts); + i->data = timestamp_delta(tr, oi->data); } if (!i->t->data) { sql_table *ot = tr_find_table(tr->parent, i->t); - i->t->data = timestamp_dbat(ot->data, tr->tid, tr->ts); + i->t->data = timestamp_dbat(tr, ot->data); } u = delta_bind_ubat(i->data, access, (oid_index(i->type))?TYPE_oid:TYPE_lng); return u; @@ -210,7 +208,7 @@ bind_col(sql_trans *tr, sql_column *c, i return NULL; if (!c->data) { sql_column *oc = tr_find_column(tr->parent, c); - c->data = timestamp_delta(oc->data, tr->tid, tr->ts); + c->data = timestamp_delta(tr, oc->data); } if (access == RD_UPD_ID || access == RD_UPD_VAL) return bind_ucol(tr, c, access); @@ -225,7 +223,7 @@ bind_idx(sql_trans *tr, sql_idx * i, int _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list