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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list