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