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 -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to