Commit 5817bdff authored by unknown's avatar unknown

Manual merge


sql/sp_head.cc:
  Manual merge, bug#27876
sql/sql_lex.cc:
  Manual merge, bug#27876
sql/sql_lex.h:
  Manual merge, bug#27876
sql/sql_view.cc:
  Manual merge, bug#27876
tests/mysql_client_test.c:
  Manual merge, bug#27876
parent 1b7acc51
...@@ -571,7 +571,7 @@ sp_head::init_strings(THD *thd, LEX *lex) ...@@ -571,7 +571,7 @@ sp_head::init_strings(THD *thd, LEX *lex)
Trim "garbage" at the end. This is sometimes needed with the Trim "garbage" at the end. This is sometimes needed with the
"/ * ! VERSION... * /" wrapper in dump files. "/ * ! VERSION... * /" wrapper in dump files.
*/ */
endp= skip_rear_comments(m_body_begin, endp); endp= skip_rear_comments(thd->charset(), m_body_begin, endp);
m_body.length= endp - m_body_begin; m_body.length= endp - m_body_begin;
m_body.str= strmake_root(root, m_body_begin, m_body.length); m_body.str= strmake_root(root, m_body_begin, m_body.length);
......
...@@ -1151,6 +1151,7 @@ Alter_info::Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root) ...@@ -1151,6 +1151,7 @@ Alter_info::Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root)
SYNOPSIS SYNOPSIS
skip_rear_comments() skip_rear_comments()
cs character set
begin pointer to the beginning of statement begin pointer to the beginning of statement
end pointer to the end of statement end pointer to the end of statement
...@@ -1161,10 +1162,12 @@ Alter_info::Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root) ...@@ -1161,10 +1162,12 @@ Alter_info::Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root)
Pointer to the last non-comment symbol of the statement. Pointer to the last non-comment symbol of the statement.
*/ */
const char *skip_rear_comments(const char *begin, const char *end) const char *skip_rear_comments(CHARSET_INFO *cs, const char *begin,
const char *end)
{ {
while (begin < end && (end[-1] <= ' ' || end[-1] == '*' || while (begin < end && (end[-1] == '*' ||
end[-1] == '/' || end[-1] == ';')) end[-1] == '/' || end[-1] == ';' ||
my_isspace(cs, end[-1])))
end-= 1; end-= 1;
return end; return end;
} }
......
...@@ -1417,7 +1417,8 @@ extern void lex_free(void); ...@@ -1417,7 +1417,8 @@ extern void lex_free(void);
extern void lex_start(THD *thd); extern void lex_start(THD *thd);
extern void lex_end(LEX *lex); extern void lex_end(LEX *lex);
extern int MYSQLlex(void *arg, void *yythd); extern int MYSQLlex(void *arg, void *yythd);
extern const char *skip_rear_comments(const char *ubegin, const char *uend); extern const char *skip_rear_comments(CHARSET_INFO *cs, const char *ubegin,
const char *uend);
extern bool is_lex_native_function(const LEX_STRING *name); extern bool is_lex_native_function(const LEX_STRING *name);
......
...@@ -775,7 +775,7 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view, ...@@ -775,7 +775,7 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
view->query.length= str.length()-1; // we do not need last \0 view->query.length= str.length()-1; // we do not need last \0
view->source.str= thd->query + thd->lex->create_view_select_start; view->source.str= thd->query + thd->lex->create_view_select_start;
endp= view->source.str; endp= view->source.str;
endp= skip_rear_comments(endp, thd->query + thd->query_length); endp= skip_rear_comments(thd->charset(), endp, thd->query + thd->query_length);
view->source.length= endp - view->source.str; view->source.length= endp - view->source.str;
view->file_version= 1; view->file_version= 1;
view->calc_md5(md5); view->calc_md5(md5);
......
...@@ -16097,6 +16097,70 @@ static void test_bug28075() ...@@ -16097,6 +16097,70 @@ static void test_bug28075()
} }
#endif #endif
/*
Bug#27876 (SF with cyrillic variable name fails during execution (regression))
*/
static void test_bug27876()
{
int rc;
MYSQL_RES *result;
char utf8_func[] =
{
0xd1, 0x84, 0xd1, 0x83, 0xd0, 0xbd, 0xd0, 0xba,
0xd1, 0x86, 0xd0, 0xb8, 0xd0, 0xb9, 0xd0, 0xba,
0xd0, 0xb0,
0x00
};
char utf8_param[] =
{
0xd0, 0xbf, 0xd0, 0xb0, 0xd1, 0x80, 0xd0, 0xb0,
0xd0, 0xbc, 0xd0, 0xb5, 0xd1, 0x82, 0xd1, 0x8a,
0xd1, 0x80, 0x5f, 0xd0, 0xb2, 0xd0, 0xb5, 0xd1,
0x80, 0xd1, 0x81, 0xd0, 0xb8, 0xd1, 0x8f,
0x00
};
char query[500];
DBUG_ENTER("test_bug27876");
myheader("test_bug27876");
rc= mysql_query(mysql, "set names utf8");
myquery(rc);
rc= mysql_query(mysql, "select version()");
myquery(rc);
result= mysql_store_result(mysql);
mytest(result);
sprintf(query, "DROP FUNCTION IF EXISTS %s", utf8_func);
rc= mysql_query(mysql, query);
myquery(rc);
sprintf(query,
"CREATE FUNCTION %s( %s VARCHAR(25))"
" RETURNS VARCHAR(25) DETERMINISTIC RETURN %s",
utf8_func, utf8_param, utf8_param);
rc= mysql_query(mysql, query);
myquery(rc);
sprintf(query, "SELECT %s(VERSION())", utf8_func);
rc= mysql_query(mysql, query);
myquery(rc);
result= mysql_store_result(mysql);
mytest(result);
sprintf(query, "DROP FUNCTION %s", utf8_func);
rc= mysql_query(mysql, query);
myquery(rc);
rc= mysql_query(mysql, "set names default");
myquery(rc);
}
/* /*
Read and parse arguments and MySQL options from my.cnf Read and parse arguments and MySQL options from my.cnf
*/ */
...@@ -16384,6 +16448,7 @@ static struct my_tests_st my_tests[]= { ...@@ -16384,6 +16448,7 @@ static struct my_tests_st my_tests[]= {
#ifdef fix_bug_in_pb_first #ifdef fix_bug_in_pb_first
{ "test_bug28075", test_bug28075 }, { "test_bug28075", test_bug28075 },
#endif #endif
{ "test_bug27876", test_bug27876 },
{ 0, 0 } { 0, 0 }
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment