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

Reply via email to