Changeset: 018c3b8aefa4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/018c3b8aefa4
Added Files:
        sql/test/BugTracker-2026/Tests/7782-roles-view.test
Modified Files:
        sql/backends/monet5/sql_upgrades.c
        sql/scripts/10_sys_schema_extension.sql
        sql/test/BugTracker-2026/Tests/All
Branch: Dec2025
Log Message:

Fix #7782 correct definition of system view sys.roles.


diffs (128 lines):

diff --git a/sql/backends/monet5/sql_upgrades.c 
b/sql/backends/monet5/sql_upgrades.c
--- a/sql/backends/monet5/sql_upgrades.c
+++ b/sql/backends/monet5/sql_upgrades.c
@@ -5263,6 +5263,39 @@ sql_update_dec2025(Client c, mvc *sql, s
        return err;
 }
 
+static str
+sql_update_dec2025_sp1(Client c, mvc *sql, sql_schema *s)
+{
+       char *err = NULL;
+       res_table *output = NULL;
+       BAT *b;
+
+       /* 10_sys_schema_extension.sql */
+       /* correct definition of view sys.roles */
+       static const char query1[] = "select id from sys._tables where name = 
'roles' and schema_id = 2000"
+               " and query = 'create view sys.roles as select id, name, 
grantor from sys.auths a where a.name not in (select u.name from 
sys.db_user_info u);';";
+       err = SQLstatementIntern(c, query1, "update", true, false, &output);
+       if (err == MAL_SUCCEED && (b = BBPquickdesc(output->cols[0].b)) && 
BATcount(b) == 1) {
+               static const char stmt1[] =
+                       "DROP VIEW sys.roles CASCADE;\n"
+                       "CREATE VIEW sys.roles AS SELECT id, name, grantor FROM 
sys.auths;\n"
+                       "GRANT SELECT ON sys.roles TO PUBLIC;\n"
+                       "UPDATE sys._tables SET system = true WHERE not system 
and schema_id = 2000 and name = 'roles';\n";
+               sql_table *t;
+               if ((t = mvc_bind_table(sql, s, "roles")) != NULL)
+                       t->system = 0; /* make it non-system else the drop view 
will fail */
+               printf("Running database upgrade commands:\n%s\n", stmt1);
+               fflush(stdout);
+               err = SQLstatementIntern(c, stmt1, "update", true, false, NULL);
+       }
+       if (output != NULL) {
+               res_table_destroy(output);
+               output = NULL;
+       }
+
+       return err;
+}
+
 int
 SQLupgrades(Client c, mvc *m)
 {
@@ -5346,6 +5379,11 @@ SQLupgrades(Client c, mvc *m)
                goto handle_error;
        }
 
+       if ((err = sql_update_dec2025_sp1(c, m, s)) != NULL) {
+               TRC_CRITICAL(SQL_PARSER, "%s\n", err);
+               goto handle_error;
+       }
+
        return 0;
 
 handle_error:
diff --git a/sql/scripts/10_sys_schema_extension.sql 
b/sql/scripts/10_sys_schema_extension.sql
--- a/sql/scripts/10_sys_schema_extension.sql
+++ b/sql/scripts/10_sys_schema_extension.sql
@@ -505,8 +505,7 @@ GRANT SELECT ON sys.privilege_codes TO P
 
 
 -- Utility views to list the defined roles and users.
--- Note: sys.auths contains both users and roles as the names must be distinct.
-CREATE VIEW sys.roles AS SELECT id, name, grantor FROM sys.auths a WHERE 
a.name NOT IN (SELECT u.name FROM sys.db_user_info u);
+CREATE VIEW sys.roles AS SELECT id, name, grantor FROM sys.auths;
 GRANT SELECT ON sys.roles TO PUBLIC;
 CREATE VIEW sys.users AS SELECT name, fullname, default_schema, schema_path, 
max_memory, max_workers, optimizer, default_role FROM sys.db_user_info;
 GRANT SELECT ON sys.users TO PUBLIC;
diff --git a/sql/test/BugTracker-2026/Tests/7782-roles-view.test 
b/sql/test/BugTracker-2026/Tests/7782-roles-view.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2026/Tests/7782-roles-view.test
@@ -0,0 +1,48 @@
+-- create a user WITHOUT a default role
+statement ok
+create user a with password 'A' name 'Aa'
+
+-- check the users
+query TT
+select name, fullname from sys.users where name = 'a'
+----
+a
+Aa
+
+statement error Role 'a' already exists
+create role a
+
+-- Apparently the create user a implicitly also creates a role with the same 
name
+-- check the roles
+query T
+select name from sys.roles where name = 'a'
+----
+a
+
+-- check the auths
+query T
+select name from sys.auths where name = 'a'
+----
+a
+
+
+-- cleanup
+statement ok
+alter user "a" set schema "sys"
+
+statement ok
+drop schema "a" cascade
+
+statement ok
+drop user "a"
+
+-- check the users
+query TT
+select name, fullname from sys.users where name = 'a'
+----
+
+-- check the roles
+query T
+select name from sys.roles where name = 'a'
+----
+
diff --git a/sql/test/BugTracker-2026/Tests/All 
b/sql/test/BugTracker-2026/Tests/All
--- a/sql/test/BugTracker-2026/Tests/All
+++ b/sql/test/BugTracker-2026/Tests/All
@@ -1,2 +1,3 @@
 7780-unnest-slow
+7782-roles-view
 7783-deleted-row
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to