Changeset: 8c91071e8de6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8c91071e8de6
Modified Files:
        gdk/gdk.h
        gdk/gdk_align.c
        gdk/gdk_bat.c
        gdk/gdk_batop.c
        gdk/gdk_bbp.c
        gdk/gdk_calc.c
        gdk/gdk_cross.c
        gdk/gdk_firstn.c
        gdk/gdk_group.c
        gdk/gdk_join.c
        gdk/gdk_project.c
        gdk/gdk_sample.c
        gdk/gdk_select.c
        monetdb5/extras/rapi/converters.c.h
        monetdb5/modules/kernel/algebra.c
        monetdb5/modules/kernel/bat5.c
        monetdb5/modules/kernel/microbenchmark.c
        monetdb5/modules/mal/pcre.c
        monetdb5/modules/mal/tablet.c
        sql/backends/monet5/sql_fround_impl.h
        sql/backends/monet5/sql_round_impl.h
Branch: default
Log Message:

Make it so that the tdense property is equivalent to tseqbase not being oid_nil.


diffs (truncated from 1098 to 300 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1478,14 +1478,15 @@ gdk_export void GDKqsort_rev(void *restr
        do {                                                            \
                assert(!is_oid_nil((b)->hseqbase));                     \
                (b)->batDirtydesc = 1;  /* likely already set */        \
-               /* the other head properties should already be correct */ \
+               assert(is_oid_nil((b)->tseqbase) ||                     \
+                      ATOMtype((b)->ttype) == TYPE_oid);               \
                if ((b)->ttype == TYPE_void) {                          \
                        if (is_oid_nil((b)->tseqbase)) {                \
+                               (b)->tdense = false;                    \
                                (b)->tnonil = (b)->batCount == 0;       \
                                (b)->tnil = !(b)->tnonil;               \
                                (b)->trevsorted = 1;                    \
                                (b)->tkey = (b)->batCount <= 1;         \
-                               (b)->tdense = 0;                        \
                        } else {                                        \
                                (b)->tdense = 1;                        \
                                (b)->tnonil = 1;                        \
@@ -1521,6 +1522,8 @@ gdk_export void GDKqsort_rev(void *restr
                                }                                       \
                                (b)->tseqbase = sqbs;                   \
                        }                                               \
+               } else if ((b)->ttype == TYPE_oid) {                    \
+                       (b)->tdense = !is_oid_nil((b)->tseqbase);       \
                }                                                       \
                if (!ATOMlinear((b)->ttype)) {                          \
                        (b)->tsorted = 0;                               \
diff --git a/gdk/gdk_align.c b/gdk/gdk_align.c
--- a/gdk/gdk_align.c
+++ b/gdk/gdk_align.c
@@ -169,7 +169,7 @@ BATmaterialize(BAT *b)
        assert(cnt >= q - p);
        ALGODEBUG fprintf(stderr, "#BATmaterialize(%d);\n", (int) 
b->batCacheid);
 
-       if (!BATtdense(b) || tt != TYPE_void) {
+       if (tt != TYPE_void) {
                /* no voids */
                return GDK_SUCCEED;
        }
@@ -193,16 +193,19 @@ BATmaterialize(BAT *b)
        b->batDirtydesc = TRUE;
        b->theap.dirty = TRUE;
 
-       /* set the correct dense info */
-       b->tdense = TRUE;
-
        /* So now generate [t..t+cnt-1] */
        t = b->tseqbase;
        x = (oid *) b->theap.base;
-       for (; p < q; p++)
-               *x++ = t++;
-       cnt = t - b->tseqbase;
-       BATsetcount(b, cnt);
+       if (is_oid_nil(t)) {
+               assert(!b->tdense);
+               while (p < q)
+                       x[p++] = oid_nil;
+       } else {
+               assert(b->tdense);
+               while (p < q)
+                       x[p++] = t++;
+       }
+       BATsetcount(b, b->batCount);
 
        /* cleanup the old heaps */
        HEAPfree(&tail, 0);
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -93,7 +93,7 @@ BATcreatedesc(oid hseq, int tt, int heap
        bn->tnil = FALSE;
        bn->tsorted = bn->trevsorted = ATOMlinear(tt) != 0;
        bn->tident = BATstring_t;
-       bn->tseqbase = (tt == TYPE_void) ? oid_nil : 0;
+       bn->tseqbase = oid_nil;
        bn->tprops = NULL;
 
        bn->batRole = role;
@@ -377,6 +377,7 @@ BATattach(int tt, const char *heapfile, 
                bn->tnonil = cap == 0;
                bn->tnil = 0;
                bn->tdense = 0;
+               bn->tseqbase = oid_nil;
                if (cap > 1) {
                        bn->tsorted = 0;
                        bn->trevsorted = 0;
@@ -540,7 +541,7 @@ BATclear(BAT *b, int force)
                b->batInserted = 0;
        BATsetcount(b,0);
        BAThseqbase(b, 0);
-       BATtseqbase(b, 0);
+       BATtseqbase(b, ATOMtype(b->ttype) == TYPE_oid ? 0 : oid_nil);
        b->batDirty = TRUE;
        BATsettrivprop(b);
        b->tnosorted = b->tnorevsorted = 0;
@@ -797,20 +798,11 @@ COLcopy(BAT *b, int tt, int writable, in
        }
        /* set properties (note that types may have changed in the copy) */
        if (ATOMtype(tt) == ATOMtype(b->ttype)) {
-               if (BATtvoid(b)) {
-                       /* b is either dense or has a void(nil) tail */
-                       if (bn->ttype != TYPE_void)
-                               bn->tdense = TRUE;
-                       else if (is_oid_nil(b->tseqbase))
-                               bn->tnonil = FALSE;
+               if (ATOMtype(tt) == TYPE_oid) {
                        BATtseqbase(bn, b->tseqbase);
-               } else if (bn->ttype != TYPE_void) {
-                       /* b is not dense, so set bn not dense */
-                       bn->tdense = FALSE;
+               } else {
                        BATtseqbase(bn, oid_nil);
-                       bn->tnonil = b->tnonil;
-               } else if (BATtkey(b))
-                       BATtseqbase(bn, 0);
+               }
                BATkey(bn, BATtkey(b));
                bn->tsorted = BATtordered(b);
                bn->trevsorted = BATtrevordered(b);
@@ -823,15 +815,18 @@ COLcopy(BAT *b, int tt, int writable, in
                        bn->tnokey[0] = bn->tnokey[1] = 0;
                }
                bn->tnosorted = b->tnosorted;
+               bn->tnonil = b->tnonil;
+               bn->tnil = b->tnil;
        } else if (ATOMstorage(tt) == ATOMstorage(b->ttype) &&
                   ATOMcompare(tt) == ATOMcompare(b->ttype)) {
                BUN h = BUNlast(b);
                bn->tsorted = b->tsorted;
                bn->trevsorted = b->trevsorted;
-               bn->tdense = b->tdense && ATOMtype(bn->ttype) == TYPE_oid;
+               bn->tdense = false;
                if (b->tkey)
                        BATkey(bn, true);
                bn->tnonil = b->tnonil;
+               bn->tnil = b->tnil;
                if (b->tnosorted > 0 && b->tnosorted < h)
                        bn->tnosorted = b->tnosorted;
                else
@@ -850,7 +845,7 @@ COLcopy(BAT *b, int tt, int writable, in
                }
        } else {
                bn->tsorted = bn->trevsorted = 0; /* set based on count later */
-               bn->tdense = bn->tnonil = 0;
+               bn->tdense = bn->tnonil = bn->tnil = false;
                bn->tnosorted = bn->tnorevsorted = 0;
                bn->tnokey[0] = bn->tnokey[1] = 0;
        }
@@ -931,6 +926,7 @@ setcolprops(BAT *b, const void *x)
                        if (x) {
                                b->tseqbase = * (const oid *) x;
                        }
+                       b->tdense = !is_oid_nil(b->tseqbase);
                        b->tnil = is_oid_nil(b->tseqbase);
                        b->tnonil = !b->tnil;
                } else {
@@ -991,7 +987,9 @@ setcolprops(BAT *b, const void *x)
                        b->tnorevsorted = pos;
                }
                if (b->tdense && (cmp >= 0 || * (const oid *) prv + 1 != * 
(const oid *) x)) {
+                       assert(b->ttype == TYPE_oid);
                        b->tdense = 0;
+                       b->tseqbase = oid_nil;
                }
                if (isnil) {
                        b->tnonil = 0;
@@ -1187,12 +1185,15 @@ BUNinplace(BAT *b, BUN p, const void *t,
                        if (prv != BUN_NONE &&
                            1 + * (oid *) BUNtloc(bi, prv) != * (oid *) t) {
                                b->tdense = FALSE;
+                               b->tseqbase = oid_nil;
                        } else if (nxt != BUN_NONE &&
                                   * (oid *) BUNtloc(bi, nxt) != 1 + * (oid *) 
t) {
                                b->tdense = FALSE;
+                               b->tseqbase = oid_nil;
                        } else if (prv == BUN_NONE &&
                                   nxt == BUN_NONE) {
                                b->tseqbase = * (oid *) t;
+                               b->tdense = !is_oid_nil(b->tseqbase);
                        }
                }
        } else if (b->tnosorted >= p)
@@ -1445,9 +1446,10 @@ BATkey(BAT *b, bool flag)
        if (b->tkey != flag)
                b->batDirtydesc = TRUE;
        b->tkey = flag;
-       if (!flag)
+       if (!flag) {
                b->tdense = 0;
-       else
+               b->tseqbase = oid_nil;
+       } else
                b->tnokey[0] = b->tnokey[1] = 0;
        if (flag && VIEWtparent(b)) {
                /* if a view is key, then so is the parent if the two
@@ -1480,29 +1482,26 @@ BAThseqbase(BAT *b, oid o)
 void
 BATtseqbase(BAT *b, oid o)
 {
+       assert(o <= oid_nil);
        if (b == NULL)
                return;
-       assert(o <= oid_nil);
        assert(is_oid_nil(o) || o + BATcount(b) <= GDK_oid_max);
        assert(b->batCacheid > 0);
+       if (b->tseqbase != o) {
+               b->batDirtydesc = true;
+       }
        if (ATOMtype(b->ttype) == TYPE_oid) {
-               if (b->tseqbase != o) {
-                       b->batDirtydesc = TRUE;
-               }
                b->tseqbase = o;
-               if (is_oid_nil(o)) {
-                       b->tdense = 0;
-               } else if (b->ttype == TYPE_void) {
-                       b->tdense = 1;
-               }
+               b->tdense = !is_oid_nil(o);
 
                /* adapt keyness */
                if (BATtvoid(b)) {
+                       b->tsorted = true;
                        if (is_oid_nil(o)) {
                                b->tkey = b->batCount <= 1;
                                b->tnonil = b->batCount == 0;
                                b->tnil = b->batCount > 0;
-                               b->tsorted = b->trevsorted = 1;
+                               b->trevsorted = true;
                                b->tnosorted = b->tnorevsorted = 0;
                                if (!b->tkey) {
                                        b->tnokey[0] = 0;
@@ -1517,12 +1516,15 @@ BATtseqbase(BAT *b, oid o)
                                }
                                b->tnonil = 1;
                                b->tnil = 0;
-                               b->tsorted = 1;
                                b->trevsorted = b->batCount <= 1;
                                if (!b->trevsorted)
                                        b->tnorevsorted = 1;
                        }
                }
+       } else {
+               assert(o == oid_nil);
+               b->tseqbase = oid_nil;
+               b->tdense = false;
        }
 }
 
@@ -2053,6 +2055,10 @@ BATassertProps(BAT *b)
                        assert(* (oid *) BUNtail(bi, 0) == b->tseqbase);
                }
        }
+       /* dense checks */
+       assert(!b->tdense || ATOMtype(b->ttype) == TYPE_oid);
+       assert(b->tdense == !is_oid_nil(b->tseqbase));
+       assert(!b->tdense || b->tsorted);
        /* a column cannot both have and not have NILs */
        assert(!b->tnil || !b->tnonil);
        if (b->ttype == TYPE_void) {
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -645,18 +645,22 @@ BATappend(BAT *b, BAT *n, BAT *s, bit fo
 
                b->tsorted = n->tsorted;
                b->trevsorted = n->trevsorted;
-               b->tdense = n->tdense && cand == NULL;
+               b->tdense = false;
+               b->tseqbase = oid_nil;
                b->tnonil = n->tnonil;
                b->tnil = n->tnil && cnt == BATcount(n);
                b->tseqbase = oid_nil;
                if (cand == NULL) {
                        b->tnosorted = start <= n->tnosorted && n->tnosorted < 
end ? n->tnosorted - start : 0;
                        b->tnorevsorted = start <= n->tnorevsorted && 
n->tnorevsorted < end ? n->tnorevsorted - start : 0;
-                       if (n->tdense && n->ttype == TYPE_oid)
+                       if (n->tdense && n->ttype == TYPE_oid) {
                                b->tseqbase = *(oid *) BUNtail(ni, start);
-                       else if (n->ttype == TYPE_void &&
-                                !is_oid_nil(n->tseqbase))
+                               b->tdense = true;
+                       } else if (n->ttype == TYPE_void &&
+                                  !is_oid_nil(n->tseqbase)) {
                                b->tseqbase = n->tseqbase + start;
+                               b->tdense = true;
+                       }
                } else {
                        b->tnosorted = 0;
                        b->tnorevsorted = 0;
@@ -679,6 +683,7 @@ BATappend(BAT *b, BAT *n, BAT *s, bit fo
                        b->tnosorted = 0;
                        if (b->tdense) {
                                b->tdense = FALSE;
+                               b->tseqbase = oid_nil;
                        }
                }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to