Changeset: 7ee2bb86a943 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/7ee2bb86a943 Modified Files: sql/backends/monet5/sql.c sql/test/BugTracker-2022/Tests/All sql/test/BugTracker-2022/Tests/index-function-query.Bug-7238.test Branch: Jan2022 Log Message:
You cannot create an integer view on an string offset bat. This fixes bug #7238. diffs (269 lines): diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c --- a/sql/backends/monet5/sql.c +++ b/sql/backends/monet5/sql.c @@ -4191,43 +4191,33 @@ BATSTRindex_int(bat *res, const bat *src if ((s = BATdescriptor(*src)) == NULL) throw(SQL, "calc.index", SQLSTATE(HY005) "Cannot access column descriptor"); - if (*u) { - Heap *h = s->tvheap; - size_t pad, pos; - int v; - - r = COLnew(0, TYPE_int, 1024, TRANSIENT); - if (r == NULL) { + (void) u; + + Heap *h = s->tvheap; + size_t pad, pos; + int v; + + r = COLnew(0, TYPE_int, 1024, TRANSIENT); + if (r == NULL) { + BBPunfix(s->batCacheid); + throw(SQL, "calc.index", SQLSTATE(HY013) MAL_MALLOC_FAIL); + } + pos = GDK_STRHASHSIZE; + while (pos < h->free) { + const char *p; + + pad = GDK_VARALIGN - (pos & (GDK_VARALIGN - 1)); + if (pad < sizeof(stridx_t)) + pad += GDK_VARALIGN; + pos += pad; + p = h->base + pos; + v = (int) (pos - GDK_STRHASHSIZE); + if (BUNappend(r, &v, false) != GDK_SUCCEED) { + BBPreclaim(r); BBPunfix(s->batCacheid); throw(SQL, "calc.index", SQLSTATE(HY013) MAL_MALLOC_FAIL); } - pos = GDK_STRHASHSIZE; - while (pos < h->free) { - const char *p; - - pad = GDK_VARALIGN - (pos & (GDK_VARALIGN - 1)); - if (pad < sizeof(stridx_t)) - pad += GDK_VARALIGN; - pos += pad; - p = h->base + pos; - v = (int) (pos - GDK_STRHASHSIZE); - if (BUNappend(r, &v, false) != GDK_SUCCEED) { - BBPreclaim(r); - BBPunfix(s->batCacheid); - throw(SQL, "calc.index", SQLSTATE(HY013) MAL_MALLOC_FAIL); - } - pos += strLen(p); - } - } else { - r = VIEWcreate(s->hseqbase, s); - if (r == NULL) { - BBPunfix(s->batCacheid); - throw(SQL, "calc.index", SQLSTATE(HY013) MAL_MALLOC_FAIL); - } - r->ttype = TYPE_int; - r->tvarsized = false; - HEAPdecref(r->tvheap, false); - r->tvheap = NULL; + pos += strLen(p); } BBPunfix(s->batCacheid); BBPkeepref((*res = r->batCacheid)); @@ -4250,42 +4240,32 @@ BATSTRindex_sht(bat *res, const bat *src if ((s = BATdescriptor(*src)) == NULL) throw(SQL, "calc.index", SQLSTATE(HY005) "Cannot access column descriptor"); - if (*u) { - Heap *h = s->tvheap; - size_t pad, pos; - sht v; - - r = COLnew(0, TYPE_sht, 1024, TRANSIENT); - if (r == NULL) { - BBPunfix(s->batCacheid); + (void) u; + + Heap *h = s->tvheap; + size_t pad, pos; + sht v; + + r = COLnew(0, TYPE_sht, 1024, TRANSIENT); + if (r == NULL) { + BBPunfix(s->batCacheid); + throw(SQL, "calc.index", SQLSTATE(HY013) MAL_MALLOC_FAIL); + } + pos = GDK_STRHASHSIZE; + while (pos < h->free) { + const char *s; + + pad = GDK_VARALIGN - (pos & (GDK_VARALIGN - 1)); + if (pad < sizeof(stridx_t)) + pad += GDK_VARALIGN; + pos += pad; + s = h->base + pos; + v = (sht) (pos - GDK_STRHASHSIZE); + if (BUNappend(r, &v, false) != GDK_SUCCEED) { + BBPreclaim(r); throw(SQL, "calc.index", SQLSTATE(HY013) MAL_MALLOC_FAIL); } - pos = GDK_STRHASHSIZE; - while (pos < h->free) { - const char *s; - - pad = GDK_VARALIGN - (pos & (GDK_VARALIGN - 1)); - if (pad < sizeof(stridx_t)) - pad += GDK_VARALIGN; - pos += pad; - s = h->base + pos; - v = (sht) (pos - GDK_STRHASHSIZE); - if (BUNappend(r, &v, false) != GDK_SUCCEED) { - BBPreclaim(r); - throw(SQL, "calc.index", SQLSTATE(HY013) MAL_MALLOC_FAIL); - } - pos += strLen(s); - } - } else { - r = VIEWcreate(s->hseqbase, s); - if (r == NULL) { - BBPunfix(s->batCacheid); - throw(SQL, "calc.index", SQLSTATE(HY013) MAL_MALLOC_FAIL); - } - r->ttype = TYPE_sht; - r->tvarsized = false; - HEAPdecref(r->tvheap, false); - r->tvheap = NULL; + pos += strLen(s); } BBPunfix(s->batCacheid); BBPkeepref((*res = r->batCacheid)); @@ -4308,43 +4288,33 @@ BATSTRindex_bte(bat *res, const bat *src if ((s = BATdescriptor(*src)) == NULL) throw(SQL, "calc.index", SQLSTATE(HY005) "Cannot access column descriptor"); - if (*u) { - Heap *h = s->tvheap; - size_t pad, pos; - bte v; - - r = COLnew(0, TYPE_bte, 64, TRANSIENT); - if (r == NULL) { + (void) u; + + Heap *h = s->tvheap; + size_t pad, pos; + bte v; + + r = COLnew(0, TYPE_bte, 64, TRANSIENT); + if (r == NULL) { + BBPunfix(s->batCacheid); + throw(SQL, "calc.index", SQLSTATE(HY013) MAL_MALLOC_FAIL); + } + pos = GDK_STRHASHSIZE; + while (pos < h->free) { + const char *p; + + pad = GDK_VARALIGN - (pos & (GDK_VARALIGN - 1)); + if (pad < sizeof(stridx_t)) + pad += GDK_VARALIGN; + pos += pad; + p = h->base + pos; + v = (bte) (pos - GDK_STRHASHSIZE); + if (BUNappend(r, &v, false) != GDK_SUCCEED) { + BBPreclaim(r); BBPunfix(s->batCacheid); throw(SQL, "calc.index", SQLSTATE(HY013) MAL_MALLOC_FAIL); } - pos = GDK_STRHASHSIZE; - while (pos < h->free) { - const char *p; - - pad = GDK_VARALIGN - (pos & (GDK_VARALIGN - 1)); - if (pad < sizeof(stridx_t)) - pad += GDK_VARALIGN; - pos += pad; - p = h->base + pos; - v = (bte) (pos - GDK_STRHASHSIZE); - if (BUNappend(r, &v, false) != GDK_SUCCEED) { - BBPreclaim(r); - BBPunfix(s->batCacheid); - throw(SQL, "calc.index", SQLSTATE(HY013) MAL_MALLOC_FAIL); - } - pos += strLen(p); - } - } else { - r = VIEWcreate(s->hseqbase, s); - if (r == NULL) { - BBPunfix(s->batCacheid); - throw(SQL, "calc.index", SQLSTATE(HY013) MAL_MALLOC_FAIL); - } - r->ttype = TYPE_bte; - r->tvarsized = false; - HEAPdecref(r->tvheap, false); - r->tvheap = NULL; + pos += strLen(p); } BBPunfix(s->batCacheid); BBPkeepref((*res = r->batCacheid)); diff --git a/sql/test/BugTracker-2022/Tests/All b/sql/test/BugTracker-2022/Tests/All --- a/sql/test/BugTracker-2022/Tests/All +++ b/sql/test/BugTracker-2022/Tests/All @@ -1,3 +1,3 @@ transaction-conflict.Bug-7228 insert-not-null.Bug-7232 -index-function-query.Bug-7238 +!ARCH_BITS32?index-function-query.Bug-7238 diff --git a/sql/test/BugTracker-2022/Tests/index-function-query.Bug-7238.test b/sql/test/BugTracker-2022/Tests/index-function-query.Bug-7238.test --- a/sql/test/BugTracker-2022/Tests/index-function-query.Bug-7238.test +++ b/sql/test/BugTracker-2022/Tests/index-function-query.Bug-7238.test @@ -4,8 +4,8 @@ create table t7238 (name varchar(22) NOT statement ok INSERT INTO t7238 VALUES ('sys'),('tmp'),('json'),('profiler') -query TI -select name, length(name) as nm_len from t7238 order by nm_len; +query TI nosort +select name, length(name) as nm_len from t7238 order by nm_len ---- sys 3 @@ -16,30 +16,27 @@ 4 profiler 8 -query TI +query TI nosort select name, "index"(name, true) nm_idx from t7238 order by nm_idx ---- sys -4 +8 tmp -12 +24 json -20 +40 profiler -32 +56 -query TI +query TI nosort select name, "index"(name, false) nm_idx from t7238 order by nm_idx ---- sys -4 +8 tmp -12 +24 json -20 +40 profiler -32 +56 -statement ok -drop table t7238 - _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list