mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Bug#20230: routine_definition is not null
SHOW CREATE PROCEDURE and SHOW CREATE FUNCTION are fixed as well as INFORMATION_SCHEMA.ROUTINES.ROUTINE_NAME. mysql-test/r/information_schema.result: Add result for bug#20230. mysql-test/t/information_schema.test: Add test case for bug#20230. sql/sp_head.cc: Return NULL for routine definition if the user doesn't have enough privilege to see it. sql/sql_show.cc: Make INFORMATION_SCHEMA.ROUTINES.ROUTINE_NAME NULL-able. Return NULL if the user doesn't have enough privilege to see routine definition.
This commit is contained in:
@ -294,26 +294,26 @@ show create function sub1;
|
||||
ERROR 42000: FUNCTION sub1 does not exist
|
||||
select ROUTINE_NAME, ROUTINE_DEFINITION from information_schema.ROUTINES;
|
||||
ROUTINE_NAME ROUTINE_DEFINITION
|
||||
sel2
|
||||
sub1
|
||||
sel2 NULL
|
||||
sub1 NULL
|
||||
grant all privileges on test.* to mysqltest_1@localhost;
|
||||
select ROUTINE_NAME, ROUTINE_DEFINITION from information_schema.ROUTINES;
|
||||
ROUTINE_NAME ROUTINE_DEFINITION
|
||||
sel2
|
||||
sub1
|
||||
sel2 NULL
|
||||
sub1 NULL
|
||||
create function sub2(i int) returns int
|
||||
return i+1;
|
||||
select ROUTINE_NAME, ROUTINE_DEFINITION from information_schema.ROUTINES;
|
||||
ROUTINE_NAME ROUTINE_DEFINITION
|
||||
sel2
|
||||
sub1
|
||||
sel2 NULL
|
||||
sub1 NULL
|
||||
sub2 return i+1
|
||||
show create procedure sel2;
|
||||
Procedure sql_mode Create Procedure
|
||||
sel2
|
||||
sel2 NULL
|
||||
show create function sub1;
|
||||
Function sql_mode Create Function
|
||||
sub1
|
||||
sub1 NULL
|
||||
show create function sub2;
|
||||
Function sql_mode Create Function
|
||||
sub2 CREATE DEFINER=`mysqltest_1`@`localhost` FUNCTION `sub2`(i int) RETURNS int(11)
|
||||
@ -1134,3 +1134,39 @@ concat(@a, table_name) @a table_name
|
||||
.t1 . t1
|
||||
.t2 . t2
|
||||
drop table t1,t2;
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
DROP FUNCTION IF EXISTS f1;
|
||||
CREATE PROCEDURE p1() SET @a= 1;
|
||||
CREATE FUNCTION f1() RETURNS INT RETURN @a + 1;
|
||||
CREATE USER mysql_bug20230@localhost;
|
||||
GRANT EXECUTE ON PROCEDURE p1 TO mysql_bug20230@localhost;
|
||||
GRANT EXECUTE ON FUNCTION f1 TO mysql_bug20230@localhost;
|
||||
SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES;
|
||||
ROUTINE_NAME ROUTINE_DEFINITION
|
||||
f1 RETURN @a + 1
|
||||
p1 SET @a= 1
|
||||
SHOW CREATE PROCEDURE p1;
|
||||
Procedure sql_mode Create Procedure
|
||||
p1 CREATE DEFINER=`root`@`localhost` PROCEDURE `p1`()
|
||||
SET @a= 1
|
||||
SHOW CREATE FUNCTION f1;
|
||||
Function sql_mode Create Function
|
||||
f1 CREATE DEFINER=`root`@`localhost` FUNCTION `f1`() RETURNS int(11)
|
||||
RETURN @a + 1
|
||||
SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES;
|
||||
ROUTINE_NAME ROUTINE_DEFINITION
|
||||
f1 NULL
|
||||
p1 NULL
|
||||
SHOW CREATE PROCEDURE p1;
|
||||
Procedure sql_mode Create Procedure
|
||||
p1 NULL
|
||||
SHOW CREATE FUNCTION f1;
|
||||
Function sql_mode Create Function
|
||||
f1 NULL
|
||||
CALL p1();
|
||||
SELECT f1();
|
||||
f1()
|
||||
2
|
||||
DROP FUNCTION f1;
|
||||
DROP PROCEDURE p1;
|
||||
DROP USER mysql_bug20230@localhost;
|
||||
|
@ -852,3 +852,39 @@ create table t2(f1 char(5));
|
||||
select concat(@a, table_name), @a, table_name
|
||||
from information_schema.tables where table_schema = 'test';
|
||||
drop table t1,t2;
|
||||
|
||||
|
||||
#
|
||||
# Bug#20230: routine_definition is not null
|
||||
#
|
||||
--disable_warnings
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
DROP FUNCTION IF EXISTS f1;
|
||||
--enable_warnings
|
||||
|
||||
CREATE PROCEDURE p1() SET @a= 1;
|
||||
CREATE FUNCTION f1() RETURNS INT RETURN @a + 1;
|
||||
CREATE USER mysql_bug20230@localhost;
|
||||
GRANT EXECUTE ON PROCEDURE p1 TO mysql_bug20230@localhost;
|
||||
GRANT EXECUTE ON FUNCTION f1 TO mysql_bug20230@localhost;
|
||||
|
||||
SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES;
|
||||
SHOW CREATE PROCEDURE p1;
|
||||
SHOW CREATE FUNCTION f1;
|
||||
|
||||
connect (conn1, localhost, mysql_bug20230,,);
|
||||
|
||||
SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES;
|
||||
SHOW CREATE PROCEDURE p1;
|
||||
SHOW CREATE FUNCTION f1;
|
||||
CALL p1();
|
||||
SELECT f1();
|
||||
|
||||
disconnect conn1;
|
||||
connection default;
|
||||
|
||||
DROP FUNCTION f1;
|
||||
DROP PROCEDURE p1;
|
||||
DROP USER mysql_bug20230@localhost;
|
||||
|
||||
# End of 5.0 tests.
|
||||
|
@ -1869,8 +1869,11 @@ sp_head::show_create_procedure(THD *thd)
|
||||
field_list.push_back(new Item_empty_string("Procedure", NAME_LEN));
|
||||
field_list.push_back(new Item_empty_string("sql_mode", sql_mode_len));
|
||||
// 1024 is for not to confuse old clients
|
||||
field_list.push_back(new Item_empty_string("Create Procedure",
|
||||
max(buffer.length(), 1024)));
|
||||
Item_empty_string *definition=
|
||||
new Item_empty_string("Create Procedure", max(buffer.length(),1024));
|
||||
definition->maybe_null= TRUE;
|
||||
field_list.push_back(definition);
|
||||
|
||||
if (protocol->send_fields(&field_list, Protocol::SEND_NUM_ROWS |
|
||||
Protocol::SEND_EOF))
|
||||
DBUG_RETURN(1);
|
||||
@ -1879,6 +1882,8 @@ sp_head::show_create_procedure(THD *thd)
|
||||
protocol->store((char*) sql_mode_str, sql_mode_len, system_charset_info);
|
||||
if (full_access)
|
||||
protocol->store(m_defstr.str, m_defstr.length, system_charset_info);
|
||||
else
|
||||
protocol->store_null();
|
||||
res= protocol->write();
|
||||
send_eof(thd);
|
||||
|
||||
@ -1934,8 +1939,11 @@ sp_head::show_create_function(THD *thd)
|
||||
&sql_mode_len);
|
||||
field_list.push_back(new Item_empty_string("Function",NAME_LEN));
|
||||
field_list.push_back(new Item_empty_string("sql_mode", sql_mode_len));
|
||||
field_list.push_back(new Item_empty_string("Create Function",
|
||||
max(buffer.length(),1024)));
|
||||
Item_empty_string *definition=
|
||||
new Item_empty_string("Create Function", max(buffer.length(),1024));
|
||||
definition->maybe_null= TRUE;
|
||||
field_list.push_back(definition);
|
||||
|
||||
if (protocol->send_fields(&field_list,
|
||||
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF))
|
||||
DBUG_RETURN(1);
|
||||
@ -1944,6 +1952,8 @@ sp_head::show_create_function(THD *thd)
|
||||
protocol->store((char*) sql_mode_str, sql_mode_len, system_charset_info);
|
||||
if (full_access)
|
||||
protocol->store(m_defstr.str, m_defstr.length, system_charset_info);
|
||||
else
|
||||
protocol->store_null();
|
||||
res= protocol->write();
|
||||
send_eof(thd);
|
||||
|
||||
|
@ -2916,6 +2916,7 @@ bool store_schema_proc(THD *thd, TABLE *table, TABLE *proc_table,
|
||||
{
|
||||
get_field(thd->mem_root, proc_table->field[10], &tmp_string);
|
||||
table->field[7]->store(tmp_string.ptr(), tmp_string.length(), cs);
|
||||
table->field[7]->set_notnull();
|
||||
}
|
||||
table->field[6]->store(STRING_WITH_LEN("SQL"), cs);
|
||||
table->field[10]->store(STRING_WITH_LEN("SQL"), cs);
|
||||
@ -4069,7 +4070,7 @@ ST_FIELD_INFO proc_fields_info[]=
|
||||
{"ROUTINE_TYPE", 9, MYSQL_TYPE_STRING, 0, 0, "Type"},
|
||||
{"DTD_IDENTIFIER", NAME_LEN, MYSQL_TYPE_STRING, 0, 1, 0},
|
||||
{"ROUTINE_BODY", 8, MYSQL_TYPE_STRING, 0, 0, 0},
|
||||
{"ROUTINE_DEFINITION", 65535, MYSQL_TYPE_STRING, 0, 0, 0},
|
||||
{"ROUTINE_DEFINITION", 65535, MYSQL_TYPE_STRING, 0, 1, 0},
|
||||
{"EXTERNAL_NAME", NAME_LEN, MYSQL_TYPE_STRING, 0, 1, 0},
|
||||
{"EXTERNAL_LANGUAGE", NAME_LEN, MYSQL_TYPE_STRING, 0, 1, 0},
|
||||
{"PARAMETER_STYLE", 8, MYSQL_TYPE_STRING, 0, 0, 0},
|
||||
|
Reference in New Issue
Block a user