Changeset: b5f11ef07ad7 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b5f11ef07ad7
Modified Files:
        gdk/gdk_bbp.c
        gdk/gdk_private.h
        sql/storage/bat/bat_storage.c
        sql/storage/bat/bat_storage.h
        sql/storage/store.c
Branch: default
Log Message:

Merge with Feb2013 branch.


diffs (200 lines):

diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1623,7 +1623,7 @@ BBPinsert(BATstore *bs)
        const char *s;
        long_str dirname;
        bat i;
-       int idx = (int) (pid & BBP_THREADMASK);
+       int idx = threadmask(pid);
 
        assert(bs->B.H != NULL);
        assert(bs->B.T != NULL);
@@ -1832,7 +1832,7 @@ BBPclear(bat i)
        int lock = locked_by ? pid != locked_by : 1;
 
        if (BBPcheck(i, "BBPclear")) {
-               bbpclear(ABS(i), (int) (pid & BBP_THREADMASK), lock ? 
"BBPclear" : NULL);
+               bbpclear(ABS(i), threadmask(pid), lock ? "BBPclear" : NULL);
        }
 }
 
@@ -1881,7 +1881,7 @@ BBPrename(bat bid, const char *nme)
        if (strlen(dirname) + strLen(nme) + 1 >= IDLENGTH) {
                return BBPRENAME_LONG;
        }
-       idx = (int) (MT_getpid() & BBP_THREADMASK);
+       idx = threadmask(MT_getpid());
        MT_lock_set(&GDKtrimLock(idx), "BBPrename");
        MT_lock_set(&GDKnameLock, "BBPrename");
        i = BBP_find(nme, FALSE);
@@ -2915,9 +2915,10 @@ BBPcold(bat i)
                i = -i;
        if (BBPcheck(i, "BBPcold")) {
                MT_Id pid = MT_getpid();
+               int idx = threadmask(pid);
                int lock = locked_by ? pid != locked_by : 1;
 
-               MT_lock_set(&GDKtrimLock(pid), "BBPcold");
+               MT_lock_set(&GDKtrimLock(idx), "BBPcold");
                if (lock)
                        MT_lock_set(&GDKswapLock(i), "BBPcold");
                /* make very cold and insert on top of trim list */
@@ -2930,7 +2931,7 @@ BBPcold(bat i)
                }
                if (lock)
                        MT_lock_unset(&GDKswapLock(i), "BBPcold");
-               MT_lock_unset(&GDKtrimLock(pid), "BBPcold");
+               MT_lock_unset(&GDKtrimLock(idx), "BBPcold");
        }
 }
 
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -128,9 +128,14 @@ extern MT_Lock MT_system_lock;
 #define GDKswapLock(x)  GDKbatLock[(x)&BBP_BATMASK].swap
 #define GDKhashLock(x)  GDKbatLock[(x)&BBP_BATMASK].hash
 #define GDKimprintsLock(x)  GDKbatLock[(x)&BBP_BATMASK].imprints
-#define GDKtrimLock(y)  GDKbbpLock[(y)&BBP_THREADMASK].trim
-#define GDKcacheLock(y) GDKbbpLock[(y)&BBP_THREADMASK].alloc
-#define BBP_free(y)    GDKbbpLock[(y)&BBP_THREADMASK].free
+#if SIZEOF_SIZE_T == 8
+#define threadmask(y)  ((int) ((mix_int((unsigned int) y) ^ mix_int((unsigned 
int) (y >> 32))) & BBP_THREADMASK))
+#else
+#define threadmask(y)  ((int) (mix_int(y) & BBP_THREADMASK))
+#endif
+#define GDKtrimLock(y) GDKbbpLock[y].trim
+#define GDKcacheLock(y)        GDKbbpLock[y].alloc
+#define BBP_free(y)    GDKbbpLock[y].free
 
 #define SORTloop_TYPE(b, p, q, tl, th, TYPE)                           \
        if (!BATtordered(b))                                            \
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
@@ -1582,8 +1582,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)
+static int 
+tr_update_delta( sql_trans *tr, sql_delta *obat, sql_delta *cbat, int unique)
 {
        int ok = LOG_OK;
        BAT *ups, *ins, *cur = NULL;
@@ -1605,12 +1605,16 @@ tr_update_delta( sql_trans *tr, sql_delt
        if (obat->bid)
                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 ((!obat->ibase && BATcount(ins) > SNAPSHOT_MINSIZE)){
                        /* swap cur and ins */
                        BAT *newcur = ins;
 
+                       if (unique)
+                               BATkey(BATmirror(newcur), TRUE);
                        temp_destroy(cbat->bid);
                        temp_destroy(obat->bid);
                        obat->bid = cbat->ibid;
@@ -1663,7 +1667,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;
@@ -1767,7 +1771,7 @@ update_table(sql_trans *tr, sql_table *f
                        }
                } else {
                        assert(oc->base.allocated);
-                       tr_update_delta(tr, oc->data, cc->data);
+                       tr_update_delta(tr, oc->data, cc->data, cc->unique == 
1);
                }
 
                if (oc->base.rtime < cc->base.rtime)
@@ -1805,7 +1809,7 @@ update_table(sql_trans *tr, sql_table *f
                                }
                        } else {
                                assert(oi->base.allocated);
-                               tr_update_delta(tr, oi->data, ci->data);
+                               tr_update_delta(tr, oi->data, ci->data, 0);
                        }
 
                        if (oi->base.rtime < ci->base.rtime)
@@ -1827,7 +1831,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;
@@ -1863,7 +1867,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
@@ -47,11 +47,6 @@ typedef struct sql_dbat {
 /* initialize bat storage call back functions interface */
 extern int bat_storage_init( store_functions *sf );
 
-extern int tr_update_delta( sql_trans *tr, sql_delta *obat, sql_delta *cbat );
-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);
-
 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);
 
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -1797,7 +1797,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);
@@ -1807,10 +1807,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;
@@ -2460,7 +2466,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
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to