Loading innobase/data/data0type.c +78 −0 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -23,6 +44,63 @@ ulint data_mysql_latin1_swedish_charset_coll = 99999999; 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. */ Loading innobase/include/data0type.h +23 −0 Original line number Diff line number Diff line Loading @@ -144,6 +144,29 @@ SQL null*/ store the charset-collation number; one byte is left unused, though */ #define DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE 6 /************************************************************************* 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 */ /************************************************************************* 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); /************************************************************************* Checks if a data main type is a string type. Also a BLOB is considered a string type. */ Loading innobase/include/fsp0fsp.h +34 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,40 @@ Created 12/18/1995 Heikki Tuuri #include "ut0byte.h" #include "page0types.h" typedef byte xdes_t; /************************************************************************ Gets pointer to a the extent descriptor of a page. The page where the extent descriptor resides is x-locked. If the page offset is equal to the free limit of the space, adds new extents from above the free limit to the space free list, if not free limit == space size. This adding is necessary to make the descriptor defined, as they are uninitialized above the free limit. */ xdes_t* xdes_get_descriptor( /*================*/ /* out: pointer to the extent descriptor, NULL if the page does not exist in the space or if offset > free limit */ ulint space, /* in: space id */ ulint offset, /* in: page offset; if equal to the free limit, we try to add new extents to the space free list */ mtr_t* mtr); /* in: mtr handle */ /************************************************************************** Gets a descriptor bit of a page. */ ibool xdes_get_bit( /*=========*/ /* out: TRUE if free */ xdes_t* descr, /* in: descriptor */ ulint bit, /* in: XDES_FREE_BIT or XDES_CLEAN_BIT */ ulint offset, /* in: page offset within extent: 0 ... FSP_EXTENT_SIZE - 1 */ mtr_t* mtr); /* in: mtr */ /* If records are inserted in order, there are the following flags to tell this (their type is made byte for the compiler to warn if direction and hint parameters are switched in Loading innobase/row/row0ins.c +3 −7 Original line number Diff line number Diff line Loading @@ -2019,14 +2019,10 @@ row_ins_index_entry_set_vals( if (ind_field->prefix_len > 0 && dfield_get_len(row_field) != UNIV_SQL_NULL) { /* For prefix keys get the storage length for the prefix_len characters. */ cur_type = dict_col_get_type( dict_field_get_col(ind_field)); field->len = innobase_get_at_most_n_mbchars( dtype_get_charset_coll(cur_type->prtype), field->len = dtype_get_at_most_n_mbchars(cur_type, ind_field->prefix_len, dfield_get_len(row_field), row_field->data); } else { Loading innobase/row/row0row.c +7 −13 Original line number Diff line number Diff line Loading @@ -143,14 +143,11 @@ row_build_index_entry( if (ind_field->prefix_len > 0 && dfield_get_len(dfield2) != UNIV_SQL_NULL) { /* For prefix keys get the storage length for the prefix_len characters. */ cur_type = dict_col_get_type( dict_field_get_col(ind_field)); storage_len = innobase_get_at_most_n_mbchars( dtype_get_charset_coll(cur_type->prtype), storage_len = dtype_get_at_most_n_mbchars( cur_type, ind_field->prefix_len, dfield_get_len(dfield2), dfield2->data); Loading Loading @@ -497,14 +494,11 @@ row_build_row_ref_from_row( if (field->prefix_len > 0 && dfield->len != UNIV_SQL_NULL) { /* For prefix keys get the storage length for the prefix_len characters. */ cur_type = dict_col_get_type( dict_field_get_col(field)); dfield->len = innobase_get_at_most_n_mbchars( dtype_get_charset_coll(cur_type->prtype), dfield->len = dtype_get_at_most_n_mbchars( cur_type, field->prefix_len, dfield->len, dfield->data); } Loading Loading
innobase/data/data0type.c +78 −0 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -23,6 +44,63 @@ ulint data_mysql_latin1_swedish_charset_coll = 99999999; 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. */ Loading
innobase/include/data0type.h +23 −0 Original line number Diff line number Diff line Loading @@ -144,6 +144,29 @@ SQL null*/ store the charset-collation number; one byte is left unused, though */ #define DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE 6 /************************************************************************* 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 */ /************************************************************************* 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); /************************************************************************* Checks if a data main type is a string type. Also a BLOB is considered a string type. */ Loading
innobase/include/fsp0fsp.h +34 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,40 @@ Created 12/18/1995 Heikki Tuuri #include "ut0byte.h" #include "page0types.h" typedef byte xdes_t; /************************************************************************ Gets pointer to a the extent descriptor of a page. The page where the extent descriptor resides is x-locked. If the page offset is equal to the free limit of the space, adds new extents from above the free limit to the space free list, if not free limit == space size. This adding is necessary to make the descriptor defined, as they are uninitialized above the free limit. */ xdes_t* xdes_get_descriptor( /*================*/ /* out: pointer to the extent descriptor, NULL if the page does not exist in the space or if offset > free limit */ ulint space, /* in: space id */ ulint offset, /* in: page offset; if equal to the free limit, we try to add new extents to the space free list */ mtr_t* mtr); /* in: mtr handle */ /************************************************************************** Gets a descriptor bit of a page. */ ibool xdes_get_bit( /*=========*/ /* out: TRUE if free */ xdes_t* descr, /* in: descriptor */ ulint bit, /* in: XDES_FREE_BIT or XDES_CLEAN_BIT */ ulint offset, /* in: page offset within extent: 0 ... FSP_EXTENT_SIZE - 1 */ mtr_t* mtr); /* in: mtr */ /* If records are inserted in order, there are the following flags to tell this (their type is made byte for the compiler to warn if direction and hint parameters are switched in Loading
innobase/row/row0ins.c +3 −7 Original line number Diff line number Diff line Loading @@ -2019,14 +2019,10 @@ row_ins_index_entry_set_vals( if (ind_field->prefix_len > 0 && dfield_get_len(row_field) != UNIV_SQL_NULL) { /* For prefix keys get the storage length for the prefix_len characters. */ cur_type = dict_col_get_type( dict_field_get_col(ind_field)); field->len = innobase_get_at_most_n_mbchars( dtype_get_charset_coll(cur_type->prtype), field->len = dtype_get_at_most_n_mbchars(cur_type, ind_field->prefix_len, dfield_get_len(row_field), row_field->data); } else { Loading
innobase/row/row0row.c +7 −13 Original line number Diff line number Diff line Loading @@ -143,14 +143,11 @@ row_build_index_entry( if (ind_field->prefix_len > 0 && dfield_get_len(dfield2) != UNIV_SQL_NULL) { /* For prefix keys get the storage length for the prefix_len characters. */ cur_type = dict_col_get_type( dict_field_get_col(ind_field)); storage_len = innobase_get_at_most_n_mbchars( dtype_get_charset_coll(cur_type->prtype), storage_len = dtype_get_at_most_n_mbchars( cur_type, ind_field->prefix_len, dfield_get_len(dfield2), dfield2->data); Loading Loading @@ -497,14 +494,11 @@ row_build_row_ref_from_row( if (field->prefix_len > 0 && dfield->len != UNIV_SQL_NULL) { /* For prefix keys get the storage length for the prefix_len characters. */ cur_type = dict_col_get_type( dict_field_get_col(field)); dfield->len = innobase_get_at_most_n_mbchars( dtype_get_charset_coll(cur_type->prtype), dfield->len = dtype_get_at_most_n_mbchars( cur_type, field->prefix_len, dfield->len, dfield->data); } Loading