Changeset: d2afa16d05c8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d2afa16d05c8
Modified Files:
sql/storage/bat/bat_storage.c
Branch: tempscs2os
Log Message:
Get rid of specialized TEMP code in bat_storage as much as possible.
diffs (truncated from 920 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
@@ -15,7 +15,7 @@
#include "matomic.h"
#define FATAL_MERGE_FAILURE "Out Of Memory during critical merge operation: %s"
-#define inTransaction(tr,t) (isLocalTemp(t))
+#define NOT_TO_BE_LOGGED(t) (isUnloggedTable(t) || isTempTable(t))
static int log_update_col( sql_trans *tr, sql_change *c);
static int log_update_idx( sql_trans *tr, sql_change *c);
@@ -494,74 +494,6 @@ new_segments(sql_trans *tr, size_t cnt)
return n;
}
-static int
-temp_dup_cs(column_storage *cs, ulng tid, int type)
-{
- BAT *b = bat_new(type, 1024, SYSTRANS);
- if (!b)
- return LOG_ERR;
- bat_set_access(b, BAT_READ);
- cs->bid = temp_create(b);
- bat_destroy(b);
- cs->uibid = e_bat(TYPE_oid);
- cs->uvbid = e_bat(type);
- if (cs->uibid == BID_NIL || cs->uvbid == BID_NIL)
- return LOG_ERR;
- cs->ucnt = 0;
- cs->cleared = 0;
- cs->ts = tid;
- cs->refcnt = 1;
- return LOG_OK;
-}
-
-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;
- }
- return bat;
-}
-
-static sql_delta *
-temp_delta(sql_delta *d, ulng tid)
-{
- while (d && d->cs.ts != tid)
- d = d->next;
- return d;
-}
-
-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;
- }
- if (!(bat->segs = new_segments(tr, 0))) {
- _DELETE(bat);
- return NULL;
- }
- return bat;
-}
-
-static storage *
-temp_storage(storage *d, ulng tid)
-{
- while (d && d->cs.ts != tid)
- d = d->next;
- return d;
-}
-
static sql_delta *
timestamp_delta( sql_trans *tr, sql_delta *d)
{
@@ -570,57 +502,6 @@ timestamp_delta( sql_trans *tr, sql_delt
return d;
}
-static sql_table *
-find_tmp_table(sql_trans *tr, sql_table *t)
-{
- assert(isGlobal(t));
- assert(tr->tmp == t->s);
- sql_table *lt = (sql_table*) os_find_id(tr->_localtmps, tr, t->base.id);
-
- if (!lt) {
- lt = globaltmp_instantiate(tr, t);
- }
- return lt;
-}
-
-static sql_column *
-find_tmp_column(sql_trans *tr, sql_column *c)
-{
- assert(isGlobal(c->t));
- sql_table *lt = find_tmp_table(tr, c->t);
- if (lt)
- return find_sql_column(lt, c->base.name);
- return NULL;
-}
-
-static sql_idx *
-find_tmp_idx(sql_trans *tr, sql_idx *i)
-{
- assert(isGlobal(i->t));
- sql_table *lt = find_tmp_table(tr, i->t);
- if (lt)
- return find_sql_idx(lt, i->base.name);
- return NULL;
-}
-
-static sql_delta *
-temp_col_timestamp_delta( sql_trans *tr, sql_column *c)
-{
- if (isGlobal(c->t))
- c = find_tmp_column(tr, c);
- assert (!isGlobal(c->t));
- assert(isTempTable(c->t));
- sql_delta *d = temp_delta(ATOMIC_PTR_GET(&c->data), tr->tid);
- if (!d) {
- 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 */
- }
- return d;
-}
-
static sql_delta *
col_timestamp_delta( sql_trans *tr, sql_column *c)
{
@@ -628,27 +509,8 @@ col_timestamp_delta( sql_trans *tr, sql_
}
static sql_delta *
-temp_idx_timestamp_delta( sql_trans *tr, sql_idx *i)
-{
- assert(isTempTable(i->t));
- sql_delta *d = temp_delta(ATOMIC_PTR_GET(&i->data), tr->tid);
- if (!d) {
- int type = oid_index(i->type)?TYPE_oid:TYPE_lng;
-
- 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 */
- }
- return d;
-}
-
-static sql_delta *
idx_timestamp_delta( sql_trans *tr, sql_idx *i)
{
- if (isTempTable(i->t))
- return temp_idx_timestamp_delta(tr, i);
return timestamp_delta( tr, ATOMIC_PTR_GET(&i->data));
}
@@ -663,24 +525,6 @@ timestamp_storage( sql_trans *tr, storag
}
static storage *
-temp_tab_timestamp_storage( sql_trans *tr, sql_table *t)
-{
- if (isGlobal(t))
- t = find_tmp_table(tr, t);
- assert(!isGlobal(t));
- assert(isTempTable(t));
- storage *d = temp_storage(ATOMIC_PTR_GET(&t->data), tr->tid);
- if (!d) {
- 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 */
- }
- return d;
-}
-
-static storage *
tab_timestamp_storage( sql_trans *tr, sql_table *t)
{
return timestamp_storage( tr, ATOMIC_PTR_GET(&t->data));
@@ -777,7 +621,7 @@ count_col(sql_trans *tr, sql_column *c,
return ds?ds->cs.ucnt:0;
if (access == 1)
return count_inserts(d->segs->h, tr);
- if (access == QUICK || isTempTable(c->t))
+ if (access == QUICK)
return d->segs->t?d->segs->t->end:0;
if (access == CNT_ACTIVE) {
size_t cnt = segs_end(d->segs, tr, c->t);
@@ -805,7 +649,7 @@ count_idx(sql_trans *tr, sql_idx *i, int
return ds?ds->cs.ucnt:0;
if (access == 1)
return count_inserts(d->segs->h, tr);
- if (access == QUICK || isTempTable(i->t))
+ if (access == QUICK)
return d->segs->t?d->segs->t->end:0;
return segs_end(d->segs, tr, i->t);
}
@@ -954,7 +798,7 @@ older_delta( sql_delta *d, sql_trans *tr
}
static BAT *
-bind_ubat(sql_trans *tr, sql_delta *d, bool temp, int access, int type, size_t
cnt)
+bind_ubat(sql_trans *tr, sql_delta *d, int access, int type, size_t cnt)
{
assert(tr->active);
sql_delta *o = NULL;
@@ -968,24 +812,22 @@ bind_ubat(sql_trans *tr, sql_delta *d, b
return NULL;
}
}
- if (!temp) {
- while ((o = older_delta(d, tr)) != NULL) {
- BAT *oui = NULL, *ouv = NULL;
- if (!oui)
- oui = cs_bind_ubat(&o->cs, RD_UPD_ID, type,
cnt);
- if (access == RD_UPD_VAL)
- ouv = cs_bind_ubat(&o->cs, RD_UPD_VAL, type,
cnt);
- if (!ui || !oui || (access == RD_UPD_VAL && (!uv ||
!ouv))) {
- bat_destroy(ui);
- bat_destroy(uv);
- bat_destroy(oui);
- bat_destroy(ouv);
- return NULL;
- }
- if ((ui = merge_updates(ui, &uv, oui, ouv)) == NULL)
- return NULL;
- d = o;
+ while ((o = older_delta(d, tr)) != NULL) {
+ BAT *oui = NULL, *ouv = NULL;
+ if (!oui)
+ oui = cs_bind_ubat(&o->cs, RD_UPD_ID, type, cnt);
+ if (access == RD_UPD_VAL)
+ ouv = cs_bind_ubat(&o->cs, RD_UPD_VAL, type, cnt);
+ if (!ui || !oui || (access == RD_UPD_VAL && (!uv || !ouv))) {
+ bat_destroy(ui);
+ bat_destroy(uv);
+ bat_destroy(oui);
+ bat_destroy(ouv);
+ return NULL;
}
+ if ((ui = merge_updates(ui, &uv, oui, ouv)) == NULL)
+ return NULL;
+ d = o;
}
if (uv) {
bat_destroy(ui);
@@ -1010,7 +852,7 @@ bind_ucol(sql_trans *tr, sql_column *c,
type = b->ttype;
}
- BAT *bn = bind_ubat(tr, d, isTempTable(c->t), access, type, cnt);
+ BAT *bn = bind_ubat(tr, d, access, type, cnt);
unlock_column(tr->store, c->base.id);
return bn;
}
@@ -1026,7 +868,7 @@ bind_uidx(sql_trans *tr, sql_idx * i, in
unlock_column(tr->store, i->base.id);
return NULL;
}
- BAT *bn = bind_ubat(tr, d, isTempTable(i->t), access, type, cnt);
+ BAT *bn = bind_ubat(tr, d, access, type, cnt);
unlock_column(tr->store, i->base.id);
return bn;
}
@@ -1071,8 +913,8 @@ bind_updates(sql_trans *tr, sql_column *
type = b->ttype;
}
- *ui = bind_ubat(tr, d, isTempTable(c->t), RD_UPD_ID, type, cnt);
- *uv = bind_ubat(tr, d, isTempTable(c->t), RD_UPD_VAL, type, cnt);
+ *ui = bind_ubat(tr, d, RD_UPD_ID, type, cnt);
+ *uv = bind_ubat(tr, d, RD_UPD_VAL, type, cnt);
unlock_column(tr->store, c->base.id);
@@ -1097,8 +939,8 @@ bind_updates_idx(sql_trans *tr, sql_idx
return LOG_ERR;
}
- *ui = bind_ubat(tr, d, isTempTable(i->t), RD_UPD_ID, type, cnt);
- *uv = bind_ubat(tr, d, isTempTable(i->t), RD_UPD_VAL, type, cnt);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]