Changeset: 72268efde28b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/72268efde28b Modified Files: monetdb5/modules/atoms/str.c Branch: sw_ew_c_sorting Log Message:
Fix startswith_join loop
diffs (119 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
@@ -5616,7 +5616,7 @@ STRcontainsselect(Client cntxt, MalBlkPt
#define STARTSWITH_SORTED_LOOP(STR_CMP, STR_LEN, FNAME)
\
do {
\
canditer_init(&rci, sorted_r, sorted_cr);
\
- for (BUN ridx = 0; ridx < rci.ncand; ridx++) {
\
+ for (BUN lidx = 0,ridx = 0; ridx < rci.ncand; ridx++) {
\
GDK_CHECK_TIMEOUT(timeoffset, counter,
GOTO_LABEL_TIMEOUT_HANDLER(exit)); \
ro = canditer_next(&rci);
\
vr = VALUE(r, ro - rbase);
\
@@ -5625,7 +5625,7 @@ STRcontainsselect(Client cntxt, MalBlkPt
vr_len = STR_LEN;
\
matches = 0;
\
canditer_init(&lci, sorted_l, sorted_cl);
\
- for (BUN lidx = 0; lidx < lci.ncand; lidx++) {
\
+ for (n = lidx; n < lci.ncand; n++) {
\
lo = canditer_next(&lci);
\
vl = VALUE(l, lo - lbase);
\
if (strNil(vl))
\
@@ -5644,7 +5644,7 @@ STRcontainsselect(Client cntxt, MalBlkPt
BATsetcount(rr, BATcount(rr));
\
if (BATextend(rl, newcap) !=
GDK_SUCCEED || \
(rr && BATextend(rr, newcap) !=
GDK_SUCCEED)) { \
- msg = createException(MAL,
FNAME, SQLSTATE(HY013) MAL_MALLOC_FAIL); \
+ msg = createException(MAL,
FNAME, SQLSTATE(HY013) MAL_MALLOC_FAIL); \
goto exit;
\
}
\
assert(!rr || BATcapacity(rl) ==
BATcapacity(rr)); \
@@ -6064,85 +6064,14 @@ startswith_join(BAT **rl_ptr, BAT **rr_p
*lvars = li.vh->base,
*rvars = ri.vh->base,
*vl, *vr;
- BUN matches, newcap;
+ BUN matches, newcap, n = 0;
int rskipped = 0, vr_len = 0, cmp = 0;
size_t counter = 0;
if (anti)
STR_JOIN_NESTED_LOOP((str_cmp(vl, vr, vr_len) != 0),
str_strlen(vr), fname);
- else {
- /* STARTSWITH_SORTED_LOOP(str_cmp(vl, vr, vr_len),
str_strlen(vr), fname); */
- canditer_init(&rci, sorted_r, sorted_cr);
- for (BUN lidx = 0,ridx = 0; ridx < rci.ncand; ridx++) {
- GDK_CHECK_TIMEOUT(timeoffset, counter,
GOTO_LABEL_TIMEOUT_HANDLER(exit));
- ro = canditer_next(&rci);
- vr = VALUE(r, ro - rbase);
- if (strNil(vr))
- continue;
- vr_len = str_strlen(vr);
- matches = 0;
- canditer_init(&lci, sorted_l, sorted_cl);
- for (BUN n = lidx; lidx < lci.ncand; n++) {
- lo = canditer_next(&lci);
- vl = VALUE(l, lo - lbase);
- if (strNil(vl))
- continue;
- cmp = str_cmp(vl, vr, vr_len);
- if (cmp < 0) {
- lidx++;
- continue;
- }
- else if (cmp > 0)
- break;
- if (BATcount(rl) == BATcapacity(rl)) {
- newcap = BATgrows(rl);
- BATsetcount(rl, BATcount(rl));
- if (rr)
- BATsetcount(rr, BATcount(rr));
- if (BATextend(rl, newcap) !=
GDK_SUCCEED ||
- (rr && BATextend(rr, newcap) !=
GDK_SUCCEED)) {
- msg = createException(MAL,
fname, SQLSTATE(HY013) MAL_MALLOC_FAIL);
- goto exit;
- }
- assert(!rr || BATcapacity(rl) ==
BATcapacity(rr));
- }
- if (BATcount(rl) > 0) {
- if (last_lo + 1 != lo)
- rl->tseqbase = oid_nil;
- if (matches == 0) {
- if (rr)
- rr->trevsorted = false;
- if (last_lo > lo) {
- rl->tsorted = false;
- rl->tkey = false;
- } else if (last_lo < lo) {
- rl->trevsorted = false;
- } else {
- rl->tkey = false;
- }
- }
- }
- APPEND(rl, lo);
- if (rr)
- APPEND(rr, ro);
- last_lo = lo;
- matches++;
- }
- if (rr) {
- if (matches > 1) {
- rr->tkey = false;
- rr->tseqbase = oid_nil;
- rl->trevsorted = false;
- } else if (matches == 0) {
- rskipped = BATcount(rr) > 0;
- } else if (rskipped) {
- rr->tseqbase = oid_nil;
- }
- } else if (matches > 1) {
- rl->trevsorted = false;
- }
- }
- }
+ else
+ STARTSWITH_SORTED_LOOP(str_cmp(vl, vr, vr_len), str_strlen(vr),
fname);
assert(!rr || BATcount(rl) == BATcount(rr));
BATsetcount(rl, BATcount(rl));
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]
