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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list