Changeset: e5de827de0bc for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/e5de827de0bc Branch: default Log Message:
merge with transaction_layer_revamp diffs (truncated from 1626 to 300 lines): diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c --- a/sql/backends/monet5/sql_cat.c +++ b/sql/backends/monet5/sql_cat.c @@ -1121,6 +1121,13 @@ alter_table(Client cntxt, mvc *sql, char if (!(nt = mvc_bind_table(sql, s, t->base.name))) throw(SQL,"sql.alter_table", SQLSTATE(42S02) "ALTER TABLE: no such table '%s'", t->base.name); + sql_table *gt = NULL; + if (nt && isTempTable(nt)) { + gt = (sql_table*)os_find_id(s->tables, sql->session->tr, nt->base.id); + if (gt) + nt = gt; + } + /* First check if all the changes are allowed */ if (t->idxs) { /* only one pkey */ diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h --- a/sql/include/sql_catalog.h +++ b/sql/include/sql_catalog.h @@ -326,7 +326,7 @@ typedef struct sql_trans { sql_catalog *cat; sql_schema *tmp; /* each session has its own tmp schema */ - changeset localtmps; + struct objectset* localtmps; struct sql_trans *parent; /* multilevel transaction support */ } sql_trans; diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c --- a/sql/server/sql_mvc.c +++ b/sql/server/sql_mvc.c @@ -933,6 +933,7 @@ mvc_bind_table(mvc *m, sql_schema *s, co (void) m; if (!t) return NULL; + TRC_DEBUG(SQL_TRANS, "Bind table: %s.%s\n", s->base.name, tname); return t; } 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 @@ -17,7 +17,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); @@ -497,74 +497,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) != LOG_OK) { - _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) != LOG_OK) { - _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) { @@ -573,93 +505,15 @@ 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)) == NULL) - return NULL; - 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) { - if (isTempTable(c->t)) - return temp_col_timestamp_delta(tr, c); return timestamp_delta( tr, ATOMIC_PTR_GET(&c->data)); } 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)); } @@ -674,28 +528,8 @@ 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)) == NULL) - return NULL; - 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) { - if (isTempTable(t)) - return temp_tab_timestamp_storage(tr, t); return timestamp_storage( tr, ATOMIC_PTR_GET(&t->data)); } @@ -790,7 +624,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); @@ -818,7 +652,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); } @@ -967,7 +801,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; @@ -981,24 +815,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; _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org