diff options
author | heikki@hundin.mysql.fi <> | 2004-10-01 20:01:25 +0300 |
---|---|---|
committer | heikki@hundin.mysql.fi <> | 2004-10-01 20:01:25 +0300 |
commit | 1390ce0f7574a85e3033596e1f91fb2ab00f2e0b (patch) | |
tree | b99f5669c6448da9932bab0ed49e52fe9d08db47 /innobase/data | |
parent | f095b82a047fc6a6b41c263d8ac99a005c7584c0 (diff) | |
download | mariadb-git-1390ce0f7574a85e3033596e1f91fb2ab00f2e0b.tar.gz |
Many files:
Fix bug introduced by the prefix key + multibyte charsets patch today
Diffstat (limited to 'innobase/data')
-rw-r--r-- | innobase/data/data0type.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/innobase/data/data0type.c b/innobase/data/data0type.c index 97d93b1b0ec..714cf92bc65 100644 --- a/innobase/data/data0type.c +++ b/innobase/data/data0type.c @@ -12,6 +12,27 @@ Created 1/16/1996 Heikki Tuuri #include "data0type.ic" #endif +/********************************************************************** +This function is used to find the storage length in bytes of the first n +characters for prefix indexes using a multibyte character set. The function +finds charset information and returns length of prefix_len characters in the +index field in bytes. + +NOTE: the prototype of this function is copied from ha_innodb.cc! If you change +this function, you MUST change also the prototype here! */ + +ulint +innobase_get_at_most_n_mbchars( +/*===========================*/ + /* out: number of bytes occupied by the first + n characters */ + ulint charset_id, /* in: character set id */ + ulint prefix_len, /* in: prefix length in bytes of the index + (this has to be divided by mbmaxlen to get the + number of CHARACTERS n in the prefix) */ + ulint data_len, /* in: length of the string in bytes */ + const char* str); /* in: character string */ + /* At the database startup we store the default-charset collation number of this MySQL installation to this global variable. If we have < 4.1.2 format column definitions, or records in the insert buffer, we use this @@ -24,6 +45,63 @@ dtype_t dtype_binary_val = {DATA_BINARY, 0, 0, 0}; dtype_t* dtype_binary = &dtype_binary_val; /************************************************************************* +Checks if a string type has to be compared by the MySQL comparison functions. +InnoDB internally only handles binary byte string comparisons, as well as +latin1_swedish_ci strings. For example, UTF-8 strings have to be compared +by MySQL. */ + +ibool +dtype_str_needs_mysql_cmp( +/*======================*/ + /* out: TRUE if a string type that requires + comparison with MySQL functions */ + dtype_t* dtype) /* in: type struct */ +{ + if (dtype->mtype == DATA_MYSQL + || dtype->mtype == DATA_VARMYSQL + || (dtype->mtype == DATA_BLOB + && 0 == (dtype->prtype & DATA_BINARY_TYPE) + && dtype_get_charset_coll(dtype->prtype) != + data_mysql_latin1_swedish_charset_coll)) { + return(TRUE); + } + + return(FALSE); +} + +/************************************************************************* +For the documentation of this function, see innobase_get_at_most_n_mbchars() +in ha_innodb.cc. */ + +ulint +dtype_get_at_most_n_mbchars( +/*========================*/ + dtype_t* dtype, + ulint prefix_len, + ulint data_len, + const char* str) +{ + ut_a(data_len != UNIV_SQL_NULL); + + if (dtype_str_needs_mysql_cmp(dtype)) { + return(innobase_get_at_most_n_mbchars( + dtype_get_charset_coll(dtype->prtype), + prefix_len, data_len, str)); + } + + /* We assume here that the string types that InnoDB itself can compare + are single-byte charsets! */ + + if (prefix_len < data_len) { + + return(prefix_len); + + } + + return(data_len); +} + +/************************************************************************* Checks if a data main type is a string type. Also a BLOB is considered a string type. */ |