Loading mysql-test/r/ctype_sjis.result +4 −0 Original line number Diff line number Diff line Loading @@ -91,3 +91,7 @@ sjis_bin 6109 sjis_bin 61 sjis_bin 6120 drop table t1; SET NAMES sjis; SELECT HEX('佐淘 \圭') FROM DUAL; HEX('佐淘 \圭') 8DB2939181408C5C mysql-test/t/ctype_sjis.test +7 −0 Original line number Diff line number Diff line Loading @@ -68,3 +68,10 @@ SET collation_connection='sjis_japanese_ci'; -- source include/ctype_filesort.inc SET collation_connection='sjis_bin'; -- source include/ctype_filesort.inc # Check parsing of string literals in SJIS with multibyte characters that # have an embedded \ in them. (Bug #8303) --character_set sjis SET NAMES sjis; SELECT HEX('@\\') FROM DUAL; sql/sql_lex.cc +26 −6 Original line number Diff line number Diff line Loading @@ -295,6 +295,17 @@ static char *get_text(LEX *lex) found_escape=1; if (lex->ptr == lex->end_of_query) return 0; #ifdef USE_MB int l; if (use_mb(cs) && (l = my_ismbchar(cs, (const char *)lex->ptr, (const char *)lex->end_of_query))) { lex->ptr += l; continue; } else #endif yySkip(); } else if (c == sep) Loading Loading @@ -323,6 +334,10 @@ static char *get_text(LEX *lex) else { uchar *to; /* Re-use found_escape for tracking state of escapes */ found_escape= 0; for (to=start ; str != end ; str++) { #ifdef USE_MB Loading @@ -336,7 +351,7 @@ static char *get_text(LEX *lex) continue; } #endif if (*str == '\\' && str+1 != end) if (!found_escape && *str == '\\' && str+1 != end) { switch(*++str) { case 'n': Loading @@ -362,15 +377,20 @@ static char *get_text(LEX *lex) *to++= '\\'; // remember prefix for wildcard /* Fall through */ default: *to++ = *str; found_escape= 1; str--; break; } } else if (*str == sep) *to++= *str++; // Two ' or " else if (!found_escape && *str == sep) { found_escape= 1; } else { *to++ = *str; found_escape= 0; } } *to=0; lex->yytoklen=(uint) (to-start); Loading Loading
mysql-test/r/ctype_sjis.result +4 −0 Original line number Diff line number Diff line Loading @@ -91,3 +91,7 @@ sjis_bin 6109 sjis_bin 61 sjis_bin 6120 drop table t1; SET NAMES sjis; SELECT HEX('佐淘 \圭') FROM DUAL; HEX('佐淘 \圭') 8DB2939181408C5C
mysql-test/t/ctype_sjis.test +7 −0 Original line number Diff line number Diff line Loading @@ -68,3 +68,10 @@ SET collation_connection='sjis_japanese_ci'; -- source include/ctype_filesort.inc SET collation_connection='sjis_bin'; -- source include/ctype_filesort.inc # Check parsing of string literals in SJIS with multibyte characters that # have an embedded \ in them. (Bug #8303) --character_set sjis SET NAMES sjis; SELECT HEX('@\\') FROM DUAL;
sql/sql_lex.cc +26 −6 Original line number Diff line number Diff line Loading @@ -295,6 +295,17 @@ static char *get_text(LEX *lex) found_escape=1; if (lex->ptr == lex->end_of_query) return 0; #ifdef USE_MB int l; if (use_mb(cs) && (l = my_ismbchar(cs, (const char *)lex->ptr, (const char *)lex->end_of_query))) { lex->ptr += l; continue; } else #endif yySkip(); } else if (c == sep) Loading Loading @@ -323,6 +334,10 @@ static char *get_text(LEX *lex) else { uchar *to; /* Re-use found_escape for tracking state of escapes */ found_escape= 0; for (to=start ; str != end ; str++) { #ifdef USE_MB Loading @@ -336,7 +351,7 @@ static char *get_text(LEX *lex) continue; } #endif if (*str == '\\' && str+1 != end) if (!found_escape && *str == '\\' && str+1 != end) { switch(*++str) { case 'n': Loading @@ -362,15 +377,20 @@ static char *get_text(LEX *lex) *to++= '\\'; // remember prefix for wildcard /* Fall through */ default: *to++ = *str; found_escape= 1; str--; break; } } else if (*str == sep) *to++= *str++; // Two ' or " else if (!found_escape && *str == sep) { found_escape= 1; } else { *to++ = *str; found_escape= 0; } } *to=0; lex->yytoklen=(uint) (to-start); Loading