Changeset: cdce135788ed for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cdce135788ed
Modified Files:
clients/mapiclient/dump.c
clients/mapiclient/mhelp.c
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
Branch: scoping2
Log Message:
Added schema path property to user to be used in searches. Updated create,
alter user statements and database dump. Validation is the next step
diffs (truncated from 534 to 300 lines):
diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c
--- a/clients/mapiclient/dump.c
+++ b/clients/mapiclient/dump.c
@@ -2332,7 +2332,8 @@ dump_database(Mapi mid, stream *toConsol
"SELECT ui.name, "
"ui.fullname, "
"password_hash(ui.name), "
- "s.name "
+ "s.name, "
+ "ui.schema_path "
"FROM sys.db_user_info ui, "
"sys.schemas s "
"WHERE ui.default_schema = s.id "
@@ -2665,6 +2666,7 @@ dump_database(Mapi mid, stream *toConsol
const char *fullname = mapi_fetch_field(hdl, 1);
const char *pwhash = mapi_fetch_field(hdl, 2);
const char *sname = mapi_fetch_field(hdl, 3);
+ const char *spath = mapi_fetch_field(hdl, 4);
mnstr_printf(toConsole, "CREATE USER ");
dquoted_print(toConsole, uname, " ");
@@ -2673,7 +2675,8 @@ dump_database(Mapi mid, stream *toConsol
mnstr_printf(toConsole, " NAME ");
squoted_print(toConsole, fullname, '\'', false);
mnstr_printf(toConsole, " SCHEMA ");
- dquoted_print(toConsole, describe ? sname : "sys",
";\n");
+ dquoted_print(toConsole, describe ? sname : "sys", " ");
+ mnstr_printf(toConsole, "SCHEMA PATH %s;\n", spath);
}
if (mapi_error(mid))
goto bailout;
diff --git a/clients/mapiclient/mhelp.c b/clients/mapiclient/mhelp.c
--- a/clients/mapiclient/mhelp.c
+++ b/clients/mapiclient/mhelp.c
@@ -82,7 +82,8 @@ SQLhelp sqlhelp1[] = {
"ALTER USER ident RENAME TO ident\n"
"ALTER USER SET [ENCRYPTED | UNENCRYPTED] PASSWORD string USING OLD
PASSWORD string\n"
"ALTER USER ident WITH [ENCRYPTED | UNENCRYPTED] PASSWORD string\n"
- "ALTER USER ident [ WITH [ENCRYPTED | UNENCRYPTED] PASSWORD string ]
SET SCHEMA ident",
+ "ALTER USER ident [WITH [ENCRYPTED | UNENCRYPTED] PASSWORD string] SET
SCHEMA ident\n"
+ "ALTER USER ident [WITH [ENCRYPTED | UNENCRYPTED] PASSWORD string] SET
SCHEMA PATH ident",
"ident",
"See also https://www.monetdb.org/Documentation/SQLreference/Users"},
{"ANALYZE",
@@ -229,7 +230,7 @@ SQLhelp sqlhelp1[] = {
NULL},
{"CREATE USER",
"Create a new database user",
- "CREATE USER ident WITH [ENCRYPTED | UNENCRYPTED] PASSWORD string NAME
string SCHEMA ident",
+ "CREATE USER ident WITH [ENCRYPTED | UNENCRYPTED] PASSWORD string NAME
string SCHEMA ident [SCHEMA PATH ident]",
"ident",
"See also https://www.monetdb.org/Documentation/SQLreference/Users"},
{"CREATE VIEW",
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
@@ -6389,10 +6389,10 @@ static mel_func sql_init_funcs[] = {
pattern("sqlcatalog", "revoke", SQLrevoke, false, "Catalog operation revoke",
args(0,7,
arg("sname",str),arg("tbl",str),arg("grantee",str),arg("privs",int),arg("cname",str),arg("grant",int),arg("grantor",int))),
pattern("sqlcatalog", "grant_function", SQLgrant_function, false, "Catalog
operation grant_function", args(0,6,
arg("sname",str),arg("fcnid",int),arg("grantee",str),arg("privs",int),arg("grant",int),arg("grantor",int))),
pattern("sqlcatalog", "revoke_function", SQLrevoke_function, false, "Catalog
operation revoke_function", args(0,6,
arg("sname",str),arg("fcnid",int),arg("grantee",str),arg("privs",int),arg("grant",int),arg("grantor",int))),
- pattern("sqlcatalog", "create_user", SQLcreate_user, false, "Catalog
operation create_user", args(0,5,
arg("sname",str),arg("passwrd",str),arg("enc",int),arg("schema",str),arg("fullname",str))),
+ pattern("sqlcatalog", "create_user", SQLcreate_user, false, "Catalog
operation create_user", args(0,6,
arg("sname",str),arg("passwrd",str),arg("enc",int),arg("schema",str),arg("schemapath",str),arg("fullname",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,5,
arg("sname",str),arg("passwrd",str),arg("enc",int),arg("schema",str),arg("oldpasswrd",str))),
+ 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", "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
@@ -1352,10 +1352,11 @@ SQLcreate_user(Client cntxt, MalBlkPtr m
char *passwd = *getArgReference_str(stk, pci, 2);
int enc = *getArgReference_int(stk, pci, 3);
char *schema = SaveArgReference(stk, pci, 4);
- char *fullname = SaveArgReference(stk, pci, 5);
+ char *schema_path = SaveArgReference(stk, pci, 5);
+ char *fullname = SaveArgReference(stk, pci, 6);
initcontext();
- msg = sql_create_user(sql, sname, passwd, enc, fullname, schema);
+ msg = sql_create_user(sql, sname, passwd, enc, fullname, schema,
schema_path);
return msg;
}
@@ -1378,10 +1379,11 @@ SQLalter_user(Client cntxt, MalBlkPtr mb
char *passwd = SaveArgReference(stk, pci, 2);
int enc = *getArgReference_int(stk, pci, 3);
char *schema = SaveArgReference(stk, pci, 4);
- char *oldpasswd = SaveArgReference(stk, pci, 5);
+ char *schema_path = SaveArgReference(stk, pci, 5);
+ char *oldpasswd = SaveArgReference(stk, pci, 6);
initcontext();
- msg = sql_alter_user(sql, sname, passwd, enc, schema, oldpasswd);
+ msg = sql_alter_user(sql, sname, passwd, enc, schema, schema_path,
oldpasswd);
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
@@ -82,8 +82,10 @@ monet5_drop_user(ptr _mvc, str user)
return TRUE;
}
+#define default_schema_path "\"sys\"" /* "sys" will be the default schema path
*/
+
static str
-monet5_create_user(ptr _mvc, str user, str passwd, char enc, str fullname,
sqlid schema_id, sqlid grantorid)
+monet5_create_user(ptr _mvc, str user, str passwd, char enc, str fullname,
sqlid schema_id, str schema_path, sqlid grantorid)
{
mvc *m = (mvc *) _mvc;
oid uid = 0;
@@ -95,6 +97,11 @@ monet5_create_user(ptr _mvc, str user, s
sql_table *db_user_info, *auths;
Client c = MCgetClient(m->clientid);
+ if (schema_path && strNil(schema_path))
+ throw(MAL, "sql.create_user", SQLSTATE(42000) "Schema path
cannot be NULL");
+ if (!schema_path)
+ schema_path = default_schema_path;
+
if (!enc) {
pwd = mcrypt_BackendSum(passwd, strlen(passwd));
if (pwd == NULL) {
@@ -114,7 +121,7 @@ monet5_create_user(ptr _mvc, str user, s
user_id = store_next_oid();
db_user_info = find_sql_table(s, "db_user_info");
auths = find_sql_table(s, "auths");
- table_funcs.table_insert(m->session->tr, db_user_info, user, fullname,
&schema_id);
+ table_funcs.table_insert(m->session->tr, db_user_info, user, fullname,
&schema_id, schema_path);
table_funcs.table_insert(m->session->tr, auths, &user_id, user,
&grantorid);
return NULL;
}
@@ -204,7 +211,6 @@ monet5_create_privileges(ptr _mvc, sql_s
sql_table *t, *uinfo;
mvc *m = (mvc *) _mvc;
sqlid schema_id = 0;
- str monetdbuser = "monetdb";
list *res, *ops;
/* create the authorisation related tables */
@@ -212,6 +218,7 @@ monet5_create_privileges(ptr _mvc, sql_s
mvc_create_column_(m, t, "name", "varchar", 1024);
mvc_create_column_(m, t, "fullname", "varchar", 2048);
mvc_create_column_(m, t, "default_schema", "int", 9);
+ mvc_create_column_(m, t, "schema_path", "varchar", 2048);
uinfo = t;
res = sa_list(m->sa);
@@ -225,9 +232,9 @@ monet5_create_privileges(ptr _mvc, sql_s
t = mvc_init_create_view(m, s, "users",
"SELECT u.\"name\" AS \"name\", "
- "ui.\"fullname\", ui.\"default_schema\" "
- "FROM db_users() AS u LEFT JOIN "
- "\"sys\".\"db_user_info\" AS ui "
+ "ui.\"fullname\", ui.\"default_schema\", "
+ "ui.\"schema_path\" FROM db_users() AS u "
+ "LEFT JOIN \"sys\".\"db_user_info\" AS ui "
"ON u.\"name\" = ui.\"name\";");
if (!t) {
TRC_CRITICAL(SQL_TRANS, "Failed to create 'users' view\n");
@@ -237,11 +244,12 @@ monet5_create_privileges(ptr _mvc, sql_s
mvc_create_column_(m, t, "name", "varchar", 1024);
mvc_create_column_(m, t, "fullname", "varchar", 2024);
mvc_create_column_(m, t, "default_schema", "int", 9);
+ mvc_create_column_(m, t, "schema_path", "varchar", 2048);
schema_id = sql_find_schema(m, "sys");
assert(schema_id >= 0);
- table_funcs.table_insert(m->session->tr, uinfo, monetdbuser, "MonetDB
Admin", &schema_id);
+ table_funcs.table_insert(m->session->tr, uinfo, "monetdb", "MonetDB
Admin", &schema_id, default_schema_path);
}
static int
@@ -261,7 +269,7 @@ 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 oldpasswd)
+monet5_alter_user(ptr _mvc, str user, str passwd, char enc, sqlid schema_id,
str schema_path, str oldpasswd)
{
mvc *m = (mvc *) _mvc;
Client c = MCgetClient(m->clientid);
@@ -338,18 +346,33 @@ monet5_alter_user(ptr _mvc, str user, st
}
if (schema_id) {
- oid rid;
sql_schema *sys = find_sql_schema(m->session->tr, "sys");
sql_table *info = find_sql_table(sys, "db_user_info");
sql_column *users_name = find_sql_column(info, "name");
sql_column *users_schema = find_sql_column(info,
"default_schema");
/* FIXME: we don't really check against the backend here */
- rid = table_funcs.column_find_row(m->session->tr, users_name,
user, NULL);
+ oid rid = table_funcs.column_find_row(m->session->tr,
users_name, user, NULL);
if (is_oid_nil(rid))
return FALSE;
+ table_funcs.column_update_value(m->session->tr, users_schema,
rid, &schema_id);
+ }
- table_funcs.column_update_value(m->session->tr, users_schema,
rid, &schema_id);
+ if (schema_path) {
+ sql_schema *sys = find_sql_schema(m->session->tr, "sys");
+ sql_table *info = find_sql_table(sys, "db_user_info");
+ sql_column *users_name = find_sql_column(info, "name");
+ sql_column *sp = find_sql_column(info, "schema_path");
+
+ if (strNil(schema_path)) {
+ (void) sql_error(m, 02, SQLSTATE(42000) "ALTER USER:
schema path cannot be NULL");
+ return (FALSE);
+ }
+
+ oid rid = table_funcs.column_find_row(m->session->tr,
users_name, user, NULL);
+ if (is_oid_nil(rid))
+ return FALSE;
+ table_funcs.column_update_value(m->session->tr, sp, rid,
schema_path);
}
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
@@ -35,10 +35,10 @@ backend_freecode(int clientid, char *nam
}
char *
-backend_create_user(ptr mvc, char *user, char *passwd, char enc, char
*fullname, sqlid defschemid, sqlid grantor)
+backend_create_user(ptr mvc, char *user, char *passwd, char enc, char
*fullname, sqlid defschemid, char *schema_path, sqlid grantor)
{
if (be_funcs.fcuser != NULL)
- return(be_funcs.fcuser(mvc, user, passwd, enc, fullname,
defschemid, grantor));
+ return(be_funcs.fcuser(mvc, user, passwd, enc, fullname,
defschemid, schema_path, grantor));
return(NULL);
}
@@ -75,10 +75,10 @@ backend_schema_has_user(ptr mvc, sql_sch
int
backend_alter_user(ptr mvc, str user, str passwd, char enc,
- sqlid schema_id, str oldpasswd)
+ sqlid schema_id, char *schema_path, str
oldpasswd)
{
if (be_funcs.fauser != NULL)
- return(be_funcs.fauser(mvc, user, passwd, enc, schema_id,
oldpasswd));
+ return(be_funcs.fauser(mvc, user, passwd, enc, schema_id,
schema_path, oldpasswd));
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
@@ -15,12 +15,12 @@
typedef void (*freecode_fptr) (int clientid, char *name);
-typedef char *(*create_user_fptr) (ptr mvc, char *user, char *passwd, char
enc, char *fullname, sqlid schema_id, sqlid grantor_id);
+typedef char *(*create_user_fptr) (ptr mvc, char *user, char *passwd, char
enc, char *fullname, sqlid schema_id, char *schema_path, sqlid grantor_id);
typedef int (*drop_user_fptr) (ptr mvc, char *user);
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, str oldpasswd);
+typedef int (*alter_user_fptr) (ptr mvc, str user, str passwd, char enc,
sqlid schema_id, char *schema_path, str oldpasswd);
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);
@@ -42,12 +42,12 @@ typedef struct _backend_functions {
extern void backend_freecode(int clientid, char *name);
-extern char *backend_create_user(ptr mvc, char *user, char *passwd, char enc,
char *fullname, sqlid defschemid, sqlid grantor);
+extern char *backend_create_user(ptr mvc, char *user, char *passwd, char enc,
char *fullname, sqlid defschemid, char *schema_path, sqlid grantor);
extern int backend_drop_user(ptr mvc, char *user);
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, str oldpasswd);
+extern int backend_alter_user(ptr mvc, str user, str passwd, char enc,
sqlid schema_id, char *schema_path, str oldpasswd);
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);
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
@@ -1848,7 +1848,7 @@ rel_create_index(mvc *sql, char *iname,
}
static sql_rel *
-rel_create_user(sql_allocator *sa, char *user, char *passwd, int enc, char
*fullname, char *schema)
+rel_create_user(sql_allocator *sa, char *user, char *passwd, int enc, char
*fullname, char *schema, char *schema_path)
{
sql_rel *rel = rel_create(sa);
list *exps = new_exp_list(sa);
@@ -1859,6 +1859,7 @@ rel_create_user(sql_allocator *sa, char
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list