Changeset: 5c88a2c664c8 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5c88a2c664c8 Modified Files: sql/backends/monet5/sql.c sql/include/sql_catalog.h sql/storage/bat/bat_storage.c sql/storage/sql_storage.h sql/storage/store.c Branch: nospare Log Message:
handle truncate diffs (truncated from 380 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 @@ -1443,7 +1443,7 @@ mvc_delta_values(Client cntxt, MalBlkPtr if (nrows) { if (tname) { - cleared = (t->cleared != 0); + cleared = 0;//(t->cleared != 0); deletes = (lng) store->storage_api.count_del(m->session->tr, t); if (cname) { if ((msg=mvc_insert_delta_values(m, col1, col2, col3, col4, col5, col6, col7, c, cleared, deletes)) != NULL) @@ -1459,7 +1459,7 @@ mvc_delta_values(Client cntxt, MalBlkPtr for (n = s->tables.set->h; n ; n = n->next) { t = (sql_table *) n->data; if (isTable(t)) { - cleared = (t->cleared != 0); + cleared = 0;//(t->cleared != 0); deletes = (lng) store->storage_api.count_del(m->session->tr, t); for (node *nn = t->columns.set->h; nn ; nn = nn->next) { 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 @@ -666,7 +666,6 @@ typedef struct sql_table { list *members; int drop_action; /* only needed for alter drop table */ - int cleared; /* cleared in the current transaction */ void *data; struct sql_schema *s; struct sql_table *po; /* the outer transactions table */ 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 @@ -21,10 +21,6 @@ static int tc_gc_del( sqlstore *store, s static int tr_merge_delta( sql_trans *tr, sql_delta *obat); -static MT_Lock destroy_lock = MT_LOCK_INITIALIZER(destroy_lock); -sql_dbat *tobe_destroyed_dbat = NULL; -sql_delta *tobe_destroyed_delta = NULL; - sql_delta * timestamp_delta( sql_trans *tr, sql_delta *d) { @@ -1846,17 +1842,6 @@ static int cleanup(void) { int ok = LOG_OK; - - MT_lock_set(&destroy_lock); - if (tobe_destroyed_delta) { - ok = destroy_bat(tobe_destroyed_delta); - tobe_destroyed_delta = NULL; - } - if (ok == LOG_OK && tobe_destroyed_dbat) { - ok = destroy_dbat(NULL, tobe_destroyed_dbat); - tobe_destroyed_dbat = NULL; - } - MT_lock_unset(&destroy_lock); return ok; } @@ -1942,9 +1927,7 @@ clear_delta(sql_trans *tr, sql_delta *ba if (bat->bid) { b = temp_descriptor(bat->bid); if (b) { - assert(!isEbat(b)); sz += BATcount(b); - /* for transactions we simple switch to ibid only */ temp_destroy(bat->bid); bat->bid = 0; bat_destroy(b); @@ -1979,10 +1962,12 @@ clear_delta(sql_trans *tr, sql_delta *ba static BUN clear_col(sql_trans *tr, sql_column *c) { - sql_delta *delta; + sql_delta *delta, *odelta = c->data; if ((delta = bind_col_data(tr, c)) == NULL) return BUN_NONE; + if (delta && !inTransaction(tr, c->t) && odelta != delta) + trans_add(tr, &c->base, delta, &tc_gc_col, &log_update_col); if (delta) return clear_delta(tr, delta); return 0; @@ -1991,12 +1976,14 @@ clear_col(sql_trans *tr, sql_column *c) static BUN clear_idx(sql_trans *tr, sql_idx *i) { - sql_delta *delta; + sql_delta *delta, *odelta = i->data; if (!isTable(i->t) || (hash_index(i->type) && list_length(i->columns) <= 1) || !idx_has_column(i->type)) return 0; if ((delta = bind_idx_data(tr, i)) == NULL) return BUN_NONE; + if (delta && !inTransaction(tr, i->t) && odelta != delta) + trans_add(tr, &i->base, delta, &tc_gc_idx, &log_update_idx); if (delta) return clear_delta(tr, delta); return 0; @@ -2031,15 +2018,50 @@ clear_dbat(sql_trans *tr, sql_dbat *bat) static BUN clear_del(sql_trans *tr, sql_table *t) { - sql_dbat *bat; + sql_dbat *bat, *obat = t->data; if ((bat = bind_del_data(tr, t)) == NULL) return BUN_NONE; + + if (!inTransaction(tr, t) && obat != bat) + trans_add(tr, &t->base, bat, &tc_gc_del, &log_update_del); return clear_dbat(tr, bat); } +static BUN +clear_table(sql_trans *tr, sql_table *t) +{ + node *n = t->columns.set->h; + sql_column *c = n->data; + BUN sz = 0, nsz = 0; + + if ((nsz = clear_col(tr, c)) == BUN_NONE) + return BUN_NONE; + sz += nsz; + if ((nsz = clear_del(tr, t)) == BUN_NONE) + return BUN_NONE; + sz -= nsz; + + for (n = n->next; n; n = n->next) { + c = n->data; + + if (clear_col(tr, c) == BUN_NONE) + return BUN_NONE; + } + if (t->idxs.set) { + for (n = t->idxs.set->h; n; n = n->next) { + sql_idx *ci = n->data; + + if (isTable(ci->t) && idx_has_column(ci->type) && + clear_idx(tr, ci) == BUN_NONE) + return BUN_NONE; + } + } + return sz; +} + static int -tr_log_delta( sql_trans *tr, sql_delta *cbat, int cleared, char tpe, oid id) +tr_log_delta( sql_trans *tr, sql_delta *cbat, char tpe, oid id) { sqlstore *store = tr->store; gdk_return ok = GDK_SUCCEED; @@ -2053,7 +2075,7 @@ tr_log_delta( sql_trans *tr, sql_delta * if (ins == NULL) return LOG_ERR; - if (cleared && log_bat_clear(store->logger, cbat->name, tpe, id) != GDK_SUCCEED) { + if (cbat->cleared && log_bat_clear(store->logger, cbat->name, tpe, id) != GDK_SUCCEED) { bat_destroy(ins); return LOG_ERR; } @@ -2080,7 +2102,7 @@ tr_log_delta( sql_trans *tr, sql_delta * } static int -tr_log_dbat(sql_trans *tr, sql_dbat *fdb, int cleared, char tpe, oid id) +tr_log_dbat(sql_trans *tr, sql_dbat *fdb, char tpe, oid id) { sqlstore *store = tr->store; gdk_return ok = GDK_SUCCEED; @@ -2091,7 +2113,7 @@ tr_log_dbat(sql_trans *tr, sql_dbat *fdb (void)tr; assert (fdb->dname); - if (cleared && log_bat_clear(store->logger, fdb->dname, tpe, id) != GDK_SUCCEED) + if (fdb->cleared && log_bat_clear(store->logger, fdb->dname, tpe, id) != GDK_SUCCEED) return LOG_ERR; db = temp_descriptor(fdb->dbid); @@ -2135,6 +2157,18 @@ tr_merge_delta( sql_trans *tr, sql_delta cur = temp_descriptor(obat->bid); if(!cur) return LOG_ERR; + if (isEbat(cur)) { + temp_destroy(obat->bid); + obat->bid = ebat2real(cur->batCacheid, 0); + bat_destroy(cur); + if(obat->bid != BID_NIL) { + cur = temp_descriptor(obat->bid); + if (cur == NULL) + return LOG_ERR; + } else { + return LOG_ERR; + } + } } ins = temp_descriptor(obat->ibid); if(!ins) { @@ -2219,7 +2253,7 @@ log_update_col( sql_trans *tr, sql_chang sql_delta *delta = c->data; if (!isTempTable(c->t)) delta->ts = commit_ts; - ok = tr_log_delta(tr, c->data, c->t->cleared, c->t->bootstrap?0:LOG_COL, c->base.id); + ok = tr_log_delta(tr, c->data, c->t->bootstrap?0:LOG_COL, c->base.id); if (ok == LOG_OK && !tr->parent) { sql_delta *d = delta; /* clean up and merge deltas */ @@ -2246,7 +2280,7 @@ log_update_idx( sql_trans *tr, sql_chang sql_delta *delta = i->data; if (!isTempTable(i->t)) delta->ts = commit_ts; - ok = tr_log_delta(tr, i->data, i->t->cleared, i->t->bootstrap?0:LOG_COL, i->base.id); + ok = tr_log_delta(tr, i->data, i->t->bootstrap?0:LOG_COL, i->base.id); if (ok == LOG_OK && !tr->parent) { sql_delta *d = delta; /* clean up and merge deltas */ @@ -2273,7 +2307,7 @@ log_update_del( sql_trans *tr, sql_chang sql_dbat *dbat = t->data; if (!isTempTable(t)) dbat->ts = commit_ts; - ok = tr_log_dbat(tr, t->data, t->cleared, t->bootstrap?0:LOG_TAB, t->base.id); + ok = tr_log_dbat(tr, t->data, t->bootstrap?0:LOG_TAB, t->base.id); if (ok == LOG_OK && !tr->parent) { sql_dbat *d = dbat; /* clean up and merge deltas */ @@ -2405,9 +2439,7 @@ bat_storage_init( store_functions *sf) sf->log_destroy_idx = (log_destroy_idx_fptr)&log_destroy_idx; sf->log_destroy_del = (log_destroy_del_fptr)&log_destroy_del; - sf->clear_col = (clear_col_fptr)&clear_col; - sf->clear_idx = (clear_idx_fptr)&clear_idx; - sf->clear_del = (clear_del_fptr)&clear_del; + sf->clear_table = (clear_table_fptr)&clear_table; sf->cleanup = (cleanup_fptr)&cleanup; } diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h --- a/sql/storage/sql_storage.h +++ b/sql/storage/sql_storage.h @@ -171,13 +171,8 @@ typedef int (*destroy_del_fptr) (struct typedef int (*log_destroy_col_fptr) (sql_trans *tr, struct sql_change *c, ulng commit_ts, ulng oldest); typedef int (*log_destroy_idx_fptr) (sql_trans *tr, struct sql_change *c, ulng commit_ts, ulng oldest); typedef int (*log_destroy_del_fptr) (sql_trans *tr, struct sql_change *c, ulng commit_ts, ulng oldest); -/* --- clear any storage resources for columns, indices and tables --- returns number of removed tuples -*/ -typedef BUN (*clear_col_fptr) (sql_trans *tr, sql_column *c); -typedef BUN (*clear_idx_fptr) (sql_trans *tr, sql_idx *i); -typedef BUN (*clear_del_fptr) (sql_trans *tr, sql_table *t); + +typedef BUN (*clear_table_fptr) (sql_trans *tr, sql_table *t); /* -- update_table rollforward the changes made from table ft to table tt @@ -192,18 +187,9 @@ typedef int (*update_table_fptr) (sql_tr typedef int (*gtrans_update_fptr) (sql_trans *tr); /* --- handle inserts and updates of columns and indices --- returns LOG_OK, LOG_ERR -*/ -typedef int (*col_ins_fptr) (sql_trans *tr, sql_column *c, void *data); -typedef int (*col_upd_fptr) (sql_trans *tr, sql_column *c, void *rows, void *data); -typedef int (*idx_ins_fptr) (sql_trans *tr, sql_idx *c, void *data); -typedef int (*idx_upd_fptr) (sql_trans *tr, sql_idx *c, void *rows, void *data); -/* -- handle deletes -- returns LOG_OK, LOG_ERR */ -typedef int (*del_fptr) (sql_trans *tr, sql_table *c, void *rows); typedef int (*cleanup_fptr) (); /* backing struct for this interface */ @@ -237,10 +223,6 @@ typedef struct store_functions { log_create_idx_fptr log_create_idx; log_create_del_fptr log_create_del; - upgrade_col_fptr upgrade_col; - upgrade_idx_fptr upgrade_idx; - upgrade_del_fptr upgrade_del; - destroy_col_fptr destroy_col; destroy_idx_fptr destroy_idx; destroy_del_fptr destroy_del; @@ -249,19 +231,13 @@ typedef struct store_functions { log_destroy_idx_fptr log_destroy_idx; log_destroy_del_fptr log_destroy_del; - clear_col_fptr clear_col; - clear_idx_fptr clear_idx; - clear_del_fptr clear_del; - - col_ins_fptr col_ins; - col_upd_fptr col_upd; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list