Changeset: a4162cc57103 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/a4162cc57103
Modified Files:
        sql/backends/monet5/sql.c
        sql/storage/bat/bat_storage.c
        sql/storage/sql_storage.h
Branch: strheapvacuum
Log Message:

swap col bats poc


diffs (104 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
@@ -4899,6 +4899,7 @@ SQLstr_column_vacuum(Client cntxt, MalBl
        BAT* bn = NULL;
        str msg = NULL;
        int access = 0;
+       int res = 0;
        const char *sname = *getArgReference_str(stk, pci, 1);
        const char *tname = *getArgReference_str(stk, pci, 2);
        const char *cname = *getArgReference_str(stk, pci, 3);
@@ -4907,13 +4908,29 @@ SQLstr_column_vacuum(Client cntxt, MalBl
                return msg;
        if ((msg = checkSQLContext(cntxt)) != NULL)
                return msg;
-       if ((b = mvc_bind(m, sname, tname, cname, access)) == NULL)
+
+       sql_trans *tr = m->session->tr;
+       sqlstore *store = tr->store;
+       sql_schema *s = NULL;
+       sql_table *t = NULL;
+       sql_column *c = NULL;
+
+       if((s = mvc_bind_schema(m, sname)) == NULL)
+               throw(SQL, "sql.column_vacuum", SQLSTATE(42S22) "Invalid or 
missing schema %s",sname);
+       if((t = mvc_bind_table(m, s, tname)) == NULL)
+               throw(SQL, "sql.column_vacuum", SQLSTATE(42S22) "Invalid or 
missing table %s.%s",sname,tname);
+       if ((c = mvc_bind_column(m, t, cname)) == NULL)
                throw(SQL, "sql.column_vacuum", SQLSTATE(42S22) "Column missing 
%s.%s",sname,tname);
+
+       if ((b = store->storage_api.bind_col(tr, c, access)) == NULL)
+               throw(SQL, "sql.column_vacuum", SQLSTATE(42S22) 
"storage_api.bind_col failed for %s.%s.%s",sname, tname, cname);
        if ((bn = COLcopy(b, b->ttype, true, b->batRole)) == NULL)
-               throw(SQL, "sql.column_vacuum", SQLSTATE(42S22) "COLcopy failed 
%s.%s",sname,tname);
-       BBPkeepref(bn->batCacheid);
+               throw(SQL, "sql.column_vacuum", SQLSTATE(42S22) "COLcopy failed 
%s.%s.%s", sname, tname, cname);
+       if ((res = (int) store->storage_api.swap_bats(tr, c, bn)) != LOG_OK) {
+               BBPreclaim(bn);
+               throw(SQL, "sql.column_vacuum", SQLSTATE(42S22) "swap_bats call 
failed %s.%s.%s", sname, tname, cname);
+       }
        BBPunfix(b->batCacheid);
-       // TODO where to? back in storage
        return MAL_SUCCEED;
 }
 
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
@@ -3273,6 +3273,28 @@ bind_cands(sql_trans *tr, sql_table *t, 
        return r;
 }
 
+static int
+swap_bats(sql_trans *tr, sql_column *col, BAT *bn)
+{
+       sqlid id = col->base.id;
+       sql_delta *d = ATOMIC_PTR_GET(&col->data);
+       bat bid = d->cs.bid;
+       lock_column(tr->store, id);
+       d->cs.bid = temp_create(bn);
+       d->cs.uibid = 0;
+       d->cs.uvbid = 0;
+       d->cs.ucnt = 0;
+       d->cs.cleared = 0;
+       d->cs.ts = tr->tid;
+       d->cs.refcnt = 1;
+       // maybe unfix in caller
+       // bat_destroy(bn);
+       temp_destroy(bid);
+       unlock_column(tr->store, id);
+       return LOG_OK;
+}
+
+
 void
 bat_storage_init( store_functions *sf)
 {
@@ -3315,6 +3337,7 @@ bat_storage_init( store_functions *sf)
        sf->drop_del = &drop_del;
 
        sf->clear_table = &clear_table;
+       sf->swap_bats = &swap_bats;
 }
 
 #if 0
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
@@ -175,6 +175,7 @@ typedef void *(*del_dup_fptr) (sql_table
 typedef int (*upgrade_col_fptr) (sql_trans *tr, sql_column *c);
 typedef int (*upgrade_idx_fptr) (sql_trans *tr, sql_idx *i);
 typedef int (*upgrade_del_fptr) (sql_trans *tr, sql_table *t);
+typedef int (*swap_bats_fptr) (sql_trans *tr, sql_column *c, BAT *b);
 
 /*
 -- free the storage resources for columns, indices and tables
@@ -245,6 +246,7 @@ typedef struct store_functions {
        upgrade_col_fptr upgrade_col;
        upgrade_idx_fptr upgrade_idx;
        upgrade_del_fptr upgrade_del;
+       swap_bats_fptr swap_bats;
 } store_functions;
 
 typedef int (*logger_create_fptr) (struct sqlstore *store, int debug, const 
char *logdir, int catalog_version);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to