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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list