diff options
author | unknown <bell@sanja.is.com.ua> | 2005-11-23 01:29:25 +0200 |
---|---|---|
committer | unknown <bell@sanja.is.com.ua> | 2005-11-23 01:29:25 +0200 |
commit | ffc506e910d8b5cc02e0b900501c6a1f807d818e (patch) | |
tree | 541795c1142786480dbf29aec960cbe8e32034e1 /sql/sp.cc | |
parent | aa06123f83d764c94f52bb7d53673ea98fcc8c42 (diff) | |
download | mariadb-git-ffc506e910d8b5cc02e0b900501c6a1f807d818e.tar.gz |
merge
Diffstat (limited to 'sql/sp.cc')
-rw-r--r-- | sql/sp.cc | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/sql/sp.cc b/sql/sp.cc index 861a41d8501..f98795c54a5 100644 --- a/sql/sp.cc +++ b/sql/sp.cc @@ -400,6 +400,7 @@ db_load_routine(THD *thd, int type, sp_name *name, sp_head **sphp, const char *definer, longlong created, longlong modified) { LEX *oldlex= thd->lex, newlex; + sp_rcontext *save_spcont= ;thd->spcont; String defstr; char olddb[128]; bool dbchanged; @@ -430,6 +431,9 @@ db_load_routine(THD *thd, int type, sp_name *name, sp_head **sphp, lex_start(thd, (uchar*)defstr.c_ptr(), defstr.length()); + (*sphp)->set_definer((char*) definer, (uint) strlen(definer)); + (*sphp)->set_info(created, modified, &chistics, sql_mode); + thd->spcont= 0; if (yyparse(thd) || thd->is_fatal_error || newlex.sphead == NULL) { sp_head *sp= newlex.sphead; @@ -442,12 +446,15 @@ db_load_routine(THD *thd, int type, sp_name *name, sp_head **sphp, else { if (dbchanged && (ret= mysql_change_db(thd, olddb, 1))) - goto end; + goto db_end; *sphp= newlex.sphead; + (*sphp)->set_definer((char*) definer, (uint) strlen(definer)); (*sphp)->set_info((char *)definer, (uint)strlen(definer), created, modified, &chistics, sql_mode); (*sphp)->optimize(); } +db_end: + thd->spcont= save_spcont; thd->variables.sql_mode= old_sql_mode; thd->variables.select_limit= select_limit; end: @@ -550,12 +557,13 @@ db_create_routine(THD *thd, int type, sp_head *sp) store(sp->m_chistics->comment.str, sp->m_chistics->comment.length, system_charset_info); - if (!trust_routine_creators && mysql_bin_log.is_open()) + if ((sp->m_type == TYPE_ENUM_FUNCTION) && + !trust_function_creators && mysql_bin_log.is_open()) { if (!sp->m_chistics->detistic) { /* - Note that for a _function_ this test is not enough; one could use + Note that this test is not perfect; one could use a non-deterministic read-only function in an update statement. */ enum enum_sp_data_access access= @@ -1606,30 +1614,30 @@ create_string(THD *thd, String *buf, chistics->comment.length)) return FALSE; - buf->append("CREATE ", 7); + buf->append(STRING_WITH_LEN("CREATE ")); if (type == TYPE_ENUM_FUNCTION) - buf->append("FUNCTION ", 9); + buf->append(STRING_WITH_LEN("FUNCTION ")); else - buf->append("PROCEDURE ", 10); + buf->append(STRING_WITH_LEN("PROCEDURE ")); append_identifier(thd, buf, name->m_name.str, name->m_name.length); buf->append('('); buf->append(params, paramslen); buf->append(')'); if (type == TYPE_ENUM_FUNCTION) { - buf->append(" RETURNS ", 9); + buf->append(STRING_WITH_LEN(" RETURNS ")); buf->append(returns, returnslen); } buf->append('\n'); switch (chistics->daccess) { case SP_NO_SQL: - buf->append(" NO SQL\n"); + buf->append(STRING_WITH_LEN(" NO SQL\n")); break; case SP_READS_SQL_DATA: - buf->append(" READS SQL DATA\n"); + buf->append(STRING_WITH_LEN(" READS SQL DATA\n")); break; case SP_MODIFIES_SQL_DATA: - buf->append(" MODIFIES SQL DATA\n"); + buf->append(STRING_WITH_LEN(" MODIFIES SQL DATA\n")); break; case SP_DEFAULT_ACCESS: case SP_CONTAINS_SQL: @@ -1637,12 +1645,12 @@ create_string(THD *thd, String *buf, break; } if (chistics->detistic) - buf->append(" DETERMINISTIC\n", 18); + buf->append(STRING_WITH_LEN(" DETERMINISTIC\n")); if (chistics->suid == SP_IS_NOT_SUID) - buf->append(" SQL SECURITY INVOKER\n", 25); + buf->append(STRING_WITH_LEN(" SQL SECURITY INVOKER\n")); if (chistics->comment.length) { - buf->append(" COMMENT "); + buf->append(STRING_WITH_LEN(" COMMENT ")); append_unescaped(buf, chistics->comment.str, chistics->comment.length); buf->append('\n'); } |