Changeset: a9d71af5a049 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a9d71af5a049
Modified Files:
        sql/storage/bat/bat_table.c
Branch: Jul2017
Log Message:

Error checking and cleanup (reference counting and freeing).


diffs (129 lines):

diff --git a/sql/storage/bat/bat_table.c b/sql/storage/bat/bat_table.c
--- a/sql/storage/bat/bat_table.c
+++ b/sql/storage/bat/bat_table.c
@@ -156,27 +156,31 @@ column_find_row(sql_trans *tr, sql_colum
        if (!s)
                return oid_nil;
        b = full_column(tr, c);
-       if (!b)
+       if (!b) {
+               bat_destroy(s);
                return oid_nil;
+       }
        r = BATselect(b, s, value, NULL, 1, 0, 0);
+       bat_destroy(s);
+       full_destroy(c, b);
        if (!r)
                return oid_nil;
-       bat_destroy(s);
        s = r;
-       full_destroy(c, b);
        while ((n = va_arg(va, sql_column *)) != NULL) {
                value = va_arg(va, void *);
                c = n;
 
                b = full_column(tr, c);
-               if (!b)
+               if (!b) {
+                       bat_destroy(s);
                        return oid_nil;
+               }
                r = BATselect(b, s, value, NULL, 1, 0, 0);
+               bat_destroy(s);
+               full_destroy(c, b);
                if (!r)
                        return oid_nil;
-               bat_destroy(s);
                s = r;
-               full_destroy(c, b);
        }
        va_end(va);
        if (BATcount(s) == 1) {
@@ -275,7 +279,16 @@ rids_select( sql_trans *tr, sql_column *
        if(!rs)
                return NULL;
        s = delta_cands(tr, key->t);
+       if (s == NULL) {
+               GDKfree(rs);
+               return NULL;
+       }
        b = full_column(tr, key);
+       if (b == NULL) {
+               bat_destroy(s);
+               GDKfree(rs);
+               return NULL;
+       }
        if (!kvl)
                kvl = ATOMnilptr(b->ttype);
        if (!kvh && kvl != ATOMnilptr(b->ttype))
@@ -287,6 +300,10 @@ rids_select( sql_trans *tr, sql_column *
                s = r;
        }
        full_destroy(key, b);
+       if (s == NULL) {
+               GDKfree(rs);
+               return NULL;
+       }
        if (key_value_low || key_value_high) {
                va_start(va, key_value_high);
                while ((key = va_arg(va, sql_column *)) != NULL) {
@@ -303,6 +320,10 @@ rids_select( sql_trans *tr, sql_column *
                        bat_destroy(s);
                        s = r;
                        full_destroy(key, b);
+                       if (s == NULL) {
+                               GDKfree(rs);
+                               return NULL;
+                       }
                }
                va_end(va);
        }
@@ -553,23 +574,44 @@ table_vacuum(sql_trans *tr, sql_table *t
        if (!tids)
                return SQL_ERR;
        cols = NEW_ARRAY(BAT*, cs_size(&t->columns));
-       if (!cols)
+       if (!cols) {
+               bat_destroy(tids);
                return SQL_ERR;
+       }
        for (n = t->columns.set->h; n; n = n->next) {
                sql_column *c = n->data;
                BAT *v = store_funcs.bind_col(tr, c, RDONLY);
 
-               if (!v)
+               if (v == NULL ||
+                   (cols[c->colnr] = BATproject(tids, v)) == NULL) {
+                       BBPunfix(tids->batCacheid);
+                       for (n = t->columns.set->h; n; n = n->next) {
+                               if (n->data == c)
+                                       break;
+                               bat_destroy(cols[((sql_column *) 
n->data)->colnr]);
+                       }
+                       bat_destroy(v);
+                       _DELETE(cols);
                        return SQL_ERR;
-               cols[c->colnr] = BATproject(tids, v);
+               }
                BBPunfix(v->batCacheid);
        }
+       BBPunfix(tids->batCacheid);
        sql_trans_clear_table(tr, t);
        for (n = t->columns.set->h; n; n = n->next) {
                sql_column *c = n->data;
+               int ok;
 
-               store_funcs.append_col(tr, c, cols[c->colnr], TYPE_bat);
+               ok = store_funcs.append_col(tr, c, cols[c->colnr], TYPE_bat);
                BBPunfix(cols[c->colnr]->batCacheid);
+               if (ok != LOG_OK) {
+                       for (n = n->next; n; n = n->next) {
+                               c = n->data;
+                               BBPunfix(cols[c->colnr]->batCacheid);
+                       }
+                       _DELETE(cols);
+                       return SQL_ERR;
+               }
        }
        _DELETE(cols);
        return SQL_OK;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to