Changeset: 1cdb0e350453 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1cdb0e350453
Modified Files:
sql/backends/monet5/sql.c
sql/backends/monet5/sql_execute.c
sql/backends/monet5/sql_scenario.c
sql/backends/monet5/sql_transaction.c
sql/backends/monet5/sql_user.c
sql/common/sql_types.c
sql/include/sql_catalog.h
sql/server/sql_mvc.c
sql/server/sql_privileges.c
sql/storage/bat/bat_storage.c
sql/storage/store.c
Branch: Apr2019
Log Message:
move active flag from session into transaction (improved transaction start/end
verification)
Added stime field on base object level. This field is needed for keeping
the version of the object at start of the transaction (solves problems
with out of sink objects (deletes/inserts).
diffs (truncated from 883 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
@@ -251,7 +251,7 @@ SQLabort(Client cntxt, MalBlkPtr mb, Mal
if ((msg = checkSQLContext(cntxt)) != NULL)
return msg;
- if (sql->session->active) {
+ if (sql->session->tr->active) {
msg = mvc_rollback(sql, 0, NULL, false);
}
return msg;
@@ -1921,7 +1921,7 @@ SQLtid(Client cntxt, MalBlkPtr mb, MalSt
sql_table *t;
sql_column *c;
BAT *tids;
- size_t nr, inr = 0;
+ size_t nr, inr = 0, dcnt;
oid sb = 0;
*res = bat_nil;
@@ -1964,7 +1964,7 @@ SQLtid(Client cntxt, MalBlkPtr mb, MalSt
if (tids == NULL)
throw(SQL, "sql.tid", SQLSTATE(HY001) MAL_MALLOC_FAIL);
- if (store_funcs.count_del(tr, t)) {
+ if ((dcnt=store_funcs.count_del(tr, t)) > 0) {
BAT *d = store_funcs.bind_del(tr, t, RD_INS);
BAT *diff;
if (d == NULL) {
@@ -1973,6 +1973,8 @@ SQLtid(Client cntxt, MalBlkPtr mb, MalSt
}
diff = BATdiff(tids, d, NULL, NULL, false, BUN_NONE);
+ (void)dcnt;
+ assert(pci->argc == 6 || BATcount(diff) == (nr-dcnt));
BBPunfix(d->batCacheid);
BBPunfix(tids->batCacheid);
if (diff == NULL)
diff --git a/sql/backends/monet5/sql_execute.c
b/sql/backends/monet5/sql_execute.c
--- a/sql/backends/monet5/sql_execute.c
+++ b/sql/backends/monet5/sql_execute.c
@@ -867,6 +867,7 @@ RAstatement(Client c, MalBlkPtr mb, MalS
return msg;
if ((msg = checkSQLContext(c)) != NULL)
return msg;
+ SQLtrans(m);
if (!m->sa)
m->sa = sa_create();
if (!m->sa)
@@ -900,6 +901,10 @@ RAstatement(Client c, MalBlkPtr mb, MalS
resetMalBlk(c->curprg->def, oldstop);
freeVariables(c, c->curprg->def, NULL, oldvtop);
}
+ if (!msg)
+ msg = mvc_commit(m, 0, NULL, false);
+ else
+ msg = mvc_rollback(m, 0, NULL, false);
}
return msg;
}
@@ -934,6 +939,7 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
return msg;
if ((msg = checkSQLContext(cntxt)) != NULL)
return msg;
+ SQLtrans(m);
if (!m->sa)
m->sa = sa_create();
if (!m->sa)
diff --git a/sql/backends/monet5/sql_scenario.c
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -329,11 +329,11 @@ SQLresetClient(Client c)
mvc *m = be->mvc;
assert(m->session);
- if (m->session->auto_commit && m->session->active) {
+ if (m->session->auto_commit && m->session->tr->active) {
if (mvc_status(m) >= 0)
msg = mvc_commit(m, 0, NULL, false);
}
- if (m->session->active)
+ if (m->session->tr->active)
other = mvc_rollback(m, 0, NULL, false);
res_tables_destroy(m->results);
@@ -555,7 +555,9 @@ SQLinit(Client c)
if (!m->sa) {
msg = createException(MAL, "createdb", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
} else if (maybeupgrade) {
+ SQLtrans(m);
SQLupgrades(c,m);
+ msg = mvc_commit(m, 0, NULL, false);
}
maybeupgrade = 0;
}
@@ -631,7 +633,7 @@ SQLautocommit(mvc *m)
{
str msg = MAL_SUCCEED;
- if (m->session->auto_commit && m->session->active) {
+ if (m->session->auto_commit && m->session->tr->active) {
if (mvc_status(m) < 0) {
msg = mvc_rollback(m, 0, NULL, false);
} else {
@@ -645,7 +647,7 @@ void
SQLtrans(mvc *m)
{
m->caching = m->cache;
- if (!m->session->active) {
+ if (!m->session->tr->active) {
sql_session *s;
if(mvc_trans(m) < 0) {
@@ -1109,7 +1111,7 @@ SQLparser(Client c)
commit = (!m->session->auto_commit && v);
m->session->auto_commit = (v) != 0;
m->session->ac_on_commit = m->session->auto_commit;
- if (m->session->active) {
+ if (m->session->tr->active) {
if (commit) {
msg = mvc_commit(m, 0, NULL, true);
} else {
diff --git a/sql/backends/monet5/sql_transaction.c
b/sql/backends/monet5/sql_transaction.c
--- a/sql/backends/monet5/sql_transaction.c
+++ b/sql/backends/monet5/sql_transaction.c
@@ -106,7 +106,7 @@ SQLtransaction_begin(Client cntxt, MalBl
if (sql->session->auto_commit == 0)
throw(SQL, "sql.trans", SQLSTATE(25001) "START TRANSACTION:
cannot start a transaction within a transaction");
- if (sql->session->active)
+ if (sql->session->tr->active)
msg = mvc_rollback(sql, 0, NULL, false);
sql->session->auto_commit = 0;
sql->session->ac_on_commit = 1;
@@ -135,7 +135,7 @@ SQLtransaction2(Client cntxt, MalBlkPtr
return msg;
if (sql->session->auto_commit == 0)
throw(SQL, "sql.trans", SQLSTATE(25001) "START TRANSACTION:
cannot start a transaction within a transaction");
- if (sql->session->active)
+ if (sql->session->tr->active)
msg = mvc_rollback(sql, 0, NULL, false);
sql->session->auto_commit = 0;
sql->session->ac_on_commit = 1;
diff --git a/sql/backends/monet5/sql_user.c b/sql/backends/monet5/sql_user.c
--- a/sql/backends/monet5/sql_user.c
+++ b/sql/backends/monet5/sql_user.c
@@ -552,7 +552,7 @@ monet5_user_set_def_schema(mvc *m, oid u
}
if (!schema || !mvc_set_schema(m, schema)) {
- if (m->session->active) {
+ if (m->session->tr->active) {
if((other = mvc_rollback(m, 0, NULL, false)) !=
MAL_SUCCEED)
freeException(other);
}
diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -140,6 +140,7 @@ base_init(sql_allocator *sa, sql_base *
assert(sa);
b->wtime = 0;
b->rtime = 0;
+ b->stime = 0;
b->flags = flags;
b->name = NULL;
b->refcnt = 1;
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
@@ -193,6 +193,7 @@ typedef int sqlid;
typedef struct sql_base {
int wtime;
int rtime;
+ int stime;
int allocated;
int flags;
int refcnt;
@@ -244,6 +245,7 @@ typedef struct sql_trans {
int wtime;
int schema_number; /* schema timestamp */
int schema_updates; /* set on schema changes */
+ int active; /* active transaction */
int status; /* status of the last query */
list *dropped; /* protection against recursive cascade action*/
list *moved_tables;
@@ -641,7 +643,6 @@ typedef struct sql_session {
commit, rollback, etc. */
char auto_commit;
int level; /* TRANSACTION isolation level */
- int active; /* active transaction */
int status; /* status, ok/error */
backend_stack stk;
} sql_session;
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
@@ -284,7 +284,7 @@ int
mvc_trans(mvc *m)
{
int schema_changed = 0, err = m->session->status;
- assert(!m->session->active); /* can only start a new transaction */
+ assert(!m->session->tr->active); /* can only start a new
transaction */
store_lock();
if (GDKverbose >= 1)
@@ -371,7 +371,7 @@ mvc_commit(mvc *m, int chain, const char
char operation[BUFSIZ];
assert(tr);
- assert(m->session->active); /* only commit an active transaction */
+ assert(m->session->tr->active); /* only commit an active transaction */
if (mvc_debug)
fprintf(stderr, "#mvc_commit %s\n", (name) ? name : "");
@@ -520,7 +520,7 @@ mvc_rollback(mvc *m, int chain, const ch
fprintf(stderr, "#mvc_rollback %s\n", (name) ? name : "");
assert(tr);
- assert(m->session->active); /* only abort an active transaction */
+ assert(m->session->tr->active); /* only abort an active transaction */
(void) disabling_auto_commit;
store_lock();
@@ -588,7 +588,7 @@ mvc_release(mvc *m, const char *name)
str msg = MAL_SUCCEED;
assert(tr);
- assert(m->session->active); /* only release active transactions */
+ assert(m->session->tr->active); /* only release active transactions */
if (mvc_debug)
fprintf(stderr, "#mvc_release %s\n", (name) ? name : "");
@@ -714,7 +714,7 @@ mvc_reset(mvc *m, bstream *rs, stream *w
fprintf(stderr, "#mvc_reset\n");
tr = m->session->tr;
if (tr && tr->parent) {
- assert(m->session->active == 0);
+ assert(m->session->tr->active == 0);
store_lock();
while (tr->parent->parent != NULL)
tr = sql_trans_destroy(tr);
@@ -783,7 +783,7 @@ mvc_destroy(mvc *m)
tr = m->session->tr;
if (tr) {
store_lock();
- if (m->session->active)
+ if (m->session->tr->active)
sql_trans_end(m->session);
while (tr->parent)
tr = sql_trans_destroy(tr);
diff --git a/sql/server/sql_privileges.c b/sql/server/sql_privileges.c
--- a/sql/server/sql_privileges.c
+++ b/sql/server/sql_privileges.c
@@ -736,7 +736,7 @@ mvc_set_schema(mvc *m, char *schema)
_DELETE(m->session->schema_name);
m->session->schema_name = new_schema_name;
m->type = Q_TRANS;
- if (m->session->active)
+ if (m->session->tr->active)
m->session->schema = s;
ret = 1;
} else if(new_schema_name) {
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
@@ -15,22 +15,11 @@
#define SNAPSHOT_MINSIZE ((BUN) 1024*128)
-static sql_trans *
-oldest_active_transaction(void)
-{
- sql_session *s = active_sessions->h->data;
- return s->tr;
-}
-
sql_delta *
timestamp_delta( sql_delta *d, int ts)
{
while (d->next && d->wtime > ts)
d = d->next;
- if (/* DISABLES CODE */ (0) && d && d->cached) {
- bat_destroy(d->cached);
- d->cached = NULL;
- }
return d;
}
@@ -39,10 +28,6 @@ timestamp_dbat( sql_dbat *d, int ts)
{
while (d->next && d->wtime > ts)
d = d->next;
- if (/* DISABLES CODE */ (0) && d && d->cached) {
- bat_destroy(d->cached);
- d->cached = NULL;
- }
return d;
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list