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