Changeset: 1e2a8ffbed05 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1e2a8ffbed05
Modified Files:
        gdk/gdk_bat.c
Branch: default
Log Message:

Check min/max properties.
If present, they have to be correct, i.e., they have to occur in the
BAT, and they must indeed be the smallest/largest value.


diffs (94 lines):

diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -2191,11 +2191,29 @@ BATassertProps(BAT *b)
                         * prove uniqueness, we can do a simple
                         * scan */
                        /* only call compare function if we have to */
-                       int cmpprv = b->tsorted | b->trevsorted | b->tkey;
-                       int cmpnil = b->tnonil | b->tnil;
+                       bool cmpprv = b->tsorted | b->trevsorted | b->tkey;
+                       bool cmpnil = b->tnonil | b->tnil;
+                       PROPrec *prop;
+                       const void *maxval = NULL;
+                       const void *minval = NULL;
+                       bool seenmax = false, seenmin = false;
 
+                       if ((prop = BATgetprop(b, GDK_MAX_VALUE)) != NULL)
+                               maxval = VALptr(&prop->v);
+                       if ((prop = BATgetprop(b, GDK_MIN_VALUE)) != NULL)
+                               minval = VALptr(&prop->v);
                        BATloop(b, p, q) {
                                valp = BUNtail(bi, p);
+                               if (maxval) {
+                                       cmp = cmpf(maxval, valp);
+                                       assert(cmp >= 0);
+                                       seenmax |= cmp == 0;
+                               }
+                               if (minval) {
+                                       cmp = cmpf(minval, valp);
+                                       assert(cmp <= 0);
+                                       seenmin |= cmp == 0;
+                               }
                                if (prev && cmpprv) {
                                        cmp = cmpf(prev, valp);
                                        assert(!b->tsorted || cmp <= 0);
@@ -2212,7 +2230,7 @@ BATassertProps(BAT *b)
                                                 * for them */
                                                seennil = true;
                                                cmpnil = 0;
-                                               if (!cmpprv) {
+                                               if (!cmpprv && maxval == NULL 
&& minval == NULL) {
                                                        /* we were
                                                         * only
                                                         * checking
@@ -2226,12 +2244,23 @@ BATassertProps(BAT *b)
                                }
                                prev = valp;
                        }
+                       assert(maxval == NULL || seenmax);
+                       assert(minval == NULL || seenmin);
                } else {        /* b->tkey && !b->tsorted && !b->trevsorted */
                        /* we need to check for uniqueness the hard
                         * way (i.e. using a hash table) */
                        const char *nme = BBP_physical(b->batCacheid);
                        Hash *hs = NULL;
                        BUN mask;
+                       PROPrec *prop;
+                       const void *maxval = NULL;
+                       const void *minval = NULL;
+                       bool seenmax = false, seenmin = false;
+
+                       if ((prop = BATgetprop(b, GDK_MAX_VALUE)) != NULL)
+                               maxval = VALptr(&prop->v);
+                       if ((prop = BATgetprop(b, GDK_MIN_VALUE)) != NULL)
+                               minval = VALptr(&prop->v);
 
                        if ((hs = GDKzalloc(sizeof(Hash))) == NULL) {
                                fprintf(stderr,
@@ -2261,6 +2290,16 @@ BATassertProps(BAT *b)
                                BUN hb;
                                BUN prb;
                                valp = BUNtail(bi, p);
+                               if (maxval) {
+                                       cmp = cmpf(maxval, valp);
+                                       assert(cmp >= 0);
+                                       seenmax |= cmp == 0;
+                               }
+                               if (minval) {
+                                       cmp = cmpf(minval, valp);
+                                       assert(cmp <= 0);
+                                       seenmin |= cmp == 0;
+                               }
                                prb = HASHprobe(hs, valp);
                                for (hb = HASHget(hs,prb);
                                     hb != HASHnil(hs);
@@ -2276,6 +2315,8 @@ BATassertProps(BAT *b)
                        }
                        HEAPfree(&hs->heap, true);
                        GDKfree(hs);
+                       assert(maxval == NULL || seenmax);
+                       assert(minval == NULL || seenmin);
                }
          abort_check:
                assert(!b->tnil || seennil);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to