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 -- [email protected]
To unsubscribe send an email to [email protected]
