Changeset: 7ddf7e58f8df for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/7ddf7e58f8df Modified Files: sql/storage/bat/bat_storage.c sql/storage/store.c Branch: tempscs2os Log Message:
new_table should dup gtt's as gtt's diffs (132 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 @@ -3405,10 +3405,17 @@ commit_create_del( sql_trans *tr, sql_ch { int ok = LOG_OK; sql_table *t = (sql_table*)change->obj; + storage *dbat = ATOMIC_PTR_GET(&t->data); + + if (t->commit_action == CA_DELETE || t->commit_action == CA_DROP) { + assert(isTempTable(t)); + if ((ok = clear_storage(tr, t, dbat)) == LOG_OK) + if (commit_ts) dbat->segs->h->ts = commit_ts; + return ok; + } if (!commit_ts) /* rollback handled by ? */ return ok; - storage *dbat = ATOMIC_PTR_GET(&t->data); ok = segments2cs(tr, dbat->segs, &dbat->cs); assert(ok == LOG_OK); if (ok != LOG_OK) diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -3044,7 +3044,7 @@ trigger_dup(sql_trans *tr, sql_trigger * } static int -table_dup(sql_trans *tr, sql_table *ot, sql_schema *s, const char *name, sql_table **tres) +table_dup(sql_trans *tr, sql_table *ot, sql_schema *s, const char *name, sql_table **tres, bool dup_global_as_global) { sqlstore *store = tr->store; sql_allocator *sa = tr->sa; @@ -3056,7 +3056,7 @@ table_dup(sql_trans *tr, sql_table *ot, t->type = ot->type; t->system = ot->system; t->bootstrap = ot->bootstrap; - t->persistence = s?ot->persistence:SQL_LOCAL_TEMP; + t->persistence = (s || dup_global_as_global)?ot->persistence:SQL_LOCAL_TEMP; t->commit_action = ot->commit_action; t->access = ot->access; t->query = (ot->query) ? SA_STRDUP(sa, ot->query) : NULL; @@ -3149,7 +3149,7 @@ globaltmp_instantiate(sql_trans *tr, sql { assert(isGlobal(ot)&& isTempTable(ot)); sql_table *t = NULL; - if (table_dup(tr, ot, NULL, NULL, &t) == LOG_OK) + if (table_dup(tr, ot, NULL, NULL, &t, false) == LOG_OK) return t; return NULL; } @@ -3158,9 +3158,11 @@ static int new_table(sql_trans *tr, sql_table *t, sql_table **tres) { int res = LOG_OK; - t = find_sql_table(tr, t->s, t->base.name); /* could have changed by depending changes */ + if (!isGlobalTemp(t)) + t = find_sql_table(tr, t->s, t->base.name); /* could have changed by depending changes */ + if (!isLocalTemp(t) && !isNew(t) && !os_obj_intransaction(t->s->tables, tr, &t->base)) - res = table_dup(tr, t, t->s, NULL, tres); + res = table_dup(tr, t, t->s, NULL, tres, true); else *tres = t; return res; @@ -3273,7 +3275,11 @@ sql_trans_copy_key( sql_trans *tr, sql_t int neg = -1, action = -1, nr, res = LOG_OK; node *n; sql_key *nk; - + sql_table *dup = NULL; + + if ((res = new_table(tr, t, &dup))) + return res; + t = dup; if ((res = key_dup(tr, k, t, &nk))) return res; sql_fkey *fk = (sql_fkey*)nk; @@ -3347,7 +3353,11 @@ sql_trans_copy_idx( sql_trans *tr, sql_t sql_table *sysic = find_sql_table(tr, syss, "objects"); node *n; int nr, res = LOG_OK, ncols = list_length(i->columns); - + sql_table *dup = NULL; + + if ((res = new_table(tr, t, &dup))) + return res; + t = dup; sql_idx *ni = SA_ZNEW(tr->sa, sql_idx); base_init(tr->sa, &ni->base, i->base.id?i->base.id:next_oid(tr->store), true, i->base.name); ni->columns = list_new(tr->sa, (fdestroy) &kc_destroy); @@ -3469,7 +3479,12 @@ sql_trans_copy_column( sql_trans *tr, sq sqlstore *store = tr->store; sql_schema *syss = find_sql_schema(tr, isGlobal(t)?"sys":"tmp"); sql_table *syscolumn = find_sql_table(tr, syss, "_columns"); + sql_table *dup = NULL; int res = LOG_OK; + + if ((res = new_table(tr, t, &dup))) + return res; + t = dup; sql_column *col = SA_ZNEW(tr->sa, sql_column); base_init(tr->sa, &col->base, c->base.id?c->base.id:next_oid(tr->store), true, c->base.name); dup_sql_type(tr, t->s, &(c->type), &(col->type)); @@ -3728,7 +3743,7 @@ schema_dup(sql_trans *tr, sql_schema *s, for (sql_base *b = oi_next(&oi); b; b = oi_next(&oi)) { sql_table *t = NULL; - if ((res = table_dup(tr, (sql_table*)b, s, NULL, &t)) || (res = os_add(ns->tables, tr, t->base.name, &t->base))) { + if ((res = table_dup(tr, (sql_table*)b, s, NULL, &t, true)) || (res = os_add(ns->tables, tr, t->base.name, &t->base))) { schema_destroy(tr->store, ns); return res; } @@ -5543,7 +5558,7 @@ sql_trans_rename_table(sql_trans *tr, sq return res; } - if ((res = table_dup(tr, t, t->s, new_name, &dup))) + if ((res = table_dup(tr, t, t->s, new_name, &dup, true))) return res; return res; } @@ -5567,7 +5582,7 @@ sql_trans_set_table_schema(sql_trans *tr return res; if ((res = os_del(os->tables, tr, t->base.name, dup_base(&t->base)))) return res; - return table_dup(tr, t, ns, NULL, &dup); + return table_dup(tr, t, ns, NULL, &dup, true); } int _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org