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