Loading include/m_ctype.h +1 −0 Original line number Diff line number Diff line Loading @@ -220,6 +220,7 @@ typedef struct charset_info_st uint mbmaxlen; uint16 min_sort_char; uint16 max_sort_char; /* For LIKE optimization */ my_bool escape_with_backslash_is_dangerous; MY_CHARSET_HANDLER *cset; MY_COLLATION_HANDLER *coll; Loading include/my_sys.h +1 −0 Original line number Diff line number Diff line Loading @@ -788,6 +788,7 @@ extern my_bool init_compiled_charsets(myf flags); extern void add_compiled_collation(CHARSET_INFO *cs); extern ulong escape_string_for_mysql(CHARSET_INFO *charset_info, char *to, const char *from, ulong length); extern char *bare_str_to_hex(char *to, const char *from, uint len); #ifdef __WIN__ #define BACKSLASH_MBTAIL /* File system character set */ Loading mysys/charset.c +18 −0 Original line number Diff line number Diff line Loading @@ -663,3 +663,21 @@ CHARSET_INFO *fs_character_set() return fs_cset_cache; } #endif /* Transforms a string into hex form. */ char *bare_str_to_hex(char *to, const char *from, uint len) { char *p= to; uint i; for (i= 0; i < len; i++, p+= 2) { /* val[i] is char. Casting to uchar helps greatly if val[i] < 0 */ uint tmp= (uint) (uchar) from[i]; p[0]= _dig_vec_upper[tmp >> 4]; p[1]= _dig_vec_upper[tmp & 15]; } *p= 0; return p; // pointer to end 0 of 'to' } sql/item.cc +13 −5 Original line number Diff line number Diff line Loading @@ -1443,7 +1443,7 @@ String *Item_param::val_str(String* str) and avoid one more memcpy/alloc between str and log string. */ const String *Item_param::query_val_str(String* str) const const String *Item_param::query_val_str(String* str, THD *thd) const { switch (state) { case INT_VALUE: Loading Loading @@ -1482,9 +1482,17 @@ const String *Item_param::query_val_str(String* str) const buf= str->c_ptr_quick(); ptr= buf; if (thd->charset()->escape_with_backslash_is_dangerous) { ptr= strmov(ptr, "x\'"); ptr= bare_str_to_hex(ptr, str_value.ptr(), str_value.length()); } else { *ptr++= '\''; ptr+= escape_string_for_mysql(str_value.charset(), ptr, str_value.ptr(), str_value.length()); } *ptr++='\''; str->length(ptr - buf); break; Loading sql/item.h +1 −1 Original line number Diff line number Diff line Loading @@ -591,7 +591,7 @@ class Item_param :public Item */ void (*set_param_func)(Item_param *param, uchar **pos, ulong len); const String *query_val_str(String *str) const; const String *query_val_str(String *str, THD *thd) const; bool convert_str_value(THD *thd); Loading Loading
include/m_ctype.h +1 −0 Original line number Diff line number Diff line Loading @@ -220,6 +220,7 @@ typedef struct charset_info_st uint mbmaxlen; uint16 min_sort_char; uint16 max_sort_char; /* For LIKE optimization */ my_bool escape_with_backslash_is_dangerous; MY_CHARSET_HANDLER *cset; MY_COLLATION_HANDLER *coll; Loading
include/my_sys.h +1 −0 Original line number Diff line number Diff line Loading @@ -788,6 +788,7 @@ extern my_bool init_compiled_charsets(myf flags); extern void add_compiled_collation(CHARSET_INFO *cs); extern ulong escape_string_for_mysql(CHARSET_INFO *charset_info, char *to, const char *from, ulong length); extern char *bare_str_to_hex(char *to, const char *from, uint len); #ifdef __WIN__ #define BACKSLASH_MBTAIL /* File system character set */ Loading
mysys/charset.c +18 −0 Original line number Diff line number Diff line Loading @@ -663,3 +663,21 @@ CHARSET_INFO *fs_character_set() return fs_cset_cache; } #endif /* Transforms a string into hex form. */ char *bare_str_to_hex(char *to, const char *from, uint len) { char *p= to; uint i; for (i= 0; i < len; i++, p+= 2) { /* val[i] is char. Casting to uchar helps greatly if val[i] < 0 */ uint tmp= (uint) (uchar) from[i]; p[0]= _dig_vec_upper[tmp >> 4]; p[1]= _dig_vec_upper[tmp & 15]; } *p= 0; return p; // pointer to end 0 of 'to' }
sql/item.cc +13 −5 Original line number Diff line number Diff line Loading @@ -1443,7 +1443,7 @@ String *Item_param::val_str(String* str) and avoid one more memcpy/alloc between str and log string. */ const String *Item_param::query_val_str(String* str) const const String *Item_param::query_val_str(String* str, THD *thd) const { switch (state) { case INT_VALUE: Loading Loading @@ -1482,9 +1482,17 @@ const String *Item_param::query_val_str(String* str) const buf= str->c_ptr_quick(); ptr= buf; if (thd->charset()->escape_with_backslash_is_dangerous) { ptr= strmov(ptr, "x\'"); ptr= bare_str_to_hex(ptr, str_value.ptr(), str_value.length()); } else { *ptr++= '\''; ptr+= escape_string_for_mysql(str_value.charset(), ptr, str_value.ptr(), str_value.length()); } *ptr++='\''; str->length(ptr - buf); break; Loading
sql/item.h +1 −1 Original line number Diff line number Diff line Loading @@ -591,7 +591,7 @@ class Item_param :public Item */ void (*set_param_func)(Item_param *param, uchar **pos, ulong len); const String *query_val_str(String *str) const; const String *query_val_str(String *str, THD *thd) const; bool convert_str_value(THD *thd); Loading