Changeset: 94d45b99eff7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/94d45b99eff7
Modified Files:
sql/storage/bat/bat_storage.c
sql/storage/sql_storage.h
sql/storage/store.c
testing/Mtest.py.in
Branch: default
Log Message:
Merged with Jan2022
diffs (truncated from 449 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
@@ -559,9 +559,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) {
@@ -620,6 +662,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) {
@@ -908,7 +953,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;
@@ -922,22 +967,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);
@@ -962,7 +1009,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;
}
@@ -978,7 +1025,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;
}
@@ -1027,8 +1074,8 @@ bind_updates(sql_trans *tr, sql_column *
type = b->ttype;
}
- upd->ui = bind_ubat(tr, d, RD_UPD_ID, type, cnt);
- upd->uv = bind_ubat(tr, d, RD_UPD_VAL, type, cnt);
+ upd->ui = bind_ubat(tr, d, isTempTable(c->t), RD_UPD_ID, type, cnt);
+ upd->uv = bind_ubat(tr, d, isTempTable(c->t), RD_UPD_VAL, type, cnt);
unlock_column(tr->store, c->base.id);
@@ -2038,6 +2085,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))
@@ -2107,6 +2157,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))
@@ -2307,6 +2360,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;
@@ -2344,6 +2400,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;
@@ -2632,6 +2691,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;
@@ -2938,7 +3000,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);
}
@@ -4580,6 +4642,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)
@@ -4595,6 +4660,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)
@@ -4760,51 +4828,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)
{
@@ -4867,7 +4890,6 @@ col_compress(sql_trans *tr, sql_column *
return LOG_OK;
}
-
void
bat_storage_init( store_functions *sf)
{
@@ -4915,7 +4937,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
@@ -217,8 +217,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 */
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]