Changeset: 83e6516454fc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=83e6516454fc
Removed Files:
testing/monet_options.py.in
Modified Files:
gdk/gdk.h
gdk/gdk_bat.c
gdk/gdk_batop.c
gdk/gdk_calc.c
gdk/gdk_hash.c
sql/backends/monet5/sql_statement.c
sql/include/sql_catalog.h
sql/rel.txt
sql/server/rel_select.c
sql/storage/bat/bat_storage.c
sql/storage/sql_storage.h
sql/storage/store.c
sql/test/BugTracker-2013/Tests/rangejoin_optimizer.Bug-3411.stable.out
sql/test/BugTracker-2018/Tests/All
sql/test/mergetables/Tests/mergequery.stable.out
sql/test/mergetables/Tests/part-elim.stable.out
sql/test/remote/Tests/partition_elim.stable.out
testing/Makefile.ag
testing/Mtest.py.in
Branch: default
Log Message:
Merge with Nov2019 branch.
diffs (truncated from 1877 to 300 lines):
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2720,6 +2720,7 @@ gdk_export void VIEWbounds(BAT *b, BAT *
enum prop_t {
GDK_MIN_VALUE = 3, /* smallest non-nil value in BAT */
GDK_MAX_VALUE, /* largest non-nil value in BAT */
+ GDK_HASH_MASK, /* last used hash mask */
};
gdk_export void PROPdestroy(BAT *b);
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -1087,7 +1087,8 @@ BUNappend(BAT *b, const void *t, bool fo
do {
for (prop = b->tprops; prop; prop = prop->next)
if (prop->id != GDK_MAX_VALUE &&
- prop->id != GDK_MIN_VALUE) {
+ prop->id != GDK_MIN_VALUE &&
+ prop->id != GDK_HASH_MASK) {
BATrmprop(b, prop->id);
break;
}
@@ -1168,7 +1169,8 @@ BUNdelete(BAT *b, oid o)
do {
for (prop = b->tprops; prop; prop = prop->next)
if (prop->id != GDK_MAX_VALUE &&
- prop->id != GDK_MIN_VALUE) {
+ prop->id != GDK_MIN_VALUE &&
+ prop->id != GDK_HASH_MASK) {
BATrmprop(b, prop->id);
break;
}
@@ -1255,7 +1257,8 @@ BUNinplace(BAT *b, BUN p, const void *t,
do {
for (prop = b->tprops; prop; prop = prop->next)
if (prop->id != GDK_MAX_VALUE &&
- prop->id != GDK_MIN_VALUE) {
+ prop->id != GDK_MIN_VALUE &&
+ prop->id != GDK_HASH_MASK) {
BATrmprop(b, prop->id);
break;
}
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -589,7 +589,8 @@ BATappend(BAT *b, BAT *n, BAT *s, bool f
do {
for (prop = b->tprops; prop; prop = prop->next)
if (prop->id != GDK_MAX_VALUE &&
- prop->id != GDK_MIN_VALUE) {
+ prop->id != GDK_MIN_VALUE &&
+ prop->id != GDK_HASH_MASK) {
BATrmprop(b, prop->id);
break;
}
diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c
--- a/gdk/gdk_calc.c
+++ b/gdk/gdk_calc.c
@@ -11009,6 +11009,8 @@ VARcalcxor(ValPtr ret, const ValRecord *
/* ---------------------------------------------------------------------- */
/* logical (for type bit) or bitwise (for integral types) OR */
+#define or3(a,b) ((a) == 1 || (b) == 1 ? 1 : is_bit_nil(a) ||
is_bit_nil(b) ? bit_nil : 0)
+
#define OR(a, b) ((a) | (b))
static BUN
@@ -11035,20 +11037,8 @@ or_typeswitchloop(const void *lft, int i
j = x * incr2;
bit v1 = ((const bit *) lft)[i];
bit v2 = ((const bit *) rgt)[j];
- /* note that any value not equal to 0
- * and not equal to bit_nil (0x80) is
- * considered true */
- if (v1 & 0x7F || v2 & 0x7F) {
- /* either one is true */
- ((bit *) dst)[k] = 1;
- } else if (v1 == 0 && v2 == 0) {
- /* both are false */
- ((bit *) dst)[k] = 0;
- } else {
- /* both are nil */
- ((bit *) dst)[k] = bit_nil;
- nils++;
- }
+ ((bit *) dst)[k] = or3(v1, v2);
+ nils += is_bit_nil(((bit *) dst)[k]);
k++;
x = canditer_next(ci);
if (is_oid_nil(x))
@@ -11228,6 +11218,8 @@ VARcalcor(ValPtr ret, const ValRecord *l
/* ---------------------------------------------------------------------- */
/* logical (for type bit) or bitwise (for integral types) exclusive AND */
+#define and3(a,b) ((a) == 0 || (b) == 0 ? 0 : is_bit_nil(a) ||
is_bit_nil(b) ? bit_nil : 1)
+
#define AND(a, b) ((a) & (b))
static BUN
@@ -11254,17 +11246,8 @@ and_typeswitchloop(const void *lft, int
j = x * incr2;
bit v1 = ((const bit *) lft)[i];
bit v2 = ((const bit *) rgt)[j];
- if (v1 == 0 || v2 == 0) {
- /* either one is false */
- ((bit *) dst)[k] = 0;
- } else if (!is_bit_nil(v1) &&
- !is_bit_nil(v2)) {
- /* both are true */
- ((bit *) dst)[k] = 1;
- } else {
- ((bit *) dst)[k] = bit_nil;
- nils++;
- }
+ ((bit *) dst)[k] = and3(v1, v2);
+ nils += is_bit_nil(((bit *) dst)[k]);
k++;
x = canditer_next(ci);
if (is_oid_nil(x))
@@ -12279,6 +12262,7 @@ VARcalcrsh(ValPtr ret, const ValRecord *
#define LTint(a,b) ((a) < (b))
#define LTlng(a,b) ((a) < (b))
#define LThge(a,b) ((a) < (b))
+#define LToid(a,b) ((a) < (b))
#define LTflt(a,b) ((a) < (b))
#define LTdbl(a,b) ((a) < (b))
#define LTany(a,b) ((*atomcmp)(a, b) < 0)
@@ -12287,6 +12271,7 @@ VARcalcrsh(ValPtr ret, const ValRecord *
#define EQint(a,b) ((a) == (b))
#define EQlng(a,b) ((a) == (b))
#define EQhge(a,b) ((a) == (b))
+#define EQoid(a,b) ((a) == (b))
#define EQflt(a,b) ((a) == (b))
#define EQdbl(a,b) ((a) == (b))
#define EQany(a,b) ((*atomcmp)(a, b) == 0)
@@ -12295,8 +12280,6 @@ VARcalcrsh(ValPtr ret, const ValRecord *
#define less3(a,b,i,t) (is_##t##_nil(a) || is_##t##_nil(b) ? bit_nil :
LT##t(a, b) || (i && EQ##t(a, b)))
#define grtr3(a,b,i,t) (is_##t##_nil(a) || is_##t##_nil(b) ? bit_nil :
LT##t(b, a) || (i && EQ##t(a, b)))
-#define and3(a,b) (is_bit_nil(a) ? is_bit_nil(b) || (b) ? bit_nil : 0 :
is_bit_nil(b) ? (a) ? bit_nil : 0 : (a) && (b))
-#define or3(a,b) (is_bit_nil(a) ? (is_bit_nil(b) || !(b) ? bit_nil : 1)
: ((a) ? 1 : (is_bit_nil(b) ? bit_nil : (b))))
#define not3(a) (is_bit_nil(a) ? bit_nil : !(a))
#define between3(v, lo, linc, hi, hinc, TYPE) \
@@ -12473,23 +12456,7 @@ BATcalcbetween(BAT *b, BAT *lo, BAT *hi,
cnt == ncand) {
bit res;
- if (!BATtdense(b))
- res = nils_false ? 0 : bit_nil;
- else if (!BATtdense(lo) || !BATtdense(hi))
- res = bit_nil;
- else
- res = (bit)
- ((((b->tseqbase > lo->tseqbase ||
- (linc && b->tseqbase == lo->tseqbase)) &&
- (b->tseqbase < hi->tseqbase ||
- (hinc && b->tseqbase == hi->tseqbase))) ||
- (symmetric &&
- (b->tseqbase > hi->tseqbase ||
- (hinc && b->tseqbase == hi->tseqbase)) &&
- (b->tseqbase < lo->tseqbase ||
- (linc && b->tseqbase == lo->tseqbase))))
- ^ anti);
-
+ res = BETWEEN(b->tseqbase, lo->tseqbase, hi->tseqbase, oid);
return BATconstant(b->hseqbase, TYPE_bit, &res, BATcount(b),
TRANSIENT);
}
diff --git a/gdk/gdk_hash.c b/gdk/gdk_hash.c
--- a/gdk/gdk_hash.c
+++ b/gdk/gdk_hash.c
@@ -226,6 +226,9 @@ BATcheckhash(BAT *b)
close(fd);
h->heap.parentid =
b->batCacheid;
h->heap.dirty = false;
+ BATsetprop(b, GDK_HASH_MASK,
+ TYPE_oid,
+ &(oid){h->mask + 1});
b->thash = h;
ACCELDEBUG fprintf(stderr,
"#BATcheckhash: reusing persisted hash %s\n", BATgetId(b));
MT_lock_unset(&GDKhashLock(b->batCacheid));
@@ -356,6 +359,7 @@ BAThash_impl(BAT *b, BAT *s, const char
Hash *h = NULL;
const char *nme = GDKinmemory() ? ":inmemory" :
BBP_physical(b->batCacheid);
BATiter bi = bat_iterator(b);
+ PROPrec *prop;
ACCELDEBUG t0 = GDKusec();
ACCELDEBUG fprintf(stderr, "#BAThash: create hash(" ALGOBATFMT ");\n",
@@ -393,7 +397,14 @@ BAThash_impl(BAT *b, BAT *s, const char
/* if key, or if small, don't bother dynamically
* adjusting the hash mask */
mask = HASHmask(cnt);
- } else {
+ } else if (s == NULL && (prop = BATgetprop(b, GDK_HASH_MASK)) != NULL) {
+ assert(prop->v.vtype == TYPE_oid);
+ mask = prop->v.val.oval;
+ assert((mask & (mask - 1)) == 0); /* power of two */
+ maxmask = HASHmask(cnt);
+ if (mask > maxmask)
+ mask = maxmask;
+ } else {
/* dynamic hash: we start with HASHmask(cnt)/64, or,
* if cnt large enough, HASHmask(cnt)/256; if there
* are too many collisions we try HASHmask(cnt)/64,
@@ -517,6 +528,8 @@ BAThash_impl(BAT *b, BAT *s, const char
}
break;
}
+ if (s == NULL)
+ BATsetprop(b, GDK_HASH_MASK, TYPE_oid, &(oid){h->mask + 1});
((size_t *) h->heap.base)[5] = (size_t) nslots;
#ifndef NDEBUG
/* clear unused part of Link array */
diff --git a/sql/backends/monet5/sql_statement.c
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -1589,7 +1589,7 @@ select2_join2(backend *be, stmt *op1, st
if (op1->nr < 0 && (sub && sub->nr < 0))
return NULL;
l = op1->nr;
- if ((op2->nrcols > 0 || op3->nrcols > 0) && (type == st_uselect2)) {
+ if (((cmp & CMP_BETWEEN) || op2->nrcols > 0 || op3->nrcols > 0) &&
(type == st_uselect2)) {
int k;
if (op2->nr < 0 || op3->nr < 0)
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -176,6 +176,7 @@ typedef enum comp_type {
/* for ranges we keep the requirment for symmetric */
#define CMP_SYMMETRIC 8
+#define CMP_BETWEEN 16
#define is_theta_exp(e) ((e) == cmp_gt || (e) == cmp_gte || (e) == cmp_lte ||\
(e) == cmp_lt || (e) == cmp_equal || (e) ==
cmp_notequal)
diff --git a/sql/rel.txt b/sql/rel.txt
--- a/sql/rel.txt
+++ b/sql/rel.txt
@@ -108,10 +108,13 @@ e_cmp
-> l left sub expression
-> r right sub expression (f second arg (->f) for range expressions)
-> flag compare type
- ( cmp_gt = 0,
- cmp_gte = 1,
- cmp_lte = 2,
- cmp_lt = 3,
+ ( cmp_gt = 0, or [ v > l && v < h ]
+ cmp_gte = 1, or [ v >= l && v < h ]
+ cmp_lte = 2, or [ v > l && v <= h ]
+ cmp_lt = 3, or [ v >= l && v <= h ]
+ uses flag&CMP_BETWEEN bit for
handling nil
+ open ranges and isNull
vs NULL
+ uses flag&CMP_SYMMETRIC bit
for symmetric
cmp_equal = 4,
cmp_notequal = 5,
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -3202,6 +3202,8 @@ rel_logical_exp(sql_query *query, sql_re
re2 = exp_binop(sql->sa, re1, re2, max);
re1 = tmp;
symmetric = 0;
+ if (!re1 || !re2)
+ return NULL;
}
flag = (symmetric)?CMP_SYMMETRIC:0;
@@ -3225,9 +3227,9 @@ rel_logical_exp(sql_query *query, sql_re
e2 = exp_atom_bool(sql->sa, 1);
rel = rel_select(sql->sa, rel, exp_compare(sql->sa,
e1, e2, cmp_equal));
} else if (sc->token == SQL_NOT_BETWEEN) {
- rel = rel_compare_exp_(query, rel, le, re1, re2,
3|flag, 1, 0);
+ rel = rel_compare_exp_(query, rel, le, re1, re2,
3|CMP_BETWEEN|flag, 1, 0);
} else {
- rel = rel_compare_exp_(query, rel, le, re1, re2,
3|flag, 0, 0);
+ rel = rel_compare_exp_(query, rel, le, re1, re2,
3|CMP_BETWEEN|flag, 0, 0);
}
return rel;
}
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
@@ -15,6 +15,10 @@
#define SNAPSHOT_MINSIZE ((BUN) 1024*128)
+static MT_Lock destroy_lock = MT_LOCK_INITIALIZER("destroy_lock");
+sql_dbat *tobe_destroyed_dbat = NULL;
+sql_delta *tobe_destroyed_delta = NULL;
+
static sql_trans *
oldest_active_transaction(void)
{
@@ -1880,6 +1884,56 @@ destroy_dbat(sql_trans *tr, sql_dbat *ba
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list