Changeset: ea82ee04de3b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/ea82ee04de3b Branch: default Log Message:
Merge with sch_rename_more_permissive branch diffs (truncated from 717 to 300 lines): diff --git a/sql/ChangeLog b/sql/ChangeLog --- a/sql/ChangeLog +++ b/sql/ChangeLog @@ -1,7 +1,13 @@ # ChangeLog file for sql # This file is updated with Maddlog -* Tue Apr 8 2024 Joeri van Ruth <joeri.van.r...@monetdbsolutions.com> +* Wed Apr 10 2024 Lucas Pereira <lucas.pere...@monetdbsolutions.com> +- Make schema renaming more permissive. A schema can be renamed if it + does not contain objects that are a dependency for objects outside + the schema. If such dependencies exist, they are shown in the + table sys.dependencies. + +* Tue Apr 8 2023 Joeri van Ruth <joeri.van.r...@monetdbsolutions.com> - Add a DECIMAL AS clause to COPY INTO that configures the decimal separator and thousands separator for decimals, temporal types and floats. 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 @@ -5584,7 +5584,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; @@ -6161,7 +6161,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) { @@ -6345,7 +6345,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 * @@ -1150,11 +1150,19 @@ alter_table(Client cntxt, mvc *sql, char node *n; if (!(s = mvc_bind_schema(sql, sname))) - throw(SQL,"sql.alter_table", SQLSTATE(3F000) "ALTER TABLE: no such schema '%s'", sname); - if (!mvc_schema_privs(sql, s) && !(isTempSchema(s) && t->persistence == SQL_LOCAL_TEMP)) - throw(SQL,"sql.alter_table", SQLSTATE(42000) "ALTER TABLE: insufficient privileges for user '%s' in schema '%s'", get_string_global_var(sql, "current_user"), s->base.name); + throw(SQL,"sql.alter_table", + SQLSTATE(3F000) "ALTER TABLE: no such schema '%s'", sname); + + if (!mvc_schema_privs(sql, s) && + !(isTempSchema(s) && t->persistence == SQL_LOCAL_TEMP)) + throw(SQL,"sql.alter_table", + SQLSTATE(42000) "ALTER TABLE: insufficient privileges for" + " user '%s' in schema '%s'", + get_string_global_var(sql, "current_user"), s->base.name); + if (!(nt = mvc_bind_table(sql, s, t->base.name))) - throw(SQL,"sql.alter_table", SQLSTATE(42S02) "ALTER TABLE: no such table '%s'", t->base.name); + throw(SQL,"sql.alter_table", + SQLSTATE(42S02) "ALTER TABLE: no such table '%s'", t->base.name); sql_table *gt = NULL; if (nt && isTempTable(nt)) { @@ -1172,7 +1180,9 @@ alter_table(Client cntxt, mvc *sql, char if (!i->base.new || i->base.deleted) continue; if (i->key && i->key->type == pkey) - throw(SQL,"sql.alter_table", SQLSTATE(40000) "CONSTRAINT PRIMARY KEY: a table can have only one PRIMARY KEY\n"); + throw(SQL,"sql.alter_table", + SQLSTATE(40000) "CONSTRAINT PRIMARY KEY: a" + " table can have only one PRIMARY KEY\n"); } } } @@ -1191,7 +1201,8 @@ alter_table(Client cntxt, mvc *sql, char throw(SQL,"sql.alter_table",SQLSTATE(HY013) MAL_MALLOC_FAIL); case -2: case -3: - throw(SQL,"sql.alter_table",SQLSTATE(42000) "ALTER TABLE: transaction conflict detected"); + throw(SQL,"sql.alter_table", + SQLSTATE(42000) "ALTER TABLE: transaction conflict detected"); default: break; } @@ -2128,34 +2139,57 @@ 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 (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 @@ -719,7 +719,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 @@ -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" + " 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 @@ -1422,19 +1422,21 @@ 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)) \ _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org