Changeset: 5108daa966aa for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/5108daa966aa Modified Files: sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_cat.c sql/server/rel_schema.c sql/server/sql_mvc.c sql/storage/bat/bat_table.c sql/storage/sql_storage.h sql/storage/store.c sql/storage/store_dependency.c Branch: sch_rename_more_permissive Log Message:
Allow schema renaming if schema has only implicit dependencies. WIP diffs (truncated from 467 to 300 lines): diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c --- a/sql/backends/monet5/rel_bin.c +++ b/sql/backends/monet5/rel_bin.c @@ -5589,7 +5589,7 @@ cascade_ukey(backend *be, stmt **updates { /* now iterate over all keys */ sql_trans *tr = be->mvc->session->tr; - list *keys = sql_trans_get_dependencies(tr, k->base.id, FKEY_DEPENDENCY, NULL); + list *keys = sql_trans_get_dependents(tr, k->base.id, FKEY_DEPENDENCY, NULL); if (keys) { for (node *n = keys->h; n; n = n->next->next) { sqlid fkey_id = *(sqlid*)n->data; @@ -6166,7 +6166,7 @@ sql_delete_ukey(backend *be, stmt *utids sql_subtype *lng = sql_bind_localtype("lng"); sql_subtype *bt = sql_bind_localtype("bit"); sql_trans *tr = be->mvc->session->tr; - list *keys = sql_trans_get_dependencies(tr, k->base.id, FKEY_DEPENDENCY, NULL); + list *keys = sql_trans_get_dependents(tr, k->base.id, FKEY_DEPENDENCY, NULL); if (keys) { for (node *n = keys->h; n; n = n->next->next) { @@ -6350,7 +6350,7 @@ check_for_foreign_key_references(mvc *sq sql_key *k = n->data; if (k->type == ukey || k->type == pkey) { - list *keys = sql_trans_get_dependencies(tr, k->base.id, FKEY_DEPENDENCY, NULL); + list *keys = sql_trans_get_dependents(tr, k->base.id, FKEY_DEPENDENCY, NULL); if (keys) { for (node *nn = keys->h; nn; nn = nn->next->next) { 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 @@ -38,12 +38,12 @@ #include "orderidx.h" #include "sql_user.h" -#define initcontext() \ - if ((msg = getSQLContext(cntxt, mb, &sql, NULL)) != NULL)\ - return msg;\ - if ((msg = checkSQLContext(cntxt)) != NULL)\ - return msg;\ - if (store_readonly(sql->session->tr->store))\ +#define initcontext() \ + if ((msg = getSQLContext(cntxt, mb, &sql, NULL)) != NULL) \ + return msg; \ + if ((msg = checkSQLContext(cntxt)) != NULL) \ + return msg; \ + if (store_readonly(sql->session->tr->store)) \ throw(SQL,"sql.cat",SQLSTATE(25006) "Schema statements cannot be executed on a readonly database."); static char * @@ -2125,34 +2125,50 @@ SQLrename_schema(Client cntxt, MalBlkPtr sql_schema *s; initcontext(); - sql_trans *tr = sql->session->tr; sql_schema *cur = cur_schema(sql); if (!(s = mvc_bind_schema(sql, old_name))) - throw(SQL, "sql.rename_schema", SQLSTATE(42S02) "ALTER SCHEMA: no such schema '%s'", old_name); + throw(SQL, "sql.rename_schema", SQLSTATE(42S02) + "ALTER SCHEMA: no such schema '%s'", old_name); + if (!mvc_schema_privs(sql, s)) - throw(SQL, "sql.rename_schema", SQLSTATE(42000) "ALTER SCHEMA: access denied for %s to schema '%s'", get_string_global_var(sql, "current_user"), old_name); + throw(SQL, "sql.rename_schema", SQLSTATE(42000) + "ALTER SCHEMA: access denied for %s to schema '%s'", + get_string_global_var(sql, "current_user"), old_name); + if (s->system) - throw(SQL, "sql.rename_schema", SQLSTATE(3F000) "ALTER SCHEMA: cannot rename a system schema"); - if (os_size(s->tables, tr) || os_size(s->types, tr) || os_size(s->funcs, tr) || os_size(s->seqs, tr)) - throw(SQL, "sql.rename_schema", SQLSTATE(2BM37) "ALTER SCHEMA: unable to rename schema '%s' (there are database objects which depend on it)", old_name); + throw(SQL, "sql.rename_schema", SQLSTATE(3F000) + "ALTER SCHEMA: cannot rename a system schema"); + if (strNil(new_name) || *new_name == '\0') - throw(SQL, "sql.rename_schema", SQLSTATE(3F000) "ALTER SCHEMA: invalid new schema name"); + throw(SQL, "sql.rename_schema", SQLSTATE(3F000) + "ALTER SCHEMA: invalid new schema name"); + if (mvc_bind_schema(sql, new_name)) - throw(SQL, "sql.rename_schema", SQLSTATE(3F000) "ALTER SCHEMA: there is a schema named '%s' in the database", new_name); + throw(SQL, "sql.rename_schema", SQLSTATE(3F000) + "ALTER SCHEMA: there is a schema named '%s' in the database", new_name); + + if (mvc_check_dependency(sql, s->base.id, SCHEMA_DEPENDENCY, NULL) == HAS_DEPENDENCY) { + throw(SQL, "sql.rename_schema", "ALTER SCHEMA: unable to" + " rename schema '%s', there are database objects" + " which depend on it", old_name); + } switch (sql_trans_rename_schema(sql->session->tr, s->base.id, new_name)) { case -1: throw(SQL,"sql.rename_schema", SQLSTATE(HY013) MAL_MALLOC_FAIL); case -2: case -3: - throw(SQL,"sql.rename_schema", SQLSTATE(42000) "ALTER SCHEMA: transaction conflict detected"); + throw(SQL,"sql.rename_schema", SQLSTATE(42000) + "ALTER SCHEMA: transaction conflict detected"); default: break; } + if (cur && s->base.id == cur->base.id) /* change current session schema name */ if (!mvc_set_schema(sql, new_name)) throw(SQL, "sql.rename_schema",SQLSTATE(HY013) MAL_MALLOC_FAIL); + return msg; } 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 @@ -2619,24 +2619,38 @@ rel_rename_schema(mvc *sql, char *old_na sql_schema *s; sql_rel *rel; list *exps; - sql_trans *tr = sql->session->tr; assert(old_name && new_name); if (!(s = mvc_bind_schema(sql, old_name))) { if (if_exists) return rel_psm_block(sql->sa, new_exp_list(sql->sa)); - return sql_error(sql, ERR_NOTFOUND, SQLSTATE(3F000) "ALTER SCHEMA: no such schema '%s'", old_name); + return sql_error(sql, ERR_NOTFOUND, SQLSTATE(3F000) + "ALTER SCHEMA: no such schema '%s'", old_name); } + if (!mvc_schema_privs(sql, s)) - return sql_error(sql, 02, SQLSTATE(3F000) "ALTER SCHEMA: access denied for %s to schema '%s'", get_string_global_var(sql, "current_user"), old_name); + return sql_error(sql, 02, SQLSTATE(3F000) + "ALTER SCHEMA: access denied for %s to schema '%s'", + get_string_global_var(sql, "current_user"), old_name); + if (s->system) - return sql_error(sql, 02, SQLSTATE(3F000) "ALTER SCHEMA: cannot rename a system schema"); - if (os_size(s->tables, tr) || os_size(s->types, tr) || os_size(s->funcs, tr) || os_size(s->seqs, tr)) - return sql_error(sql, 02, SQLSTATE(2BM37) "ALTER SCHEMA: unable to rename schema '%s' (there are database objects which depend on it)", old_name); + return sql_error(sql, 02, SQLSTATE(3F000) + "ALTER SCHEMA: cannot rename a system schema"); + if (strNil(new_name) || *new_name == '\0') - return sql_error(sql, 02, SQLSTATE(3F000) "ALTER SCHEMA: invalid new schema name"); + return sql_error(sql, 02, SQLSTATE(3F000) + "ALTER SCHEMA: invalid new schema name"); + if (mvc_bind_schema(sql, new_name)) - return sql_error(sql, 02, SQLSTATE(3F000) "ALTER SCHEMA: there is a schema named '%s' in the database", new_name); + return sql_error(sql, 02, SQLSTATE(3F000) + "ALTER SCHEMA: there is a schema named '%s' in the database", new_name); + + 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); + } rel = rel_create(sql->sa); exps = new_exp_list(sql->sa); @@ -2645,6 +2659,7 @@ rel_rename_schema(mvc *sql, char *old_na rel->op = op_ddl; rel->flag = ddl_rename_schema; rel->exps = exps; + return rel; } diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c --- a/sql/server/sql_mvc.c +++ b/sql/server/sql_mvc.c @@ -1421,19 +1421,22 @@ mvc_check_dependency(mvc *m, sqlid id, s break; case SCHEMA_DEPENDENCY: dep_list = sql_trans_schema_user_dependencies(m->session->tr, id); + if (list_length(dep_list) == 0) { + dep_list = sql_trans_get_dependents(m->session->tr, id, SCHEMA_DEPENDENCY, NULL); + } break; case TABLE_DEPENDENCY: - dep_list = sql_trans_get_dependencies(m->session->tr, id, TABLE_DEPENDENCY, NULL); + dep_list = sql_trans_get_dependents(m->session->tr, id, TABLE_DEPENDENCY, NULL); break; case VIEW_DEPENDENCY: - dep_list = sql_trans_get_dependencies(m->session->tr, id, TABLE_DEPENDENCY, NULL); + dep_list = sql_trans_get_dependents(m->session->tr, id, TABLE_DEPENDENCY, NULL); break; case FUNC_DEPENDENCY: case PROC_DEPENDENCY: - dep_list = sql_trans_get_dependencies(m->session->tr, id, FUNC_DEPENDENCY, ignore_ids); + dep_list = sql_trans_get_dependents(m->session->tr, id, FUNC_DEPENDENCY, ignore_ids); break; default: - dep_list = sql_trans_get_dependencies(m->session->tr, id, COLUMN_DEPENDENCY, NULL); + dep_list = sql_trans_get_dependents(m->session->tr, id, COLUMN_DEPENDENCY, NULL); } if (!dep_list) diff --git a/sql/storage/bat/bat_table.c b/sql/storage/bat/bat_table.c --- a/sql/storage/bat/bat_table.c +++ b/sql/storage/bat/bat_table.c @@ -142,28 +142,28 @@ column_find_value(sql_trans *tr, sql_col return res; } -#define column_find_tpe(TPE) \ -static TPE \ -column_find_##TPE(sql_trans *tr, sql_column *c, oid rid) \ -{ \ - BUN q = BUN_NONE; \ - BAT *b; \ - TPE res = -1; \ - \ - b = full_column(tr, c); \ - if (b) { \ - if (rid < b->hseqbase || rid >= b->hseqbase + BATcount(b)) \ - q = BUN_NONE; \ - else \ - q = rid - b->hseqbase; \ - } \ - if (q != BUN_NONE) { \ - BATiter bi = bat_iterator(b); \ - res = *(TPE*)BUNtloc(bi, q); \ - bat_iterator_end(&bi); \ - } \ - bat_destroy(b); \ - return res; \ +#define column_find_tpe(TPE) \ +static TPE \ +column_find_##TPE(sql_trans *tr, sql_column *c, oid rid) \ +{ \ + BUN q = BUN_NONE; \ + BAT *b; \ + TPE res = -1; \ + \ + b = full_column(tr, c); \ + if (b) { \ + if (rid < b->hseqbase || rid >= b->hseqbase + BATcount(b)) \ + q = BUN_NONE; \ + else \ + q = rid - b->hseqbase; \ + } \ + if (q != BUN_NONE) { \ + BATiter bi = bat_iterator(b); \ + res = *(TPE*)BUNtloc(bi, q); \ + bat_iterator_end(&bi); \ + } \ + bat_destroy(b); \ + return res; \ } column_find_tpe(sqlid) diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h --- a/sql/storage/sql_storage.h +++ b/sql/storage/sql_storage.h @@ -452,7 +452,7 @@ extern list* sql_trans_schema_user_depen extern int sql_trans_create_dependency(sql_trans *tr, sqlid id, sqlid depend_id, sql_dependency depend_type); extern int sql_trans_drop_dependencies(sql_trans *tr, sqlid depend_id); extern int sql_trans_drop_dependency(sql_trans *tr, sqlid id, sqlid depend_id, sql_dependency depend_type); -extern list* sql_trans_get_dependencies(sql_trans *tr, sqlid id, sql_dependency depend_type, list *ignore_ids); +extern list* sql_trans_get_dependents(sql_trans *tr, sqlid id, sql_dependency depend_type, list *ignore_ids); extern int sql_trans_get_dependency_type(sql_trans *tr, sqlid depend_id, sql_dependency depend_type); extern int sql_trans_check_dependency(sql_trans *tr, sqlid id, sqlid depend_id, sql_dependency depend_type); extern list* sql_trans_owner_schema_dependencies(sql_trans *tr, sqlid id); diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -3894,7 +3894,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, true)) || (res = os_add(ns->tables, tr, t->base.name, &t->base))) { + if ((res = table_dup(tr, (sql_table*)b, s, NULL, &t, true))) { schema_destroy(tr->store, ns); return res; } @@ -4204,7 +4204,7 @@ sql_trans_drop_all_dependencies(sql_tran { sqlid dep_id=0, t_id = -1; sht dep_type = 0; - list *dep = sql_trans_get_dependencies(tr, id, type, NULL); + list *dep = sql_trans_get_dependents(tr, id, type, NULL); node *n; int res = LOG_OK; diff --git a/sql/storage/store_dependency.c b/sql/storage/store_dependency.c --- a/sql/storage/store_dependency.c +++ b/sql/storage/store_dependency.c @@ -99,18 +99,24 @@ sql_trans_drop_dependency(sql_trans* tr, return log_res; } -/*It returns a list with depend_id_1, depend_type_1, depend_id_2, depend_type_2, ....*/ +/*It returns a list with depend_id_1, depend_type_1, + depend_id_2, depend_type_2, ....*/ list* -sql_trans_get_dependencies(sql_trans* tr, sqlid id, sql_dependency depend_type, list * ignore_ids) +sql_trans_get_dependents(sql_trans* tr, sqlid id, _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org