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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list