Changeset: 425259247453 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/425259247453
Modified Files:
.bumpversion.cfg
MonetDB.spec
clients/mapilib/mapi.rc
clients/odbc/driver/driver.rc
clients/odbc/winsetup/setup.rc
cmake/monetdb-versions.cmake
gdk/gdk_batop.c
gdk/gdk_logger.c
gdk/gdk_project.c
gdk/libbat.rc
monetdb5/modules/mal/mkey.c
monetdb5/tools/libmonetdb5.rc
sql/server/rel_exp.c
sql/storage/bat/bat_storage.c
sql/test/BugTracker-2022/Tests/All
Branch: default
Log Message:
Merge with Jan2022 branch.
diffs (truncated from 523 to 300 lines):
diff --git a/.hgtags b/.hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -756,3 +756,4 @@ f458e1c71c73d6bd9636369c1406eadb74f016bf
00463fdd0d51d7ce058549a82bc74efaea6035a2 Jul2021_15
00463fdd0d51d7ce058549a82bc74efaea6035a2 Jul2021_SP3_release
db3cec8ea853884e857fcfb413428116cb95e786 Jul2021_17
+8c015afafb5903ea59b0e2cffac1138a0d82e007 Jul2021_19
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -1391,14 +1391,23 @@ BATappend_or_update(BAT *b, BAT *p, cons
else if (pos <= bi.minpos && bi.minpos
< pos + ni.count)
bi.minpos = BUN_NONE;
}
+ if (complex_cand(n)) {
+ for (BUN i = 0, j = ni.count; i < j;
i++)
+ o[i] = *(oid *)Tpos(&ni, i);
+ /* last value */
+ v = o[ni.count - 1];
+ } else {
+ for (BUN i = 0, j = ni.count; i < j;
i++)
+ o[i] = v++;
+ /* last value added (not one beyond) */
+ v--;
+ }
if (bi.maxpos != BUN_NONE) {
- if (v + ni.count - 1 >= BUNtoid(b,
bi.maxpos))
+ if (v >= BUNtoid(b, bi.maxpos))
bi.maxpos = pos + ni.count - 1;
else if (pos <= bi.maxpos && bi.maxpos
< pos + ni.count)
bi.maxpos = BUN_NONE;
}
- for (BUN i = 0, j = ni.count; i < j; i++)
- o[i] = v++;
}
} else {
/* if the extremes of n are at least as
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -14,7 +14,7 @@
#include "mutils.h"
#include <string.h>
-static gdk_return logger_add_bat(logger *lg, BAT *b, log_id id);
+static gdk_return logger_add_bat(logger *lg, BAT *b, log_id id, int tid);
static gdk_return logger_del_bat(logger *lg, log_bid bid);
/*
* The logger uses a directory to store its log files. One master log
@@ -157,18 +157,33 @@ log_find(BAT *b, BAT *d, int val)
}
static log_bid
-internal_find_bat(logger *lg, log_id id)
+internal_find_bat(logger *lg, log_id id, int tid)
{
BATiter cni = bat_iterator_nolock(lg->catalog_id);
BUN p;
if (BAThash(lg->catalog_id) == GDK_SUCCEED) {
MT_rwlock_rdlock(&cni.b->thashlock);
- HASHloop_int(cni, cni.b->thash, p, &id) {
- oid pos = p;
- if (BUNfnd(lg->dcatalog, &pos) == BUN_NONE) {
+ if (tid < 0) {
+ HASHloop_int(cni, cni.b->thash, p, &id) {
+ oid pos = p;
+ if (BUNfnd(lg->dcatalog, &pos) == BUN_NONE) {
+ MT_rwlock_rdunlock(&cni.b->thashlock);
+ return *(log_bid *)
Tloc(lg->catalog_bid, p);
+ }
+ }
+ } else {
+ BUN cp = BUN_NONE;
+ HASHloop_int(cni, cni.b->thash, p, &id) {
+ lng lid = *(lng *) Tloc(lg->catalog_lid, p);
+ if (lid != lng_nil && lid <= tid) {
+ break;
+ }
+ cp = p;
+ }
+ if (cp != BUN_NONE) {
MT_rwlock_rdunlock(&cni.b->thashlock);
- return *(log_bid *) Tloc(lg->catalog_bid, p);
+ return *(log_bid *) Tloc(lg->catalog_bid, cp);
}
}
MT_rwlock_rdunlock(&cni.b->thashlock);
@@ -232,9 +247,9 @@ log_read_clear(logger *lg, trans *tr, lo
}
static gdk_return
-la_bat_clear(logger *lg, logaction *la)
+la_bat_clear(logger *lg, logaction *la, int tid)
{
- log_bid bid = internal_find_bat(lg, la->cid);
+ log_bid bid = internal_find_bat(lg, la->cid, tid);
BAT *b;
if (lg->debug & 1)
@@ -603,7 +618,7 @@ la_bat_update_count(logger *lg, log_id i
static gdk_return
la_bat_updates(logger *lg, logaction *la, int tid)
{
- log_bid bid = internal_find_bat(lg, la->cid);
+ log_bid bid = internal_find_bat(lg, la->cid, tid);
BAT *b = NULL;
if (bid == 0)
@@ -705,9 +720,9 @@ log_read_destroy(logger *lg, trans *tr,
}
static gdk_return
-la_bat_destroy(logger *lg, logaction *la)
+la_bat_destroy(logger *lg, logaction *la, int tid)
{
- log_bid bid = internal_find_bat(lg, la->cid);
+ log_bid bid = internal_find_bat(lg, la->cid, tid);
if (bid && logger_del_bat(lg, bid) != GDK_SUCCEED)
return GDK_FAIL;
@@ -740,7 +755,7 @@ log_read_create(logger *lg, trans *tr, l
}
static gdk_return
-la_bat_create(logger *lg, logaction *la)
+la_bat_create(logger *lg, logaction *la, int tid)
{
BAT *b;
@@ -752,7 +767,7 @@ la_bat_create(logger *lg, logaction *la)
BATtseqbase(b, 0);
if ((b = BATsetaccess(b, BAT_READ)) == NULL ||
- logger_add_bat(lg, b, la->cid) != GDK_SUCCEED) {
+ logger_add_bat(lg, b, la->cid, tid) != GDK_SUCCEED) {
logbat_destroy(b);
return GDK_FAIL;
}
@@ -827,15 +842,15 @@ la_apply(logger *lg, logaction *c, int t
break;
case LOG_CREATE:
if (!lg->flushing)
- ret = la_bat_create(lg, c);
+ ret = la_bat_create(lg, c, tid);
break;
case LOG_DESTROY:
if (!lg->flushing)
- ret = la_bat_destroy(lg, c);
+ ret = la_bat_destroy(lg, c, tid);
break;
case LOG_CLEAR:
if (!lg->flushing)
- ret = la_bat_clear(lg, c);
+ ret = la_bat_clear(lg, c, tid);
break;
default:
assert(0);
@@ -2501,7 +2516,7 @@ log_bat_persists(logger *lg, BAT *b, log
bte ta = find_type(lg, b->ttype);
logformat l;
- if (logger_add_bat(lg, b, id) != GDK_SUCCEED) {
+ if (logger_add_bat(lg, b, id, -1) != GDK_SUCCEED) {
logger_unlock(lg);
return GDK_FAIL;
}
@@ -2527,7 +2542,7 @@ gdk_return
log_bat_transient(logger *lg, log_id id)
{
logger_lock(lg);
- log_bid bid = internal_find_bat(lg, id);
+ log_bid bid = internal_find_bat(lg, id, -1);
logformat l;
l.flag = LOG_DESTROY;
@@ -2814,9 +2829,9 @@ bm_commit(logger *lg)
}
static gdk_return
-logger_add_bat(logger *lg, BAT *b, log_id id)
+logger_add_bat(logger *lg, BAT *b, log_id id, int tid)
{
- log_bid bid = internal_find_bat(lg, id);
+ log_bid bid = internal_find_bat(lg, id, tid);
lng cnt = 0;
lng lid = lng_nil;
@@ -2878,7 +2893,7 @@ log_bid
logger_find_bat(logger *lg, log_id id)
{
logger_lock(lg);
- log_bid bid = internal_find_bat(lg, id);
+ log_bid bid = internal_find_bat(lg, id, -1);
logger_unlock(lg);
return bid;
}
diff --git a/gdk/gdk_project.c b/gdk/gdk_project.c
--- a/gdk/gdk_project.c
+++ b/gdk/gdk_project.c
@@ -646,6 +646,10 @@ BATproject2(BAT *restrict l, BAT *restri
l = BATunmask(l);
if (l == NULL)
goto doreturn;
+ if (complex_cand(l)) {
+ lcount = canditer_init(&ci, NULL, l);
+ lci = &ci;
+ }
}
if (lcount == 0 ||
(l->ttype == TYPE_void && is_oid_nil(l->tseqbase)) ||
diff --git a/monetdb5/modules/mal/mkey.c b/monetdb5/modules/mal/mkey.c
--- a/monetdb5/modules/mal/mkey.c
+++ b/monetdb5/modules/mal/mkey.c
@@ -120,6 +120,11 @@
#ifdef HAVE_HGE
#define MKEYHASH_hge(valp) ((lng) (valp >> 64) ^ (lng) (valp))
#endif
+#if SIZEOF_OID == SIZEOF_INT
+#define MKEYHASH_oid(valp) MKEYHASH_int(valp)
+#else
+#define MKEYHASH_oid(valp) MKEYHASH_lng(valp)
+#endif
static inline ulng
GDK_ROTATE(ulng x, int y, int z)
@@ -408,57 +413,66 @@ MKEYbulk_rotate_xor_hash(Client cntxt, M
hbi = bat_iterator(hb);
bi = bat_iterator(b);
- switch (ATOMstorage(b->ttype)) {
- case TYPE_bte:
- MKEYbulk_rotate_xor_hashloop(bte);
- break;
- case TYPE_sht:
- MKEYbulk_rotate_xor_hashloop(sht);
- break;
- case TYPE_int:
- case TYPE_flt:
- MKEYbulk_rotate_xor_hashloop(int);
- break;
- case TYPE_lng: { /* hb and b areas may overlap, so for this case the
'restrict' keyword cannot be used */
- const ulng *h = (const ulng *) hbi.base;
- const lng *v = (const lng *) bi.base;
- if (ci1.tpe == cand_dense && ci2.tpe == cand_dense) {
- for (BUN i = 0; i < n; i++) {
- oid p1 = (canditer_next_dense(&ci1) - off1), p2
= (canditer_next_dense(&ci2) - off2);
- r[i] = GDK_ROTATE(h[p1], lbit, rbit) ^ (ulng)
MKEYHASH_lng(v[p2]);
- }
- } else {
- for (BUN i = 0; i < n; i++) {
- oid p1 = (canditer_next(&ci1) - off1), p2 =
(canditer_next(&ci2) - off2);
- r[i] = GDK_ROTATE(h[p1], lbit, rbit) ^ (ulng)
MKEYHASH_lng(v[p2]);
- }
+ if (complex_cand(b)) {
+ const ulng *restrict h = (const ulng *) hbi.base;
+ for (BUN i = 0; i < n; i++) {
+ oid p1 = canditer_next(&ci1) - off1;
+ oid p2 = canditer_next(&ci2) - off2;
+ r[i] = GDK_ROTATE(h[p1], lbit, rbit) ^
MKEYHASH_oid(*(oid*)Tpos(&bi, p2));
}
- } break;
- case TYPE_dbl:
- MKEYbulk_rotate_xor_hashloop(lng);
- break;
+ } else {
+ switch (ATOMstorage(b->ttype)) {
+ case TYPE_bte:
+ MKEYbulk_rotate_xor_hashloop(bte);
+ break;
+ case TYPE_sht:
+ MKEYbulk_rotate_xor_hashloop(sht);
+ break;
+ case TYPE_int:
+ case TYPE_flt:
+ MKEYbulk_rotate_xor_hashloop(int);
+ break;
+ case TYPE_lng: { /* hb and b areas may overlap, so for this
case the 'restrict' keyword cannot be used */
+ const ulng *h = (const ulng *) hbi.base;
+ const lng *v = (const lng *) bi.base;
+ if (ci1.tpe == cand_dense && ci2.tpe == cand_dense) {
+ for (BUN i = 0; i < n; i++) {
+ oid p1 = (canditer_next_dense(&ci1) -
off1), p2 = (canditer_next_dense(&ci2) - off2);
+ r[i] = GDK_ROTATE(h[p1], lbit, rbit) ^
(ulng) MKEYHASH_lng(v[p2]);
+ }
+ } else {
+ for (BUN i = 0; i < n; i++) {
+ oid p1 = (canditer_next(&ci1) - off1),
p2 = (canditer_next(&ci2) - off2);
+ r[i] = GDK_ROTATE(h[p1], lbit, rbit) ^
(ulng) MKEYHASH_lng(v[p2]);
+ }
+ }
+ } break;
+ case TYPE_dbl:
+ MKEYbulk_rotate_xor_hashloop(lng);
+ break;
#ifdef HAVE_HGE
- case TYPE_hge:
- MKEYbulk_rotate_xor_hashloop(hge);
- break;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]