Changeset: 7445cc92fa41 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7445cc92fa41
Modified Files:
        sql/storage/bat/bat_storage.c
        sql/storage/store.c
Branch: nospare
Log Message:

fixing savepoint - release - rollback issue


diffs (124 lines):

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
@@ -2779,26 +2779,11 @@ tc_gc_col( sql_store Store, sql_change *
        sql_column *c = (sql_column*)change->obj;
 
        (void)store;
-       (void)commit_ts;
-       (void)oldest;
-#if 0
-       if (/*c->t->base->deleted ||*/ !commit_ts) {
-               sql_delta *d = change->data, *o = c->data;
-
-               if (o != d) {
-                       while(o && o->next != d)
-                               o = o->next;
-               }
-               if (o == c->data)
-                       c->data = d->next;
-               else
-                       o->next = d->next;
-               d->next = NULL;
-               destroy_delta(d);
-       }
-#endif
+       /* savepoint commit (did it merge ?) */
        if (c->data != change->data || isTempTable(c->t)) /* data is freed by 
commit */
                return 1;
+       if (commit_ts && commit_ts >= TRANSACTION_ID_BASE) /* cannot cleanup 
older stuff on savepoint commits */
+               return 0;
        sql_delta *d = (sql_delta*)change->data;
        if (d->next) {
                if (d->ts > oldest)
@@ -2817,26 +2802,11 @@ tc_gc_idx( sql_store Store, sql_change *
        sql_idx *i = (sql_idx*)change->obj;
 
        (void)store;
-       (void)commit_ts;
-       (void)oldest;
-#if 0
-       if (/*i->t->base->deleted ||*/ !commit_ts) {
-               sql_delta *d = change->data, *o = i->data;
-
-               if (o != d) {
-                       while(o && o->next != d)
-                               o = o->next;
-               }
-               if (o == i->data)
-                       i->data = d->next;
-               else
-                       o->next = d->next;
-               d->next = NULL;
-               destroy_delta(d);
-       }
-#endif
+       /* savepoint commit (did it merge ?) */
        if (i->data != change->data || isTempTable(i->t)) /* data is freed by 
commit */
                return 1;
+       if (commit_ts && commit_ts >= TRANSACTION_ID_BASE) /* cannot cleanup 
older stuff on savepoint commits */
+               return 0;
        sql_delta *d = (sql_delta*)change->data;
        if (d->next) {
                if (d->ts > oldest)
@@ -2855,26 +2825,11 @@ tc_gc_del( sql_store Store, sql_change *
        sql_table *t = (sql_table*)change->obj;
 
        (void)store;
-       (void)commit_ts;
-       (void)oldest;
-#if 0
-       if (/*t->base->deleted ||*/ !commit_ts) {
-               sql_dbat *d = change->data, *o = t->data;
-
-               if (o != d) {
-                       while(o && o->next != d)
-                               o = o->next;
-               }
-               if (o == t->data)
-                       t->data = d->next;
-               else
-                       o->next = d->next;
-               d->next = NULL;
-               destroy_dbat(d);
-       }
-#endif
+       /* savepoint commit (did it merge ?) */
        if (t->data != change->data || isTempTable(t)) /* data is freed by 
commit */
                return 1;
+       if (commit_ts && commit_ts >= TRANSACTION_ID_BASE) /* cannot cleanup 
older stuff on savepoint commits */
+               return 0;
        sql_dbat *d = (sql_dbat*)change->data;
        if (d->next) {
                if (d->ts > oldest)
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3320,10 +3320,11 @@ sql_trans_copy_column( sql_trans *tr, sq
                        if (store->storage_api.create_col(tr, col) != LOG_OK)
                                return NULL;
        if (!isDeclaredTable(t)) {
-               store->table_api.table_insert(tr, syscolumn, &col->base.id, 
col->base.name, col->type.type->sqlname,
+               if (store->table_api.table_insert(tr, syscolumn, &col->base.id, 
col->base.name, col->type.type->sqlname,
                                                                 
&col->type.digits, &col->type.scale, &t->base.id,
                                                                 (col->def) ? 
col->def : ATOMnilptr(TYPE_str), &col->null, &col->colnr,
-                                                                
(col->storage_type) ? col->storage_type : ATOMnilptr(TYPE_str));
+                                                                
(col->storage_type) ? col->storage_type : ATOMnilptr(TYPE_str)) != LOG_OK)
+                       return NULL;
                if (c->type.type->s) /* column depends on type */
                        sql_trans_create_dependency(tr, c->type.type->base.id, 
col->base.id, TYPE_DEPENDENCY);
        }
@@ -3604,11 +3605,9 @@ sql_trans_commit(sql_trans *tr)
                        node *next = n->next;
                        sql_change *c = n->data;
 
-                       if (!c->cleanup) {
+                       if (!c->cleanup || c->cleanup(store, c, commit_ts, 
oldest)) {
                                _DELETE(c);
-                       } else if (c->cleanup && c->cleanup(store, c, 
commit_ts, oldest)) {
-                               _DELETE(c);
-                       } else if (tr->parent) {
+                       } else if (tr->parent) { /* need to keep everything */
                                tr->parent->changes = sa_list_append(tr->sa, 
tr->parent->changes, c);
                        } else {
                                store->changes = sa_list_append(tr->sa, 
store->changes, c);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to