Changeset: a951ee924c15 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/a951ee924c15 Modified Files: sql/backends/monet5/sql.c Branch: sequences_7184 Log Message:
merged with default diffs (truncated from 482 to 300 lines): diff --git a/gdk/gdk_string.c b/gdk/gdk_string.c --- a/gdk/gdk_string.c +++ b/gdk/gdk_string.c @@ -1078,28 +1078,39 @@ BATstr_group_concat(ValPtr res, BAT *b, { BUN ncand; struct canditer ci; + gdk_return r = GDK_SUCCEED; + bool free_nseparator = false; + char *nseparator = (char *)separator; (void) abort_on_error; - assert((separator && !sep) || (!separator && sep)); /* only one of them must be set */ + assert((nseparator && !sep) || (!nseparator && sep)); /* only one of them must be set */ res->vtype = TYPE_str; ncand = canditer_init(&ci, b, s); if (sep && BATcount(sep) == 1) { /* Only one element in sep */ BATiter bi = bat_iterator(sep); - separator = BUNtvar(bi, 0); + nseparator = GDKstrdup(BUNtvar(bi, 0)); bat_iterator_end(&bi); + if (!nseparator) + return GDK_FAIL; + free_nseparator = true; sep = NULL; } - if (ncand == 0 || (separator && strNil(separator))) { + if (ncand == 0 || (nseparator && strNil(nseparator))) { if (VALinit(res, TYPE_str, nil_if_empty ? str_nil : "") == NULL) - return GDK_FAIL; - return GDK_SUCCEED; + r = GDK_FAIL; + if (free_nseparator) + GDKfree(nseparator); + return r; } - return concat_strings(NULL, res, b, b->hseqbase, 1, &ci, ncand, NULL, 0, 0, - skip_nils, sep, separator, NULL); + r = concat_strings(NULL, res, b, b->hseqbase, 1, &ci, ncand, NULL, 0, 0, + skip_nils, sep, nseparator, NULL); + if (free_nseparator) + GDKfree(nseparator); + return r; } BAT * @@ -1112,8 +1123,10 @@ BATgroupstr_group_concat(BAT *b, BAT *g, struct canditer ci; const char *err; gdk_return res; + bool free_nseparator = false; + char *nseparator = (char *)separator; - assert((separator && !sep) || (!separator && sep)); /* only one of them must be set */ + assert((nseparator && !sep) || (!nseparator && sep)); /* only one of them must be set */ (void) skip_nils; if ((err = BATgroupaggrinit(b, g, e, s, &min, &max, &ngrp, @@ -1128,29 +1141,37 @@ BATgroupstr_group_concat(BAT *b, BAT *g, if (sep && BATcount(sep) == 1) { /* Only one element in sep */ BATiter bi = bat_iterator(sep); - separator = BUNtvar(bi, 0); + nseparator = GDKstrdup(BUNtvar(bi, 0)); bat_iterator_end(&bi); + if (!nseparator) + return NULL; + free_nseparator = true; sep = NULL; } - if (ncand == 0 || ngrp == 0 || (separator && strNil(separator))) { + if (ncand == 0 || ngrp == 0 || (nseparator && strNil(nseparator))) { /* trivial: no strings to concat, so return bat * aligned with g with nil in the tail */ - return BATconstant(ngrp == 0 ? 0 : min, TYPE_str, str_nil, ngrp, TRANSIENT); + bn = BATconstant(ngrp == 0 ? 0 : min, TYPE_str, str_nil, ngrp, TRANSIENT); + goto done; } if (BATtdense(g) || (g->tkey && g->tnonil)) { /* trivial: singleton groups, so all results are equal * to the inputs (but possibly a different type) */ - return BATconvert(b, s, TYPE_str, abort_on_error, 0, 0, 0); + bn = BATconvert(b, s, TYPE_str, abort_on_error, 0, 0, 0); + goto done; } res = concat_strings(&bn, NULL, b, b->hseqbase, ngrp, &ci, ncand, (const oid *) Tloc(g, 0), min, max, skip_nils, sep, - separator, &nils); + nseparator, &nils); if (res != GDK_SUCCEED) - return NULL; + bn = NULL; +done: + if (free_nseparator) + GDKfree(nseparator); return bn; } diff --git a/gdk/gdk_unique.c b/gdk/gdk_unique.c --- a/gdk/gdk_unique.c +++ b/gdk/gdk_unique.c @@ -31,7 +31,7 @@ BATunique(BAT *b, BAT *s) const char *vals; const char *vars; int width; - oid i, o; + oid i, o, hseq; const char *nme; Hash *hs = NULL; BUN hb; @@ -102,6 +102,7 @@ BATunique(BAT *b, BAT *s) vars = NULL; width = bi.width; cmp = ATOMcompare(bi.type); + hseq = b->hseqbase; if (ATOMbasetype(bi.type) == TYPE_bte || (bi.width == 1 && @@ -114,7 +115,7 @@ BATunique(BAT *b, BAT *s) memset(seen, 0, sizeof(seen)); TIMEOUT_LOOP_IDX(i, cnt, timeoffset) { o = canditer_next(&ci); - val = ((const uint8_t *) vals)[o - b->hseqbase]; + val = ((const uint8_t *) vals)[o - hseq]; uint32_t m = UINT32_C(1) << (val & 0x1F); if (!(seen[val >> 5] & m)) { seen[val >> 5] |= m; @@ -140,7 +141,7 @@ BATunique(BAT *b, BAT *s) memset(seen, 0, sizeof(seen)); TIMEOUT_LOOP_IDX(i, cnt, timeoffset) { o = canditer_next(&ci); - val = ((const uint16_t *) vals)[o - b->hseqbase]; + val = ((const uint16_t *) vals)[o - hseq]; uint32_t m = UINT32_C(1) << (val & 0x1F); if (!(seen[val >> 5] & m)) { seen[val >> 5] |= m; @@ -160,7 +161,7 @@ BATunique(BAT *b, BAT *s) algomsg = "unique: sorted"; TIMEOUT_LOOP_IDX(i, cnt, timeoffset) { o = canditer_next(&ci); - v = VALUE(o - b->hseqbase); + v = VALUE(o - hseq); if (prev == NULL || (*cmp)(v, prev) != 0) { if (bunfastappTYPE(oid, bn, &o) != GDK_SUCCEED) goto bunins_failed; @@ -174,13 +175,11 @@ BATunique(BAT *b, BAT *s) cnt == bi.count && BAThash(b) == GDK_SUCCEED)) { BUN lo = 0; - oid seq; /* we already have a hash table on b, or b is * persistent and we could create a hash table, or b * is a view on a bat that already has a hash table */ algomsg = "unique: existing hash"; - seq = b->hseqbase; MT_rwlock_rdlock(&b->thashlock); hs = b->thash; if (hs == NULL) { @@ -191,14 +190,14 @@ BATunique(BAT *b, BAT *s) BUN p; o = canditer_next(&ci); - p = o - seq; + p = o - hseq; v = VALUE(p); for (hb = HASHgetlink(hs, p + lo); hb != BUN_NONE && hb >= lo; hb = HASHgetlink(hs, hb)) { assert(hb < p + lo); if (cmp(v, BUNtail(bi, hb)) == 0 && - canditer_contains(&ci, hb - lo + seq)) { + canditer_contains(&ci, hb - lo + hseq)) { /* we've seen this value * before */ break; @@ -251,7 +250,7 @@ BATunique(BAT *b, BAT *s) } TIMEOUT_LOOP_IDX(i, cnt, timeoffset) { o = canditer_next(&ci); - v = VALUE(o - b->hseqbase); + v = VALUE(o - hseq); prb = HASHprobe(hs, v); for (hb = HASHget(hs, prb); hb != BUN_NONE; @@ -260,7 +259,7 @@ BATunique(BAT *b, BAT *s) break; } if (hb == BUN_NONE) { - p = o - b->hseqbase; + p = o - hseq; if (bunfastappTYPE(oid, bn, &o) != GDK_SUCCEED) goto bunins_failed; /* enter into hash table */ diff --git a/monetdb5/modules/atoms/json.c b/monetdb5/modules/atoms/json.c --- a/monetdb5/modules/atoms/json.c +++ b/monetdb5/modules/atoms/json.c @@ -1980,14 +1980,15 @@ JSONrenderRowObject(BAT **bl, MalBlkPtr len = 1; for (i = pci->retc; i < pci->argc; i += 2) { name = stk->stk[getArg(pci, i)].val.sval; + tpe = getBatType(getArgType(mb, pci, i + 1)); bi = bat_iterator(bl[i + 1]); p = BUNtail(bi, idx); - bat_iterator_end(&bi); - tpe = getBatType(getArgType(mb, pci, i + 1)); if ((val = ATOMformat(tpe, p)) == NULL) { + bat_iterator_end(&bi); GDKfree(row); return NULL; } + bat_iterator_end(&bi); if (strncmp(val, "nil", 3) == 0) { GDKfree(val); val = NULL; @@ -2096,13 +2097,14 @@ JSONrenderRowArray(BAT **bl, MalBlkPtr m row[1] = 0; len = 1; for (i = pci->retc; i < pci->argc; i++) { + tpe = getBatType(getArgType(mb, pci, i)); bi = bat_iterator(bl[i]); p = BUNtail(bi, idx); - bat_iterator_end(&bi); - tpe = getBatType(getArgType(mb, pci, i)); if ((val = ATOMformat(tpe, p)) == NULL) { + bat_iterator_end(&bi); goto memfail; } + bat_iterator_end(&bi); if (strcmp(val, "nil") == 0) { GDKfree(val); val = NULL; 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 @@ -3161,6 +3161,7 @@ SQLbat_alpha_cst(bat *res, const bat *de if (BUNappend(bn, &r, false) != GDK_SUCCEED) { BBPreclaim(bn); bat_iterator_end(&bi); + BBPunfix(b->batCacheid); throw(SQL, "sql.alpha", SQLSTATE(HY013) MAL_MALLOC_FAIL); } } @@ -3207,6 +3208,7 @@ SQLcst_alpha_bat(bat *res, const dbl *de if (BUNappend(bn, &r, false) != GDK_SUCCEED) { BBPreclaim(bn); bat_iterator_end(&bi); + BBPunfix(b->batCacheid); throw(SQL, "sql.alpha", SQLSTATE(HY013) MAL_MALLOC_FAIL); } } diff --git a/sql/backends/monet5/sql_subquery.c b/sql/backends/monet5/sql_subquery.c --- a/sql/backends/monet5/sql_subquery.c +++ b/sql/backends/monet5/sql_subquery.c @@ -16,18 +16,17 @@ zero_or_one_error(ptr ret, const bat *bi BAT *b; BUN c; size_t _s; + BATiter bi = {0}; const void *p = NULL; - if ((b = BATdescriptor(*bid)) == NULL) { + if ((b = BATdescriptor(*bid)) == NULL) throw(SQL, "sql.zero_or_one", SQLSTATE(HY005) "Cannot access column descriptor"); - } c = BATcount(b); if (c == 0) { p = ATOMnilptr(b->ttype); } else if (c == 1 || (c > 1 && *err == false)) { - BATiter bi = bat_iterator(b); + bi = bat_iterator(b); p = BUNtail(bi, 0); - bat_iterator_end(&bi); } else { p = NULL; BBPunfix(b->batCacheid); @@ -40,6 +39,8 @@ zero_or_one_error(ptr ret, const bat *bi _s = ATOMlen(ATOMtype(b->ttype), p); *(ptr *) ret = GDKmalloc(_s); if (*(ptr *) ret == NULL) { + if (bi.b) + bat_iterator_end(&bi); BBPunfix(b->batCacheid); throw(SQL, "sql.zero_or_one", SQLSTATE(HY013) MAL_MALLOC_FAIL); } @@ -47,6 +48,8 @@ zero_or_one_error(ptr ret, const bat *bi } else if (b->ttype == TYPE_bat) { bat bid = *(bat *) p; if ((*(BAT **) ret = BATdescriptor(bid)) == NULL){ + if (bi.b) + bat_iterator_end(&bi); BBPunfix(b->batCacheid); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list