• unknown's avatar
    Fixed bug #29294. · 166d3c91
    unknown authored
    The `SELECT 'r' INTO OUTFILE ... FIELDS ENCLOSED BY 'r' ' statement
    encoded the 'r' string to a 4 byte string of value x'725c7272'
    (sequence of 4 characters: r\rr).
    The LOAD DATA statement decoded this string to a 1 byte string of
    value x'0d' (ASCII Carriage Return character) instead of the original
    'r' character.
    The same error also happened with the FIELDS ENCLOSED BY clause
    followed by special characters: 'n', 't', 'r', 'b', '0', 'Z' and 'N'.
    
    NOTE 1: This is a result of the undocumented feature: the LOAD DATA INFILE
    recognises 2-byte input sequences like \n, \t, \r and \Z in addition
    to documented 2-byte sequences: \0 and \N. This feature should be
    documented (here backspace character is a default ESCAPED BY character,
    in the real-life example it may be any ESCAPED BY character).
    
    NOTE 2, changed behaviour:
    Now the `SELECT INTO OUTFILE' statement with the `FIELDS ENCLOSED BY'
    clause followed by one of: 'n', 't', 'r', 'b', '0', 'Z' or 'N' characters
    encodes this special character itself by doubling it ('r' --> 'rr'),
    not by prepending it with an escape character.
    
    
    sql/sql_class.h:
      Fixed bug #29294.
      The ESCAPE_CHARS macro constant is defined to enumerate
      symbolic names of espace-sequences like  '\n', '\t' etc.
      The select_export::is_ambiguous_field_sep field has been added
      to distinguish special values of the field_sep field from
      another values (see ESCAPE_CHARS).
    sql/sql_class.cc:
      Fixed bug #29294.
      The select_export::send_data method has been modified to
      encode special values of the field_sep field by
      doubling of those values instead of prepending them with a
      value of the escape_char field.
      Example: The SELECT 'r' INTO OUTFILE FIELDS ENCLOSED BY 'r'
      now produces the 'rr' output string instead of x'5c72'
      (i.e. instead of sequence of 2 bytes: \ and r).
    sql/sql_load.cc:
      Fixed bug #29294.
      Added commentary for the READ_INFO::unescape method.
    mysql-test/t/loaddata.test:
      Updated test case for bug #29294.
    mysql-test/r/loaddata.result:
      Updated test case for bug #29294.
    166d3c91
sql_class.h 48 KB