Changeset: 269f1da84176 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=269f1da84176
Modified Files:
sql/storage/bat/bat_storage.c
Branch: default
Log Message:
Defensive lines in bat storage
diffs (275 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
@@ -568,11 +568,16 @@ update_col(sql_trans *tr, sql_column *c,
if (!c->data || !c->base.allocated) {
int type = c->type.type->localtype;
sql_column *oc = tr_find_column(tr->parent, c);
- sql_delta *bat = c->data = ZNEW(sql_delta), *obat =
timestamp_delta(oc->data, tr->stime);
- (void)dup_bat(tr, c->t, obat, bat, type, isNew(oc),
c->base.flag == TR_NEW);
+ sql_delta* bat = ZNEW(sql_delta),*obat;
+ if(!bat)
+ return LOG_ERR;
+ c->data = bat;
+ obat = timestamp_delta(oc->data, tr->stime);
+ if(dup_bat(tr, c->t, obat, bat, type, isNew(oc), c->base.flag
== TR_NEW) == LOG_ERR)
+ return LOG_ERR;
c->base.allocated = 1;
}
- bat = c->data;
+ bat = c->data;
bat->wtime = c->base.wtime = c->t->base.wtime = c->t->s->base.wtime =
tr->wtime = tr->wstime;
c->base.rtime = c->t->base.rtime = c->t->s->base.rtime = tr->rtime =
tr->stime;
if (tpe == TYPE_bat)
@@ -593,11 +598,16 @@ update_idx(sql_trans *tr, sql_idx * i, v
if (!i->data || !i->base.allocated) {
int type = (oid_index(i->type))?TYPE_oid:TYPE_lng;
sql_idx *oi = tr_find_idx(tr->parent, i);
- sql_delta *bat = i->data = ZNEW(sql_delta), *obat =
timestamp_delta(oi->data, tr->stime);
- (void)dup_bat(tr, i->t, obat, bat, type, isNew(i), i->base.flag
== TR_NEW);
+ sql_delta* bat = ZNEW(sql_delta), *obat;
+ if(!bat)
+ return LOG_ERR;
+ i->data = bat;
+ obat = timestamp_delta(oi->data, tr->stime);
+ if(dup_bat(tr, i->t, obat, bat, type, isNew(i), i->base.flag ==
TR_NEW) == LOG_ERR)
+ return LOG_ERR;
i->base.allocated = 1;
}
- bat = i->data;
+ bat = i->data;
bat->wtime = i->base.wtime = i->t->base.wtime = i->t->s->base.wtime =
tr->wtime = tr->wstime;
i->base.rtime = i->t->base.rtime = i->t->s->base.rtime = tr->rtime =
tr->stime;
if (tpe == TYPE_bat)
@@ -696,9 +706,14 @@ dup_col(sql_trans *tr, sql_column *oc, s
if (oc->data) {
int type = c->type.type->localtype;
- sql_delta *bat = c->data = ZNEW(sql_delta), *obat = oc->data;
- ok = dup_bat(tr, c->t, obat, bat, type, isNew(oc), c->base.flag
== TR_NEW);
- c->base.allocated = 1;
+ sql_delta *bat = ZNEW(sql_delta), *obat = oc->data;
+ if (!bat)
+ ok = LOG_ERR;
+ else {
+ c->data = bat;
+ ok = dup_bat(tr, c->t, obat, bat, type, isNew(oc),
c->base.flag == TR_NEW);
+ c->base.allocated = 1;
+ }
}
return ok;
}
@@ -712,9 +727,14 @@ dup_idx(sql_trans *tr, sql_idx *i, sql_i
return ok;
if (i->data) {
int type = (oid_index(ni->type))?TYPE_oid:TYPE_lng;
- sql_delta *bat = ni->data = ZNEW(sql_delta), *obat = i->data;
- ok = dup_bat(tr, ni->t, obat, bat, type, isNew(i),
ni->base.flag == TR_NEW);
- ni->base.allocated = 1;
+ sql_delta *bat = ZNEW(sql_delta), *obat = i->data;
+ if (!bat)
+ ok = LOG_ERR;
+ else {
+ ni->data = bat;
+ ok = dup_bat(tr, ni->t, obat, bat, type, isNew(i),
ni->base.flag == TR_NEW);
+ ni->base.allocated = 1;
+ }
}
return ok;
}
@@ -744,8 +764,12 @@ dup_dbat( sql_trans *tr, sql_dbat *obat,
static int
dup_del(sql_trans *tr, sql_table *ot, sql_table *t)
{
- sql_dbat *bat = t->data = ZNEW(sql_dbat), *obat = ot->data;
- int ok = dup_dbat( tr, obat, bat, isNew(t), isTempTable(t));
+ int ok;
+ sql_dbat *bat = ZNEW(sql_dbat), *obat = ot->data;
+ if (!bat)
+ return LOG_ERR;
+ t->data = bat;
+ ok = dup_dbat( tr, obat, bat, isNew(t), isTempTable(t));
assert(t->base.allocated == 0);
t->base.allocated = 1;
return ok;
@@ -764,11 +788,22 @@ append_col(sql_trans *tr, sql_column *c,
if (!c->data || !c->base.allocated) {
int type = c->type.type->localtype;
sql_column *oc = tr_find_column(tr->parent, c);
- sql_delta *bat = c->data = ZNEW(sql_delta), *obat =
timestamp_delta(oc->data, tr->stime);
- (void)dup_bat(tr, c->t, obat, bat, type, isNew(oc),
c->base.flag == TR_NEW);
- c->base.allocated = 1;
+ sql_delta *bat = ZNEW(sql_delta), *obat;
+ if (!bat)
+ ok = LOG_ERR;
+ else {
+ c->data = bat;
+ obat = timestamp_delta(oc->data, tr->stime);
+ ok = dup_bat(tr, c->t, obat, bat, type, isNew(oc),
c->base.flag == TR_NEW);
+ if(ok == LOG_OK)
+ c->base.allocated = 1;
+ }
}
- bat = c->data;
+
+ if(ok == LOG_ERR)
+ return ok;
+
+ bat = c->data;
/* appends only write */
bat->wtime = c->base.wtime = c->t->base.wtime = c->t->s->base.wtime =
tr->wtime = tr->wstime;
/* inserts are ordered with the current delta implementation */
@@ -780,8 +815,12 @@ append_col(sql_trans *tr, sql_column *c,
ok = delta_append_val(bat, i);
if (!c->t->data || !c->t->base.allocated) {
sql_table *ot = tr_find_table(tr->parent, c->t);
- sql_dbat *bat = c->t->data = ZNEW(sql_dbat), *obat =
timestamp_dbat(ot->data, tr->stime);
- dup_dbat(tr, obat, bat, isNew(ot), isTempTable(c->t));
+ sql_dbat *bat = ZNEW(sql_dbat), *obat;
+ if (!bat)
+ return LOG_ERR;
+ c->t->data = bat;
+ obat = timestamp_dbat(ot->data, tr->stime);
+ dup_dbat(tr, obat, bat, isNew(ot), isTempTable(c->t));
c->t->base.allocated = 1;
}
if (c->t && c->t->data && ((sql_dbat*)c->t->data)->cached) {
@@ -806,11 +845,22 @@ append_idx(sql_trans *tr, sql_idx * i, v
if (!i->data || !i->base.allocated) {
int type = (oid_index(i->type))?TYPE_oid:TYPE_lng;
sql_idx *oi = tr_find_idx(tr->parent, i);
- sql_delta *bat = i->data = ZNEW(sql_delta), *obat =
timestamp_delta(oi->data, tr->stime);
- (void)dup_bat(tr, i->t, obat, bat, type, isNew(i), i->base.flag
== TR_NEW);
- i->base.allocated = 1;
+ sql_delta *bat = ZNEW(sql_delta), *obat;
+ if(!bat)
+ ok = LOG_ERR;
+ else {
+ i->data = bat;
+ obat = timestamp_delta(oi->data, tr->stime);
+ ok = dup_bat(tr, i->t, obat, bat, type, isNew(i),
i->base.flag == TR_NEW);
+ if(ok != LOG_ERR)
+ i->base.allocated = 1;
+ }
}
- bat = i->data;
+
+ if(ok == LOG_ERR)
+ return ok;
+
+ bat = i->data;
/* appends only write */
bat->wtime = i->base.wtime = i->t->base.wtime = i->t->s->base.wtime =
tr->wtime = tr->wstime;
if (tpe == TYPE_bat)
@@ -819,10 +869,20 @@ append_idx(sql_trans *tr, sql_idx * i, v
ok = delta_append_val(bat, ib);
if (!i->t->data || !i->t->base.allocated) {
sql_table *ot = tr_find_table(tr->parent, i->t);
- sql_dbat *bat = i->t->data = ZNEW(sql_dbat), *obat =
timestamp_dbat(ot->data, tr->stime);
- dup_dbat(tr, obat, bat, isNew(ot), isTempTable(i->t));
- i->t->base.allocated = 1;
+ sql_dbat *bat = ZNEW(sql_dbat), *obat;
+ if(!bat)
+ ok = LOG_ERR;
+ else {
+ i->t->data = bat;
+ obat = timestamp_dbat(ot->data, tr->stime);
+ dup_dbat(tr, obat, bat, isNew(ot), isTempTable(i->t));
+ i->t->base.allocated = 1;
+ }
}
+
+ if(ok == LOG_ERR)
+ return ok;
+
if (i->t && i->t->data && ((sql_dbat*)i->t->data)->cached) {
sql_dbat *bat = i->t->data;
@@ -895,11 +955,15 @@ delete_tab(sql_trans *tr, sql_table * t,
if (!t->data || !t->base.allocated) {
sql_table *ot = tr_find_table(tr->parent, t);
- sql_dbat *bat = t->data = ZNEW(sql_dbat), *obat =
timestamp_dbat(ot->data, tr->stime);
- dup_dbat(tr, obat, bat, isNew(ot), isTempTable(t));
+ sql_dbat *bat = ZNEW(sql_dbat), *obat;
+ if(!bat)
+ return LOG_ERR;
+ t->data = bat;
+ obat = timestamp_dbat(ot->data, tr->stime);
+ dup_dbat(tr, obat, bat, isNew(ot), isTempTable(t));
t->base.allocated = 1;
}
- bat = t->data;
+ bat = t->data;
/* delete all cached copies */
if (bat->cached) {
@@ -1302,6 +1366,8 @@ create_col(sql_trans *tr, sql_column *c)
if (!bat || !c->base.allocated) {
c->data = bat = ZNEW(sql_delta);
+ if(!bat)
+ return LOG_ERR;
bat->wtime = c->base.wtime = tr->wstime;
c->base.allocated = 1;
}
@@ -1373,6 +1439,8 @@ create_idx(sql_trans *tr, sql_idx *ni)
if (!bat || !ni->base.allocated) {
ni->data = bat = ZNEW(sql_delta);
+ if(!bat)
+ return LOG_ERR;
bat->wtime = ni->base.wtime = tr->wstime;
ni->base.allocated = 1;
}
@@ -1445,6 +1513,8 @@ create_del(sql_trans *tr, sql_table *t)
if (!bat) {
t->data = bat = ZNEW(sql_dbat);
+ if(!bat)
+ return LOG_ERR;
bat->wtime = t->base.wtime = t->s->base.wtime = tr->wstime;
t->base.allocated = 1;
}
@@ -1719,9 +1789,13 @@ clear_col(sql_trans *tr, sql_column *c)
if (!c->data || !c->base.allocated) {
int type = c->type.type->localtype;
sql_column *oc = tr_find_column(tr->parent, c);
- sql_delta *bat = c->data = ZNEW(sql_delta), *obat =
timestamp_delta(oc->data, tr->stime);
+ sql_delta *bat = c->data = ZNEW(sql_delta), *obat;
+ if(!bat)
+ return 0;
+ obat = timestamp_delta(oc->data, tr->stime);
assert(tr != gtrans);
- (void)dup_bat(tr, c->t, obat, bat, type, isNew(oc),
c->base.flag == TR_NEW);
+ if(dup_bat(tr, c->t, obat, bat, type, isNew(oc), c->base.flag
== TR_NEW) == LOG_ERR)
+ return 0;
c->base.allocated = 1;
}
if (c->data)
@@ -1738,9 +1812,11 @@ clear_idx(sql_trans *tr, sql_idx *i)
int type = (oid_index(i->type))?TYPE_oid:TYPE_lng;
sql_idx *oi = tr_find_idx(tr->parent, i);
sql_delta *bat = i->data = ZNEW(sql_delta), *obat;
-
+ if(!bat)
+ return 0;
obat = timestamp_delta(oi->data, tr->stime);
- (void)dup_bat(tr, i->t, obat, bat, type, isNew(i), i->base.flag
== TR_NEW);
+ if(dup_bat(tr, i->t, obat, bat, type, isNew(i), i->base.flag ==
TR_NEW))
+ return 0;
i->base.allocated = 1;
}
if (i->data)
@@ -1912,7 +1988,10 @@ clear_del(sql_trans *tr, sql_table *t)
{
if (!t->data || !t->base.allocated) {
sql_table *ot = tr_find_table(tr->parent, t);
- sql_dbat *bat = t->data = ZNEW(sql_dbat), *obat =
timestamp_dbat(ot->data, tr->stime);
+ sql_dbat *bat = t->data = ZNEW(sql_dbat), *obat;
+ if(!bat)
+ return 0;
+ obat = timestamp_dbat(ot->data, tr->stime);
dup_dbat(tr, obat, bat, isNew(ot), isTempTable(t));
t->base.allocated = 1;
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list