1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

Bug#20404: SHOW CREATE TABLE fails with Turkish I

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.
This commit is contained in:
unknown
2006-10-30 14:40:15 +04:00
parent 4453dc48e4
commit e463ee9421
9 changed files with 213 additions and 33 deletions

View File

@ -188,20 +188,26 @@ int my_strnncollsp_simple(CHARSET_INFO * cs, const uchar *a, uint a_length,
}
void my_caseup_str_8bit(CHARSET_INFO * cs,char *str)
uint my_caseup_str_8bit(CHARSET_INFO * cs,char *str)
{
register uchar *map=cs->to_upper;
while ((*str = (char) map[(uchar) *str]) != 0)
register uchar *map= cs->to_upper;
char *str_orig= str;
while ((*str= (char) map[(uchar) *str]) != 0)
str++;
return str - str_orig;
}
void my_casedn_str_8bit(CHARSET_INFO * cs,char *str)
uint my_casedn_str_8bit(CHARSET_INFO * cs,char *str)
{
register uchar *map=cs->to_lower;
while ((*str = (char) map[(uchar)*str]) != 0)
register uchar *map= cs->to_lower;
char *str_orig= str;
while ((*str= (char) map[(uchar) *str]) != 0)
str++;
return str - str_orig;
}
uint my_caseup_8bit(CHARSET_INFO * cs, char *src, uint srclen,
char *dst __attribute__((unused)),
uint dstlen __attribute__((unused)))