Changeset: 4c9dfea79f79 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/4c9dfea79f79 Modified Files: gdk/gdk_imprints.c gdk/gdk_private.h gdk/gdk_select.c Branch: Jul2021 Log Message:
Better check before calling BATimprints. diffs (85 lines): diff --git a/gdk/gdk_imprints.c b/gdk/gdk_imprints.c --- a/gdk/gdk_imprints.c +++ b/gdk/gdk_imprints.c @@ -447,18 +447,7 @@ BATimprints(BAT *b) lng t0 = GDKusec(); /* we only create imprints for types that look like types we know */ - switch (ATOMbasetype(b->ttype)) { - case TYPE_bte: - case TYPE_sht: - case TYPE_int: - case TYPE_lng: -#ifdef HAVE_HGE - case TYPE_hge: -#endif - case TYPE_flt: - case TYPE_dbl: - break; - default: /* type not supported */ + if (!imprintable(b->ttype)) { /* doesn't look enough like base type: do nothing */ GDKerror("unsupported type\n"); return GDK_FAIL; diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h --- a/gdk/gdk_private.h +++ b/gdk/gdk_private.h @@ -273,6 +273,25 @@ void VIEWdestroy(BAT *b) BAT *virtualize(BAT *bn) __attribute__((__visibility__("hidden"))); +static inline bool +imprintable(int tpe) +{ + switch (ATOMbasetype(tpe)) { + case TYPE_bte: + case TYPE_sht: + case TYPE_int: + case TYPE_lng: +#ifdef HAVE_HGE + case TYPE_hge: +#endif + case TYPE_flt: + case TYPE_dbl: + return true; + default: /* type not supported */ + return false; + } +} + /* calculate the integer 2 logarithm (i.e. position of highest set * bit) of the argument (with a slight twist: 0 gives 0, 1 gives 1, * 0x8 to 0xF give 4, etc.) */ diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c --- a/gdk/gdk_select.c +++ b/gdk/gdk_select.c @@ -1899,14 +1899,14 @@ BATselect(BAT *b, BAT *s, const void *tl * iii) is not var-sized. */ tmp = NULL; - bool use_imprints = !equi && - !b->tvarsized && - (!b->batTransient || - (parent != 0 && - (tmp = BBP_cache(parent)) != NULL && - !tmp->batTransient)); Imprints *imprints = NULL; - if (use_imprints && BATimprints(b) == GDK_SUCCEED) { + if (!equi && + imprintable(b->ttype) && + (!b->batTransient || + (parent != 0 && + (tmp = BBP_cache(parent)) != NULL && + !tmp->batTransient)) && + BATimprints(b) == GDK_SUCCEED) { if (tmp != NULL) { MT_lock_set(&tmp->batIdxLock); imprints = tmp->timprints; @@ -2252,6 +2252,7 @@ rangejoin(BAT *r1, BAT *r2, BAT *l, BAT cnt = BATcount(r1); assert(r2 == NULL || BATcount(r1) == BATcount(r2)); } else if (!anti && !symmetric && + imprintable(l->ttype) && (BATcount(rl) > 2 || !l->batTransient || (VIEWtparent(l) != 0 && _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list