Changeset: 8a647131391e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/8a647131391e
Modified Files:
sql/storage/bat/bat_storage.c
sql/storage/sql_storage.h
sql/storage/store.c
Branch: Jan2022
Log Message:
merged with jul2021
diffs (truncated from 407 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
@@ -549,9 +549,51 @@ 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);
+ node *n = cs_find_id(&tr->localtmps, t->base.id);
+ sql_table *lt = NULL;
+
+ if (n)
+ lt = (sql_table*)n->data;
+ if (!lt) {
+ lt = globaltmp_instantiate(tr, t);
+ /* TODO prepend to not mark as new */
+ if (lt)
+ cs_add(&tr->localtmps, lt, true);
+ }
+ 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) {
@@ -610,6 +652,9 @@ 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) {
@@ -898,7 +943,7 @@ older_delta( sql_delta *d, sql_trans *tr
}
static BAT *
-bind_ubat(sql_trans *tr, sql_delta *d, int access, int type, size_t cnt)
+bind_ubat(sql_trans *tr, sql_delta *d, bool temp, int access, int type, size_t
cnt)
{
assert(tr->active);
sql_delta *o = NULL;
@@ -912,22 +957,24 @@ bind_ubat(sql_trans *tr, sql_delta *d, i
return NULL;
}
}
- 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 (!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;
}
- if ((ui = merge_updates(ui, &uv, oui, ouv)) == NULL)
- return NULL;
- d = o;
}
if (uv) {
bat_destroy(ui);
@@ -952,7 +999,7 @@ bind_ucol(sql_trans *tr, sql_column *c,
type = b->ttype;
}
- BAT *bn = bind_ubat(tr, d, access, type, cnt);
+ BAT *bn = bind_ubat(tr, d, isTempTable(c->t), access, type, cnt);
unlock_column(tr->store, c->base.id);
return bn;
}
@@ -968,7 +1015,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, access, type, cnt);
+ BAT *bn = bind_ubat(tr, d, isTempTable(i->t), access, type, cnt);
unlock_column(tr->store, i->base.id);
return bn;
}
@@ -1986,6 +2033,9 @@ update_col(sql_trans *tr, sql_column *c,
bool update_conflict = false;
sql_delta *delta, *odelta = ATOMIC_PTR_GET(&c->data);
+ if (isTempTable(c->t) && isGlobal(c->t))
+ c = find_tmp_column(tr, c);
+
if (tpe == TYPE_bat) {
BAT *t = tids;
if (!BATcount(t))
@@ -2055,6 +2105,9 @@ update_idx(sql_trans *tr, sql_idx * i, v
bool update_conflict = false;
sql_delta *delta, *odelta = ATOMIC_PTR_GET(&i->data);
+ if (isTempTable(i->t) && isGlobal(i->t))
+ i = find_tmp_idx(tr, i);
+
if (tpe == TYPE_bat) {
BAT *t = tids;
if (!BATcount(t))
@@ -2255,6 +2308,9 @@ 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 ((delta = bind_col_data(tr, c, NULL)) == NULL)
return LOG_ERR;
@@ -2292,6 +2348,9 @@ 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 ((delta = bind_idx_data(tr, i, NULL)) == NULL)
return LOG_ERR;
@@ -2580,6 +2639,9 @@ delete_tab(sql_trans *tr, sql_table * t,
BAT *b = ib;
storage *bat;
+ if (isTempTable(t) && isGlobal(t))
+ t = find_tmp_table(tr, t);
+
if (tpe == TYPE_bat && !BATcount(b))
return ok;
@@ -2886,7 +2948,7 @@ create_col(sql_trans *tr, sql_column *c)
size_t cnt = 0;
/* alter ? */
- if (ol_first_node(c->t->columns) && (fc =
ol_first_node(c->t->columns)->data) != NULL) {
+ 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);
cnt = segs_end(s->segs, tr, c->t);
}
@@ -4528,6 +4590,9 @@ claim_tab(sql_trans *tr, sql_table *t, s
{
storage *s;
+ if (isTempTable(t) && isGlobal(t))
+ t = find_tmp_table(tr, t);
+
/* we have a single segment structure for each persistent table
* for temporary tables each has its own */
if ((s = bind_del_data(tr, t, NULL)) == NULL)
@@ -4543,6 +4608,9 @@ key_claim_tab(sql_trans *tr, sql_table *
storage *s;
int res = 0;
+ if (isTempTable(t) && isGlobal(t))
+ t = find_tmp_table(tr, t);
+
/* we have a single segment structure for each persistent table
* for temporary tables each has its own */
if ((s = bind_del_data(tr, t, NULL)) == NULL)
@@ -4708,51 +4776,6 @@ bind_cands(sql_trans *tr, sql_table *t,
return segments2cands(s, tr, t, start, end);
}
-static void
-temp_del_tab(sql_trans *tr, sql_table *t)
-{
- ulng tid = tr->tid;
- lock_table(tr->store, t->base.id);
- table_retry:
- for (storage *d = ATOMIC_PTR_GET(&t->data), *p = NULL, *n = NULL; d; d
= n) {
- n = d->next;
- if (d->cs.ts == tid) {
- if (p == NULL) {
- if (!ATOMIC_PTR_CAS(&t->data, (void **) &d, n))
- goto table_retry;
- } else {
- p->next = n;
- }
- d->next = NULL;
- destroy_storage(d);
- } else {
- p = d;
- }
- }
- unlock_table(tr->store, t->base.id);
- for (node *nd = t->columns->l->h; nd; nd = nd->next) {
- sql_column *c = nd->data;
- lock_column(tr->store, c->base.id);
- column_retry:
- for (sql_delta *d = ATOMIC_PTR_GET(&c->data), *p = NULL, *n =
NULL; d; d = n) {
- n = d->next;
- if (d->cs.ts == tid) {
- if (p == NULL) {
- if (!ATOMIC_PTR_CAS(&c->data, (void **)
&d, n))
- goto column_retry;
- } else {
- p->next = n;
- }
- d->next = NULL;
- destroy_delta(d, false);
- } else {
- p = d;
- }
- }
- unlock_column(tr->store, c->base.id);
- }
-}
-
static int
swap_bats(sql_trans *tr, sql_column *col, BAT *bn)
{
@@ -4813,7 +4836,6 @@ col_compress(sql_trans *tr, sql_column *
return LOG_OK;
}
-
void
bat_storage_init( store_functions *sf)
{
@@ -4860,7 +4882,6 @@ bat_storage_init( store_functions *sf)
sf->clear_table = &clear_table;
- sf->temp_del_tab = &temp_del_tab;
sf->swap_bats = &swap_bats;
sf->col_compress = &col_compress;
}
diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h
--- a/sql/storage/sql_storage.h
+++ b/sql/storage/sql_storage.h
@@ -211,8 +211,6 @@ typedef int (*col_compress_fptr) (sql_tr
*/
typedef int (*update_table_fptr) (sql_trans *tr, sql_table *ft, sql_table *tt);
-typedef void (*temp_del_tab_fptr) (sql_trans *tr, sql_table *ft);
-
/* backing struct for this interface */
typedef struct store_functions {
@@ -262,7 +260,6 @@ typedef struct store_functions {
upgrade_col_fptr upgrade_col;
upgrade_idx_fptr upgrade_idx;
upgrade_del_fptr upgrade_del;
- temp_del_tab_fptr temp_del_tab;
swap_bats_fptr swap_bats;
} store_functions;
@@ -460,6 +457,7 @@ extern int sql_trans_copy_column(sql_tra
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]