Changeset: cb9f0b02d1c6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/cb9f0b02d1c6
Modified Files:
        monetdb5/mal/mal_profiler.c
        monetdb5/modules/atoms/blob.c
        monetdb5/modules/atoms/uuid.c
        sql/backends/monet5/sql_cast.c
        sql/backends/monet5/sql_rank.c
Branch: Jul2021
Log Message:

Retain when possible and don't leak on error


diffs (201 lines):

diff --git a/monetdb5/mal/mal_profiler.c b/monetdb5/mal/mal_profiler.c
--- a/monetdb5/mal/mal_profiler.c
+++ b/monetdb5/mal/mal_profiler.c
@@ -317,8 +317,11 @@ renderProfilerEvent(Client cntxt, MalBlk
                                tname = getTypeName(getBatType(tpe));
                                ok = logadd(&logbuf, ",\"type\":\"bat[:%s]\"", 
tname);
                                GDKfree(tname);
-                               if (!ok)
+                               if (!ok) {
+                                       if (d)
+                                               BBPunfix(d->batCacheid);
                                        return;
+                               }
                                if(d) {
                                        BAT *v;
                                        cnt = BATcount(d);
@@ -331,11 +334,15 @@ renderProfilerEvent(Client cntxt, MalBlk
                                                                        
",\"mode\":\"%s\"",
                                                                        
VIEWtparent(d),
                                                                        
d->hseqbase,
-                                                                       v && 
!v->batTransient ? "persistent" : "transient"))
-                                                       return;
+                                                                       v && 
!v->batTransient ? "persistent" : "transient")) {
+                                                                               
BBPunfix(d->batCacheid);
+                                                                               
return;
+                                               }
                                        } else {
-                                               if (!logadd(&logbuf, 
",\"mode\":\"%s\"", (d->batTransient ? "transient" : "persistent")))
+                                               if (!logadd(&logbuf, 
",\"mode\":\"%s\"", (d->batTransient ? "transient" : "persistent"))) {
+                                                       BBPunfix(d->batCacheid);
                                                        return;
+                                               }
                                        }
                                        if (!logadd(&logbuf,
                                                                ",\"sorted\":%d"
@@ -347,8 +354,10 @@ renderProfilerEvent(Client cntxt, MalBlk
                                                                d->trevsorted,
                                                                d->tnonil,
                                                                d->tnil,
-                                                               d->tkey))
+                                                               d->tkey)) {
+                                               BBPunfix(d->batCacheid);
                                                return;
+                                       }
 #define keepprop(NME, LNME)                                                    
                                        \
        do {                                                                    
                                                        \
                const void *valp = BATgetprop(d, NME);                          
                        \
@@ -359,8 +368,10 @@ renderProfilerEvent(Client cntxt, MalBlk
                                ok = logadd(&logbuf, ",\"%s\":\"%s\"", LNME, 
cvquote);  \
                                GDKfree(cv);                                    
                                                \
                                GDKfree(cvquote);                               
                                                \
-                               if (!ok)                                        
                                                        \
+                               if (!ok) {                                      
                                                        \
+                                       BBPunfix(d->batCacheid);                
                                        \
                                        return;                                 
                                                        \
+                               }                                               
                                                                \
                        }                                                       
                                                                \
                }                                                               
                                                                \
        } while (0)
@@ -379,22 +390,31 @@ renderProfilerEvent(Client cntxt, MalBlk
                                                *c = 0;
                                        ok = logadd(&logbuf, 
",\"file\":\"%s\"", cv + 1);
                                        GDKfree(cv);
-                                       if (!ok)
+                                       if (!ok) {
+                                               BBPunfix(d->batCacheid);
                                                return;
+                                       }
                                        total += cnt << d->tshift;
-                                       if (!logadd(&logbuf, ",\"width\":%d", 
d->twidth))
+                                       if (!logadd(&logbuf, ",\"width\":%d", 
d->twidth)) {
+                                               BBPunfix(d->batCacheid);
                                                return;
+                                       }
                                        /* keeping information about the 
individual auxiliary heaps is helpful during analysis. */
                                        MT_rwlock_rdlock(&d->thashlock);
                                        if( d->thash && !logadd(&logbuf, 
",\"hash\":" LLFMT, (lng) hashinfo(d->thash, d->batCacheid))) {
                                                
MT_rwlock_rdunlock(&d->thashlock);
+                                               BBPunfix(d->batCacheid);
                                                return;
                                        }
                                        MT_rwlock_rdunlock(&d->thashlock);
-                                       if( d->tvheap && !logadd(&logbuf, 
",\"vheap\":" LLFMT, (lng) heapinfo(d->tvheap, d->batCacheid)))
+                                       if( d->tvheap && !logadd(&logbuf, 
",\"vheap\":" LLFMT, (lng) heapinfo(d->tvheap, d->batCacheid))) {
+                                               BBPunfix(d->batCacheid);
                                                return;
-                                       if( d->timprints && !logadd(&logbuf, 
",\"imprints\":" LLFMT, (lng) IMPSimprintsize(d)))
+                                       }
+                                       if( d->timprints && !logadd(&logbuf, 
",\"imprints\":" LLFMT, (lng) IMPSimprintsize(d))) {
+                                               BBPunfix(d->batCacheid);
                                                return;
+                                       }
                                        /* if (!logadd(&logbuf, 
"\"debug\":\"%s\",", d->debugmessages)) return; */
                                        BBPunfix(d->batCacheid);
                                }
diff --git a/monetdb5/modules/atoms/blob.c b/monetdb5/modules/atoms/blob.c
--- a/monetdb5/modules/atoms/blob.c
+++ b/monetdb5/modules/atoms/blob.c
@@ -438,19 +438,19 @@ BLOBblob_blob_bulk(bat *res, const bat *
        oid off;
        bool nils = false;
 
-       if ((b = BATdescriptor(*bid)) == NULL) {
-               msg = createException(SQL, "batcalc.blob_blob_bulk", 
SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
-               goto bailout;
-       }
        if (sid && !is_bat_nil(*sid)) {
                if ((s = BATdescriptor(*sid)) == NULL) {
                        msg = createException(SQL, "batcalc.blob_blob_bulk", 
SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
                        goto bailout;
                }
        } else {
-               BBPkeepref(*res = b->batCacheid); /* nothing to convert, return 
*/
+               BBPretain(*res = *bid); /* nothing to convert, return */
                return MAL_SUCCEED;
        }
+       if ((b = BATdescriptor(*bid)) == NULL) {
+               msg = createException(SQL, "batcalc.blob_blob_bulk", 
SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
+               goto bailout;
+       }
        off = b->hseqbase;
        q = canditer_init(&ci, b, s);
        if (!(dst = COLnew(ci.hseq, TYPE_blob, q, TRANSIENT))) {
diff --git a/monetdb5/modules/atoms/uuid.c b/monetdb5/modules/atoms/uuid.c
--- a/monetdb5/modules/atoms/uuid.c
+++ b/monetdb5/modules/atoms/uuid.c
@@ -186,19 +186,19 @@ UUIDuuid2uuid_bulk(bat *res, const bat *
        bool nils = false;
        BATiter bi;
 
-       if ((b = BATdescriptor(*bid)) == NULL) {
-               msg = createException(SQL, "batcalc.uuid2uuidbulk", 
SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
-               goto bailout;
-       }
        if (sid && !is_bat_nil(*sid)) {
                if ((s = BATdescriptor(*sid)) == NULL) {
                        msg = createException(SQL, "batcalc.uuid2uuidbulk", 
SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
                        goto bailout;
                }
        } else {
-               BBPkeepref(*res = b->batCacheid); /* nothing to convert, return 
*/
+               BBPretain(*res = *bid); /* nothing to convert, return */
                return MAL_SUCCEED;
        }
+       if ((b = BATdescriptor(*bid)) == NULL) {
+               msg = createException(SQL, "batcalc.uuid2uuidbulk", 
SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
+               goto bailout;
+       }
        off = b->hseqbase;
        q = canditer_init(&ci, b, s);
        if (!(dst = COLnew(ci.hseq, TYPE_uuid, q, TRANSIENT))) {
diff --git a/sql/backends/monet5/sql_cast.c b/sql/backends/monet5/sql_cast.c
--- a/sql/backends/monet5/sql_cast.c
+++ b/sql/backends/monet5/sql_cast.c
@@ -245,8 +245,8 @@ SQLbatstr_cast(Client cntxt, MalBlkPtr m
                        if (!strNil(v))
                                SQLstr_cast_str(v, digits);
                }
+               bat_iterator_end(&bi);
                BBPkeepref(*res = b->batCacheid);
-               bat_iterator_end(&bi);
                return MAL_SUCCEED;
        }
 
diff --git a/sql/backends/monet5/sql_rank.c b/sql/backends/monet5/sql_rank.c
--- a/sql/backends/monet5/sql_rank.c
+++ b/sql/backends/monet5/sql_rank.c
@@ -48,12 +48,12 @@ SQLdiff(Client cntxt, MalBlkPtr mb, MalS
                gdk_return gdk_code = GDK_SUCCEED;
 
                res = getArgReference_bat(stk, pci, 0);
-               if ((!(b = BATdescriptor(*getArgReference_bat(stk, pci, 1))))) {
-                       msg = createException(SQL, "sql.diff", SQLSTATE(HY005) 
"Cannot access column descriptor");
-                       goto bailout;
-               }
                if (pci->argc > 2) {
                        if (isaBatType(getArgType(mb, pci, 2))) {
+                               if ((!(b = 
BATdescriptor(*getArgReference_bat(stk, pci, 1))))) {
+                                       msg = createException(SQL, "sql.diff", 
SQLSTATE(HY005) "Cannot access column descriptor");
+                                       goto bailout;
+                               }
                                if (!(r = COLnew(b->hseqbase, TYPE_bit, 
BATcount(b), TRANSIENT))) {
                                        msg = createException(SQL, "sql.diff", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
                                        goto bailout;
@@ -65,11 +65,14 @@ SQLdiff(Client cntxt, MalBlkPtr mb, MalS
                                }
                                gdk_code = GDKanalyticaldiff(r, b, c, NULL, 
b->ttype);
                        } else { /* the input is a constant, so the output is 
the previous sql.diff output */
-                               assert(b->ttype == TYPE_bit);
-                               BBPkeepref(*res = b->batCacheid);
+                               BBPretain(*res = *getArgReference_bat(stk, pci, 
1));
                                return MAL_SUCCEED;
                        }
                } else {
+                       if ((!(b = BATdescriptor(*getArgReference_bat(stk, pci, 
1))))) {
+                               msg = createException(SQL, "sql.diff", 
SQLSTATE(HY005) "Cannot access column descriptor");
+                               goto bailout;
+                       }
                        if (!(r = COLnew(b->hseqbase, TYPE_bit, BATcount(b), 
TRANSIENT))) {
                                msg = createException(SQL, "sql.diff", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
                                goto bailout;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to