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, >r_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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list