summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgluh@gluh.mysql.r18.ru <>2004-04-05 17:55:26 +0500
committergluh@gluh.mysql.r18.ru <>2004-04-05 17:55:26 +0500
commit8a4e6c6482046a08a24c78154384ba97b36a9d44 (patch)
treee0bb9eeebf8b928e1196274803e37d4faa9612e7
parent01b3a8e62ac7950024e313af0187b6773b5db66f (diff)
downloadmariadb-git-8a4e6c6482046a08a24c78154384ba97b36a9d44.tar.gz
WL1368: SHOW GRANTS FOR CURRENT USER
'SHOW GRANTS' syntax is added 'SHOW GRANTS FOR CURRENT_USER' syntax is added 'SHOW GRANTS FOR CURRENT_USER()' syntax is added CURRENT_USER without parens in expressions(SELECT CURRENT_USER;)
-rw-r--r--mysql-test/r/grant2.result3
-rw-r--r--mysql-test/r/grant_cache.result17
-rw-r--r--mysql-test/t/grant2.test1
-rw-r--r--mysql-test/t/grant_cache.test8
-rw-r--r--sql/lex.h2
-rw-r--r--sql/sql_yacc.yy54
6 files changed, 82 insertions, 3 deletions
diff --git a/mysql-test/r/grant2.result b/mysql-test/r/grant2.result
index 0b127188586..d0765e2721f 100644
--- a/mysql-test/r/grant2.result
+++ b/mysql-test/r/grant2.result
@@ -5,6 +5,9 @@ grant all privileges on `my\_%`.* to mysqltest_1@localhost with grant option;
select current_user();
current_user()
mysqltest_1@localhost
+select current_user;
+current_user
+mysqltest_1@localhost
grant all privileges on `my\_1`.* to mysqltest_2@localhost with grant option;
grant all privileges on `my_%`.* to mysqltest_3@localhost with grant option;
ERROR 42000: Access denied for user: 'mysqltest_1'@'localhost' to database 'my_%'
diff --git a/mysql-test/r/grant_cache.result b/mysql-test/r/grant_cache.result
index fc4073d23b1..48068c0f68d 100644
--- a/mysql-test/r/grant_cache.result
+++ b/mysql-test/r/grant_cache.result
@@ -2,6 +2,12 @@ drop table if exists test.t1,mysqltest.t1,mysqltest.t2;
drop database if exists mysqltest;
reset query cache;
flush status;
+show grants for current_user;
+Grants for root@localhost
+GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION
+show grants;
+Grants for root@localhost
+GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION
create database if not exists mysqltest;
create table mysqltest.t1 (a int,b int,c int);
create table mysqltest.t2 (a int,b int,c int);
@@ -41,6 +47,10 @@ grant SELECT on mysqltest.* to mysqltest_1@localhost;
grant SELECT on mysqltest.t1 to mysqltest_2@localhost;
grant SELECT on test.t1 to mysqltest_2@localhost;
grant SELECT(a) on mysqltest.t1 to mysqltest_3@localhost;
+show grants for current_user();
+Grants for mysqltest_1@localhost
+GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
+GRANT SELECT ON `mysqltest`.* TO 'mysqltest_1'@'localhost'
show status like "Qcache_queries_in_cache";
Variable_name Value
Qcache_queries_in_cache 6
@@ -101,6 +111,9 @@ Qcache_hits 3
show status like "Qcache_not_cached";
Variable_name Value
Qcache_not_cached 1
+show grants for current_user();
+Grants for @localhost
+GRANT USAGE ON *.* TO ''@'localhost'
select "user2";
user2
user2
@@ -158,6 +171,10 @@ Qcache_not_cached 7
select "user4";
user4
user4
+show grants;
+Grants for mysqltest_1@localhost
+GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
+GRANT SELECT ON `mysqltest`.* TO 'mysqltest_1'@'localhost'
select a from t1;
ERROR 3D000: No Database Selected
select * from mysqltest.t1,test.t1;
diff --git a/mysql-test/t/grant2.test b/mysql-test/t/grant2.test
index 148c4d3da21..1fc1ed78385 100644
--- a/mysql-test/t/grant2.test
+++ b/mysql-test/t/grant2.test
@@ -15,6 +15,7 @@ grant all privileges on `my\_%`.* to mysqltest_1@localhost with grant option;
connect (user1,localhost,mysqltest_1,,);
connection user1;
select current_user();
+select current_user;
grant all privileges on `my\_1`.* to mysqltest_2@localhost with grant option;
--error 1044
grant all privileges on `my_%`.* to mysqltest_3@localhost with grant option;
diff --git a/mysql-test/t/grant_cache.test b/mysql-test/t/grant_cache.test
index 5ebf621ff40..7806253124e 100644
--- a/mysql-test/t/grant_cache.test
+++ b/mysql-test/t/grant_cache.test
@@ -12,6 +12,8 @@ reset query cache;
flush status;
connect (root,localhost,root,,test,$MASTER_MYPORT,master.sock);
connection root;
+show grants for current_user;
+show grants;
--disable_warnings
create database if not exists mysqltest;
--enable_warnings
@@ -43,6 +45,7 @@ grant SELECT(a) on mysqltest.t1 to mysqltest_3@localhost;
# The following queries should be fetched from cache
connect (user1,localhost,mysqltest_1,,mysqltest,$MASTER_MYPORT,master.sock);
connection user1;
+show grants for current_user();
show status like "Qcache_queries_in_cache";
show status like "Qcache_hits";
show status like "Qcache_not_cached";
@@ -64,6 +67,10 @@ show status like "Qcache_queries_in_cache";
show status like "Qcache_hits";
show status like "Qcache_not_cached";
+connect (unkuser,localhost,,,,$MASTER_MYPORT,master.sock);
+connection unkuser;
+show grants for current_user();
+
# The following queries should be fetched from cache
connect (user2,localhost,mysqltest_2,,mysqltest,$MASTER_MYPORT,master.sock);
connection user2;
@@ -104,6 +111,7 @@ show status like "Qcache_not_cached";
connect (user4,localhost,mysqltest_1,,*NO-ONE*,$MASTER_MYPORT,master.sock);
connection user4;
select "user4";
+show grants;
--error 1046
select a from t1;
# The following query is not cached before (different database)
diff --git a/sql/lex.h b/sql/lex.h
index ceef140b5f7..94ea0295f05 100644
--- a/sql/lex.h
+++ b/sql/lex.h
@@ -122,6 +122,7 @@ static SYMBOL symbols[] = {
{ "CURRENT_DATE", SYM(CURDATE)},
{ "CURRENT_TIME", SYM(CURTIME)},
{ "CURRENT_TIMESTAMP", SYM(NOW_SYM)},
+ { "CURRENT_USER", SYM(CURRENT_USER)},
{ "DATA", SYM(DATA_SYM)},
{ "DATABASE", SYM(DATABASE)},
{ "DATABASES", SYM(DATABASES)},
@@ -481,7 +482,6 @@ static SYMBOL sql_functions[] = {
{ "CAST", SYM(CAST_SYM)},
{ "CEIL", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ceiling)},
{ "CEILING", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ceiling)},
- { "CURRENT_USER", F_SYM(FUNC_ARG0),0,CREATE_FUNC(create_func_current_user)},
{ "BIT_LENGTH", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_bit_length)},
{ "CENTROID", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_centroid)},
{ "CHAR_LENGTH", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_char_length)},
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 2d713ef5f5e..12216125034 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -210,6 +210,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
%token CONCURRENT
%token CONSTRAINT
%token CONVERT_SYM
+%token CURRENT_USER
%token DATABASES
%token DATA_SYM
%token DEFAULT
@@ -721,7 +722,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
union_clause union_list
precision subselect_start opt_and charset
subselect_end select_var_list select_var_list_init help opt_len
- opt_extended_describe
+ opt_extended_describe curr_user
END_OF_INPUT
%type <NONE>
@@ -2684,6 +2685,8 @@ simple_expr:
$$= new Item_func_curtime_local($3);
Lex->safe_to_cache_query=0;
}
+ | curr_user
+ { $$= create_func_current_user(); }
| DATE_ADD_INTERVAL '(' expr ',' interval_expr interval ')'
{ $$= new Item_date_add_interval($3,$5,$6,0); }
| DATE_SUB_INTERVAL '(' expr ',' interval_expr interval ')'
@@ -4170,6 +4173,29 @@ show_param:
{ Lex->sql_command= SQLCOM_SHOW_LOGS; WARN_DEPRECATED("SHOW BDB LOGS", "SHOW ENGINE BDB LOGS"); }
| LOGS_SYM
{ Lex->sql_command= SQLCOM_SHOW_LOGS; WARN_DEPRECATED("SHOW LOGS", "SHOW ENGINE BDB LOGS"); }
+ | GRANTS
+ {
+ LEX *lex=Lex;
+ lex->sql_command= SQLCOM_SHOW_GRANTS;
+ THD *thd= lex->thd;
+ LEX_USER *curr_user;
+ if (!(curr_user= (LEX_USER*) thd->alloc(sizeof(st_lex_user))))
+ YYABORT;
+ curr_user->user.str= thd->priv_user;
+ curr_user->user.length= strlen(thd->priv_user);
+ if (*thd->priv_host != 0)
+ {
+ curr_user->host.str= thd->priv_host;
+ curr_user->host.length= strlen(thd->priv_host);
+ }
+ else
+ {
+ curr_user->host.str= (char *) "%";
+ curr_user->host.length= 1;
+ }
+ curr_user->password.str=NullS;
+ lex->grant_user= curr_user;
+ }
| GRANTS FOR_SYM user
{
LEX *lex=Lex;
@@ -4744,6 +4770,11 @@ ident_or_text:
| TEXT_STRING_sys { $$=$1;}
| LEX_HOSTNAME { $$=$1;};
+curr_user:
+ CURRENT_USER {;}
+ | CURRENT_USER '(' ')' {;}
+ ;
+
user:
ident_or_text
{
@@ -4760,7 +4791,25 @@ user:
if (!($$=(LEX_USER*) thd->alloc(sizeof(st_lex_user))))
YYABORT;
$$->user = $1; $$->host=$3;
- };
+ }
+ | curr_user
+ {
+ THD *thd= YYTHD;
+ if (!($$=(LEX_USER*) thd->alloc(sizeof(st_lex_user))))
+ YYABORT;
+ $$->user.str= thd->priv_user;
+ $$->user.length= strlen(thd->priv_user);
+ if (*thd->priv_host != 0)
+ {
+ $$->host.str= thd->priv_host;
+ $$->host.length= strlen(thd->priv_host);
+ }
+ else
+ {
+ $$->host.str= (char *) "%";
+ $$->host.length= 1;
+ }
+ };
/* Keyword that we allow for identifiers */
@@ -4798,6 +4847,7 @@ keyword:
| COMPRESSED_SYM {}
| CONCURRENT {}
| CUBE_SYM {}
+ | CURRENT_USER {}
| DATA_SYM {}
| DATETIME {}
| DATE_SYM {}