summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <malff/marcsql@weblab.(none)>2007-05-29 14:52:17 -0600
committerunknown <malff/marcsql@weblab.(none)>2007-05-29 14:52:17 -0600
commit5817bdffe73f70c46cc848c76a8721e16fdf31f7 (patch)
treeb09fee48f0ce9d6d8c7fc524be731472506e4435
parent1b7acc5134853d54cd5170b7fe984bb987e31d03 (diff)
downloadmariadb-git-5817bdffe73f70c46cc848c76a8721e16fdf31f7.tar.gz
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
-rw-r--r--sql/sp_head.cc2
-rw-r--r--sql/sql_lex.cc9
-rw-r--r--sql/sql_lex.h3
-rw-r--r--sql/sql_view.cc2
-rw-r--r--tests/mysql_client_test.c65
5 files changed, 75 insertions, 6 deletions
diff --git a/sql/sp_head.cc b/sql/sp_head.cc
index 2f78f0b24dd..5627d6139ac 100644
--- a/sql/sp_head.cc
+++ b/sql/sp_head.cc
@@ -571,7 +571,7 @@ sp_head::init_strings(THD *thd, LEX *lex)
Trim "garbage" at the end. This is sometimes needed with the
"/ * ! 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.str= strmake_root(root, m_body_begin, m_body.length);
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index 535a2492159..c19c224f0a3 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -1151,6 +1151,7 @@ Alter_info::Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root)
SYNOPSIS
skip_rear_comments()
+ cs character set
begin pointer to the beginning 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)
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] == '*' ||
- end[-1] == '/' || end[-1] == ';'))
+ while (begin < end && (end[-1] == '*' ||
+ end[-1] == '/' || end[-1] == ';' ||
+ my_isspace(cs, end[-1])))
end-= 1;
return end;
}
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index 400535babf0..68a3092cd77 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -1417,7 +1417,8 @@ extern void lex_free(void);
extern void lex_start(THD *thd);
extern void lex_end(LEX *lex);
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);
diff --git a/sql/sql_view.cc b/sql/sql_view.cc
index bf48cd0094a..bbdd347ae7b 100644
--- a/sql/sql_view.cc
+++ b/sql/sql_view.cc
@@ -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->source.str= thd->query + thd->lex->create_view_select_start;
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->file_version= 1;
view->calc_md5(md5);
diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c
index 66eff66398f..ceb7e59a97b 100644
--- a/tests/mysql_client_test.c
+++ b/tests/mysql_client_test.c
@@ -16097,6 +16097,70 @@ static void test_bug28075()
}
#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
*/
@@ -16384,6 +16448,7 @@ static struct my_tests_st my_tests[]= {
#ifdef fix_bug_in_pb_first
{ "test_bug28075", test_bug28075 },
#endif
+ { "test_bug27876", test_bug27876 },
{ 0, 0 }
};