Changeset: 1f54d09df052 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1f54d09df052
Modified Files:
        sql/backends/monet5/sql_cat.c
        sql/include/sql_catalog.h
        sql/server/rel_schema.c
        sql/storage/objectset.c
        sql/storage/sql_catalog.c
        sql/storage/store.c
Branch: sch_rename_more_permissive
Log Message:

schema renaming works if no explicit dependencies


diffs (155 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
@@ -2165,10 +2165,17 @@ SQLrename_schema(Client cntxt, MalBlkPtr
                        break;
        }
 
-       if (cur && s->base.id == cur->base.id) /* change current session schema 
name */
+       if (cur && s->base.id == cur->base.id) {
                if (!mvc_set_schema(sql, new_name))
                        throw(SQL, "sql.rename_schema",SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
 
+               s = mvc_bind_schema(sql, "sys");
+               assert(s);
+
+               if (!sqlvar_set_string(find_global_var(sql, s, 
"current_schema"), new_name))
+                       throw(SQL, "sql.setVariable", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+       }
+
        return msg;
 }
 
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
@@ -710,7 +710,7 @@ typedef struct sql_table {
        int drop_action;        /* only needed for alter drop table */
 
        ATOMIC_PTR_TYPE data;
-       struct sql_schema *s;
+       sql_schema *s;
 
        union {
                struct sql_column *pcol; /* If it is partitioned on a column */
diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -2647,9 +2647,9 @@ rel_rename_schema(mvc *sql, char *old_na
 
        if (mvc_check_dependency(sql, s->base.id, SCHEMA_DEPENDENCY, NULL) != 
NO_DEPENDENCY) {
                return sql_error(sql, 02,
-                                                SQLSTATE(2BM37) "ALTER SCHEMA: 
unable to "
-                                                "rename schema '%s', there are 
database objects"
-                                                " (views) which depend on it", 
old_name);
+                                                SQLSTATE(2BM37) "ALTER SCHEMA: 
unable to"
+                                                " rename schema '%s', there 
are database objects"
+                                                " which depend on it", 
old_name);
        }
 
        rel = rel_create(sql->sa);
diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c
--- a/sql/storage/objectset.c
+++ b/sql/storage/objectset.c
@@ -968,7 +968,9 @@ os_del_name_based(objectset *os, struct 
 
 static int
 os_del_id_based(objectset *os, struct sql_trans *tr, sqlid id, objectversion 
*ov) {
+
        versionhead  *id_based_node;
+
        if (ov->name_based_older && ov->name_based_older->b->id == id)
                id_based_node = ov->name_based_older->id_based_head;
        else // Previous id based objectversion is of a different name, so now 
we do have to perform an extensive look up
@@ -1029,7 +1031,7 @@ os_del_(objectset *os, struct sql_trans 
 }
 
 int
-os_del(objectset *os, struct sql_trans *tr, const char *name, sql_base *b)
+os_del(objectset *os, sql_trans *tr, const char *name, sql_base *b)
 {
        store_lock(tr->store);
        int res = os_del_(os, tr, name, b);
diff --git a/sql/storage/sql_catalog.c b/sql/storage/sql_catalog.c
--- a/sql/storage/sql_catalog.c
+++ b/sql/storage/sql_catalog.c
@@ -578,7 +578,8 @@ bool
 is_column_unique(sql_column *c)
 {
        /* is it a primary key column itself? */
-       if (c->t->pkey && list_length(c->t->pkey->k.columns) == 1 && 
((sql_kc*)c->t->pkey->k.columns->h->data)->c->base.id == c->base.id)
+       if (c->t->pkey && list_length(c->t->pkey->k.columns) == 1 &&
+               ((sql_kc*)c->t->pkey->k.columns->h->data)->c->base.id == 
c->base.id)
                return true;
        /* is it a unique key itself */
        return c->unique == 2;
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3165,7 +3165,8 @@ 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, bool dup_global_as_global)
+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_table *t = ZNEW(sql_table);
@@ -3192,7 +3193,7 @@ table_dup(sql_trans *tr, sql_table *ot, 
                t->members = list_create((fdestroy) &part_destroy);
 
        t->pkey = NULL;
-       t->s = s?s:tr->tmp;
+       t->s = s ? s : tr->tmp;
        t->sz = ot->sz;
        ATOMIC_PTR_INIT(&t->data, NULL);
 
@@ -3893,8 +3894,7 @@ schema_dup(sql_trans *tr, sql_schema *s,
        os_iterator(&oi, s->tables, tr, NULL);
        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, true))) {
+               if ((res = table_dup(tr, (sql_table*)b, ns, NULL, &t, true))) {
                        schema_destroy(tr->store, ns);
                        return res;
                }
@@ -5239,26 +5239,31 @@ int
 sql_trans_rename_schema(sql_trans *tr, sqlid id, const char *new_name)
 {
        sqlstore *store = tr->store;
-       sql_table *sysschema = find_sql_table(tr, find_sql_schema(tr, "sys"), 
"schemas");
+       table_functions table_api = store->table_api;
+       sql_table *schemas = find_sql_table(tr, find_sql_schema(tr, "sys"), 
"schemas");
        sql_schema *s = find_sql_schema_id(tr, id), *ns = NULL;
        oid rid;
        int res = LOG_OK;
 
        assert(!strNil(new_name));
 
-       rid = store->table_api.column_find_row(tr, find_sql_column(sysschema, 
"id"), &id, NULL);
+       rid = table_api.column_find_row(tr, find_sql_column(schemas, "id"), 
&id, NULL);
        assert(!is_oid_nil(rid));
-       if ((res = store->table_api.column_update_value(tr, 
find_sql_column(sysschema, "name"), rid, (void*) new_name)))
+       if ((res = table_api.column_update_value(tr, find_sql_column(schemas, 
"name"), rid, (void*) new_name)))
                return res;
 
        if (!isNew(s) && (res = sql_trans_add_dependency_change(tr, id, ddl)))
                return res;
+
        /* delete schema, add schema */
        if ((res = os_del(tr->cat->schemas, tr, s->base.name, 
dup_base(&s->base))))
                return res;
-       if ((res = schema_dup(tr, s, new_name, &ns)) || (res = 
os_add(tr->cat->schemas, tr, ns->base.name, &ns->base))) {
-               return res;
-       }
+
+       if ((res = schema_dup(tr, s, new_name, &ns)) ||
+               (res = os_add(tr->cat->schemas, tr, ns->base.name, &ns->base))) 
{
+               return res;
+       }
+
        return res;
 }
 
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to