Changeset: 532a741491b4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=532a741491b4
Modified Files:
        gdk/gdk.h
        gdk/gdk_hash.c
        gdk/gdk_hash.h
        gdk/gdk_unique.c
        monetdb5/modules/atoms/mtime.c
        sql/rel.txt
Branch: default
Log Message:

Merge with linear-hashing branch.


diffs (104 lines):

diff --git a/gdk/gdk_hash.c b/gdk/gdk_hash.c
--- a/gdk/gdk_hash.c
+++ b/gdk/gdk_hash.c
@@ -627,6 +627,16 @@ BAThashsync(void *arg)
 }
 #endif
 
+#define EQbte(a, b)    ((a) == (b))
+#define EQsht(a, b)    ((a) == (b))
+#define EQint(a, b)    ((a) == (b))
+#define EQlng(a, b)    ((a) == (b))
+#ifdef HAVE_HGE
+#define EQhge(a, b)    ((a) == (b))
+#endif
+#define EQflt(a, b)    (is_flt_nil(a) ? is_flt_nil(b) : (a) == (b))
+#define EQdbl(a, b)    (is_dbl_nil(a) ? is_dbl_nil(b) : (a) == (b))
+
 #define starthash(TYPE)                                                        
\
        do {                                                            \
                const TYPE *restrict v = (const TYPE *) BUNtloc(bi, 0); \
@@ -642,7 +652,7 @@ BAThashsync(void *arg)
                                for (hb = hget;                         \
                                     hb != hnil;                        \
                                     hb = HASHgetlink(h, hb)) {         \
-                                       if (v[o - b->hseqbase] == v[hb]) \
+                                       if (EQ##TYPE(v[o - b->hseqbase], 
v[hb])) \
                                                break;                  \
                                }                                       \
                                h->nunique += hb == hnil;               \
@@ -663,7 +673,7 @@ BAThashsync(void *arg)
                        for (hb = hget;                                 \
                             hb != hnil;                                \
                             hb = HASHgetlink(h, hb)) {                 \
-                               if (v[o - b->hseqbase] == v[hb])        \
+                               if (EQ##TYPE(v[o - b->hseqbase], v[hb])) \
                                        break;                          \
                        }                                               \
                        h->nunique += hb == hnil;                       \
diff --git a/gdk/gdk_hash.h b/gdk/gdk_hash.h
--- a/gdk/gdk_hash.h
+++ b/gdk/gdk_hash.h
@@ -220,6 +220,15 @@ HASHgetlink(Hash *h, BUN i)
             hb = HASHgetlink(h,hb))                                    \
                if (* (const TYPE *) (v) == * (const TYPE *) BUNtloc(bi, hb))
 
+/* need to take special care comparing nil floating point values */
+#define HASHloop_fTYPE(bi, h, hb, v, TYPE)                             \
+       for (hb = HASHget(h, hash_##TYPE(h, v));                        \
+            hb != HASHnil(h);                                          \
+            hb = HASHgetlink(h,hb))                                    \
+               if (is_##TYPE##_nil(* (const TYPE *) (v))               \
+                   ? is_##TYPE##_nil(* (const TYPE *) BUNtloc(bi, hb)) \
+                   : * (const TYPE *) (v) == * (const TYPE *) BUNtloc(bi, hb))
+
 #define HASHloop_bte(bi, h, hb, v)     HASHloop_TYPE(bi, h, hb, v, bte)
 #define HASHloop_sht(bi, h, hb, v)     HASHloop_TYPE(bi, h, hb, v, sht)
 #define HASHloop_int(bi, h, hb, v)     HASHloop_TYPE(bi, h, hb, v, int)
@@ -227,8 +236,8 @@ HASHgetlink(Hash *h, BUN i)
 #ifdef HAVE_HGE
 #define HASHloop_hge(bi, h, hb, v)     HASHloop_TYPE(bi, h, hb, v, hge)
 #endif
-#define HASHloop_flt(bi, h, hb, v)     HASHloop_TYPE(bi, h, hb, v, flt)
-#define HASHloop_dbl(bi, h, hb, v)     HASHloop_TYPE(bi, h, hb, v, dbl)
+#define HASHloop_flt(bi, h, hb, v)     HASHloop_fTYPE(bi, h, hb, v, flt)
+#define HASHloop_dbl(bi, h, hb, v)     HASHloop_fTYPE(bi, h, hb, v, dbl)
 
 #define HASHfnd_str(x,y,z)                                             \
        do {                                                            \
diff --git a/gdk/gdk_unique.c b/gdk/gdk_unique.c
--- a/gdk/gdk_unique.c
+++ b/gdk/gdk_unique.c
@@ -154,6 +154,7 @@ BATunique(BAT *b, BAT *s)
                seen = NULL;
        } else if (BATcheckhash(b) ||
                   (!b->batTransient &&
+                   cnt == BATcount(b) &&
                    BAThash(b) == GDK_SUCCEED) ||
                   ((parent = VIEWtparent(b)) != 0 &&
                    BATcheckhash(BBPdescriptor(parent)))) {
@@ -215,10 +216,7 @@ BATunique(BAT *b, BAT *s)
                        mask = (BUN) 1 << 16;
                        cmp = NULL; /* no compare needed, "hash" is perfect */
                } else {
-                       if (s)
-                               mask = HASHmask(s->batCount);
-                       else
-                               mask = HASHmask(b->batCount);
+                       mask = HASHmask(cnt);
                        if (mask < ((BUN) 1 << 16))
                                mask = (BUN) 1 << 16;
                }
diff --git a/sql/rel.txt b/sql/rel.txt
--- a/sql/rel.txt
+++ b/sql/rel.txt
@@ -137,9 +137,6 @@ e_cmp
                        cmp_joined = 17,                /* special case already 
joined */
                        cmp_left = 18,                  /* special case equi 
join, keep left order */
                        cmp_left_project = 19   /* last step of outer join */
-
-                       cmp_all = 14,           cross product
-                       cmp_project = 15,       special case for projection 
joins
                )
 
 e_func
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to