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

Reply via email to