diff options
author | unknown <anozdrin@mysql.com> | 2006-03-10 14:40:15 +0300 |
---|---|---|
committer | unknown <anozdrin@mysql.com> | 2006-03-10 14:40:15 +0300 |
commit | cf539a5ac0420bb15d9eed06998510be4bb46598 (patch) | |
tree | 4409b8f31e6e19dde59ed5021f897520893db43d | |
parent | 50c8c206fca3ea3b7ca6978ba1fe283f9777db4d (diff) | |
download | mariadb-git-cf539a5ac0420bb15d9eed06998510be4bb46598.tar.gz |
Additional fix for BUG#16777: Can not create trigger nor view
w/o definer if --skip-grant-tables specified.
The previous patch does not allow to specify empty host name in
DEFINER-clause explicitly.
mysql-test/r/skip_grants.result:
Updated the result file.
mysql-test/r/view_grant.result:
Updated the result file.
mysql-test/t/skip_grants.test:
Added test cases for BUG#16777; re-organized tests.
mysql-test/t/view_grant.test:
Updated after final fix of BUG#16777.
sql/sql_parse.cc:
The final part of fixing BUG#16777: allow empty host name in explicitly
specified DEFINER-clause.
sql/sql_show.cc:
Quote an identifier if it is empty.
-rw-r--r-- | mysql-test/r/skip_grants.result | 54 | ||||
-rw-r--r-- | mysql-test/r/view_grant.result | 11 | ||||
-rw-r--r-- | mysql-test/t/skip_grants.test | 88 | ||||
-rw-r--r-- | mysql-test/t/view_grant.test | 7 | ||||
-rw-r--r-- | sql/sql_parse.cc | 11 | ||||
-rw-r--r-- | sql/sql_show.cc | 21 |
6 files changed, 135 insertions, 57 deletions
diff --git a/mysql-test/r/skip_grants.result b/mysql-test/r/skip_grants.result index 6714fa9d217..58ced16acac 100644 --- a/mysql-test/r/skip_grants.result +++ b/mysql-test/r/skip_grants.result @@ -1,30 +1,60 @@ -drop table if exists t1,v1; -drop view if exists t1,v1; -drop procedure if exists f1; use test; -create procedure f1() select 1; -drop procedure f1; -create table t1 (a int); -create definer='user'@'host' sql security definer view v1 as select * from t1; -drop view v1; -drop table t1; -drop function if exists f1; -Warnings: -Note 1305 FUNCTION f1 does not exist DROP VIEW IF EXISTS v1; DROP VIEW IF EXISTS v2; +DROP VIEW IF EXISTS v3; DROP TABLE IF EXISTS t1; +DROP PROCEDURE IF EXISTS p1; +DROP PROCEDURE IF EXISTS p2; +DROP PROCEDURE IF EXISTS p3; +DROP FUNCTION IF EXISTS f1; +DROP FUNCTION IF EXISTS f2; +DROP FUNCTION IF EXISTS f3; CREATE TABLE t1(c INT); CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW SET @a = 1; CREATE VIEW v1 AS SELECT * FROM t1; +CREATE PROCEDURE p1() +SELECT 1; +CREATE FUNCTION f1() RETURNS INT +RETURN 1; CREATE DEFINER=a@b TRIGGER ti_ai AFTER INSERT ON t1 FOR EACH ROW SET @b = 1; CREATE DEFINER=a@b VIEW v2 AS SELECT * FROM t1; +CREATE DEFINER=a@b PROCEDURE p2() +SELECT 2; +CREATE DEFINER=a@b FUNCTION f2() RETURNS INT +RETURN 2; +CREATE DEFINER=a@'' TRIGGER ti_bu BEFORE UPDATE ON t1 +FOR EACH ROW +SET @c = 1; +CREATE DEFINER=a@'' VIEW v3 AS SELECT * FROM t1; +CREATE DEFINER=a@'' PROCEDURE p3() +SELECT 3; +CREATE DEFINER=a@'' FUNCTION f3() RETURNS INT +RETURN 3; +SHOW CREATE VIEW v3; +View Create View +v3 CREATE ALGORITHM=UNDEFINED DEFINER=`a`@`` SQL SECURITY DEFINER VIEW `v3` AS select `t1`.`c` AS `c` from `t1` +SHOW CREATE PROCEDURE p3; +Procedure sql_mode Create Procedure +p3 CREATE DEFINER=`a`@`` PROCEDURE `p3`() +SELECT 3 +SHOW CREATE FUNCTION f3; +Function sql_mode Create Function +f3 CREATE DEFINER=`a`@`` FUNCTION `f3`() RETURNS int(11) +RETURN 3 DROP TRIGGER t1_bi; DROP TRIGGER ti_ai; +DROP TRIGGER ti_bu; DROP VIEW v1; DROP VIEW v2; +DROP VIEW v3; DROP TABLE t1; +DROP PROCEDURE p1; +DROP PROCEDURE p2; +DROP PROCEDURE p3; +DROP FUNCTION f1; +DROP FUNCTION f2; +DROP FUNCTION f3; diff --git a/mysql-test/r/view_grant.result b/mysql-test/r/view_grant.result index 46fb4698838..3feffb4a510 100644 --- a/mysql-test/r/view_grant.result +++ b/mysql-test/r/view_grant.result @@ -520,11 +520,16 @@ use test; drop user mysqltest_1@localhost; drop database mysqltest; create definer=some_user@`` sql security invoker view v1 as select 1; -ERROR HY000: Definer is not fully qualified -create definer=some_user@localhost sql security invoker view v1 as select 1; +Warnings: +Note 1449 There is no 'some_user'@'' registered +create definer=some_user@localhost sql security invoker view v2 as select 1; Warnings: Note 1449 There is no 'some_user'@'localhost' registered show create view v1; View Create View -v1 CREATE ALGORITHM=UNDEFINED DEFINER=`some_user`@`localhost` SQL SECURITY INVOKER VIEW `v1` AS select 1 AS `1` +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`some_user`@`` SQL SECURITY INVOKER VIEW `v1` AS select 1 AS `1` +show create view v2; +View Create View +v2 CREATE ALGORITHM=UNDEFINED DEFINER=`some_user`@`localhost` SQL SECURITY INVOKER VIEW `v2` AS select 1 AS `1` drop view v1; +drop view v2; diff --git a/mysql-test/t/skip_grants.test b/mysql-test/t/skip_grants.test index 93e052d8c71..6dda97fcf8a 100644 --- a/mysql-test/t/skip_grants.test +++ b/mysql-test/t/skip_grants.test @@ -1,37 +1,18 @@ # This tests not performed with embedded server -- source include/not_embedded.inc ---disable_warnings -drop table if exists t1,v1; -drop view if exists t1,v1; -drop procedure if exists f1; ---enable_warnings use test; # -# Test that we can create and drop procedure without warnings -# see bug#9993 -# -create procedure f1() select 1; -drop procedure f1; - -# -# BUG#13504: creation view with DEFINER clause if --skip-grant-tables -# -create table t1 (a int); -create definer='user'@'host' sql security definer view v1 as select * from t1; -drop view v1; -drop table t1; - -# BUG#17595: DROP FUNCTION IF EXISTS f1 crashes server -drop function if exists f1; - -# # BUG#16777: Can not create trigger nor view w/o definer if --skip-grant-tables # specified # -# Also, a test that we can create VIEW if privileges check switched off has -# been moved here. +# Also, the following test cases have been moved here: +# - test that we can create VIEW if privileges check switched off has been +# moved here; +# - test that we can create and drop procedure without warnings (BUG#9993); +# - BUG#17595: "DROP FUNCTION IF EXISTS" crashes server; +# - BUG#13504: creation view with DEFINER clause if --skip-grant-tables # # Prepare. @@ -40,33 +21,90 @@ drop function if exists f1; DROP VIEW IF EXISTS v1; DROP VIEW IF EXISTS v2; +DROP VIEW IF EXISTS v3; DROP TABLE IF EXISTS t1; +DROP PROCEDURE IF EXISTS p1; +DROP PROCEDURE IF EXISTS p2; +DROP PROCEDURE IF EXISTS p3; + +DROP FUNCTION IF EXISTS f1; +DROP FUNCTION IF EXISTS f2; +DROP FUNCTION IF EXISTS f3; + --enable_warnings # Test case. CREATE TABLE t1(c INT); +# - try to create with implicit definer (definer would be ''@''); + CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW SET @a = 1; CREATE VIEW v1 AS SELECT * FROM t1; +CREATE PROCEDURE p1() + SELECT 1; + +CREATE FUNCTION f1() RETURNS INT + RETURN 1; + +# - try to create with explicit definer; + CREATE DEFINER=a@b TRIGGER ti_ai AFTER INSERT ON t1 FOR EACH ROW SET @b = 1; CREATE DEFINER=a@b VIEW v2 AS SELECT * FROM t1; +CREATE DEFINER=a@b PROCEDURE p2() + SELECT 2; + +CREATE DEFINER=a@b FUNCTION f2() RETURNS INT + RETURN 2; + +# - try to create with explicit definer with empty host; + +CREATE DEFINER=a@'' TRIGGER ti_bu BEFORE UPDATE ON t1 + FOR EACH ROW + SET @c = 1; + +CREATE DEFINER=a@'' VIEW v3 AS SELECT * FROM t1; + +CREATE DEFINER=a@'' PROCEDURE p3() + SELECT 3; + +CREATE DEFINER=a@'' FUNCTION f3() RETURNS INT + RETURN 3; + +# - check that empty host name is treated correctly; + +SHOW CREATE VIEW v3; + +SHOW CREATE PROCEDURE p3; + +SHOW CREATE FUNCTION f3; + # Cleanup. DROP TRIGGER t1_bi; DROP TRIGGER ti_ai; +DROP TRIGGER ti_bu; DROP VIEW v1; DROP VIEW v2; +DROP VIEW v3; DROP TABLE t1; + +DROP PROCEDURE p1; +DROP PROCEDURE p2; +DROP PROCEDURE p3; + +DROP FUNCTION f1; +DROP FUNCTION f2; +DROP FUNCTION f3; diff --git a/mysql-test/t/view_grant.test b/mysql-test/t/view_grant.test index 87478a9d4b2..e80e1770ba2 100644 --- a/mysql-test/t/view_grant.test +++ b/mysql-test/t/view_grant.test @@ -706,10 +706,9 @@ connection default; # # DEFINER information check # --- error ER_MALFORMED_DEFINER create definer=some_user@`` sql security invoker view v1 as select 1; -create definer=some_user@localhost sql security invoker view v1 as select 1; +create definer=some_user@localhost sql security invoker view v2 as select 1; show create view v1; +show create view v2; drop view v1; - - +drop view v2; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 489afe79b5e..d9f5499f362 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -7300,8 +7300,7 @@ LEX_USER *create_default_definer(THD *thd) /* - Create definer with the given user and host names. Also check that the user - and host names satisfy definers requirements. + Create definer with the given user and host names. SYNOPSIS create_definer() @@ -7319,14 +7318,6 @@ LEX_USER *create_definer(THD *thd, LEX_STRING *user_name, LEX_STRING *host_name) { LEX_USER *definer; - /* Check that specified host name is valid. */ - - if (host_name->length == 0) - { - my_error(ER_MALFORMED_DEFINER, MYF(0)); - return 0; - } - /* Create and initialize. */ if (! (definer= (LEX_USER*) thd->alloc(sizeof(LEX_USER)))) diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 5c9d13cac3e..403781b330d 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -648,6 +648,18 @@ static const char *require_quotes(const char *name, uint name_length) } +/* + Quote the given identifier if needed and append it to the target string. + If the given identifier is empty, it will be quoted. + + SYNOPSIS + append_identifier() + thd thread handler + packet target string + name the identifier to be appended + name_length length of the appending identifier +*/ + void append_identifier(THD *thd, String *packet, const char *name, uint length) { @@ -701,8 +713,11 @@ append_identifier(THD *thd, String *packet, const char *name, uint length) length length of name IMPLEMENTATION - If name is a keyword or includes a special character, then force - quoting. + Force quoting in the following cases: + - name is empty (for one, it is possible when we use this function for + quoting user and host names for DEFINER clause); + - name is a keyword; + - name includes a special character; Otherwise identifier is quoted only if the option OPTION_QUOTE_SHOW_CREATE is set. @@ -713,7 +728,7 @@ append_identifier(THD *thd, String *packet, const char *name, uint length) int get_quote_char_for_identifier(THD *thd, const char *name, uint length) { - if (!length || + if (length && !is_keyword(name,length) && !require_quotes(name, length) && !(thd->options & OPTION_QUOTE_SHOW_CREATE)) |