summaryrefslogtreecommitdiff
path: root/innobase/data
diff options
context:
space:
mode:
authorheikki@hundin.mysql.fi <>2004-10-01 20:01:25 +0300
committerheikki@hundin.mysql.fi <>2004-10-01 20:01:25 +0300
commit1390ce0f7574a85e3033596e1f91fb2ab00f2e0b (patch)
treeb99f5669c6448da9932bab0ed49e52fe9d08db47 /innobase/data
parentf095b82a047fc6a6b41c263d8ac99a005c7584c0 (diff)
downloadmariadb-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.c78
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. */