Changeset: 0dc0ef3e0c0f for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0dc0ef3e0c0f
Modified Files:
        sql/storage/bat/bat_storage.c
        sql/storage/bat/bat_storage.h
        sql/storage/store.c
Branch: Feb2013
Log Message:

make sure we mark bats as key when we have a unique contraint without null's


diffs (134 lines):

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
@@ -1371,8 +1371,8 @@ gtr_minmax( sql_trans *tr )
        return _gtr_update(tr, &gtr_minmax_table);
 }
 
-int 
-tr_update_delta( sql_trans *tr, sql_delta *obat, sql_delta *cbat, BUN 
snapshot_minsize)
+static int 
+tr_update_delta( sql_trans *tr, sql_delta *obat, sql_delta *cbat, BUN 
snapshot_minsize, int unique)
 {
        int ok = LOG_OK;
        BAT *ups, *ins, *cur;
@@ -1390,6 +1390,8 @@ tr_update_delta( sql_trans *tr, sql_delt
 
        cur = temp_descriptor(obat->bid);
        ins = temp_descriptor(cbat->ibid);
+       if (unique)
+               BATkey(BATmirror(cur), TRUE);
        /* any inserts */
        if (BUNlast(ins) > BUNfirst(ins) || cleared) {
                if (BUNlast(ins) > ins->batInserted && (store_nr_active > 1)) { 
@@ -1428,6 +1430,8 @@ tr_update_delta( sql_trans *tr, sql_delt
                                /* swap cur and ins */
                                BAT *newcur = ins;
 
+                               if (unique)
+                                       BATkey(BATmirror(newcur), TRUE);
                                temp_destroy(obat->bid);
                                temp_destroy(cbat->bid);
 
@@ -1517,7 +1521,7 @@ tr_update_delta( sql_trans *tr, sql_delt
        return ok;
 }
 
-int
+static int
 tr_update_dbat(sql_trans *tr, sql_dbat *tdb, sql_dbat *fdb, int cleared)
 {
        int ok = LOG_OK;
@@ -1566,7 +1570,13 @@ update_table(sql_trans *tr, sql_table *f
                if (!cc->base.wtime) 
                        continue;
                assert(oc->base.wtime < cc->base.wtime);
-               tr_update_delta(tr, oc->data, cc->data, SNAPSHOT_MINSIZE);
+               tr_update_delta(tr, oc->data, cc->data, SNAPSHOT_MINSIZE, 
cc->unique == 1);
+               oc->null = cc->null;
+               oc->unique = cc->unique;
+               if (cc->storage_type && (!cc->storage_type || 
strcmp(cc->storage_type, oc->storage_type) != 0))
+                       oc->storage_type = sa_strdup(tr->sa, cc->storage_type);
+               if (cc->def && (!cc->def || strcmp(cc->def, oc->def) != 0))
+                       oc->def = sa_strdup(tr->sa, cc->def);
 
                if (oc->base.rtime < cc->base.rtime)
                        oc->base.rtime = cc->base.rtime;
@@ -1583,7 +1593,7 @@ update_table(sql_trans *tr, sql_table *f
                        if (!oi->data || !ci->base.wtime)
                                continue;
 
-                       tr_update_delta(tr, oi->data, ci->data, 
SNAPSHOT_MINSIZE);
+                       tr_update_delta(tr, oi->data, ci->data, 
SNAPSHOT_MINSIZE, 0);
 
                        if (oi->base.rtime < ci->base.rtime)
                                oi->base.rtime = ci->base.rtime;
@@ -1600,7 +1610,7 @@ update_table(sql_trans *tr, sql_table *f
        return ok;
 }
 
-int 
+static int 
 tr_log_delta( sql_trans *tr, sql_delta *cbat, int cleared)
 {
        int ok = LOG_OK;
@@ -1636,7 +1646,7 @@ tr_log_delta( sql_trans *tr, sql_delta *
        return ok;
 }
 
-int
+static int
 tr_log_dbat(sql_trans *tr, sql_dbat *fdb, int cleared)
 {
        int ok = LOG_OK;
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
@@ -71,10 +71,6 @@ extern int log_destroy_delta(sql_delta *
 extern int log_destroy_dbat(sql_dbat *bat);
 extern BUN clear_delta(sql_trans *tr, sql_delta *bat);
 extern BUN clear_dbat(sql_trans *tr, sql_dbat *bat);
-extern int tr_update_delta( sql_trans *tr, sql_delta *obat, sql_delta *cbat, 
BUN snapshot_minsize);
-extern int tr_update_dbat(sql_trans *tr, sql_dbat *tdb, sql_dbat *fdb, int 
cleared);
-extern int tr_log_delta( sql_trans *tr, sql_delta *cbat, int cleared);
-extern int tr_log_dbat(sql_trans *tr, sql_dbat *fdb, int cleared);
 
 #endif /*BATSTORAGE_H */
 
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -1791,7 +1791,7 @@ sql_trans_copy_idx( sql_trans *tr, sql_t
        sql_table *sysidx = find_sql_table(syss, "idxs");
        sql_table *sysic = find_sql_table(syss, "objects");
        node *n;
-       int nr;
+       int nr, unique = 0;
        sql_idx *ni = SA_ZNEW(tr->sa, sql_idx);
 
        base_init(tr->sa, &ni->base, i->base.id, TR_NEW, i->base.name);
@@ -1801,10 +1801,16 @@ sql_trans_copy_idx( sql_trans *tr, sql_t
        ni->type = i->type;
        ni->key = NULL;
 
+       if (list_length(i->columns) == 1)
+               unique = 1;
        for (n = i->columns->h, nr = 0; n; n = n->next, nr++) {
                sql_kc *okc = n->data, *ic;
 
                list_append(ni->columns, ic = kc_dup_(tr, TR_NEW, okc, t, 1));
+               if (ic->c->unique != (unique & !okc->c->null)) {
+                       ic->c->base.wtime = tr->wstime;
+                       okc->c->unique = ic->c->unique = (unique & 
(!okc->c->null));
+               }
 
                table_funcs.table_insert(tr, sysic, &ni->base.id, 
ic->c->base.name, &nr);
                sysic->base.wtime = sysic->s->base.wtime = tr->wtime = 
tr->wstime;
@@ -2441,7 +2447,6 @@ rollforward_create_seq(sql_trans *tr, sq
        return k;
 }
 
-
 static sql_column *
 rollforward_create_column(sql_trans *tr, sql_column *c, int mode)
 {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to