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]

Reply via email to