summaryrefslogtreecommitdiff
path: root/sql/sql_class.cc
diff options
context:
space:
mode:
authorunknown <gshchepa/uchum@gleb.loc>2007-07-06 03:43:23 +0500
committerunknown <gshchepa/uchum@gleb.loc>2007-07-06 03:43:23 +0500
commit725b49716b2bfb88361f37df2fd882578998b131 (patch)
tree38e72a5d8c618981a5dbae64c641605be1408d86 /sql/sql_class.cc
parente0f93ca8c1955cc2766c224703a278e66d9c05bc (diff)
downloadmariadb-git-725b49716b2bfb88361f37df2fd882578998b131.tar.gz
Fixed bug #29442.
The SELECT INTO OUTFILE FIELDS ENCLOSED BY digit or minus sign, followed by the same LOAD DATA INFILE statement, used wrond encoding of non-string fields contained the enclosed character in their text representation. Example: SELECT 15, 9 INTO OUTFILE 'text' FIELDS ENCLOSED BY '5'; Old encoded result in the text file: 5155 595 ^ was decoded as the 1st enclosing character of the 2nd field; ^ was skipped as garbage; ^ ^ was decoded as a pair of englosing characters of the 1st field; ^ was decoded as traling space of the first field; ^^ was decoded as a doubled enclosed character. New encoded result in the text file: 51\55 595 ^ ^ pair of enclosing characters of the 1st field; ^^ escaped enclosed character. sql/sql_class.h: Fixed bug #29442. The NUMERIC_CHARS macro constant has been defined to enumerate all possible characters of a numeric value text representation. The select_export::is_unsafe_field_sep boolean flag has been added to apply the encoding algorithm to non-string values when it is necessary. sql/sql_class.cc: Fixed bug #29442. The select_export::send_data method has been modified to encode text representation of fields of all data types like string fields. mysql-test/t/loaddata.test: Updated test case for bug #29442. mysql-test/r/loaddata.result: Updated test case for bug #29442.
Diffstat (limited to 'sql/sql_class.cc')
-rw-r--r--sql/sql_class.cc4
1 files changed, 3 insertions, 1 deletions
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index 117c20352ce..036ba217a9b 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -1210,6 +1210,7 @@ select_export::prepare(List<Item> &list, SELECT_LEX_UNIT *u)
field_term_length ? (*exchange->field_term)[0] : INT_MAX);
escape_char= (exchange->escaped->length() ? (*exchange->escaped)[0] : -1);
is_ambiguous_field_sep= test(strchr(ESCAPE_CHARS, field_sep_char));
+ is_unsafe_field_sep= test(strchr(NUMERIC_CHARS, field_sep_char));
line_sep_char= (exchange->line_term->length() ?
(*exchange->line_term)[0] : INT_MAX);
if (!field_term_length)
@@ -1284,7 +1285,8 @@ bool select_export::send_data(List<Item> &items)
used_length=min(res->length(),item->max_length);
else
used_length=res->length();
- if (result_type == STRING_RESULT && escape_char != -1)
+ if ((result_type == STRING_RESULT || is_unsafe_field_sep) &&
+ escape_char != -1)
{
char *pos, *start, *end;
CHARSET_INFO *res_charset= res->charset();