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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list