mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Implementation of WL#2897: Complete definer support in the stored routines.
The idea is to add DEFINER-clause in CREATE PROCEDURE and CREATE FUNCTION statements. Almost all support of definer in stored routines had been already done before this patch. NOTE: this patch changes behaviour of dumping stored routines in mysqldump. Before this patch, mysqldump did not dump DEFINER-clause for stored routines and this was documented behaviour. In order to get full information about stored routines, one should have dumped mysql.proc table. This patch changes this behaviour, so that DEFINER-clause is dumped. Since DEFINER-clause is not supported in CREATE PROCEDURE | FUNCTION statements before this patch, the clause is covered by additional version-specific comments. client/mysqldump.c: Updated the code for dumping stored routines: cover DEFINER-clause into version-specific comment. mysql-test/r/gis.result: Updated result file after adding DEFINER-clause. mysql-test/r/information_schema.result: Updated result file after adding DEFINER-clause. mysql-test/r/mysqldump.result: Updated result file after adding DEFINER-clause. mysql-test/r/rpl_ddl.result: Updated result file after adding DEFINER-clause. mysql-test/r/rpl_sp.result: Updated result file after adding DEFINER-clause. mysql-test/r/rpl_trigger.result: Updated result file after adding DEFINER-clause. mysql-test/r/sp-security.result: Updated result file after adding DEFINER-clause. mysql-test/r/sp.result: Updated result file after adding DEFINER-clause. mysql-test/r/sql_mode.result: Updated result file after adding DEFINER-clause. mysql-test/t/sp-security.test: Updated result file after adding DEFINER-clause. sql/sp.cc: Added DEFINER-clause. sql/sp_head.cc: Added a new convenient variant of set_definer() operation. sql/sp_head.h: Updated result file after adding DEFINER-clause. sql/sql_lex.h: Renamed trigger_definition_begin into stmt_definition_begin to be used for triggers and stored routines. sql/sql_parse.cc: Check DEFINER-clause. sql/sql_trigger.cc: Renamed trigger_definition_begin into stmt_definition_begin to be used for triggers and stored routines. sql/sql_yacc.yy: Added DEFINER-clause.
This commit is contained in:
@ -80,6 +80,7 @@ static char *add_load_option(char *ptr, const char *object,
|
||||
const char *statement);
|
||||
static ulong find_set(TYPELIB *lib, const char *x, uint length,
|
||||
char **err_pos, uint *err_len);
|
||||
static char *alloc_query_str(ulong size);
|
||||
|
||||
static char *field_escape(char *to,const char *from,uint length);
|
||||
static my_bool verbose=0,tFlag=0,dFlag=0,quick= 1, extended_insert= 1,
|
||||
@ -1304,19 +1305,64 @@ static uint dump_routines_for_db(char *db)
|
||||
routine_name, row[2], strlen(row[2])));
|
||||
if (strlen(row[2]))
|
||||
{
|
||||
char *query_str= NULL;
|
||||
char *definer_begin;
|
||||
|
||||
if (opt_drop)
|
||||
fprintf(sql_file, "/*!50003 DROP %s IF EXISTS %s */;;\n",
|
||||
routine_type[i], routine_name);
|
||||
|
||||
/*
|
||||
Cover DEFINER-clause in version-specific comments.
|
||||
|
||||
TODO: this is definitely a BAD IDEA to parse SHOW CREATE output.
|
||||
We should user INFORMATION_SCHEMA instead. The only problem is
|
||||
that now INFORMATION_SCHEMA does not provide information about
|
||||
routine parameters.
|
||||
*/
|
||||
|
||||
definer_begin= strstr(row[2], " DEFINER");
|
||||
|
||||
if (definer_begin)
|
||||
{
|
||||
char *definer_end= strstr(definer_begin, " PROCEDURE");
|
||||
|
||||
if (!definer_end)
|
||||
definer_end= strstr(definer_begin, " FUNCTION");
|
||||
|
||||
if (definer_end)
|
||||
{
|
||||
char *query_str_tail;
|
||||
|
||||
/*
|
||||
Allocate memory for new query string: original string
|
||||
from SHOW statement and version-specific comments.
|
||||
*/
|
||||
query_str= alloc_query_str(strlen(row[2]) + 23);
|
||||
|
||||
query_str_tail= strnmov(query_str, row[2],
|
||||
definer_begin - row[2]);
|
||||
query_str_tail= strmov(query_str_tail, "*/ /*!50019");
|
||||
query_str_tail= strnmov(query_str_tail, definer_begin,
|
||||
definer_end - definer_begin);
|
||||
query_str_tail= strxmov(query_str_tail, "*/ /*!50003",
|
||||
definer_end, NullS);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
we need to change sql_mode only for the CREATE
|
||||
PROCEDURE/FUNCTION otherwise we may need to re-quote routine_name
|
||||
*/;
|
||||
fprintf(sql_file, "/*!50003 SET SESSION SQL_MODE=\"%s\"*/;;\n",
|
||||
row[1] /* sql_mode */);
|
||||
fprintf(sql_file, "/*!50003 %s */;;\n", row[2]);
|
||||
fprintf(sql_file, "/*!50003 %s */;;\n",
|
||||
(query_str != NULL ? query_str : row[2]));
|
||||
fprintf(sql_file,
|
||||
"/*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE*/"
|
||||
";;\n");
|
||||
|
||||
my_free(query_str, MYF(MY_ALLOW_ZERO_PTR));
|
||||
}
|
||||
} /* end of routine printing */
|
||||
} /* end of list of routines */
|
||||
|
Reference in New Issue
Block a user