Changeset: 9034ceb1d557 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9034ceb1d557
Modified Files:
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_result.c
        sql/storage/bat/bat_storage.c
Branch: Mar2018
Log Message:

More allocation checks in bat storage and sql_result


diffs (273 lines):

diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -2133,6 +2133,10 @@ mvc_row_result_wrap( Client cntxt, MalBl
        if ((msg = checkSQLContext(cntxt)) != NULL)
                return msg;
        res = *res_id = mvc_result_table(m, mb->tag, pci->argc - (pci->retc + 
5), 1, NULL);
+       if(res < 0) {
+               msg = createException(SQL, "sql.resultset", SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
+               goto wrapup_result_set;
+       }
 
        tbl = BATdescriptor(tblId);
        atr = BATdescriptor(atrId);
@@ -2470,7 +2474,8 @@ mvc_scalar_value_wrap(Client cntxt, MalB
                p = *(ptr *) p;
 
        // scalar values are single-column result sets
-       res_id = mvc_result_table(b->mvc, mb->tag, 1, 1, NULL);
+       if((res_id = mvc_result_table(b->mvc, mb->tag, 1, 1, NULL)) < 0)
+               throw(SQL, "sql.exportValue", SQLSTATE(HY001) MAL_MALLOC_FAIL);
        if (mvc_result_value(b->mvc, tn, cn, type, digits, scale, p, mtype))
                throw(SQL, "sql.exportValue", SQLSTATE(45000) "Result set 
construction failed");
        if (b->output_format == OFMT_NONE) {
@@ -2904,11 +2909,12 @@ SQLall(ptr ret, const bat *bid)
        _s = ATOMsize(ATOMtype(b->ttype));
        if (ATOMextern(b->ttype)) {
                _s = ATOMlen(ATOMtype(b->ttype), p);
-               memcpy(*(ptr *) ret = GDKmalloc(_s), p, _s);
-               if(ret == NULL){
+               *(ptr *) ret = GDKmalloc(_s);
+               if(*(ptr *) ret == NULL){
                        BBPunfix(b->batCacheid);
                        throw(SQL, "SQLall", SQLSTATE(HY001) MAL_MALLOC_FAIL);
                }
+               memcpy(*(ptr *) ret, p, _s);
        } else if (b->ttype == TYPE_bat) {
                bat bid = *(bat *) p;
                *(BAT **) ret = BATdescriptor(bid);
diff --git a/sql/backends/monet5/sql_result.c b/sql/backends/monet5/sql_result.c
--- a/sql/backends/monet5/sql_result.c
+++ b/sql/backends/monet5/sql_result.c
@@ -2604,7 +2604,10 @@ mvc_result_table(mvc *m, oid query_id, i
 {
        res_table *t = res_table_create(m->session->tr, m->result_id++, 
query_id, nr_cols, type, m->results, order);
        m->results = t;
-       return t->id;
+       if(t)
+               return t->id;
+       else
+               return -1;
 }
 
 int
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
@@ -1255,6 +1255,7 @@ load_bat(sql_delta *bat, int type)
 static int
 log_create_delta(sql_delta *bat) 
 {
+       int res = LOG_OK;
        gdk_return ok;
        BAT *b = (bat->bid)?
                        temp_descriptor(bat->bid):
@@ -1264,15 +1265,15 @@ log_create_delta(sql_delta *bat)
                bat->uibid = e_bat(TYPE_oid);
        if (!bat->uvbid) 
                bat->uvbid = e_bat(b->ttype);
-       if(bat->uibid == BID_NIL || bat->uvbid == BID_NIL) {
-               bat_destroy(b);
-               return LOG_ERR;
-       }
+       if (bat->uibid == BID_NIL || bat->uvbid == BID_NIL)
+               res = LOG_ERR;
 
        ok = logger_add_bat(bat_logger, b, bat->name);
        if (ok == GDK_SUCCEED)
                ok = log_bat_persists(bat_logger, b, bat->name);
        bat_destroy(b);
+       if(res != LOG_OK)
+               return res;
        return ok == GDK_SUCCEED ? LOG_OK : LOG_ERR;
 }
 
@@ -1395,8 +1396,11 @@ create_col(sql_trans *tr, sql_column *c)
                bat->wtime = c->base.wtime = tr->wstime;
                c->base.allocated = 1;
        }
-       if (!bat->name) 
+       if (!bat->name) {
                bat->name = sql_message("%s_%s_%s", c->t->s->base.name, 
c->t->base.name, c->base.name);
+               if(!bat->name)
+                       ok = LOG_ERR;
+       }
 
        if (c->base.flag == TR_OLD && !isTempTable(c->t)){
                c->base.wtime = 0;
@@ -1414,26 +1418,33 @@ create_col(sql_trans *tr, sql_column *c)
                        sql_delta *d = fc->data;
 
                        bat->bid = copyBat(d->bid, type, 0);
-                       if (d->ibid)
+                       if(bat->bid == BID_NIL)
+                               ok = LOG_ERR;
+                       if (d->ibid) {
                                bat->ibid = copyBat(d->ibid, type, d->ibase);
+                               if(bat->ibid == BID_NIL)
+                                       ok = LOG_ERR;
+                       }
                        bat->ibase = d->ibase;
                        bat->cnt = d->cnt;
                        if (d->uibid) {
                                bat->uibid = e_bat(TYPE_oid);
                                if (bat->uibid == BID_NIL)
-                                       return LOG_ERR;
+                                       ok = LOG_ERR;
                        }
                        if (d->uvbid) {
                                bat->uvbid = e_bat(type);
                                if(bat->uvbid == BID_NIL)
-                                       return LOG_ERR;
+                                       ok = LOG_ERR;
                        }
                } else {
                        BAT *b = bat_new(type, c->t->sz, PERSISTENT);
-                       if (!b) 
-                               return LOG_ERR;
-                       create_delta(c->data, NULL, b);
-                       bat_destroy(b);
+                       if (!b) {
+                               ok = LOG_ERR;
+                       } else {
+                               create_delta(c->data, NULL, b);
+                               bat_destroy(b);
+                       }
                }
        }
        return ok;
@@ -1474,8 +1485,11 @@ create_idx(sql_trans *tr, sql_idx *ni)
                bat->wtime = ni->base.wtime = tr->wstime;
                ni->base.allocated = 1;
        }
-       if (!bat->name) 
+       if (!bat->name) {
                bat->name = sql_message("%s_%s@%s", ni->t->s->base.name, 
ni->t->base.name, ni->base.name);
+               if(!bat->name)
+                       ok = LOG_ERR;
+       }
 
        if (ni->base.flag == TR_OLD && !isTempTable(ni->t)){
                ni->base.wtime = 0;
@@ -1499,16 +1513,18 @@ create_idx(sql_trans *tr, sql_idx *ni)
                bat->ibase = d->ibase;
                bat->cnt = d->cnt;
                bat->ucnt = 0;
+               if(bat->bid == BID_NIL || bat->ibid == BID_NIL)
+                       ok = LOG_ERR;
 
                if (d->uibid) {
                        bat->uibid = e_bat(TYPE_oid);
                        if (bat->uibid == BID_NIL)
-                               return LOG_ERR;
+                               ok = LOG_ERR;
                }
                if (d->uvbid) {
                        bat->uvbid = e_bat(type);
                        if(bat->uvbid == BID_NIL)
-                               return LOG_ERR;
+                               ok = LOG_ERR;
                }
        }
        return ok;
@@ -1557,8 +1573,11 @@ create_del(sql_trans *tr, sql_table *t)
                bat->wtime = t->base.wtime = t->s->base.wtime = tr->wstime;
                t->base.allocated = 1;
        }
-       if (!bat->dname)
+       if (!bat->dname) {
                bat->dname = sql_message("D_%s_%s", t->s->base.name, 
t->base.name);
+               if(!bat->dname)
+                       ok = LOG_ERR;
+       }
        (void)tr;
        if (t->base.flag == TR_OLD && !isTempTable(t)) {
                log_bid bid = logger_find_bat(bat_logger, bat->dname);
@@ -2074,11 +2093,8 @@ gtr_update_delta( sql_trans *tr, sql_del
                BATcleanProps(cur);
                temp_destroy(cbat->ibid);
                cbat->ibid = e_bat(cur->ttype);
-               if(cbat->ibid == BID_NIL) {
-                       bat_destroy(ins);
-                       bat_destroy(cur);
-                       return LOG_ERR;
-               }
+               if(cbat->ibid == BID_NIL)
+                       ok = LOG_ERR;
        }
        bat_destroy(ins);
 
@@ -2098,12 +2114,8 @@ gtr_update_delta( sql_trans *tr, sql_del
                        temp_destroy(cbat->uvbid);
                        cbat->uibid = e_bat(TYPE_oid);
                        cbat->uvbid = e_bat(cur->ttype);
-                       if(cbat->uibid == BID_NIL || cbat->uvbid == BID_NIL) {
-                               bat_destroy(ui);
-                               bat_destroy(uv);
-                               bat_destroy(cur);
-                               return LOG_ERR;
-                       }
+                       if(cbat->uibid == BID_NIL || cbat->uvbid == BID_NIL)
+                               ok = LOG_ERR;
                        cbat->ucnt = 0;
                }
                bat_destroy(ui);
@@ -2357,11 +2369,8 @@ tr_update_delta( sql_trans *tr, sql_delt
                obat->cnt = cbat->cnt = obat->ibase = cbat->ibase = 
BATcount(cur);
                temp_destroy(obat->ibid);
                obat->ibid = e_bat(cur->ttype);
-               if (obat->ibid == BID_NIL) {
-                       bat_destroy(cur);
-                       bat_destroy(ins);
-                       return LOG_ERR;
-               }
+               if (obat->ibid == BID_NIL)
+                       ok = LOG_ERR;
        }
        if (obat->cnt != cbat->cnt) { /* locked */
                obat->cnt = cbat->cnt;
@@ -2386,12 +2395,8 @@ tr_update_delta( sql_trans *tr, sql_delt
                        temp_destroy(obat->uvbid);
                        obat->uibid = e_bat(TYPE_oid);
                        obat->uvbid = e_bat(cur->ttype);
-                       if(obat->uibid == BID_NIL || obat->uvbid == BID_NIL) {
-                               bat_destroy(ui);
-                               bat_destroy(uv);
-                               bat_destroy(cur);
-                               return LOG_ERR;
-                       }
+                       if(obat->uibid == BID_NIL || obat->uvbid == BID_NIL)
+                               ok = LOG_ERR;
                        temp_destroy(cbat->uibid);
                        temp_destroy(cbat->uvbid);
                        cbat->uibid = cbat->uvbid = 0;
@@ -2454,11 +2459,8 @@ tr_merge_delta( sql_trans *tr, sql_delta
                obat->cnt = obat->ibase = BATcount(cur);
                temp_destroy(obat->ibid);
                obat->ibid = e_bat(cur->ttype);
-               if (obat->ibid == BID_NIL) {
-                       bat_destroy(cur);
-                       bat_destroy(ins);
-                       return LOG_ERR;
-               }
+               if (obat->ibid == BID_NIL)
+                       ok = LOG_ERR;
        }
        bat_destroy(ins);
 
@@ -2479,12 +2481,8 @@ tr_merge_delta( sql_trans *tr, sql_delta
                        temp_destroy(obat->uvbid);
                        obat->uibid = e_bat(TYPE_oid);
                        obat->uvbid = e_bat(cur->ttype);
-                       if(obat->uibid == BID_NIL || obat->uvbid == BID_NIL) {
-                               bat_destroy(ui);
-                               bat_destroy(uv);
-                               bat_destroy(cur);
-                               return LOG_ERR;
-                       }
+                       if(obat->uibid == BID_NIL || obat->uvbid == BID_NIL)
+                               ok = LOG_ERR;
                        obat->ucnt = 0;
                }
                bat_destroy(ui);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to