Changeset: 0637da923fbf for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0637da923fbf
Modified Files:
        gdk/gdk.h
        gdk/gdk_bbp.c
        monetdb5/ChangeLog.Apr2019
        monetdb5/modules/atoms/blob.c
Branch: Apr2019
Log Message:

Changed the BLOB compare function.
x'FF' now is larger than x'0000' because the first byte of the value
is larger.  Before it was smaller because the blob was shorter.


diffs (85 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -774,7 +774,8 @@ typedef struct {
 
 #define GDKLIBRARY_TALIGN      061036U /* talign field in BBP.dir */
 #define GDKLIBRARY_NIL_NAN     061037U /* flt/dbl NIL not represented by NaN */
-#define GDKLIBRARY             061040U
+#define GDKLIBRARY_BLOB_SORT   061040U /* blob compare changed */
+#define GDKLIBRARY             061041U
 
 typedef struct BAT {
        /* static bat properties */
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -657,6 +657,12 @@ heapinit(BAT *b, const char *buf, int *h
        b->theap.newstorage = (storage_t) storage;
        b->theap.farmid = BBPselectfarm(PERSISTENT, b->ttype, offheap);
        b->theap.dirty = false;
+#ifdef GDKLIBRARY_BLOB_SORT
+       if (bbpversion <= GDKLIBRARY_BLOB_SORT && strcmp(type, "blob") == 0) {
+               b->tsorted = b->trevsorted = false;
+               b->tnosorted = b->tnorevsorted = 0;
+       }
+#endif
        if (b->theap.free > b->theap.size)
                GDKfatal("BBPinit: \"free\" value larger than \"size\" in heap 
of bat %d\n", (int) bid);
        return n;
@@ -836,6 +842,7 @@ BBPheader(FILE *fp)
                exit(1);
        }
        if (bbpversion != GDKLIBRARY &&
+           bbpversion != GDKLIBRARY_BLOB_SORT &&
            bbpversion != GDKLIBRARY_NIL_NAN &&
            bbpversion != GDKLIBRARY_TALIGN) {
                GDKfatal("BBPinit: incompatible BBP version: expected 0%o, got 
0%o.\n"
diff --git a/monetdb5/ChangeLog.Apr2019 b/monetdb5/ChangeLog.Apr2019
--- a/monetdb5/ChangeLog.Apr2019
+++ b/monetdb5/ChangeLog.Apr2019
@@ -1,6 +1,10 @@
 # ChangeLog file for MonetDB5
 # This file is updated with Maddlog
 
+* Fri Feb  8 2019 Sjoerd Mullender <[email protected]>
+- Changed the way blobs are ordered.  Before, shorter blobs came before
+  longer, now the contents is compared first.
+
 * Wed Jan 23 2019 Sjoerd Mullender <[email protected]>
 - Removed function blob.tostring() since it cannot guarantee that the
   resulting string is properly encoded in UTF-8.
diff --git a/monetdb5/modules/atoms/blob.c b/monetdb5/modules/atoms/blob.c
--- a/monetdb5/modules/atoms/blob.c
+++ b/monetdb5/modules/atoms/blob.c
@@ -84,15 +84,21 @@ static char hexit[] = "0123456789ABCDEF"
 int
 BLOBcmp(const blob *l, const blob *r)
 {
-       size_t len = l->nitems;
-
-       if (len != r->nitems)
-               return len < r->nitems ? -1 : len > r->nitems ? 1 : 0;
-
-       if (len == ~(size_t) 0)
-               return (0);
-
-       return memcmp(l->data, r->data, len);
+       int c;
+       if (r->nitems == ~(size_t)0)
+               return l->nitems != ~(size_t)0;
+       if (l->nitems == ~(size_t)0)
+               return -1;
+       if (l->nitems < r->nitems) {
+               c = memcmp(l->data, r->data, l->nitems);
+               if (c == 0)
+                       return -1;
+       } else {
+               c = memcmp(l->data, r->data, r->nitems);
+               if (c == 0)
+                       return l->nitems > r->nitems;
+       }
+       return c;
 }
 
 void
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to