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

Reply via email to