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