Changeset: 7697a015ed04 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7697a015ed04
Modified Files:
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_cat.c
        sql/backends/monet5/sql_user.c
        sql/common/sql_backend.c
        sql/common/sql_backend.h
        sql/server/rel_schema.c
        sql/server/sql_parser.y
        sql/server/sql_privileges.c
        sql/server/sql_privileges.h
        sql/test/Users/Tests/user_default_role.SQL.py
Branch: userprofile
Log Message:

add default role in ALTER USER ... stmt


diffs (284 lines):

diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -6002,7 +6002,7 @@ static mel_func sql_init_funcs[] = {
  pattern("sqlcatalog", "create_user", SQLcreate_user, false, "Catalog 
operation create_user", args(0,10, 
arg("sname",str),arg("passwrd",str),arg("enc",int),arg("schema",str),arg("schemapath",str),arg("fullname",str),
 arg("max_memory", lng), arg("max_workers", int), arg("optimizer", str), 
arg("default_role", str))),
  pattern("sqlcatalog", "drop_user", SQLdrop_user, false, "Catalog operation 
drop_user", args(0,2, arg("sname",str),arg("action",int))),
  pattern("sqlcatalog", "drop_user", SQLdrop_user, false, "Catalog operation 
drop_user", args(0,3, arg("sname",str),arg("auth",str),arg("action",int))),
- pattern("sqlcatalog", "alter_user", SQLalter_user, false, "Catalog operation 
alter_user", args(0,6, 
arg("sname",str),arg("passwrd",str),arg("enc",int),arg("schema",str),arg("schemapath",str),arg("oldpasswrd",str))),
+ pattern("sqlcatalog", "alter_user", SQLalter_user, false, "Catalog operation 
alter_user", args(0,7, 
arg("sname",str),arg("passwrd",str),arg("enc",int),arg("schema",str),arg("schemapath",str),arg("oldpasswrd",str),arg("role",str))),
  pattern("sqlcatalog", "rename_user", SQLrename_user, false, "Catalog 
operation rename_user", args(0,3, 
arg("sname",str),arg("newnme",str),arg("action",int))),
  pattern("sqlcatalog", "create_role", SQLcreate_role, false, "Catalog 
operation create_role", args(0,3, 
arg("sname",str),arg("role",str),arg("grator",int))),
  pattern("sqlcatalog", "drop_role", SQLdrop_role, false, "Catalog operation 
drop_role", args(0,3, arg("auth",str),arg("role",str),arg("action",int))),
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
@@ -1773,9 +1773,10 @@ SQLalter_user(Client cntxt, MalBlkPtr mb
        char *schema = SaveArgReference(stk, pci, 4);
        char *schema_path = SaveArgReference(stk, pci, 5);
        char *oldpasswd = SaveArgReference(stk, pci, 6);
+       char *role = SaveArgReference(stk, pci, 7);
 
        initcontext();
-       msg = sql_alter_user(sql, sname, passwd, enc, schema, schema_path, 
oldpasswd);
+       msg = sql_alter_user(sql, sname, passwd, enc, schema, schema_path, 
oldpasswd, role);
 
        return msg;
 }
diff --git a/sql/backends/monet5/sql_user.c b/sql/backends/monet5/sql_user.c
--- a/sql/backends/monet5/sql_user.c
+++ b/sql/backends/monet5/sql_user.c
@@ -384,7 +384,8 @@ monet5_schema_has_user(ptr _mvc, sql_sch
 }
 
 static int
-monet5_alter_user(ptr _mvc, str user, str passwd, char enc, sqlid schema_id, 
str schema_path, str oldpasswd)
+monet5_alter_user(ptr _mvc, str user, str passwd, char enc, sqlid schema_id, 
str schema_path, str oldpasswd, sqlid
+               role_id)
 {
        mvc *m = (mvc *) _mvc;
        Client c = MCgetClient(m->clientid);
@@ -462,18 +463,19 @@ monet5_alter_user(ptr _mvc, str user, st
        }
 
        sqlstore *store = m->session->tr->store;
+       sql_schema *sys = find_sql_schema(m->session->tr, "sys");
+       sql_table *info = find_sql_table(m->session->tr, sys, "db_user_info");
+       sql_column *users_name = find_sql_column(info, "name");
+
+       oid rid = store->table_api.column_find_row(m->session->tr, users_name, 
user, NULL);
+       if (is_oid_nil(rid)) {
+               (void) sql_error(m, 02, "ALTER USER: user not found");
+               return FALSE;
+       }
+
        if (schema_id) {
-               sql_schema *sys = find_sql_schema(m->session->tr, "sys");
-               sql_table *info = find_sql_table(m->session->tr, sys, 
"db_user_info");
-               sql_column *users_name = find_sql_column(info, "name");
                sql_column *users_schema = find_sql_column(info, 
"default_schema");
 
-               oid rid = store->table_api.column_find_row(m->session->tr, 
users_name, user, NULL);
-               if (is_oid_nil(rid)) {
-                       (void) sql_error(m, 02, "ALTER USER: local 
inconsistency, "
-                                "your database is damaged, auth not found in 
SQL catalog");
-                       return FALSE;
-               }
                if ((res = store->table_api.column_update_value(m->session->tr, 
users_schema, rid, &schema_id))) {
                        (void) sql_error(m, 02, SQLSTATE(42000) "ALTER USER: 
failed%s",
                                                        res == LOG_CONFLICT ? " 
due to conflict with another transaction" : "");
@@ -482,9 +484,6 @@ monet5_alter_user(ptr _mvc, str user, st
        }
 
        if (schema_path) {
-               sql_schema *sys = find_sql_schema(m->session->tr, "sys");
-               sql_table *info = find_sql_table(m->session->tr, sys, 
"db_user_info");
-               sql_column *users_name = find_sql_column(info, "name");
                sql_column *sp = find_sql_column(info, "schema_path");
 
                if ((err = parse_schema_path_str(m, schema_path, false)) != 
MAL_SUCCEED) {
@@ -493,12 +492,6 @@ monet5_alter_user(ptr _mvc, str user, st
                        return (FALSE);
                }
 
-               oid rid = store->table_api.column_find_row(m->session->tr, 
users_name, user, NULL);
-               if (is_oid_nil(rid)) {
-                       (void) sql_error(m, 02, "ALTER USER: local 
inconsistency, "
-                                "your database is damaged, auth not found in 
SQL catalog");
-                       return FALSE;
-               }
                if ((res = store->table_api.column_update_value(m->session->tr, 
sp, rid, schema_path))) {
                        (void) sql_error(m, 02, SQLSTATE(42000) "ALTER USER: 
failed%s",
                                                        res == LOG_CONFLICT ? " 
due to conflict with another transaction" : "");
@@ -506,6 +499,17 @@ monet5_alter_user(ptr _mvc, str user, st
                }
        }
 
+       if (role_id) {
+               sql_column *users_role = find_sql_column(info, "default_role");
+
+               if ((res = store->table_api.column_update_value(m->session->tr, 
users_role, rid, &role_id))) {
+                       (void) sql_error(m, 02, SQLSTATE(42000) "ALTER USER: 
failed%s",
+                                                       res == LOG_CONFLICT ? " 
due to conflict with another transaction" : "");
+                       return (FALSE);
+               }
+
+       }
+
        return TRUE;
 }
 
diff --git a/sql/common/sql_backend.c b/sql/common/sql_backend.c
--- a/sql/common/sql_backend.c
+++ b/sql/common/sql_backend.c
@@ -76,10 +76,10 @@ backend_schema_has_user(ptr mvc, sql_sch
 
 int
 backend_alter_user(ptr mvc, str user, str passwd, char enc,
-                                  sqlid schema_id, char *schema_path, str 
oldpasswd)
+                                  sqlid schema_id, char *schema_path, str 
oldpasswd, sqlid role_id)
 {
        if (be_funcs.fauser != NULL)
-               return(be_funcs.fauser(mvc, user, passwd, enc, schema_id, 
schema_path, oldpasswd));
+               return(be_funcs.fauser(mvc, user, passwd, enc, schema_id, 
schema_path, oldpasswd, role_id));
        return(FALSE);
 }
 
diff --git a/sql/common/sql_backend.h b/sql/common/sql_backend.h
--- a/sql/common/sql_backend.h
+++ b/sql/common/sql_backend.h
@@ -20,7 +20,7 @@ typedef int  (*drop_user_fptr) (ptr mvc,
 typedef int  (*find_user_fptr) (ptr mvc, char *user);
 typedef void (*create_privileges_fptr) (ptr mvc, sql_schema *s);
 typedef int  (*schema_has_user_fptr) (ptr mvc, sql_schema *s);
-typedef int  (*alter_user_fptr) (ptr mvc, str user, str passwd, char enc, 
sqlid schema_id, char *schema_path, str oldpasswd);
+typedef int  (*alter_user_fptr) (ptr mvc, str user, str passwd, char enc, 
sqlid schema_id, char *schema_path, str oldpasswd, sqlid role_id);
 typedef int  (*rename_user_fptr) (ptr mvc, str olduser, str newuser);
 typedef void*  (*schema_user_dependencies) (ptr mvc, int schema_id);
 typedef void  (*create_function) (ptr mvc, str name, sql_rel *rel, sql_table 
*t);
@@ -53,7 +53,7 @@ extern int  backend_drop_user(ptr mvc, c
 extern int  backend_find_user(ptr mp, char *user);
 extern void backend_create_privileges(ptr mvc, sql_schema *s);
 extern int  backend_schema_has_user(ptr mvc, sql_schema *s);
-extern int     backend_alter_user(ptr mvc, str user, str passwd, char enc, 
sqlid schema_id, char *schema_path, str oldpasswd);
+extern int     backend_alter_user(ptr mvc, str user, str passwd, char enc, 
sqlid schema_id, char *schema_path, str oldpasswd, sqlid role_id);
 extern int     backend_rename_user(ptr mvc, str olduser, str newuser);
 extern void*   backend_schema_user_dependencies(ptr trans, sqlid schema_id);
 extern int     backend_resolve_function(ptr trans, sql_func *f, const char 
*fimp, bool *side_effect);
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
@@ -2290,7 +2290,7 @@ rel_create_user(sql_allocator *sa, char 
 }
 
 static sql_rel *
-rel_alter_user(sql_allocator *sa, char *user, char *passwd, int enc, char 
*schema, char *schema_path, char *oldpasswd)
+rel_alter_user(sql_allocator *sa, char *user, char *passwd, int enc, char 
*schema, char *schema_path, char *oldpasswd, char *role)
 {
        sql_rel *rel = rel_create(sa);
        list *exps = new_exp_list(sa);
@@ -2303,6 +2303,7 @@ rel_alter_user(sql_allocator *sa, char *
        append(exps, exp_atom_clob(sa, schema));
        append(exps, exp_atom_clob(sa, schema_path));
        append(exps, exp_atom_clob(sa, oldpasswd));
+       append(exps, exp_atom_clob(sa, role));
        rel->l = NULL;
        rel->r = NULL;
        rel->op = op_ddl;
@@ -2941,7 +2942,8 @@ rel_schemas(sql_query *query, symbol *s)
                             a->next->next->next->data.i_val == 
SQL_PW_ENCRYPTED, /* encrypted */
                             a->next->data.sval,        /* schema */
                                 a->next->next->data.sval, /* schema path */
-                            a->next->next->next->next->data.sval /* old passwd 
*/
+                            a->next->next->next->next->data.sval, /* old 
passwd */
+                            l->h->next->next->data.sval /* default role */
                    );
        }       break;
        case SQL_RENAME_USER: {
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -1230,10 +1230,10 @@ alter_statement:
          append_string(l, $7);
          append_int(l, $3);
          $$ = _symbol_create_list( SQL_SET_TABLE_SCHEMA, l ); }
- | ALTER USER ident opt_with_encrypted_password user_schema user_schema_path
+ | ALTER USER ident opt_with_encrypted_password user_schema user_schema_path 
opt_default_role
        { dlist *l = L(), *p = L();
-         if (!$4 && !$5 && !$6) {
-               yyerror(m, "ALTER USER: At least one property should be 
updatd");
+         if (!$4 && !$5 && !$6 && !$7) {
+               yyerror(m, "ALTER USER: At least one property should be 
updated");
                YYABORT;
          }
          append_string(l, $3);
@@ -1243,6 +1243,7 @@ alter_statement:
          append_int(p, $4 ? $4->h->next->data.i_val : 0);
          append_string(p, NULL);
          append_list(l, p);
+         append_string(l, $7);
          $$ = _symbol_create_list( SQL_ALTER_USER, l ); }
  | ALTER USER ident RENAME TO ident
        { dlist *l = L();
@@ -1283,6 +1284,7 @@ user_schema_path:
  |  /* empty */                        { $$ = NULL; }
  ;
 
+
 alter_table_element:
        opt_column ident SET DEFAULT default_value
        { dlist *l = L();
diff --git a/sql/server/sql_privileges.c b/sql/server/sql_privileges.c
--- a/sql/server/sql_privileges.c
+++ b/sql/server/sql_privileges.c
@@ -921,10 +921,15 @@ sql_drop_user(mvc *sql, char *user)
 }
 
 char *
-sql_alter_user(mvc *sql, char *user, char *passwd, char enc, char *schema, 
char *schema_path, char *oldpasswd)
+sql_alter_user(mvc *sql, char *user, char *passwd, char enc, char *schema, 
char *schema_path, char *oldpasswd, char *role)
 {
        sql_schema *s = NULL;
        sqlid schema_id = 0;
+       sqlid role_id = 0;
+
+       if (role)
+               if (backend_find_role(sql, role, &role_id) < 0)
+                       throw(SQL,"sql.create_user", SQLSTATE(42M31) "ALTER 
USER: no such role '%s'", role);
 
        /* we may be called from MAL (nil) */
        if (strNil(user))
@@ -943,7 +948,7 @@ sql_alter_user(mvc *sql, char *user, cha
                if (!isNew(s) && sql_trans_add_dependency(sql->session->tr, 
s->base.id, ddl) != LOG_OK)
                        throw(SQL, "sql.alter_user", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
        }
-       if (backend_alter_user(sql, user, passwd, enc, schema_id, schema_path, 
oldpasswd) == FALSE)
+       if (backend_alter_user(sql, user, passwd, enc, schema_id, schema_path, 
oldpasswd, role_id) == FALSE)
                throw(SQL,"sql.alter_user", SQLSTATE(M0M27) "%s", sql->errstr);
        return NULL;
 }
diff --git a/sql/server/sql_privileges.h b/sql/server/sql_privileges.h
--- a/sql/server/sql_privileges.h
+++ b/sql/server/sql_privileges.h
@@ -42,7 +42,7 @@ extern int sql_schema_has_user(mvc *m, s
 
 extern char * sql_create_user(mvc *sql, char *user, char *passwd, char enc, 
char *fullname, char *schema, char *schema_path, lng max_memory, int 
max_workers, char *optimizer, char *default_role);
 extern char * sql_drop_user(mvc *sql, char *user);
-extern char * sql_alter_user(mvc *sql, char *user, char *passwd, char enc, 
char *schema, char *schema_path, char *oldpasswd);
+extern char * sql_alter_user(mvc *sql, char *user, char *passwd, char enc, 
char *schema, char *schema_path, char *oldpasswd, char *role);
 extern char * sql_rename_user(mvc *sql, char *olduser, char *newuser);
 
 #endif /*_SQL_PRIV_H_ */
diff --git a/sql/test/Users/Tests/user_default_role.SQL.py 
b/sql/test/Users/Tests/user_default_role.SQL.py
--- a/sql/test/Users/Tests/user_default_role.SQL.py
+++ b/sql/test/Users/Tests/user_default_role.SQL.py
@@ -2,14 +2,24 @@ from MonetDBtesting.sqltest import SQLTe
 
 with SQLTestCase() as tc:
     tc.connect(username="monetdb", password="monetdb")
+    tc.execute('create schema pub').assertSucceeded()
     tc.execute("create role bartender").assertSucceeded()
-    tc.execute("create table beers(name VARCHAR(20))").assertSucceeded()
-    tc.execute("grant all on beers to bartender").assertSucceeded()
-    tc.execute("create user foo with password 'foo' name 'foo' schema sys 
default role bartender").assertSucceeded()
+    tc.execute("create table pub.beers(name VARCHAR(20))").assertSucceeded()
+    tc.execute("grant all on pub.beers to bartender").assertSucceeded()
+    tc.execute("create user foo with password 'foo' name 'foo' schema pub 
default role bartender").assertSucceeded()
     with SQLTestCase() as tc:
         tc.connect(username="foo", password="foo")
         tc.execute("select current_user").assertValue('foo')
         tc.execute("select current_role").assertValue('bartender')
-        tc.execute("insert into beers values ('Amstel'), ('Grolsch'), 
('Brand')").assertSucceeded()
-        tc.execute("delete from beers").assertSucceeded()
+        tc.execute("insert into pub.beers values ('Amstel'), ('Grolsch'), 
('Brand')").assertSucceeded()
+        tc.execute("delete from pub.beers").assertSucceeded()
+    # change back to implicitly created role foo
+    with SQLTestCase() as tc:
+        tc.connect(username="monetdb", password="monetdb")
+        tc.execute('alter user foo default role foo').assertSucceeded()
+    with SQLTestCase() as tc:
+        tc.connect(username="foo", password="foo")
+        tc.execute("select current_user").assertValue('foo')
+        tc.execute("select current_role").assertValue('foo')
 
+
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to