Changeset: 8ec355517be6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/8ec355517be6
Modified Files:
        sql/storage/bat/bat_storage.c
Branch: Jul2021
Log Message:

More allocation checks


diffs (167 lines):

diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -433,6 +433,9 @@ static sql_delta *
 temp_dup_delta(ulng tid, int type)
 {
        sql_delta *bat = ZNEW(sql_delta);
+
+       if (!bat)
+               return NULL;
        if (temp_dup_cs(&bat->cs, tid, type)) {
                _DELETE(bat);
                return NULL;
@@ -452,6 +455,9 @@ static storage *
 temp_dup_storage(sql_trans *tr)
 {
        storage *bat = ZNEW(storage);
+
+       if (!bat)
+               return NULL;
        if (temp_dup_cs(&bat->cs, tr->tid, TYPE_msk)) {
                _DELETE(bat);
                return NULL;
@@ -483,7 +489,8 @@ temp_col_timestamp_delta( sql_trans *tr,
        assert(isTempTable(c->t));
        sql_delta *d = temp_delta(ATOMIC_PTR_GET(&c->data), tr->tid);
        if (!d) {
-               d = temp_dup_delta(tr->tid, c->type.type->localtype);
+               if (!(d = temp_dup_delta(tr->tid, c->type.type->localtype)))
+                       return NULL;
                do {
                        d->next = ATOMIC_PTR_GET(&c->data);
                } while(!ATOMIC_PTR_CAS(&c->data, (void**)&d->next, d)); /* set 
c->data = d, when c->data == d->next else d->next = c->data */
@@ -506,7 +513,9 @@ temp_idx_timestamp_delta( sql_trans *tr,
        sql_delta *d = temp_delta(ATOMIC_PTR_GET(&i->data), tr->tid);
        if (!d) {
                int type = oid_index(i->type)?TYPE_oid:TYPE_lng;
-               d = temp_dup_delta(tr->tid, type);
+
+               if (!(d = temp_dup_delta(tr->tid, type)))
+                       return NULL;
                do {
                        d->next = ATOMIC_PTR_GET(&i->data);
                } while(!ATOMIC_PTR_CAS(&i->data, (void**)&d->next, d)); /* set 
i->data = d, when i->data == d->next else d->next = i->data */
@@ -538,7 +547,8 @@ temp_tab_timestamp_storage( sql_trans *t
        assert(isTempTable(t));
        storage *d = temp_storage(ATOMIC_PTR_GET(&t->data), tr->tid);
        if (!d) {
-               d = temp_dup_storage(tr);
+               if (!(d = temp_dup_storage(tr)))
+                       return NULL;
                do {
                        d->next = ATOMIC_PTR_GET(&t->data);
                } while(!ATOMIC_PTR_CAS(&t->data, (void**)&d->next, d)); /* set 
t->data = d, when t->data == d->next else d->next = t->data */
@@ -637,7 +647,7 @@ count_col(sql_trans *tr, sql_column *c, 
                return 0;
        d = tab_timestamp_storage(tr, c->t);
        ds = col_timestamp_delta(tr, c);
-       if (!d)
+       if (!d ||!ds)
                return 0;
        if (access == 2)
                return ds?ds->cs.ucnt:0;
@@ -665,7 +675,7 @@ count_idx(sql_trans *tr, sql_idx *i, int
                return 0;
        d = tab_timestamp_storage(tr, i->t);
        ds = idx_timestamp_delta(tr, i);
-       if (!d)
+       if (!d || !ds)
                return 0;
        if (access == 2)
                return ds?ds->cs.ucnt:0;
@@ -862,14 +872,22 @@ bind_ubat(sql_trans *tr, sql_delta *d, i
 static BAT *
 bind_ucol(sql_trans *tr, sql_column *c, int access, size_t cnt)
 {
-       return bind_ubat(tr, col_timestamp_delta(tr, c), access, 
c->type.type->localtype, cnt);
+       sql_delta *d = col_timestamp_delta(tr, c);
+
+       if (!d)
+               return NULL;
+       return bind_ubat(tr, d, access, c->type.type->localtype, cnt);
 }
 
 static BAT *
 bind_uidx(sql_trans *tr, sql_idx * i, int access, size_t cnt)
 {
        int type = oid_index(i->type)?TYPE_oid:TYPE_lng;
-       return bind_ubat(tr, idx_timestamp_delta(tr, i), access, type, cnt);
+       sql_delta *d = idx_timestamp_delta(tr, i);
+
+       if (!d)
+               return NULL;
+       return bind_ubat(tr, d, access, type, cnt);
 }
 
 static BAT *
@@ -899,6 +917,8 @@ bind_col(sql_trans *tr, sql_column *c, i
        if (!isTable(c->t))
                return NULL;
        sql_delta *d = col_timestamp_delta(tr, c);
+       if (!d)
+               return NULL;
        size_t cnt = count_col(tr, c, 0);
        if (access == RD_UPD_ID || access == RD_UPD_VAL)
                return bind_ucol(tr, c, access, cnt);
@@ -912,6 +932,8 @@ bind_idx(sql_trans *tr, sql_idx * i, int
        if (!isTable(i->t))
                return NULL;
        sql_delta *d = idx_timestamp_delta(tr, i);
+       if (!d)
+               return NULL;
        size_t cnt = count_idx(tr, i, 0);
        if (access == RD_UPD_ID || access == RD_UPD_VAL)
                return bind_uidx(tr, i, access, cnt);
@@ -1414,8 +1436,8 @@ bind_col_data(sql_trans *tr, sql_column 
 {
        sql_delta *obat = ATOMIC_PTR_GET(&c->data);
 
-       if (isTempTable(c->t))
-               obat = temp_col_timestamp_delta(tr, c);
+       if (isTempTable(c->t) && !(obat = temp_col_timestamp_delta(tr, c)))
+               return NULL;
 
        if (obat->cs.ts == tr->tid || ((obat->cs.ts < TRANSACTION_ID_BASE || 
tr_version_of_parent(tr, obat->cs.ts)) && !update_conflict)) /* on append there 
are no conflicts */
                return obat;
@@ -1482,8 +1504,8 @@ bind_idx_data(sql_trans *tr, sql_idx *i,
 {
        sql_delta *obat = ATOMIC_PTR_GET(&i->data);
 
-       if (isTempTable(i->t))
-               obat = temp_idx_timestamp_delta(tr, i);
+       if (isTempTable(i->t) && !(obat = temp_idx_timestamp_delta(tr, i)))
+               return NULL;
 
        if (obat->cs.ts == tr->tid || ((obat->cs.ts < TRANSACTION_ID_BASE || 
tr_version_of_parent(tr, obat->cs.ts)) && !update_conflict)) /* on append there 
are no conflicts */
                return obat;
@@ -2297,16 +2319,20 @@ create_idx(sql_trans *tr, sql_idx *ni)
                return new_persistent_delta(ATOMIC_PTR_GET(&ni->data));
        } else {
                sql_column *c = ol_first_node(ni->t->columns)->data;
-               sql_delta *d;
-
-               d = col_timestamp_delta(tr, c);
-               /* Here we also handle indices created through alter stmts */
-               /* These need to be created aligned to the existing data */
-               if (d->cs.bid) {
-                       bat->cs.bid = copyBat(d->cs.bid, type, 0);
-                       if(bat->cs.bid == BID_NIL)
-                               ok = LOG_ERR;
+               sql_delta *d = col_timestamp_delta(tr, c);
+
+               if (d) {
+                       /* Here we also handle indices created through alter 
stmts */
+                       /* These need to be created aligned to the existing 
data */
+                       if (d->cs.bid) {
+                               bat->cs.bid = copyBat(d->cs.bid, type, 0);
+                               if(bat->cs.bid == BID_NIL)
+                                       ok = LOG_ERR;
+                       }
+               } else {
+                       ok = LOG_ERR;
                }
+
                bat->cs.ucnt = 0;
                if (!isNew(c))
                        bat->cs.alter = 1;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to