Changeset: a7beddadbe8c for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a7beddadbe8c Modified Files: gdk/gdk_imprints.c gdk/gdk_select.c monetdb5/optimizer/opt_mergetable.c Branch: default Log Message:
Merge with Oct2020 branch.
diffs (truncated from 423 to 300 lines):
diff --git a/gdk/gdk_imprints.c b/gdk/gdk_imprints.c
--- a/gdk/gdk_imprints.c
+++ b/gdk/gdk_imprints.c
@@ -21,89 +21,91 @@
#define IMPRINTS_VERSION 2
#define IMPRINTS_HEADER_SIZE 4 /* nr of size_t fields in header */
-#define BINSIZE(B, FUNC, T) do { \
- switch (B) { \
+#define BINSIZE(B, FUNC, T) \
+ do { \
+ switch (B) { \
case 8: FUNC(T,8); break; \
case 16: FUNC(T,16); break; \
case 32: FUNC(T,32); break; \
case 64: FUNC(T,64); break; \
default: assert(0); break; \
- } \
-} while (0)
+ } \
+ } while (0)
#define GETBIN(Z,X,B) \
-do { \
- int _i; \
- Z = 0; \
- for (_i = 1; _i < B; _i++) \
- Z += ((X) >= bins[_i]); \
-} while (0)
+ do { \
+ int _i; \
+ Z = 0; \
+ for (_i = 1; _i < B; _i++) \
+ Z += ((X) >= bins[_i]); \
+ } while (0)
#define IMPS_CREATE(TYPE,B) \
-do { \
- uint##B##_t mask, prvmask; \
- uint##B##_t *restrict im = (uint##B##_t *) imps; \
- const TYPE *restrict col = (TYPE *) Tloc(b, 0); \
- const TYPE *restrict bins = (TYPE *) inbins; \
- const BUN page = IMPS_PAGE / sizeof(TYPE); \
- prvmask = 0; \
- for (i = 0; i < b->batCount; ) { \
- const BUN lim = MIN(i + page, b->batCount); \
- /* new mask */ \
- mask = 0; \
- /* build mask for all BUNs in one PAGE */ \
- for ( ; i < lim; i++) { \
- register const TYPE val = col[i]; \
- GETBIN(bin,val,B); \
- mask = IMPSsetBit(B,mask,bin); \
- if (!is_##TYPE##_nil(val)) { /* do not count nils */ \
- if (!cnt_bins[bin]++) { \
- min_bins[bin] = max_bins[bin] = i; \
+ do { \
+ uint##B##_t mask, prvmask; \
+ uint##B##_t *restrict im = (uint##B##_t *) imps; \
+ const TYPE *restrict col = (TYPE *) Tloc(b, 0); \
+ const TYPE *restrict bins = (TYPE *) inbins; \
+ const BUN page = IMPS_PAGE / sizeof(TYPE); \
+ prvmask = 0; \
+ for (i = 0; i < b->batCount; ) { \
+ const BUN lim = MIN(i + page, b->batCount); \
+ /* new mask */ \
+ mask = 0; \
+ /* build mask for all BUNs in one PAGE */ \
+ for ( ; i < lim; i++) { \
+ const TYPE val = col[i]; \
+ GETBIN(bin,val,B); \
+ mask = IMPSsetBit(B,mask,bin); \
+ if (!is_##TYPE##_nil(val)) { /* do not count
nils */ \
+ if (!cnt_bins[bin]++) { \
+ /* first in the bin */ \
+ min_bins[bin] = max_bins[bin] =
i; \
+ } else { \
+ if (val < col[min_bins[bin]]) \
+ min_bins[bin] = i; \
+ if (val > col[max_bins[bin]]) \
+ max_bins[bin] = i; \
+ } \
+ } \
+ } \
+ /* same mask as previous and enough count to add */ \
+ if ((prvmask == mask) && (dcnt > 0) && \
+ (dict[dcnt-1].cnt < (IMPS_MAX_CNT-1))) { \
+ /* not a repeat header */ \
+ if (!dict[dcnt-1].repeat) { \
+ /* if compressed */ \
+ if (dict[dcnt-1].cnt > 1) { \
+ /* uncompress last */ \
+ dict[dcnt-1].cnt--; \
+ /* new header */ \
+ dict[dcnt].cnt = 1; \
+ dict[dcnt].flags = 0; \
+ dcnt++; \
+ } \
+ /* set repeat */ \
+ dict[dcnt-1].repeat = 1; \
+ } \
+ /* increase cnt */ \
+ dict[dcnt-1].cnt++; \
+ } else { /* new mask (or run out of header count) */ \
+ prvmask=mask; \
+ im[icnt] = mask; \
+ icnt++; \
+ if ((dcnt > 0) && !(dict[dcnt-1].repeat) && \
+ (dict[dcnt-1].cnt < (IMPS_MAX_CNT-1))) { \
+ dict[dcnt-1].cnt++; \
} else { \
- if (val < col[min_bins[bin]]) \
- min_bins[bin] = i; \
- if (val > col[max_bins[bin]]) \
- max_bins[bin] = i; \
+ dict[dcnt].cnt = 1; \
+ dict[dcnt].repeat = 0; \
+ dict[dcnt].flags = 0; \
+ dcnt++; \
} \
} \
} \
- /* same mask as previous and enough count to add */ \
- if ((prvmask == mask) && (dcnt > 0) && \
- (dict[dcnt-1].cnt < (IMPS_MAX_CNT-1))) { \
- /* not a repeat header */ \
- if (!dict[dcnt-1].repeat) { \
- /* if compressed */ \
- if (dict[dcnt-1].cnt > 1) { \
- /* uncompress last */ \
- dict[dcnt-1].cnt--; \
- /* new header */ \
- dict[dcnt].cnt = 1; \
- dict[dcnt].flags = 0; \
- dcnt++; \
- } \
- /* set repeat */ \
- dict[dcnt-1].repeat = 1; \
- } \
- /* increase cnt */ \
- dict[dcnt-1].cnt++; \
- } else { /* new mask (or run out of header count) */ \
- prvmask=mask; \
- im[icnt] = mask; \
- icnt++; \
- if ((dcnt > 0) && !(dict[dcnt-1].repeat) && \
- (dict[dcnt-1].cnt < (IMPS_MAX_CNT-1))) { \
- dict[dcnt-1].cnt++; \
- } else { \
- dict[dcnt].cnt = 1; \
- dict[dcnt].repeat = 0; \
- dict[dcnt].flags = 0; \
- dcnt++; \
- } \
- } \
- } \
-} while (0)
+ } while (0)
static void
imprints_create(BAT *b, void *inbins, BUN *stats, bte bits,
@@ -162,25 +164,25 @@ imprints_create(BAT *b, void *inbins, BU
#endif
#define FILL_HISTOGRAM(TYPE) \
-do { \
- BUN k; \
- TYPE *restrict s = (TYPE *) Tloc(s4, 0); \
- TYPE *restrict h = imprints->bins; \
- if (cnt < 64-1) { \
- TYPE max = GDK_##TYPE##_max; \
- for (k = 0; k < cnt; k++) \
- h[k] = s[k]; \
- while (k < (BUN) imprints->bits) \
- h[k++] = max; \
- CLRMEM(); \
- } else { \
- double y, ystep = (double) cnt / (64 - 1); \
- for (k = 0, y = 0; (BUN) y < cnt; y += ystep, k++) \
- h[k] = s[(BUN) y]; \
- if (k == 64 - 1) /* there is one left */ \
- h[k] = s[cnt - 1]; \
- } \
-} while (0)
+ do { \
+ BUN k; \
+ TYPE *restrict s = (TYPE *) Tloc(s4, 0); \
+ TYPE *restrict h = imprints->bins; \
+ if (cnt < 64-1) { \
+ TYPE max = GDK_##TYPE##_max; \
+ for (k = 0; k < cnt; k++) \
+ h[k] = s[k]; \
+ while (k < (BUN) imprints->bits) \
+ h[k++] = max; \
+ CLRMEM(); \
+ } else { \
+ double y, ystep = (double) cnt / (64 - 1); \
+ for (k = 0, y = 0; (BUN) y < cnt; y += ystep, k++) \
+ h[k] = s[(BUN) y]; \
+ if (k == 64 - 1) /* there is one left */ \
+ h[k] = s[cnt - 1]; \
+ } \
+ } while (0)
/* Check whether we have imprints on b (and return true if we do). It
* may be that the imprints were made persistent, but we hadn't seen
@@ -233,8 +235,7 @@ BATcheckimprints(BAT *b)
st.st_size >= (off_t)
(imprints->imprints.size =
imprints->imprints.free =
64 *
b->twidth +
- 64 * 2 *
SIZEOF_OID +
- 64 *
SIZEOF_BUN +
+ 64 * 3 *
SIZEOF_BUN +
pages *
((bte) hdata[0] / 8) +
hdata[2] *
sizeof(cchdc_t) +
sizeof(uint64_t) /* padding for alignment */
@@ -458,8 +459,7 @@ BATimprints(BAT *b)
HEAPalloc(&imprints->imprints,
IMPRINTS_HEADER_SIZE * SIZEOF_SIZE_T + /* extra
info */
64 * b->twidth + /* bins */
- 64 * 2 * SIZEOF_OID + /* {min,max}_bins */
- 64 * SIZEOF_BUN + /* cnt_bins */
+ 64 * 3 * SIZEOF_BUN + /* {min,max,cnt}_bins */
pages * (imprints->bits / 8) + /* imps */
sizeof(uint64_t) + /* padding for alignment */
pages * sizeof(cchdc_t), /* dict */
@@ -558,10 +558,10 @@ BATimprints(BAT *b)
}
#define getbin(TYPE,B) \
-do { \
- register const TYPE val = * (TYPE *) v; \
- GETBIN(ret,val,B); \
-} while (0)
+ do { \
+ const TYPE val = * (TYPE *) v; \
+ GETBIN(ret,val,B); \
+ } while (0)
int
IMPSgetbin(int tpe, bte bits, const char *restrict inbins, const void
*restrict v)
@@ -569,50 +569,43 @@ IMPSgetbin(int tpe, bte bits, const char
int ret = -1;
switch (tpe) {
- case TYPE_bte:
- {
+ case TYPE_bte: {
const bte *restrict bins = (bte *) inbins;
BINSIZE(bits, getbin, bte);
+ break;
}
- break;
- case TYPE_sht:
- {
+ case TYPE_sht: {
const sht *restrict bins = (sht *) inbins;
BINSIZE(bits, getbin, sht);
+ break;
}
- break;
- case TYPE_int:
- {
+ case TYPE_int: {
const int *restrict bins = (int *) inbins;
BINSIZE(bits, getbin, int);
+ break;
}
- break;
- case TYPE_lng:
- {
+ case TYPE_lng: {
const lng *restrict bins = (lng *) inbins;
BINSIZE(bits, getbin, lng);
+ break;
}
- break;
#ifdef HAVE_HGE
- case TYPE_hge:
- {
+ case TYPE_hge: {
const hge *restrict bins = (hge *) inbins;
BINSIZE(bits, getbin, hge);
+ break;
}
- break;
#endif
- case TYPE_flt:
- {
+ case TYPE_flt: {
const flt *restrict bins = (flt *) inbins;
BINSIZE(bits, getbin, flt);
+ break;
}
- break;
- case TYPE_dbl:
- {
+ case TYPE_dbl: {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list
