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

Reply via email to