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]