Changeset: 6ed9b4798e4b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/6ed9b4798e4b Modified Files: monetdb5/modules/atoms/str.c Branch: sw_ew_c_sorting Log Message:
Cleanup strjoin. Intro strjoin_mapargs macro. diffs (truncated from 567 to 300 lines): diff --git a/monetdb5/modules/atoms/str.c b/monetdb5/modules/atoms/str.c --- a/monetdb5/modules/atoms/str.c +++ b/monetdb5/modules/atoms/str.c @@ -5089,6 +5089,18 @@ STRasciify(str *r, const str *s) #endif } +static inline void +BBPnreclaim(int nargs, ...) +{ + va_list valist; + va_start(valist, nargs); + for (int i = 0; i < nargs; i++) { + BAT *b = va_arg(valist, BAT *); + BBPreclaim(b); + } + va_end(valist); +} + /* scan select loop with or without candidates */ #define scanloop(TEST, KEEP_NULLS) \ do { \ @@ -5360,69 +5372,69 @@ STRcontainsselect(Client cntxt, MalBlkPt GDK_CHECK_TIMEOUT(timeoffset, counter, GOTO_LABEL_TIMEOUT_HANDLER(exit)); \ ro = canditer_next(&rci); \ vr = VALUE(r, ro - rbase); \ - rlen = STR_LEN; \ - nl = 0; \ + rlen = STR_LEN; \ + nl = 0; \ if (with_strimps) \ - filtered_sl = STRMPfilter(l, sl, vr, anti); \ + filtered_sl = STRMPfilter(l, sl, vr, anti); \ if (filtered_sl) \ canditer_init(&lci, l, filtered_sl); \ else \ - canditer_init(&lci, l, sl); \ + canditer_init(&lci, l, sl); \ for (BUN lidx = 0; lidx < lci.ncand; lidx++) { \ lo = canditer_next(&lci); \ vl = VALUE(l, lo - lbase); \ if (strNil(vl)) { \ continue; \ - } else if (!(STRCMP)) { \ + } else if (!(STRCMP)) { \ continue; \ } \ if (BATcount(r1) == BATcapacity(r1)) { \ newcap = BATgrows(r1); \ BATsetcount(r1, BATcount(r1)); \ - if (r2) \ + if (r2) \ BATsetcount(r2, BATcount(r2)); \ - if (BATextend(r1, newcap) != GDK_SUCCEED || \ + if (BATextend(r1, newcap) != GDK_SUCCEED || \ (r2 && BATextend(r2, newcap) != GDK_SUCCEED)) { \ msg = createException(MAL, "str.%s", fname, SQLSTATE(HY013) MAL_MALLOC_FAIL); \ goto exit; \ } \ assert(!r2 || BATcapacity(r1) == BATcapacity(r2)); \ } \ - if (BATcount(r1) > 0) { \ + if (BATcount(r1) > 0) { \ if (lastl + 1 != lo) \ - r1->tseqbase = oid_nil; \ + r1->tseqbase = oid_nil; \ if (nl == 0) { \ - if (r2) \ - r2->trevsorted = false; \ + if (r2) \ + r2->trevsorted = false; \ if (lastl > lo) { \ r1->tsorted = false; \ r1->tkey = false; \ } else if (lastl < lo) { \ - r1->trevsorted = false; \ + r1->trevsorted = false; \ } else { \ r1->tkey = false; \ } \ } \ } \ - APPEND(r1, lo); \ - if (r2) \ - APPEND(r2, ro); \ - lastl = lo; \ + APPEND(r1, lo); \ + if (r2) \ + APPEND(r2, ro); \ + lastl = lo; \ nl++; \ } \ BBPreclaim(filtered_sl); \ if (r2) { \ if (nl > 1) { \ r2->tkey = false; \ - r2->tseqbase = oid_nil; \ - r1->trevsorted = false; \ + r2->tseqbase = oid_nil; \ + r1->trevsorted = false; \ } else if (nl == 0) { \ rskipped = BATcount(r2) > 0; \ } else if (rskipped) { \ - r2->tseqbase = oid_nil; \ + r2->tseqbase = oid_nil; \ } \ } else if (nl > 1) { \ - r1->trevsorted = false; \ + r1->trevsorted = false; \ } \ } \ } while (0) @@ -5433,63 +5445,63 @@ STRcontainsselect(Client cntxt, MalBlkPt GDK_CHECK_TIMEOUT(timeoffset, counter, GOTO_LABEL_TIMEOUT_HANDLER(exit)); \ ro = canditer_next(&rci); \ vr = VALUE(r, ro - rbase); \ - rlen = STR_LEN; \ - nl = 0; \ - canditer_init(&lci, l, sl); \ + rlen = STR_LEN; \ + nl = 0; \ + canditer_init(&lci, l, sl); \ for (BUN lidx = 0; lidx < lci.ncand; lidx++) { \ lo = canditer_next(&lci); \ vl = VALUE(l, lo - lbase); \ if (strNil(vl)) { \ continue; \ - } else if (!(STRCMP)) { \ + } else if (!(STRCMP)) { \ continue; \ } \ if (BATcount(r1) == BATcapacity(r1)) { \ newcap = BATgrows(r1); \ BATsetcount(r1, BATcount(r1)); \ - if (r2) \ + if (r2) \ BATsetcount(r2, BATcount(r2)); \ - if (BATextend(r1, newcap) != GDK_SUCCEED || \ + if (BATextend(r1, newcap) != GDK_SUCCEED || \ (r2 && BATextend(r2, newcap) != GDK_SUCCEED)) { \ msg = createException(MAL, "str.%s", fname, SQLSTATE(HY013) MAL_MALLOC_FAIL); \ goto exit; \ } \ assert(!r2 || BATcapacity(r1) == BATcapacity(r2)); \ } \ - if (BATcount(r1) > 0) { \ + if (BATcount(r1) > 0) { \ if (lastl + 1 != lo) \ - r1->tseqbase = oid_nil; \ + r1->tseqbase = oid_nil; \ if (nl == 0) { \ - if (r2) \ - r2->trevsorted = false; \ + if (r2) \ + r2->trevsorted = false; \ if (lastl > lo) { \ r1->tsorted = false; \ r1->tkey = false; \ } else if (lastl < lo) { \ - r1->trevsorted = false; \ + r1->trevsorted = false; \ } else { \ r1->tkey = false; \ } \ } \ } \ - APPEND(r1, lo); \ - if (r2) \ - APPEND(r2, ro); \ - lastl = lo; \ + APPEND(r1, lo); \ + if (r2) \ + APPEND(r2, ro); \ + lastl = lo; \ nl++; \ } \ if (r2) { \ if (nl > 1) { \ r2->tkey = false; \ - r2->tseqbase = oid_nil; \ - r1->trevsorted = false; \ + r2->tseqbase = oid_nil; \ + r1->trevsorted = false; \ } else if (nl == 0) { \ rskipped = BATcount(r2) > 0; \ } else if (rskipped) { \ - r2->tseqbase = oid_nil; \ + r2->tseqbase = oid_nil; \ } \ } else if (nl > 1) { \ - r1->trevsorted = false; \ + r1->trevsorted = false; \ } \ } \ } while (0) @@ -5601,230 +5613,174 @@ strjoin(BAT *r1, BAT *r2, BAT *l, BAT *r } static str -STRjoin(bat *r1, bat *r2, const bat lid, const bat rid, const bat slid, - const bat srid, const bit anti, bit (*str_cmp)(const char *, - const char *, int), - const str fname) +STRjoin(bat *lr, bat *rr, const bat l, const bat r, const bat cl, const bat cr, + const bit anti, bit (*str_cmp)(const char *, const char *, int), const str fname) { + str msg = MAL_SUCCEED; BAT *left = NULL, *right = NULL, *cleft = NULL, *cright = NULL, - *res1 = NULL, *res2 = NULL; - str msg = MAL_SUCCEED; - - if (!(left = BATdescriptor(lid)) || !(right = BATdescriptor(rid))) { - msg = createException(MAL, fname, - SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); - goto exit; + *lres = NULL, *rres = NULL; + + if (!(left = BATdescriptor(l)) || !(right = BATdescriptor(r))) + throw(MAL, fname, SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); + + if ((!is_bat_nil(cl) && (cleft = BATdescriptor(cl)) == NULL) || + (!is_bat_nil(cr) && (cright = BATdescriptor(cr)) == NULL)) + throw(MAL, fname, SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); + + lres = COLnew(0, TYPE_oid, BATcount(left), TRANSIENT); + if (rr) + rres = COLnew(0, TYPE_oid, BATcount(right), TRANSIENT); + if (!lres || (rr && !rres)) { + BBPnreclaim(2, lres, rres); + throw(MAL, fname, SQLSTATE(HY013) MAL_MALLOC_FAIL); } - if ((!is_bat_nil(slid) && (cleft = BATdescriptor(slid)) == NULL) || - (!is_bat_nil(srid) && (cright = BATdescriptor(srid)) == NULL)) { - msg = createException(MAL, fname, - SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); - goto exit; - } - - res1 = COLnew(0, TYPE_oid, BATcount(left), TRANSIENT); - if (r2) - res2 = COLnew(0, TYPE_oid, BATcount(left), TRANSIENT); - if (!res1 || (r2 && !res2)) { - BBPreclaim(res1); - BBPreclaim(res2); - msg = createException(MAL, fname, SQLSTATE(HY013) MAL_MALLOC_FAIL); - goto exit; - } - - set_empty_bat_props(res1); - if (r2) - set_empty_bat_props(res2); - - msg = strjoin(res1, res2, left, right, cleft, cright, anti, str_cmp, fname); + set_empty_bat_props(lres); + if (rr) + set_empty_bat_props(rres); + + msg = strjoin(lres, rres, left, right, cleft, cright, anti, str_cmp, fname); if (!msg) { - *r1 = res1->batCacheid; - BBPkeepref(res1); - if (r2) { - *r2 = res2->batCacheid; - BBPkeepref(res2); + *lr = lres->batCacheid; + BBPkeepref(lres); + if (rr) { + *rr = rres->batCacheid; + BBPkeepref(rres); } - } else { - BBPreclaim(res1); - BBPreclaim(res2); - } - - exit: - BBPreclaim(left); - BBPreclaim(right); - BBPreclaim(cleft); - BBPreclaim(cright); + } else + BBPnreclaim(2, lres, rres); + + BBPnreclaim(4, left, right, cleft, cright); return msg; } -static str -join_caseignore(const bat *cid, bool *caseignore, str fname) +#define strjoin_mapargs(stk, pci, lr, rr, l, r, cl, cr, icase, anti) \ + do { \ + lr = getArgReference(stk, pci, 0); \ + rr = pci->retc == 1 ? 0 : getArgReference(stk, pci, 1); \ + int i = pci->retc == 1 ? 1 : 2; \ + l = getArgReference(stk, pci, i++); \ + r = getArgReference(stk, pci, i++); \ + icase = pci->argc - pci->retc == 7 ? \ + NULL : getArgReference(stk, pci, i++); \ _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org