Changeset: 379bdadf16db for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=379bdadf16db Modified Files: gdk/gdk_qsort.c Branch: Jul2012 Log Message:
Fixed sorting when sizeof(oid) < sizeof(size_t). The implementation for sorting with offsets into a base "heap" wasn't done properly. diffs (122 lines): diff --git a/gdk/gdk_qsort.c b/gdk/gdk_qsort.c --- a/gdk/gdk_qsort.c +++ b/gdk/gdk_qsort.c @@ -28,19 +28,6 @@ struct qsort_t { char *base; }; -#if SIZEOF_VAR_T == 8 -#define OFF(b, i) (buf->base + \ - (buf->hs == 1 ? ((unsigned char *) b)[i] + GDK_VAROFFSET : \ - (buf->hs == 2 ? ((unsigned short *) b)[i] + GDK_VAROFFSET : \ - (buf->hs == 4 ? ((unsigned int *) b)[i] : \ - ((var_t *) b)[i])))) -#else -#define OFF(b, i) (buf->base + \ - (buf->hs == 1 ? ((unsigned char *) b)[i] + GDK_VAROFFSET : \ - (buf->hs == 2 ? ((unsigned short *) b)[i] + GDK_VAROFFSET : \ - ((var_t *) b)[i]))) -#endif - /* return index of middle value at indexes a, b, and c */ #define MED3(a, b, c) (LT(a, b) ? \ (LT(b, c) ? (b) : (LT(a, c) ? (c) : (a))) : \ @@ -241,13 +228,48 @@ struct qsort_t { if (t && buf->ts) \ SWAP1((i) * buf->ts, (j) * buf->ts, t, buf->ts); \ } while (0) + +#define GDKqsort_impl GDKqsort_impl_var +#define INITIALIZER int z +#define OFF(i) (buf->base + VarHeapVal(h, i, buf->hs)) +#define CMP(i, j) (*buf->cmp)(OFF(i), OFF(j)) +/* EQ is only ever called directly after LE with the same arguments */ +#define EQ(i, j) (z == 0) +#define LE(i, j) ((z = CMP(i, j)) <= 0) +#define LT(i, j) (CMP(i, j) < 0) +#include "gdk_qsort_impl.h" +#undef GDKqsort_impl +#undef LE +#undef LT + +#define GDKqsort_impl GDKqsort_impl_var_rev +#define LE(i, j) ((z = CMP(i, j)) >= 0) +#define LT(i, j) (CMP(i, j) > 0) +#include "gdk_qsort_impl.h" +#undef GDKqsort_impl +#undef OFF +#undef CMP +#undef EQ +#undef LE +#undef LT + #define GDKqsort_impl GDKqsort_impl_any #define INITIALIZER int z +#if SIZEOF_VAR_T == 8 +#define OFF(i) (buf->base + \ + (buf->hs == 1 ? ((unsigned char *) h)[i] : \ + buf->hs == 2 ? ((unsigned short *) h)[i] : \ + buf->hs == 4 ? ((unsigned int *) h)[i] : \ + ((var_t *) h)[i])) +#else +#define OFF(i) (buf->base + \ + (buf->hs == 1 ? ((unsigned char *) h)[i] : \ + buf->hs == 2 ? ((unsigned short *) h)[i] : \ + ((var_t *) h)[i])) +#endif #define CMP(i, j) (buf->base ? \ - (*buf->cmp)(OFF(h, i), \ - OFF(h, j)) : \ - (*buf->cmp)(h + (i) * buf->hs, \ - h + (j) * buf->hs)) + (*buf->cmp)(OFF(i), OFF(j)) : \ + (*buf->cmp)(h + (i) * buf->hs, h + (j) * buf->hs)) /* EQ is only ever called directly after LE with the same arguments */ #define EQ(i, j) (z == 0) #define LE(i, j) ((z = CMP(i, j)) <= 0) @@ -266,6 +288,7 @@ struct qsort_t { #undef EQ #undef LE #undef LT + #undef SWAP /* the interface functions */ @@ -276,11 +299,18 @@ GDKqsort(void *h, void *t, void *base, s assert(hs > 0); assert(ts >= 0); + assert(tpe != TYPE_void); + buf.hs = (unsigned int) hs; buf.ts = (unsigned int) ts; buf.cmp = BATatoms[tpe].atomCmp; buf.base = base; + if (ATOMvarsized(tpe)) { + assert(base != NULL); + GDKqsort_impl_var(&buf, h, t, n); + return; + } if (base) tpe = TYPE_str; /* we need the default case */ @@ -316,11 +346,18 @@ GDKqsort_rev(void *h, void *t, void *bas assert(hs > 0); assert(ts >= 0); + assert(tpe != TYPE_void); + buf.hs = (unsigned int) hs; buf.ts = (unsigned int) ts; buf.cmp = BATatoms[tpe].atomCmp; buf.base = base; + if (ATOMvarsized(tpe)) { + assert(base != NULL); + GDKqsort_impl_var_rev(&buf, h, t, n); + return; + } if (base) tpe = TYPE_str; /* we need the default case */ _______________________________________________ Checkin-list mailing list Checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list