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