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

Reply via email to