• unknown's avatar
    Bug#20404: SHOW CREATE TABLE fails with Turkish I · e463ee94
    unknown authored
      
      Problem: SHOW CREATE TABLE printed garbage in table
      name for tables having TURKISH I
      (i.e. LATIN CAPITABLE LETTER I WITH DOT ABOVE)
      when lower-case-table-name=1.
      
      Reason: In some cases during lower/upper conversion in utf8,
      the result string can be shorter the original string
      (including the above letter). Old implementation of caseup_str()
      and casedn_str() didn't handle the result length properly,
      assuming that length cannot change.
      
      This fix changes the result type of cs->cset->casedn_str()
      and cs->cset->caseup_str() from VOID to UINT, to return
      the result length, as well as put '\0' terminator on a 
      proper place.
      
      Also, my_caseup_str_utf8() and my_casedn_str_utf8() were 
      rewritten not to use strlen() for performance purposes.
      It was done with help of adding of new functions - my_utf8_uni_no_range()
      and my_uni_utf8_no_range() - for null terminated strings.
    
    
    
    include/m_ctype.h:
      Changeing return type from void to int for caseup_str() and casedn_str()
    mysql-test/r/lowercase_table.result:
      Adding test case
    mysql-test/t/lowercase_table.test:
      Adding test case
    sql/sql_parse.cc:
      Set table->table.length to result of my_casedn_str().
    strings/ctype-bin.c:
      Changeing return type from void to int for caseup_str() and casedn_str()
    strings/ctype-mb.c:
      Changeing return type from void to int for caseup_str() and casedn_str()
    strings/ctype-simple.c:
      Changeing return type from void to int for caseup_str() and casedn_str()
    strings/ctype-ucs2.c:
      Changeing return type from void to int for caseup_str() and casedn_str()
    strings/ctype-utf8.c:
      Changeing return type from void to int for caseup_str() and casedn_str().
          Optimization, to get rid of strlen():
          Adding my_utf8_uni_no_range() and my_uni_utf8_no_range() - for null
          terninated strings.
    e463ee94
lowercase_table.test 2.55 KB