Loading include/my_sys.h +3 −0 Original line number Diff line number Diff line Loading @@ -866,6 +866,9 @@ extern void add_compiled_collation(CHARSET_INFO *cs); extern ulong escape_string_for_mysql(CHARSET_INFO *charset_info, char *to, ulong to_length, const char *from, ulong length); extern ulong escape_quotes_for_mysql(CHARSET_INFO *charset_info, char *to, ulong to_length, const char *from, ulong length); extern void thd_increment_bytes_sent(ulong length); extern void thd_increment_bytes_received(ulong length); Loading include/mysql_com.h +1 −0 Original line number Diff line number Diff line Loading @@ -148,6 +148,7 @@ enum enum_server_command */ #define SERVER_STATUS_LAST_ROW_SENT 128 #define SERVER_STATUS_DB_DROPPED 256 /* A database was dropped */ #define SERVER_STATUS_NO_BACKSLASH_ESCAPES 512 #define MYSQL_ERRMSG_SIZE 512 #define NET_READ_TIMEOUT 30 /* Timeout on read */ Loading libmysql/libmysql.c +8 −1 Original line number Diff line number Diff line Loading @@ -1615,9 +1615,16 @@ mysql_escape_string(char *to,const char *from,ulong length) ulong STDCALL mysql_real_escape_string(MYSQL *mysql, char *to,const char *from, ulong length) { if (mysql->server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES) { return escape_quotes_for_mysql(mysql->charset, to, 0, from, length); } else { return escape_string_for_mysql(mysql->charset, to, 0, from, length); } } char * STDCALL Loading mysys/charset.c +108 −8 Original line number Diff line number Diff line Loading @@ -561,11 +561,30 @@ CHARSET_INFO *get_charset_by_csname(const char *cs_name, DBUG_RETURN(cs); } /* Escape string with backslashes (\) SYNOPSIS escape_string_for_mysql() charset_info Charset of the strings to Buffer for escaped string to_length Length of destination buffer, or 0 from The string to escape length The length of the string to escape DESCRIPTION This escapes the contents of a string by adding backslashes before special characters, and turning others into specific escape sequences, such as turning newlines into \n and null bytes into \0. NOTE to keep old C API, to_length may be 0 to mean "big enough" RETURN the length of the escaped string or ~0 if it did not fit. To maintain compatibility with the old C API, to_length may be 0 to mean "big enough" RETURN VALUES ~0 The escaped string did not fit in the to buffer >=0 The length of the escaped string */ ulong escape_string_for_mysql(CHARSET_INFO *charset_info, char *to, ulong to_length, Loading @@ -573,7 +592,7 @@ ulong escape_string_for_mysql(CHARSET_INFO *charset_info, { const char *to_start= to; const char *end, *to_end=to_start + (to_length ? to_length-1 : 2*length); my_bool overflow=0; my_bool overflow= FALSE; #ifdef USE_MB my_bool use_mb_flag= use_mb(charset_info); #endif Loading @@ -586,7 +605,7 @@ ulong escape_string_for_mysql(CHARSET_INFO *charset_info, { if (to + tmp_length > to_end) { overflow=1; overflow= TRUE; break; } while (tmp_length--) Loading Loading @@ -636,7 +655,7 @@ ulong escape_string_for_mysql(CHARSET_INFO *charset_info, { if (to + 2 > to_end) { overflow=1; overflow= TRUE; break; } *to++= '\\'; Loading @@ -646,7 +665,7 @@ ulong escape_string_for_mysql(CHARSET_INFO *charset_info, { if (to + 1 > to_end) { overflow=1; overflow= TRUE; break; } *to++= *from; Loading @@ -656,3 +675,84 @@ ulong escape_string_for_mysql(CHARSET_INFO *charset_info, return overflow ? (ulong)~0 : (ulong) (to - to_start); } /* Escape apostrophes by doubling them up SYNOPSIS escape_quotes_for_mysql() charset_info Charset of the strings to Buffer for escaped string to_length Length of destination buffer, or 0 from The string to escape length The length of the string to escape DESCRIPTION This escapes the contents of a string by doubling up any apostrophes that it contains. This is used when the NO_BACKSLASH_ESCAPES SQL_MODE is in effect on the server. NOTE To be consistent with escape_string_for_mysql(), to_length may be 0 to mean "big enough" RETURN VALUES ~0 The escaped string did not fit in the to buffer >=0 The length of the escaped string */ ulong escape_quotes_for_mysql(CHARSET_INFO *charset_info, char *to, ulong to_length, const char *from, ulong length) { const char *to_start= to; const char *end, *to_end=to_start + (to_length ? to_length-1 : 2*length); my_bool overflow= FALSE; #ifdef USE_MB my_bool use_mb_flag= use_mb(charset_info); #endif for (end= from + length; from < end; from++) { char escape= 0; #ifdef USE_MB int tmp_length; if (use_mb_flag && (tmp_length= my_ismbchar(charset_info, from, end))) { if (to + tmp_length > to_end) { overflow= TRUE; break; } while (tmp_length--) *to++= *from++; from--; continue; } /* We don't have the same issue here with a non-multi-byte character being turned into a multi-byte character by the addition of an escaping character, because we are only escaping the ' character with itself. */ #endif if (*from == '\'') { if (to + 2 > to_end) { overflow= TRUE; break; } *to++= '\''; *to++= '\''; } else { if (to + 1 > to_end) { overflow= TRUE; break; } *to++= *from; } } *to= 0; return overflow ? (ulong)~0 : (ulong) (to - to_start); } sql/set_var.cc +9 −0 Original line number Diff line number Diff line Loading @@ -3238,7 +3238,16 @@ void fix_sql_mode_var(THD *thd, enum_var_type type) global_system_variables.sql_mode= fix_sql_mode(global_system_variables.sql_mode); else { thd->variables.sql_mode= fix_sql_mode(thd->variables.sql_mode); /* Update thd->server_status */ if (thd->variables.sql_mode & MODE_NO_BACKSLASH_ESCAPES) thd->server_status|= SERVER_STATUS_NO_BACKSLASH_ESCAPES; else thd->server_status&= ~SERVER_STATUS_NO_BACKSLASH_ESCAPES; } } /* Map database specific bits to function bits */ Loading Loading
include/my_sys.h +3 −0 Original line number Diff line number Diff line Loading @@ -866,6 +866,9 @@ extern void add_compiled_collation(CHARSET_INFO *cs); extern ulong escape_string_for_mysql(CHARSET_INFO *charset_info, char *to, ulong to_length, const char *from, ulong length); extern ulong escape_quotes_for_mysql(CHARSET_INFO *charset_info, char *to, ulong to_length, const char *from, ulong length); extern void thd_increment_bytes_sent(ulong length); extern void thd_increment_bytes_received(ulong length); Loading
include/mysql_com.h +1 −0 Original line number Diff line number Diff line Loading @@ -148,6 +148,7 @@ enum enum_server_command */ #define SERVER_STATUS_LAST_ROW_SENT 128 #define SERVER_STATUS_DB_DROPPED 256 /* A database was dropped */ #define SERVER_STATUS_NO_BACKSLASH_ESCAPES 512 #define MYSQL_ERRMSG_SIZE 512 #define NET_READ_TIMEOUT 30 /* Timeout on read */ Loading
libmysql/libmysql.c +8 −1 Original line number Diff line number Diff line Loading @@ -1615,9 +1615,16 @@ mysql_escape_string(char *to,const char *from,ulong length) ulong STDCALL mysql_real_escape_string(MYSQL *mysql, char *to,const char *from, ulong length) { if (mysql->server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES) { return escape_quotes_for_mysql(mysql->charset, to, 0, from, length); } else { return escape_string_for_mysql(mysql->charset, to, 0, from, length); } } char * STDCALL Loading
mysys/charset.c +108 −8 Original line number Diff line number Diff line Loading @@ -561,11 +561,30 @@ CHARSET_INFO *get_charset_by_csname(const char *cs_name, DBUG_RETURN(cs); } /* Escape string with backslashes (\) SYNOPSIS escape_string_for_mysql() charset_info Charset of the strings to Buffer for escaped string to_length Length of destination buffer, or 0 from The string to escape length The length of the string to escape DESCRIPTION This escapes the contents of a string by adding backslashes before special characters, and turning others into specific escape sequences, such as turning newlines into \n and null bytes into \0. NOTE to keep old C API, to_length may be 0 to mean "big enough" RETURN the length of the escaped string or ~0 if it did not fit. To maintain compatibility with the old C API, to_length may be 0 to mean "big enough" RETURN VALUES ~0 The escaped string did not fit in the to buffer >=0 The length of the escaped string */ ulong escape_string_for_mysql(CHARSET_INFO *charset_info, char *to, ulong to_length, Loading @@ -573,7 +592,7 @@ ulong escape_string_for_mysql(CHARSET_INFO *charset_info, { const char *to_start= to; const char *end, *to_end=to_start + (to_length ? to_length-1 : 2*length); my_bool overflow=0; my_bool overflow= FALSE; #ifdef USE_MB my_bool use_mb_flag= use_mb(charset_info); #endif Loading @@ -586,7 +605,7 @@ ulong escape_string_for_mysql(CHARSET_INFO *charset_info, { if (to + tmp_length > to_end) { overflow=1; overflow= TRUE; break; } while (tmp_length--) Loading Loading @@ -636,7 +655,7 @@ ulong escape_string_for_mysql(CHARSET_INFO *charset_info, { if (to + 2 > to_end) { overflow=1; overflow= TRUE; break; } *to++= '\\'; Loading @@ -646,7 +665,7 @@ ulong escape_string_for_mysql(CHARSET_INFO *charset_info, { if (to + 1 > to_end) { overflow=1; overflow= TRUE; break; } *to++= *from; Loading @@ -656,3 +675,84 @@ ulong escape_string_for_mysql(CHARSET_INFO *charset_info, return overflow ? (ulong)~0 : (ulong) (to - to_start); } /* Escape apostrophes by doubling them up SYNOPSIS escape_quotes_for_mysql() charset_info Charset of the strings to Buffer for escaped string to_length Length of destination buffer, or 0 from The string to escape length The length of the string to escape DESCRIPTION This escapes the contents of a string by doubling up any apostrophes that it contains. This is used when the NO_BACKSLASH_ESCAPES SQL_MODE is in effect on the server. NOTE To be consistent with escape_string_for_mysql(), to_length may be 0 to mean "big enough" RETURN VALUES ~0 The escaped string did not fit in the to buffer >=0 The length of the escaped string */ ulong escape_quotes_for_mysql(CHARSET_INFO *charset_info, char *to, ulong to_length, const char *from, ulong length) { const char *to_start= to; const char *end, *to_end=to_start + (to_length ? to_length-1 : 2*length); my_bool overflow= FALSE; #ifdef USE_MB my_bool use_mb_flag= use_mb(charset_info); #endif for (end= from + length; from < end; from++) { char escape= 0; #ifdef USE_MB int tmp_length; if (use_mb_flag && (tmp_length= my_ismbchar(charset_info, from, end))) { if (to + tmp_length > to_end) { overflow= TRUE; break; } while (tmp_length--) *to++= *from++; from--; continue; } /* We don't have the same issue here with a non-multi-byte character being turned into a multi-byte character by the addition of an escaping character, because we are only escaping the ' character with itself. */ #endif if (*from == '\'') { if (to + 2 > to_end) { overflow= TRUE; break; } *to++= '\''; *to++= '\''; } else { if (to + 1 > to_end) { overflow= TRUE; break; } *to++= *from; } } *to= 0; return overflow ? (ulong)~0 : (ulong) (to - to_start); }
sql/set_var.cc +9 −0 Original line number Diff line number Diff line Loading @@ -3238,7 +3238,16 @@ void fix_sql_mode_var(THD *thd, enum_var_type type) global_system_variables.sql_mode= fix_sql_mode(global_system_variables.sql_mode); else { thd->variables.sql_mode= fix_sql_mode(thd->variables.sql_mode); /* Update thd->server_status */ if (thd->variables.sql_mode & MODE_NO_BACKSLASH_ESCAPES) thd->server_status|= SERVER_STATUS_NO_BACKSLASH_ESCAPES; else thd->server_status&= ~SERVER_STATUS_NO_BACKSLASH_ESCAPES; } } /* Map database specific bits to function bits */ Loading