Changeset: 4cbe30e653a3 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4cbe30e653a3 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_cand.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: json Log Message:
Merge with default diffs (truncated from 1907 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_cand.c b/gdk/gdk_cand.c --- a/gdk/gdk_cand.c +++ b/gdk/gdk_cand.c @@ -500,21 +500,12 @@ canditer_init(struct canditer *ci, BAT * p = binsearchcand(ci->oids, ci->noids - 1, b->hseqbase); if (p == ci->noids) { /* all exceptions before start of b */ - p = b->hseqbase - ci->seq + ci->noids; - if (p >= cnt) { - /* no candidates left */ - *ci = (struct canditer) { - .tpe = cand_dense, - }; - return 0; - } - /* rest of list is dense */ + ci->offset = b->hseqbase - ci->seq - ci->noids; + cnt = ci->seq + cnt + ci->noids - b->hseqbase; + ci->seq = b->hseqbase; + ci->noids = 0; + ci->oids = NULL; ci->tpe = cand_dense; - cnt -= p; - ci->offset += p; - ci->seq = b->hseqbase; - if (ci->seq + cnt > b->hseqbase + BATcount(b)) - cnt = b->hseqbase + BATcount(b) - ci->seq; break; } assert(b->hseqbase > ci->seq || p == 0); 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; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list