Commit d822c6f7 authored by unknown's avatar unknown
Browse files

Many files:

  Fix bug introduced by the prefix key + multibyte charsets patch today


sql/ha_innodb.cc:
  Fix bug introduced by the prefix key + multibyte charsets patch today
innobase/include/data0type.h:
  Fix bug introduced by the prefix key + multibyte charsets patch today
innobase/include/fsp0fsp.h:
  Fix bug introduced by the prefix key + multibyte charsets patch today
innobase/data/data0type.c:
  Fix bug introduced by the prefix key + multibyte charsets patch today
innobase/row/row0ins.c:
  Fix bug introduced by the prefix key + multibyte charsets patch today
innobase/row/row0row.c:
  Fix bug introduced by the prefix key + multibyte charsets patch today
innobase/row/row0sel.c:
  Fix bug introduced by the prefix key + multibyte charsets patch today
innobase/row/row0upd.c:
  Fix bug introduced by the prefix key + multibyte charsets patch today
parent 0db72d6e
Loading
Loading
Loading
Loading
+78 −0
Original line number Diff line number Diff line
@@ -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
@@ -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. */
+23 −0
Original line number Diff line number Diff line
@@ -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. */
+34 −0
Original line number Diff line number Diff line
@@ -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
+3 −7
Original line number Diff line number Diff line
@@ -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 {
+7 −13
Original line number Diff line number Diff line
@@ -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);

@@ -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