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 -- [email protected]
To unsubscribe send an email to [email protected]