summaryrefslogtreecommitdiff
path: root/sql/sp_head.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sp_head.cc')
-rw-r--r--sql/sp_head.cc103
1 files changed, 72 insertions, 31 deletions
diff --git a/sql/sp_head.cc b/sql/sp_head.cc
index 821d19dca79..3e1f50b91bb 100644
--- a/sql/sp_head.cc
+++ b/sql/sp_head.cc
@@ -180,6 +180,7 @@ sp_get_flags_for_command(LEX *lex)
case SQLCOM_SHOW_CREATE_FUNC:
case SQLCOM_SHOW_CREATE_PROC:
case SQLCOM_SHOW_CREATE_EVENT:
+ case SQLCOM_SHOW_CREATE_TRIGGER:
case SQLCOM_SHOW_DATABASES:
case SQLCOM_SHOW_ERRORS:
case SQLCOM_SHOW_FIELDS:
@@ -280,7 +281,6 @@ sp_get_flags_for_command(LEX *lex)
return flags;
}
-
/*
Prepare an Item for evaluation (call of fix_fields).
@@ -426,8 +426,6 @@ check_routine_name(LEX_STRING *ident)
return FALSE;
}
-/* ------------------------------------------------------------------ */
-
/*
*
@@ -493,6 +491,10 @@ sp_head::sp_head()
m_lex.empty();
hash_init(&m_sptabs, system_charset_info, 0, 0, 0, sp_table_key, 0, 0);
hash_init(&m_sroutines, system_charset_info, 0, 0, 0, sp_sroutine_key, 0, 0);
+
+ m_body_utf8.str= NULL;
+ m_body_utf8.length= 0;
+
DBUG_VOID_RETURN;
}
@@ -550,32 +552,53 @@ sp_head::init_sp_name(THD *thd, sp_name *spname)
void
-sp_head::init_strings(THD *thd, LEX *lex)
+sp_head::set_body_start(THD *thd, const char *begin_ptr)
+{
+ m_body_begin= begin_ptr;
+ thd->m_lip->body_utf8_start(thd, begin_ptr);
+}
+
+
+void
+sp_head::set_stmt_end(THD *thd)
{
- DBUG_ENTER("sp_head::init_strings");
- const char *endp; /* Used to trim the end */
- /* During parsing, we must use thd->mem_root */
- MEM_ROOT *root= thd->mem_root;
- Lex_input_stream *lip=thd->m_lip;
+ Lex_input_stream *lip= thd->m_lip; /* shortcut */
+ const char *end_ptr= lip->get_cpp_ptr(); /* shortcut */
+
+ /* Make the string of parameters. */
if (m_param_begin && m_param_end)
{
m_params.length= m_param_end - m_param_begin;
- m_params.str= strmake_root(root, m_param_begin, m_params.length);
+ m_params.str= thd->strmake(m_param_begin, m_params.length);
}
- endp= lip->get_cpp_ptr();
- lex->stmt_definition_end= endp;
+ /* Remember end pointer for further dumping of whole statement. */
+
+ thd->lex->stmt_definition_end= end_ptr;
+
+ /* Make the string of body (in the original character set). */
- m_body.length= endp - m_body_begin;
- m_body.str= strmake_root(root, m_body_begin, m_body.length);
+ m_body.length= end_ptr - m_body_begin;
+ m_body.str= thd->strmake(m_body_begin, m_body.length);
trim_whitespace(thd->charset(), & m_body);
- m_defstr.length= endp - lip->get_cpp_buf();
- m_defstr.str= strmake_root(root, lip->get_cpp_buf(), m_defstr.length);
- trim_whitespace(thd->charset(), & m_defstr);
+ /* Make the string of UTF-body. */
- DBUG_VOID_RETURN;
+ lip->body_utf8_append(end_ptr);
+
+ m_body_utf8.length= lip->get_body_utf8_length();
+ m_body_utf8.str= thd->strmake(lip->get_body_utf8_str(), m_body_utf8.length);
+ trim_whitespace(thd->charset(), & m_body_utf8);
+
+ /*
+ Make the string of whole stored-program-definition query (in the
+ original character set).
+ */
+
+ m_defstr.length= end_ptr - lip->get_cpp_buf();
+ m_defstr.str= thd->strmake(lip->get_cpp_buf(), m_defstr.length);
+ trim_whitespace(thd->charset(), & m_defstr);
}
@@ -968,6 +991,8 @@ sp_head::execute(THD *thd)
Item_change_list old_change_list;
String old_packet;
+ Object_creation_ctx *saved_creation_ctx;
+
/* Use some extra margin for possible SP recursion and functions */
if (check_stack_overrun(thd, 8 * STACK_MIN_SIZE, (uchar*)&old_packet))
DBUG_RETURN(TRUE);
@@ -1057,6 +1082,10 @@ sp_head::execute(THD *thd)
*/
thd->spcont->callers_arena= &backup_arena;
+ /* Switch query context. */
+
+ saved_creation_ctx= m_creation_ctx->set_n_backup(thd);
+
do
{
sp_instr *i;
@@ -1143,6 +1172,12 @@ sp_head::execute(THD *thd)
}
} while (!err_status && !thd->killed);
+ /* Restore query context. */
+
+ m_creation_ctx->restore_env(thd, saved_creation_ctx);
+
+ /* Restore arena. */
+
thd->restore_active_arena(&execute_arena, &backup_arena);
thd->spcont->pop_all_cursors(); // To avoid memory leaks after an error
@@ -1971,18 +2006,15 @@ sp_head::fill_field_definition(THD *thd, LEX *lex,
enum enum_field_types field_type,
Create_field *field_def)
{
- HA_CREATE_INFO sp_db_info;
LEX_STRING cmt = { 0, 0 };
uint unused1= 0;
int unused2= 0;
- load_db_opt_by_name(thd, m_db.str, &sp_db_info);
-
if (field_def->init(thd, (char*) "", field_type, lex->length, lex->dec,
lex->type, (Item*) 0, (Item*) 0, &cmt, 0,
&lex->interval_list,
- (lex->charset ? lex->charset :
- sp_db_info.default_table_charset),
+ lex->charset ? lex->charset :
+ thd->variables.collation_database,
lex->uint_geom_type))
return TRUE;
@@ -2054,13 +2086,6 @@ sp_head::set_info(longlong created, longlong modified,
void
-sp_head::set_body_begin_ptr(Lex_input_stream *lip, const char *begin_ptr)
-{
- m_body_begin= begin_ptr;
-}
-
-
-void
sp_head::set_definer(const char *definer, uint definerlen)
{
char user_name_holder[USERNAME_LENGTH + 1];
@@ -2212,6 +2237,15 @@ sp_head::show_create_routine(THD *thd, int type)
fields.push_back(stmt_fld);
}
+ fields.push_back(new Item_empty_string("character_set_client",
+ MY_CS_NAME_SIZE));
+
+ fields.push_back(new Item_empty_string("collation_connection",
+ MY_CS_NAME_SIZE));
+
+ fields.push_back(new Item_empty_string("Database Collation",
+ MY_CS_NAME_SIZE));
+
if (protocol->send_fields(&fields,
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF))
{
@@ -2230,6 +2264,11 @@ sp_head::show_create_routine(THD *thd, int type)
else
protocol->store_null();
+
+ protocol->store(m_creation_ctx->get_client_cs()->csname, system_charset_info);
+ protocol->store(m_creation_ctx->get_connection_cl()->name, system_charset_info);
+ protocol->store(m_creation_ctx->get_db_cl()->name, system_charset_info);
+
err_status= protocol->write();
if (!err_status)
@@ -2424,7 +2463,9 @@ sp_head::show_routine_code(THD *thd)
if ((res= protocol->write()))
break;
}
- send_eof(thd);
+
+ if (!res)
+ send_eof(thd);
DBUG_RETURN(res);
}