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