mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
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.
This commit is contained in:
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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))))
|
||||
|
@ -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))
|
||||
|
Reference in New Issue
Block a user