Changeset: 67437a75ad04 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/67437a75ad04
Modified Files:
sql/storage/bat/bat_storage.c
Branch: default
Log Message:
Merge with Sep2022 branch.
diffs (truncated from 312 to 300 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
@@ -524,7 +524,7 @@ temp_dup_delta(ulng tid, int type)
if (!bat)
return NULL;
- if (temp_dup_cs(&bat->cs, tid, type)) {
+ if (temp_dup_cs(&bat->cs, tid, type) != LOG_OK) {
_DELETE(bat);
return NULL;
}
@@ -546,7 +546,7 @@ temp_dup_storage(sql_trans *tr)
if (!bat)
return NULL;
- if (temp_dup_cs(&bat->cs, tr->tid, TYPE_msk)) {
+ if (temp_dup_cs(&bat->cs, tr->tid, TYPE_msk) != LOG_OK) {
_DELETE(bat);
return NULL;
}
@@ -2136,6 +2136,9 @@ update_col(sql_trans *tr, sql_column *c,
return LOG_OK;
}
+ if (c == NULL)
+ return LOG_ERR;
+
if ((delta = bind_col_data(tr, c, &update_conflict)) == NULL)
return update_conflict ? LOG_CONFLICT : LOG_ERR;
@@ -2208,6 +2211,9 @@ update_idx(sql_trans *tr, sql_idx * i, v
return LOG_OK;
}
+ if (i == NULL)
+ return LOG_ERR;
+
if ((delta = bind_idx_data(tr, i, &update_conflict)) == NULL)
return update_conflict ? LOG_CONFLICT : LOG_ERR;
@@ -2443,8 +2449,8 @@ append_col(sql_trans *tr, sql_column *c,
return LOG_OK;
}
- if (isTempTable(c->t) && isGlobal(c->t))
- c = find_tmp_column(tr, c);
+ if (isTempTable(c->t) && isGlobal(c->t) && (c = find_tmp_column(tr, c))
== NULL)
+ return LOG_ERR;
if ((delta = bind_col_data(tr, c, NULL)) == NULL)
return LOG_ERR;
@@ -2452,8 +2458,8 @@ append_col(sql_trans *tr, sql_column *c,
assert(delta->cs.st == ST_DEFAULT || delta->cs.st == ST_DICT ||
delta->cs.st == ST_FOR);
assert(delta && (!isTempTable(c->t) || delta->cs.ts == tr->tid));
if (isTempTable(c->t))
- if ((!inTransaction(tr, c->t) && (odelta != delta ||
!segments_in_transaction(tr, c->t) || isTempTable(c->t)) && isGlobal(c->t)) ||
(!isNew(c->t) && isLocalTemp(c->t)))
- trans_add(tr, &c->base, delta, &tc_gc_col, &commit_update_col,
isTempTable(c->t) || isUnloggedTable(c->t) ? NULL : &log_update_col);
+ if ((!inTransaction(tr, c->t) && (odelta != delta ||
!segments_in_transaction(tr, c->t) || isTempTable(c->t)) && isGlobal(c->t)) ||
(!isNew(c->t) && isLocalTemp(c->t)))
+ trans_add(tr, &c->base, delta, &tc_gc_col,
&commit_update_col, isTempTable(c->t) || isUnloggedTable(c->t) ? NULL :
&log_update_col);
odelta = delta;
if ((res = append_col_execute(tr, &delta, c->base.id, offset, offsets,
data, cnt, tpe, c->storage_type)) != LOG_OK)
@@ -2483,8 +2489,8 @@ append_idx(sql_trans *tr, sql_idx *i, BU
return LOG_OK;
}
- if (isTempTable(i->t) && isGlobal(i->t))
- i = find_tmp_idx(tr, i);
+ if (isTempTable(i->t) && isGlobal(i->t) && (i = find_tmp_idx(tr, i)) ==
NULL)
+ return LOG_ERR;
if ((delta = bind_idx_data(tr, i, NULL)) == NULL)
return LOG_ERR;
@@ -2492,8 +2498,8 @@ append_idx(sql_trans *tr, sql_idx *i, BU
assert(delta->cs.st == ST_DEFAULT);
assert(delta && (!isTempTable(i->t) || delta->cs.ts == tr->tid));
if (isTempTable(i->t))
- if ((!inTransaction(tr, i->t) && (odelta != delta ||
!segments_in_transaction(tr, i->t) || isTempTable(i->t)) && isGlobal(i->t)) ||
(!isNew(i->t) && isLocalTemp(i->t)))
- trans_add(tr, &i->base, delta, &tc_gc_idx, &commit_update_idx,
isTempTable(i->t) || isUnloggedTable(i->t) ? NULL : &log_update_idx);
+ if ((!inTransaction(tr, i->t) && (odelta != delta ||
!segments_in_transaction(tr, i->t) || isTempTable(i->t)) && isGlobal(i->t)) ||
(!isNew(i->t) && isLocalTemp(i->t)))
+ trans_add(tr, &i->base, delta, &tc_gc_idx,
&commit_update_idx, isTempTable(i->t) || isUnloggedTable(i->t) ? NULL :
&log_update_idx);
odelta = delta;
res = append_col_execute(tr, &delta, i->base.id, offset, offsets, data,
cnt, tpe, NULL);
@@ -2683,15 +2689,13 @@ destroy_segments(segments *s)
_DELETE(s);
}
-static int
+static void
destroy_storage(storage *bat)
{
- int ok = LOG_OK;
-
if (--bat->cs.refcnt > 0)
- return LOG_OK;
+ return;
if (bat->next)
- ok = destroy_storage(bat->next);
+ destroy_storage(bat->next);
destroy_segments(bat->segs);
if (bat->cs.uibid)
temp_destroy(bat->cs.uibid);
@@ -2701,7 +2705,6 @@ destroy_storage(storage *bat)
temp_destroy(bat->cs.bid);
bat->cs.bid = bat->cs.uibid = bat->cs.uvbid = 0;
_DELETE(bat);
- return ok;
}
static int
@@ -2795,6 +2798,9 @@ delete_tab(sql_trans *tr, sql_table * t,
if (tpe == TYPE_bat && !BATcount(b))
return ok;
+ if (t == NULL)
+ return LOG_ERR;
+
if ((bat = bind_del_data(tr, t, NULL)) == NULL)
return LOG_ERR;
@@ -3226,6 +3232,8 @@ create_col(sql_trans *tr, sql_column *c)
/* alter ? */
if (!isTempTable(c->t) && ol_first_node(c->t->columns) && (fc =
ol_first_node(c->t->columns)->data) != NULL) {
storage *s = tab_timestamp_storage(tr, fc->t);
+ if (s == NULL)
+ return LOG_ERR;
cnt = segs_end(s->segs, tr, c->t);
}
if (cnt && fc != c) {
@@ -3354,7 +3362,7 @@ create_idx(sql_trans *tr, sql_idx *ni)
ok = LOG_ERR;
}
} else {
- ok = LOG_ERR;
+ return LOG_ERR;
}
bat->cs.ucnt = 0;
@@ -3415,8 +3423,10 @@ load_storage(sql_trans *tr, sql_table *t
}
if (BATcount(b)) {
- if (ok == LOG_OK && !(s->segs = new_segments(tr, BATcount(ib))))
- ok = LOG_ERR;
+ if (ok == LOG_OK && !(s->segs = new_segments(tr,
BATcount(ib)))) {
+ bat_destroy(ib);
+ return LOG_ERR;
+ }
if (BATtdense(b)) {
size_t start = b->tseqbase;
size_t cnt = BATcount(b);
@@ -3517,7 +3527,7 @@ create_del(sql_trans *tr, sql_table *t)
} else if (!bat->cs.bid) {
assert(!bat->segs);
if (!(bat->segs = new_segments(tr, 0)))
- ok = LOG_ERR;
+ return LOG_ERR;
b = bat_new(TYPE_msk, t->sz, PERSISTENT);
if(b != NULL) {
@@ -3525,7 +3535,7 @@ create_del(sql_trans *tr, sql_table *t)
bat->cs.bid = temp_create(b);
bat_destroy(b);
} else {
- ok = LOG_ERR;
+ return LOG_ERR;
}
if (new)
trans_add(tr, &t->base, bat, &tc_gc_del,
&commit_create_del, isTempTable(t) ? NULL : &log_create_del);
@@ -3622,7 +3632,6 @@ commit_create_del( sql_trans *tr, sql_ch
if(!isTempTable(t)) {
storage *dbat = ATOMIC_PTR_GET(&t->data);
ok = segments2cs(tr, dbat->segs, &dbat->cs);
- assert(ok == LOG_OK);
if (ok != LOG_OK)
return ok;
merge_segments(dbat, tr, change, commit_ts, commit_ts/* create
is we are alone */ /*oldest*/);
@@ -3732,11 +3741,10 @@ static int
destroy_del(sqlstore *store, sql_table *t)
{
(void)store;
- int ok = LOG_OK;
if (ATOMIC_PTR_GET(&t->data))
- ok = destroy_storage(ATOMIC_PTR_GET(&t->data));
+ destroy_storage(ATOMIC_PTR_GET(&t->data));
ATOMIC_PTR_SET(&t->data, NULL);
- return ok;
+ return LOG_OK;
}
static int
@@ -4488,7 +4496,6 @@ commit_update_del( sql_trans *tr, sql_ch
dbat->cs.ts = commit_ts;
ok = segments2cs(tr, dbat->segs, &dbat->cs);
- assert(ok == LOG_OK);
if (ok == LOG_OK) {
merge_segments(dbat, tr, change, commit_ts, oldest);
if (oldest == commit_ts)
@@ -4706,27 +4713,30 @@ claim_segmentsV2(sql_trans *tr, sql_tabl
slot = s->segs->t->start;
}
}
- ok = add_offsets(slot, cnt, total, offset, offsets);
+ if (ok == LOG_OK)
+ ok = add_offsets(slot, cnt, total, offset, offsets);
}
if (!locked)
unlock_table(tr->store, t->base.id);
- /* hard to only add this once per transaction (probably want to change
to once per new segment) */
- if ((!inTransaction(tr, t) && (!in_transaction || isTempTable(t)) &&
isGlobal(t)) || (!isNew(t) && isLocalTemp(t))) {
- trans_add(tr, &t->base, s, &tc_gc_del, &commit_update_del,
isTempTable(t) || isUnloggedTable(t) ? NULL : &log_update_del);
- in_transaction = true;
- }
- if (in_transaction && !isTempTable(t) && !isUnloggedTable(t))
- tr->logchanges += (int) total;
- if (*offsets) {
- BAT *pos = *offsets;
- assert(BATcount(pos) == total);
- BATsetcount(pos, total); /* set other properties */
- pos->tnil = false;
- pos->tnonil = true;
- pos->tkey = true;
- pos->tsorted = true;
- pos->trevsorted = false;
+ if (ok == LOG_OK) {
+ /* hard to only add this once per transaction (probably want to
change to once per new segment) */
+ if ((!inTransaction(tr, t) && (!in_transaction ||
isTempTable(t)) && isGlobal(t)) || (!isNew(t) && isLocalTemp(t))) {
+ trans_add(tr, &t->base, s, &tc_gc_del,
&commit_update_del, isTempTable(t) || isUnloggedTable(t) ? NULL :
&log_update_del);
+ in_transaction = true;
+ }
+ if (in_transaction && !isTempTable(t) && !isUnloggedTable(t))
+ tr->logchanges += (int) total;
+ if (*offsets) {
+ BAT *pos = *offsets;
+ assert(BATcount(pos) == total);
+ BATsetcount(pos, total); /* set other properties */
+ pos->tnil = false;
+ pos->tnonil = true;
+ pos->tkey = true;
+ pos->tsorted = true;
+ pos->trevsorted = false;
+ }
}
return ok;
}
@@ -4760,8 +4770,10 @@ claim_segments(sql_trans *tr, sql_table
break;
}
/* we claimed part of the old segment, the
split off part needs to stay deleted */
- if ((seg=split_segment(s->segs, seg, p, tr,
seg->start, cnt, false)) == NULL)
+ if ((seg=split_segment(s->segs, seg, p, tr,
seg->start, cnt, false)) == NULL) {
ok = LOG_ERR;
+ break;
+ }
}
seg->ts = tr->tid;
seg->deleted = false;
@@ -4787,18 +4799,17 @@ claim_segments(sql_trans *tr, sql_table
if (!locked)
unlock_table(tr->store, t->base.id);
- /* hard to only add this once per transaction (probably want to change
to once per new segment) */
- if ((!inTransaction(tr, t) && (!in_transaction || isTempTable(t)) &&
isGlobal(t)) || (!isNew(t) && isLocalTemp(t))) {
- trans_add(tr, &t->base, s, &tc_gc_del, &commit_update_del,
isTempTable(t) || isUnloggedTable(t) ? NULL : &log_update_del);
- in_transaction = true;
+ if (ok == LOG_OK) {
+ /* hard to only add this once per transaction (probably want to
change to once per new segment) */
+ if ((!inTransaction(tr, t) && (!in_transaction ||
isTempTable(t)) && isGlobal(t)) || (!isNew(t) && isLocalTemp(t))) {
+ trans_add(tr, &t->base, s, &tc_gc_del,
&commit_update_del, isTempTable(t) || isUnloggedTable(t) ? NULL :
&log_update_del);
+ in_transaction = true;
+ }
+ if (in_transaction && !isTempTable(t) && !isUnloggedTable(t))
+ tr->logchanges += (int) cnt;
+ *offset = slot;
}
- if (in_transaction && !isTempTable(t) && !isUnloggedTable(t))
- tr->logchanges += (int) cnt;
- if (ok == LOG_OK) {
- *offset = slot;
- return LOG_OK;
- }
- return LOG_ERR;
+ return ok;
}
/*
@@ -4812,8 +4823,8 @@ claim_tab(sql_trans *tr, sql_table *t, s
{
storage *s;
- if (isTempTable(t) && isGlobal(t))
- t = find_tmp_table(tr, t);
+ if (isTempTable(t) && isGlobal(t) && (t = find_tmp_table(tr, t)) ==
NULL)
+ return LOG_ERR;
/* we have a single segment structure for each persistent table
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]