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

Reply via email to