• Alexander Barkov's avatar
    Bug#11764503 (Bug#57341) Query in EXPLAIN EXTENDED shows wrong characters · b326b9a3
    Alexander Barkov authored
      @ mysql-test/r/ctype_latin1.result
      @ mysql-test/r/ctype_utf8.result
      @ mysql-test/t/ctype_latin1.test
      @ mysql-test/t/ctype_utf8.test
      Adding tests
    
      @ sql/mysqld.h
      @ sql/item.cc
      @ sql/sql_parse.cc
      @ sql/sql_view.cc
    
      Refactoring (thanks to Guilhem for the idea):
    
      Item_string::print() was hard to understand because of the different
      QT_ constants: in "query_type==QT_x", QT_x is explicitely included
      but the other two QT_ are implicitely excluded. The combinations
      with '||' and '&&' make this even harder.
      - logic is now more "explicit" by changing QT_ constants to a bitmap of flags:
        QT_ORDINARY: no change,
        QT_IS -> QT_TO_SYSTEM_CHARSET | QT_WITHOUT_INTRODUCERS,
        QT_EXPLAIN -> QT_TO_SYSTEM_CHARSET
        (QT_EXPLAIN was introduced in the first version of the Bug#57341 patch)
      - Item_string::print() is rewritten using those flags
    
      Bugfix itself:
    
      When QT_TO_SYSTEM_CHARSET is used alone (with no QT_WITHOUT_INTRODUCERS),
      we print string literals as follows:
    
      - display introducers if they were in the original query
      - print ASCII characters as is
      - print non-ASCII characters using hex-escape
      Note: as "EXPLAIN" output is only for human readability purposes
      and does not need to be a pasrable SQL, so using hex-escape is Ok.
      ErrConvString class perfectly suites for hex escaping purposes.
    b326b9a3
sql_parse.cc 222 KB