Changeset: 09d73ee0caa1 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=09d73ee0caa1 Modified Files: sql/backends/monet5/sql.c sql/include/sql_catalog.h sql/storage/bat/bat_storage.c sql/storage/bat/bat_storage.h Branch: mosaic Log Message:
Handle 'compressed' columns/idxs in storage code (todo handle logging) diffs (114 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 @@ -589,10 +589,17 @@ alter_table(Client cntxt, mvc *sql, char bat bid = 0; BAT *b = store_funcs.bind_col(sql->session->tr, nc, 0); sql_delta *d; - char *msg = MOScompressInternal(cntxt, &bid, &b->batCacheid, c->storage_type); + char *msg; + if (c->t->access == TABLE_WRITABLE) + return sql_message("40002!ALTER TABLE: SET STORAGE for column %s.%s only allowed on READ or INSERT ONLY tables", c->t->base.name, c->base.name); + + msg = MOScompressInternal(cntxt, &bid, &b->batCacheid, c->storage_type); if (msg) return msg; + allocate_delta(sql->session->tr, nc); d = nc->data; + assert(nc->base.allocated == 1); + nc->base.rtime = nc->base.wtime = sql->session->tr->wtime; d->bid = bid; mvc_storage(sql, nc, c->storage_type); } 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 @@ -371,6 +371,7 @@ typedef struct sql_idx { struct list *columns; /* list of sql_kc */ struct sql_table *t; struct sql_key *key; /* key */ + char *storage_type; void *data; } sql_idx; 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 @@ -544,6 +544,18 @@ dup_del(sql_trans *tr, sql_table *ot, sq return ok; } +void +allocate_delta(sql_trans *tr, sql_column *c) +{ + if (!c->data || !c->base.allocated) { + int type = c->type.type->localtype; + sql_column *oc = tr_find_column(tr->parent, c); + sql_delta *bat = c->data = ZNEW(sql_delta), *obat = timestamp_delta(oc->data, tr->stime); + (void)dup_bat(tr, c->t, obat, bat, type, isNew(oc), c->base.flag == TR_NEW); + c->base.allocated = 1; + } +} + static void append_col(sql_trans *tr, sql_column *c, void *i, int tpe) { @@ -1606,6 +1618,23 @@ gtr_minmax( sql_trans *tr ) } static int +tr_update_storage( sql_trans *tr, sql_delta *obat, sql_delta *cbat) +{ + int ok = LOG_OK; + + (void)tr; + assert(store_nr_active==1); + + assert (obat->bid != 0 && cbat->bid != 0); + assert (obat->cached == NULL && cbat->cached == NULL); + temp_destroy(obat->bid); + obat->bid = cbat->bid; + temp_dup(cbat->bid); + assert(obat->ibid == cbat->ibid); + return ok; +} + +static int tr_update_delta( sql_trans *tr, sql_delta *obat, sql_delta *cbat, int unique) { int ok = LOG_OK; @@ -1801,7 +1830,10 @@ update_table(sql_trans *tr, sql_table *f } } else { assert(oc->base.allocated); - tr_update_delta(tr, oc->data, cc->data, cc->unique == 1); + if (cc->storage_type && (!cc->storage_type || strcmp(cc->storage_type, oc->storage_type) != 0)) + tr_update_storage(tr, oc->data, cc->data); + else + tr_update_delta(tr, oc->data, cc->data, cc->unique == 1); } oc->null = cc->null; @@ -1846,7 +1878,10 @@ update_table(sql_trans *tr, sql_table *f } } else { assert(oi->base.allocated); - tr_update_delta(tr, oi->data, ci->data, 0); + if (ci->storage_type && (!ci->storage_type || strcmp(ci->storage_type, oi->storage_type) != 0)) + tr_update_storage(tr, oi->data, ci->data); + else + tr_update_delta(tr, oi->data, ci->data, 0); } if (oi->base.rtime < ci->base.rtime) diff --git a/sql/storage/bat/bat_storage.h b/sql/storage/bat/bat_storage.h --- a/sql/storage/bat/bat_storage.h +++ b/sql/storage/bat/bat_storage.h @@ -50,5 +50,7 @@ extern int bat_storage_init( store_funct extern int dup_bat(sql_trans *tr, sql_table *t, sql_delta *obat, sql_delta *bat, int type, int oc_isnew, int c_isnew); extern sql_delta * timestamp_delta( sql_delta *d, int ts); +extern void allocate_delta(sql_trans *tr, sql_column *c); + #endif /*BATSTORAGE_H */ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list