Changeset: 83f5341ee69a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=83f5341ee69a
Modified Files:
        sql/storage/store.c
Branch: nospare
Log Message:

more handling of table objects, ie keys/indices etc


diffs (270 lines):

diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -2642,18 +2642,118 @@ key_dup_(sql_trans *tr, int flags, sql_k
        return nk;
 }
 
+static sql_column *
+column_dup(sql_trans *tr, sql_column *oc, sql_table *t, int deep)
+{
+       sqlstore *store = tr->store;
+       sql_allocator *sa = tr->sa;
+       sql_column *c = SA_ZNEW(sa, sql_column);
+
+       base_init(sa, &c->base, oc->base.id, 0, oc->base.name);
+       c->type = oc->type;
+       c->def = NULL;
+       if (oc->def)
+               c->def = sa_strdup(sa, oc->def);
+       c->null = oc->null;
+       c->colnr = oc->colnr;
+       c->unique = oc->unique;
+       c->t = t;
+       c->storage_type = NULL;
+       if (oc->storage_type)
+               c->storage_type = sa_strdup(sa, oc->storage_type);
+
+       if (isTable(c->t)) {
+               if (deep)
+                       store->storage_api.create_col(tr, c);
+               else
+                       c->data = store->storage_api.col_dup(oc);
+       }
+       return c;
+}
+
+static sql_base *
+base_incref(sql_base *b)
+{
+       b->refcnt++;
+       return b;
+}
+
+static sql_table *
+table_dup(sql_trans *tr, sql_table *ot, sql_schema *s, int deep)
+{
+       sqlstore *store = tr->store;
+       sql_allocator *sa = tr->sa;
+       sql_table *t = SA_ZNEW(sa, sql_table);
+       node *n;
+
+       base_init(sa, &t->base, ot->base.id, 0, ot->base.name);
+       t->type = ot->type;
+       t->system = ot->system;
+       t->bootstrap = ot->bootstrap;
+       t->persistence = ot->persistence;
+       t->commit_action = ot->commit_action;
+       t->access = ot->access;
+       t->query = (ot->query) ? sa_strdup(sa, ot->query) : NULL;
+       t->properties = ot->properties;
+
+       cs_new(&t->columns, sa, (fdestroy) &column_destroy);
+       cs_new(&t->keys, sa, (fdestroy) &key_destroy);
+       cs_new(&t->idxs, sa, (fdestroy) &idx_destroy);
+       cs_new(&t->triggers, sa, (fdestroy) &trigger_destroy);
+       if (ot->members.set)
+               cs_new(&t->members, sa, (fdestroy) NULL);
+
+       t->pkey = NULL;
+       t->s = s;
+       t->sz = ot->sz;
+
+       if (ot->columns.set)
+               for (n = ot->columns.set->h; n; n = n->next)
+                       cs_add(&t->columns, column_dup(tr, n->data, t, deep), 
0);
+       if (ot->idxs.set)
+               for (n = ot->idxs.set->h; n; n = n->next)
+                       cs_add(&t->idxs, base_incref(n->data), 0);
+       if (ot->keys.set)
+               for (n = ot->keys.set->h; n; n = n->next)
+                       cs_add(&t->keys, key_dup_(tr, 0, n->data, t, deep), 0);
+       if (ot->triggers.set)
+               for (n = ot->triggers.set->h; n; n = n->next)
+                       cs_add(&t->triggers, base_incref(n->data), 0);
+       if (ot->members.set)
+               for (n = ot->members.set->h; n; n = n->next)
+                       cs_add(&t->members, base_incref(n->data), 0);
+       if (isTable(t)) {
+               if (deep)
+                       store->storage_api.create_del(tr, t);
+               else
+                       t->data = store->storage_api.del_dup(ot);
+       }
+       return t;
+}
+
+static sql_table*
+new_table( sql_trans *tr, sql_table *t)
+{
+       return table_dup(tr, t, t->s, 0);
+}
+
 sql_key *
 sql_trans_copy_key( sql_trans *tr, sql_table *t, sql_key *k)
 {
        sqlstore *store = tr->store;
-       sql_key *nk = key_dup_(tr, TR_NEW, k, t, 1);
-       sql_fkey *fk = (sql_fkey*)nk;
        sql_schema *syss = find_sql_schema(tr, isGlobal(t)?"sys":"tmp");
        sql_table *syskey = find_sql_table(tr, syss, "keys");
        sql_table *syskc = find_sql_table(tr, syss, "objects");
        int neg = -1, action = -1, nr;
        node *n;
-
+       t = find_sql_table_id(tr, t->s, t->base.id); /* could have changed by 
depending changes */
+
+       if (!inTransaction(tr, t)) {
+               t = new_table(tr, t);
+               os_add(t->s->tables, tr, t->base.name, &t->base);
+       }
+       sql_key *nk = key_dup_(tr, TR_NEW, k, t, 1);
+       sql_fkey *fk = (sql_fkey*)nk;
        cs_add(&t->keys, nk, TR_NEW);
 
        if (nk->type == fkey)
@@ -2692,6 +2792,10 @@ sql_trans_copy_idx( sql_trans *tr, sql_t
        int nr, unique = 0;
        sql_idx *ni = SA_ZNEW(tr->sa, sql_idx);
 
+       if (!inTransaction(tr, t)) {
+               t = new_table(tr, t);
+               os_add(t->s->tables, tr, t->base.name, &t->base);
+       }
        base_init(tr->sa, &ni->base, i->base.id?i->base.id:next_oid(tr->store), 
TR_NEW, i->base.name);
 
        ni->columns = list_new(tr->sa, (fdestroy) NULL);
@@ -3001,96 +3105,6 @@ sql_trans_create_(sqlstore *store, sql_t
        return tr;
 }
 
-static sql_column *
-column_dup(sql_trans *tr, sql_column *oc, sql_table *t, int deep)
-{
-       sqlstore *store = tr->store;
-       sql_allocator *sa = tr->sa;
-       sql_column *c = SA_ZNEW(sa, sql_column);
-
-       base_init(sa, &c->base, oc->base.id, 0, oc->base.name);
-       c->type = oc->type;
-       c->def = NULL;
-       if (oc->def)
-               c->def = sa_strdup(sa, oc->def);
-       c->null = oc->null;
-       c->colnr = oc->colnr;
-       c->unique = oc->unique;
-       c->t = t;
-       c->storage_type = NULL;
-       if (oc->storage_type)
-               c->storage_type = sa_strdup(sa, oc->storage_type);
-
-       if (isTable(c->t)) {
-               if (deep)
-                       store->storage_api.create_col(tr, c);
-               else
-                       c->data = store->storage_api.col_dup(oc);
-       }
-       return c;
-}
-
-static sql_base *
-base_incref(sql_base *b)
-{
-       b->refcnt++;
-       return b;
-}
-
-static sql_table *
-table_dup(sql_trans *tr, sql_table *ot, sql_schema *s, int deep)
-{
-       sqlstore *store = tr->store;
-       sql_allocator *sa = tr->sa;
-       sql_table *t = SA_ZNEW(sa, sql_table);
-       node *n;
-
-       base_init(sa, &t->base, ot->base.id, 0, ot->base.name);
-       t->type = ot->type;
-       t->system = ot->system;
-       t->bootstrap = ot->bootstrap;
-       t->persistence = ot->persistence;
-       t->commit_action = ot->commit_action;
-       t->access = ot->access;
-       t->query = (ot->query) ? sa_strdup(sa, ot->query) : NULL;
-       t->properties = ot->properties;
-
-       cs_new(&t->columns, sa, (fdestroy) &column_destroy);
-       cs_new(&t->keys, sa, (fdestroy) &key_destroy);
-       cs_new(&t->idxs, sa, (fdestroy) &idx_destroy);
-       cs_new(&t->triggers, sa, (fdestroy) &trigger_destroy);
-       if (ot->members.set)
-               cs_new(&t->members, sa, (fdestroy) NULL);
-
-       t->pkey = NULL;
-
-       t->s = s;
-       t->sz = ot->sz;
-
-       if (ot->columns.set)
-               for (n = ot->columns.set->h; n; n = n->next)
-                       cs_add(&t->columns, column_dup(tr, n->data, t, deep), 
0);
-       if (ot->idxs.set)
-               for (n = ot->idxs.set->h; n; n = n->next)
-                       cs_add(&t->idxs, base_incref(n->data), 0);
-       if (ot->keys.set)
-               for (n = ot->keys.set->h; n; n = n->next)
-                       cs_add(&t->keys, key_dup_(tr, 0, n->data, t, deep), 0);
-       if (ot->triggers.set)
-               for (n = ot->triggers.set->h; n; n = n->next)
-                       cs_add(&t->triggers, base_incref(n->data), 0);
-       if (ot->members.set)
-               for (n = ot->members.set->h; n; n = n->next)
-                       cs_add(&t->members, base_incref(n->data), 0);
-       if (isTable(t)) {
-               if (deep)
-                       store->storage_api.create_del(tr, t);
-               else
-                       t->data = store->storage_api.del_dup(ot);
-       }
-       return t;
-}
-
 static sql_schema *
 schema_dup(sql_trans *tr, sql_schema *s, int deep)
 {
@@ -4221,12 +4235,6 @@ sql_trans_add_value_partition(sql_trans 
        return 0;
 }
 
-static sql_table*
-new_table( sql_trans *tr, sql_table *t)
-{
-       return table_dup(tr, t, t->s, 0);
-}
-
 sql_table*
 sql_trans_rename_table(sql_trans *tr, sql_schema *s, sqlid id, const char 
*new_name)
 {
@@ -4762,7 +4770,10 @@ sql_trans_alter_default(sql_trans *tr, s
 
                sql_table *t = col->t;
                os_del(t->s->tables, tr, t->base.name, &t->base);
-               t = new_table(tr, t);
+               if (!inTransaction(tr, t)) {
+                       t = new_table(tr, t);
+                       os_add(t->s->tables, tr, t->base.name, &t->base);
+               }
                col = new_column(tr, col, NULL);
                col->def = NULL;
                if (val)
@@ -4907,7 +4918,10 @@ sql_trans_create_ukey(sql_trans *tr, sql
        if (isTempTable(t))
                return NULL;
 
-       t = new_table(tr, t);
+       if (!inTransaction(tr, t)) {
+               t = new_table(tr, t);
+               os_add(t->s->tables, tr, t->base.name, &t->base);
+       }
        nk = (kt != fkey) ? (sql_key *) SA_ZNEW(tr->sa, sql_ukey)
        : (sql_key *) SA_ZNEW(tr->sa, sql_fkey);
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to