MDEV-7049 MySQL#74585 - InnoDB: Failing assertion: *mbmaxlen < 5 in file ha_innodb.cc line 1904
InnoDB limited the maximum number of bytes per character to 4. But, the filename character set that was introduced in MySQL 5.1 uses up to 5 bytes per character. To allow InnoDB tables to be created with wider characters, let us split the mbminmaxlen fields into mbminlen, mbmaxlen, and increase the limit to 7 bytes per character. This will increase the payload size of dtype_t and dict_col_t by one bit. The storage size will be unchanged (54 bits and 77 bits will use the same number of bytes as the previous sizes 53 and 76 bits).
This commit is contained in:
parent
6c60c809bb
commit
906ce0962d
@ -1,3 +1,5 @@
|
||||
create temporary table t (a char(1) character set filename) engine=innodb;
|
||||
drop temporary table t;
|
||||
set optimizer_switch = 'mrr=on,mrr_sort_keys=on,index_condition_pushdown=on';
|
||||
drop table if exists t1,t2,t3,t4;
|
||||
drop database if exists mysqltest;
|
||||
|
@ -1,23 +1,11 @@
|
||||
#######################################################################
|
||||
# #
|
||||
# Please, DO NOT TOUCH this file as well as the innodb.result file. #
|
||||
# These files are to be modified ONLY BY INNOBASE guys. #
|
||||
# #
|
||||
# Use innodb_mysql.[test|result] files instead. #
|
||||
# #
|
||||
# If nevertheless you need to make some changes here, please, forward #
|
||||
# your commit message #
|
||||
# To: innodb_dev_ww@oracle.com #
|
||||
# Cc: dev-innodb@mysql.com #
|
||||
# (otherwise your changes may be erased). #
|
||||
# #
|
||||
#######################################################################
|
||||
|
||||
-- source include/have_innodb.inc
|
||||
let $MYSQLD_DATADIR= `select @@datadir`;
|
||||
let collation=utf8_unicode_ci;
|
||||
--source include/have_collation.inc
|
||||
|
||||
create temporary table t (a char(1) character set filename) engine=innodb;
|
||||
drop temporary table t;
|
||||
|
||||
set optimizer_switch = 'mrr=on,mrr_sort_keys=on,index_condition_pushdown=on';
|
||||
|
||||
# Save the original values of some variables in order to be able to
|
||||
@ -2546,18 +2534,3 @@ show status like "handler_read_key";
|
||||
select f1 from t1;
|
||||
show status like "handler_read_key";
|
||||
drop table t1;
|
||||
|
||||
#######################################################################
|
||||
# #
|
||||
# Please, DO NOT TOUCH this file as well as the innodb.result file. #
|
||||
# These files are to be modified ONLY BY INNOBASE guys. #
|
||||
# #
|
||||
# Use innodb_mysql.[test|result] files instead. #
|
||||
# #
|
||||
# If nevertheless you need to make some changes here, please, forward #
|
||||
# your commit message #
|
||||
# To: innodb_dev_ww@oracle.com #
|
||||
# Cc: dev-innodb@mysql.com #
|
||||
# (otherwise your changes may be erased). #
|
||||
# #
|
||||
#######################################################################
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2009, Innobase Oy. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -49,8 +50,10 @@ ulint
|
||||
dtype_get_at_most_n_mbchars(
|
||||
/*========================*/
|
||||
ulint prtype, /*!< in: precise type */
|
||||
ulint mbminmaxlen, /*!< in: minimum and maximum length of
|
||||
a multi-byte character */
|
||||
ulint mbminlen, /*!< in: minimum length of
|
||||
a multi-byte character, in bytes */
|
||||
ulint mbmaxlen, /*!< in: maximum length of
|
||||
a multi-byte character, in bytes */
|
||||
ulint prefix_len, /*!< in: length of the requested
|
||||
prefix, in characters, multiplied by
|
||||
dtype_get_mbmaxlen(dtype) */
|
||||
@ -58,9 +61,6 @@ dtype_get_at_most_n_mbchars(
|
||||
const char* str) /*!< in: the string whose prefix
|
||||
length is being determined */
|
||||
{
|
||||
ulint mbminlen = DATA_MBMINLEN(mbminmaxlen);
|
||||
ulint mbmaxlen = DATA_MBMAXLEN(mbminmaxlen);
|
||||
|
||||
ut_a(data_len != UNIV_SQL_NULL);
|
||||
ut_ad(!mbmaxlen || !(prefix_len % mbmaxlen));
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2010, Innobase Oy. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -251,7 +252,8 @@ dict_mem_fill_column_struct(
|
||||
column->len = (unsigned int) col_len;
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
dtype_get_mblen(mtype, prtype, &mbminlen, &mbmaxlen);
|
||||
dict_col_set_mbminmaxlen(column, mbminlen, mbmaxlen);
|
||||
column->mbminlen = mbminlen;
|
||||
column->mbmaxlen = mbmaxlen;
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 2005, 2013, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -99,8 +100,7 @@ innobase_col_to_mysql(
|
||||
#ifdef UNIV_DEBUG
|
||||
case DATA_MYSQL:
|
||||
ut_ad(flen >= len);
|
||||
ut_ad(DATA_MBMAXLEN(col->mbminmaxlen)
|
||||
>= DATA_MBMINLEN(col->mbminmaxlen));
|
||||
ut_ad(col->mbmaxlen >= col->mbminlen);
|
||||
memcpy(dest, data, len);
|
||||
break;
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2009, Innobase Oy. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -169,18 +170,7 @@ store the charset-collation number; one byte is left unused, though */
|
||||
#define DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE 6
|
||||
|
||||
/* Maximum multi-byte character length in bytes, plus 1 */
|
||||
#define DATA_MBMAX 5
|
||||
|
||||
/* Pack mbminlen, mbmaxlen to mbminmaxlen. */
|
||||
#define DATA_MBMINMAXLEN(mbminlen, mbmaxlen) \
|
||||
((mbmaxlen) * DATA_MBMAX + (mbminlen))
|
||||
/* Get mbminlen from mbminmaxlen. Cast the result of UNIV_EXPECT to ulint
|
||||
because in GCC it returns a long. */
|
||||
#define DATA_MBMINLEN(mbminmaxlen) ((ulint) \
|
||||
UNIV_EXPECT(((mbminmaxlen) % DATA_MBMAX), \
|
||||
1))
|
||||
/* Get mbmaxlen from mbminmaxlen. */
|
||||
#define DATA_MBMAXLEN(mbminmaxlen) ((ulint) ((mbminmaxlen) / DATA_MBMAX))
|
||||
#define DATA_MBMAX 8
|
||||
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
/*********************************************************************//**
|
||||
@ -201,8 +191,10 @@ ulint
|
||||
dtype_get_at_most_n_mbchars(
|
||||
/*========================*/
|
||||
ulint prtype, /*!< in: precise type */
|
||||
ulint mbminmaxlen, /*!< in: minimum and maximum length of
|
||||
a multi-byte character */
|
||||
ulint mbminlen, /*!< in: minimum length of
|
||||
a multi-byte character, in bytes */
|
||||
ulint mbmaxlen, /*!< in: maximum length of
|
||||
a multi-byte character, in bytes */
|
||||
ulint prefix_len, /*!< in: length of the requested
|
||||
prefix, in characters, multiplied by
|
||||
dtype_get_mbmaxlen(dtype) */
|
||||
@ -347,19 +339,6 @@ dtype_get_mbmaxlen(
|
||||
/*===============*/
|
||||
const dtype_t* type); /*!< in: type */
|
||||
/*********************************************************************//**
|
||||
Sets the minimum and maximum length of a character, in bytes. */
|
||||
UNIV_INLINE
|
||||
void
|
||||
dtype_set_mbminmaxlen(
|
||||
/*==================*/
|
||||
dtype_t* type, /*!< in/out: type */
|
||||
ulint mbminlen, /*!< in: minimum length of a char,
|
||||
in bytes, or 0 if this is not
|
||||
a character type */
|
||||
ulint mbmaxlen); /*!< in: maximum length of a char,
|
||||
in bytes, or 0 if this is not
|
||||
a character type */
|
||||
/*********************************************************************//**
|
||||
Gets the padding character code for the type.
|
||||
@return padding character code, or ULINT_UNDEFINED if no padding specified */
|
||||
UNIV_INLINE
|
||||
@ -379,7 +358,9 @@ dtype_get_fixed_size_low(
|
||||
ulint mtype, /*!< in: main type */
|
||||
ulint prtype, /*!< in: precise type */
|
||||
ulint len, /*!< in: length */
|
||||
ulint mbminmaxlen, /*!< in: minimum and maximum length of a
|
||||
ulint mbminlen, /*!< in: minimum length of a
|
||||
multibyte character, in bytes */
|
||||
ulint mbmaxlen, /*!< in: maximum length of a
|
||||
multibyte character, in bytes */
|
||||
ulint comp); /*!< in: nonzero=ROW_FORMAT=COMPACT */
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
@ -393,8 +374,8 @@ dtype_get_min_size_low(
|
||||
ulint mtype, /*!< in: main type */
|
||||
ulint prtype, /*!< in: precise type */
|
||||
ulint len, /*!< in: length */
|
||||
ulint mbminmaxlen); /*!< in: minimum and maximum length of a
|
||||
multibyte character */
|
||||
ulint mbminlen, /*!< in: minimum length of a character */
|
||||
ulint mbmaxlen); /*!< in: maximum length of a character */
|
||||
/***********************************************************************//**
|
||||
Returns the maximum size of a data type. Note: types in system tables may be
|
||||
incomplete and return incorrect information.
|
||||
@ -497,11 +478,10 @@ struct dtype_struct{
|
||||
the string, MySQL uses 1 or 2
|
||||
bytes to store the string length) */
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
unsigned mbminmaxlen:5; /*!< minimum and maximum length of a
|
||||
character, in bytes;
|
||||
DATA_MBMINMAXLEN(mbminlen,mbmaxlen);
|
||||
mbminlen=DATA_MBMINLEN(mbminmaxlen);
|
||||
mbmaxlen=DATA_MBMINLEN(mbminmaxlen) */
|
||||
unsigned mbminlen:3; /*!< minimum length of a character,
|
||||
in bytes */
|
||||
unsigned mbmaxlen:3; /*!< maximum length of a character,
|
||||
in bytes */
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
};
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2012, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -100,27 +101,6 @@ dtype_get_mblen(
|
||||
}
|
||||
}
|
||||
|
||||
/*********************************************************************//**
|
||||
Sets the minimum and maximum length of a character, in bytes. */
|
||||
UNIV_INLINE
|
||||
void
|
||||
dtype_set_mbminmaxlen(
|
||||
/*==================*/
|
||||
dtype_t* type, /*!< in/out: type */
|
||||
ulint mbminlen, /*!< in: minimum length of a char,
|
||||
in bytes, or 0 if this is not
|
||||
a character type */
|
||||
ulint mbmaxlen) /*!< in: maximum length of a char,
|
||||
in bytes, or 0 if this is not
|
||||
a character type */
|
||||
{
|
||||
ut_ad(mbminlen < DATA_MBMAX);
|
||||
ut_ad(mbmaxlen < DATA_MBMAX);
|
||||
ut_ad(mbminlen <= mbmaxlen);
|
||||
|
||||
type->mbminmaxlen = DATA_MBMINMAXLEN(mbminlen, mbmaxlen);
|
||||
}
|
||||
|
||||
/*********************************************************************//**
|
||||
Compute the mbminlen and mbmaxlen members of a data type structure. */
|
||||
UNIV_INLINE
|
||||
@ -133,7 +113,8 @@ dtype_set_mblen(
|
||||
ulint mbmaxlen;
|
||||
|
||||
dtype_get_mblen(type->mtype, type->prtype, &mbminlen, &mbmaxlen);
|
||||
dtype_set_mbminmaxlen(type, mbminlen, mbmaxlen);
|
||||
type->mbminlen = mbminlen;
|
||||
type->mbmaxlen = mbmaxlen;
|
||||
|
||||
ut_ad(dtype_validate(type));
|
||||
}
|
||||
@ -229,8 +210,7 @@ dtype_get_mbminlen(
|
||||
/*===============*/
|
||||
const dtype_t* type) /*!< in: type */
|
||||
{
|
||||
ut_ad(type);
|
||||
return(DATA_MBMINLEN(type->mbminmaxlen));
|
||||
return type->mbminlen;
|
||||
}
|
||||
/*********************************************************************//**
|
||||
Gets the maximum length of a character, in bytes.
|
||||
@ -242,8 +222,7 @@ dtype_get_mbmaxlen(
|
||||
/*===============*/
|
||||
const dtype_t* type) /*!< in: type */
|
||||
{
|
||||
ut_ad(type);
|
||||
return(DATA_MBMAXLEN(type->mbminmaxlen));
|
||||
return type->mbmaxlen;
|
||||
}
|
||||
|
||||
/*********************************************************************//**
|
||||
@ -424,8 +403,10 @@ dtype_get_fixed_size_low(
|
||||
ulint mtype, /*!< in: main type */
|
||||
ulint prtype, /*!< in: precise type */
|
||||
ulint len, /*!< in: length */
|
||||
ulint mbminmaxlen, /*!< in: minimum and maximum length of
|
||||
a multibyte character, in bytes */
|
||||
ulint mbminlen, /*!< in: minimum length of a
|
||||
multibyte character, in bytes */
|
||||
ulint mbmaxlen, /*!< in: maximum length of a
|
||||
multibyte character, in bytes */
|
||||
ulint comp) /*!< in: nonzero=ROW_FORMAT=COMPACT */
|
||||
{
|
||||
switch (mtype) {
|
||||
@ -466,11 +447,10 @@ dtype_get_fixed_size_low(
|
||||
dtype_get_charset_coll(prtype),
|
||||
&i_mbminlen, &i_mbmaxlen);
|
||||
|
||||
ut_ad(DATA_MBMINMAXLEN(i_mbminlen, i_mbmaxlen)
|
||||
== mbminmaxlen);
|
||||
ut_ad(i_mbminlen == mbminlen);
|
||||
ut_ad(i_mbmaxlen == mbmaxlen);
|
||||
#endif /* UNIV_DEBUG */
|
||||
if (DATA_MBMINLEN(mbminmaxlen)
|
||||
== DATA_MBMAXLEN(mbminmaxlen)) {
|
||||
if (mbminlen == mbmaxlen) {
|
||||
return(len);
|
||||
}
|
||||
}
|
||||
@ -502,8 +482,8 @@ dtype_get_min_size_low(
|
||||
ulint mtype, /*!< in: main type */
|
||||
ulint prtype, /*!< in: precise type */
|
||||
ulint len, /*!< in: length */
|
||||
ulint mbminmaxlen) /*!< in: minimum and maximum length of a
|
||||
multi-byte character */
|
||||
ulint mbminlen, /*!< in: minimum length of a character */
|
||||
ulint mbmaxlen) /*!< in: maximum length of a character */
|
||||
{
|
||||
switch (mtype) {
|
||||
case DATA_SYS:
|
||||
@ -533,9 +513,6 @@ dtype_get_min_size_low(
|
||||
if (prtype & DATA_BINARY_TYPE) {
|
||||
return(len);
|
||||
} else {
|
||||
ulint mbminlen = DATA_MBMINLEN(mbminmaxlen);
|
||||
ulint mbmaxlen = DATA_MBMAXLEN(mbminmaxlen);
|
||||
|
||||
if (mbminlen == mbmaxlen) {
|
||||
return(len);
|
||||
}
|
||||
@ -606,9 +583,9 @@ dtype_get_sql_null_size(
|
||||
{
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
return(dtype_get_fixed_size_low(type->mtype, type->prtype, type->len,
|
||||
type->mbminmaxlen, comp));
|
||||
type->mbminlen, type->mbmaxlen, comp));
|
||||
#else /* !UNIV_HOTBACKUP */
|
||||
return(dtype_get_fixed_size_low(type->mtype, type->prtype, type->len,
|
||||
0, 0));
|
||||
0, 0, 0));
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2014, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -119,17 +120,6 @@ dict_col_get_mbmaxlen(
|
||||
/*==================*/
|
||||
const dict_col_t* col); /*!< in: column */
|
||||
/*********************************************************************//**
|
||||
Sets the minimum and maximum number of bytes per character. */
|
||||
UNIV_INLINE
|
||||
void
|
||||
dict_col_set_mbminmaxlen(
|
||||
/*=====================*/
|
||||
dict_col_t* col, /*!< in/out: column */
|
||||
ulint mbminlen, /*!< in: minimum multi-byte
|
||||
character size, in bytes */
|
||||
ulint mbmaxlen); /*!< in: minimum multi-byte
|
||||
character size, in bytes */
|
||||
/*********************************************************************//**
|
||||
Gets the column data type. */
|
||||
UNIV_INLINE
|
||||
void
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2014, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -38,7 +39,7 @@ dict_col_get_mbminlen(
|
||||
/*==================*/
|
||||
const dict_col_t* col) /*!< in: column */
|
||||
{
|
||||
return(DATA_MBMINLEN(col->mbminmaxlen));
|
||||
return col->mbminlen;
|
||||
}
|
||||
/*********************************************************************//**
|
||||
Gets the maximum number of bytes per character.
|
||||
@ -49,25 +50,7 @@ dict_col_get_mbmaxlen(
|
||||
/*==================*/
|
||||
const dict_col_t* col) /*!< in: column */
|
||||
{
|
||||
return(DATA_MBMAXLEN(col->mbminmaxlen));
|
||||
}
|
||||
/*********************************************************************//**
|
||||
Sets the minimum and maximum number of bytes per character. */
|
||||
UNIV_INLINE
|
||||
void
|
||||
dict_col_set_mbminmaxlen(
|
||||
/*=====================*/
|
||||
dict_col_t* col, /*!< in/out: column */
|
||||
ulint mbminlen, /*!< in: minimum multi-byte
|
||||
character size, in bytes */
|
||||
ulint mbmaxlen) /*!< in: minimum multi-byte
|
||||
character size, in bytes */
|
||||
{
|
||||
ut_ad(mbminlen < DATA_MBMAX);
|
||||
ut_ad(mbmaxlen < DATA_MBMAX);
|
||||
ut_ad(mbminlen <= mbmaxlen);
|
||||
|
||||
col->mbminmaxlen = DATA_MBMINMAXLEN(mbminlen, mbmaxlen);
|
||||
return col->mbmaxlen;
|
||||
}
|
||||
/*********************************************************************//**
|
||||
Gets the column data type. */
|
||||
@ -83,7 +66,8 @@ dict_col_copy_type(
|
||||
type->mtype = col->mtype;
|
||||
type->prtype = col->prtype;
|
||||
type->len = col->len;
|
||||
type->mbminmaxlen = col->mbminmaxlen;
|
||||
type->mbminlen = col->mbminlen;
|
||||
type->mbmaxlen = col->mbmaxlen;
|
||||
}
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
|
||||
@ -105,7 +89,8 @@ dict_col_type_assert_equal(
|
||||
ut_ad(col->prtype == type->prtype);
|
||||
ut_ad(col->len == type->len);
|
||||
# ifndef UNIV_HOTBACKUP
|
||||
ut_ad(col->mbminmaxlen == type->mbminmaxlen);
|
||||
ut_ad(col->mbminlen == type->mbminlen);
|
||||
ut_ad(col->mbmaxlen == type->mbmaxlen);
|
||||
# endif /* !UNIV_HOTBACKUP */
|
||||
|
||||
return(TRUE);
|
||||
@ -123,7 +108,7 @@ dict_col_get_min_size(
|
||||
const dict_col_t* col) /*!< in: column */
|
||||
{
|
||||
return(dtype_get_min_size_low(col->mtype, col->prtype, col->len,
|
||||
col->mbminmaxlen));
|
||||
col->mbminlen, col->mbmaxlen));
|
||||
}
|
||||
/***********************************************************************//**
|
||||
Returns the maximum size of the column.
|
||||
@ -148,7 +133,7 @@ dict_col_get_fixed_size(
|
||||
ulint comp) /*!< in: nonzero=ROW_FORMAT=COMPACT */
|
||||
{
|
||||
return(dtype_get_fixed_size_low(col->mtype, col->prtype, col->len,
|
||||
col->mbminmaxlen, comp));
|
||||
col->mbminlen, col->mbmaxlen, comp));
|
||||
}
|
||||
/***********************************************************************//**
|
||||
Returns the ROW_FORMAT=REDUNDANT stored SQL NULL size of a column.
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2014, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -294,11 +295,10 @@ struct dict_col_struct{
|
||||
the string, MySQL uses 1 or 2
|
||||
bytes to store the string length) */
|
||||
|
||||
unsigned mbminmaxlen:5; /*!< minimum and maximum length of a
|
||||
character, in bytes;
|
||||
DATA_MBMINMAXLEN(mbminlen,mbmaxlen);
|
||||
mbminlen=DATA_MBMINLEN(mbminmaxlen);
|
||||
mbmaxlen=DATA_MBMINLEN(mbminmaxlen) */
|
||||
unsigned mbminlen:3; /*!< minimum length of a
|
||||
character, in bytes */
|
||||
unsigned mbmaxlen:3; /*!< maximum length of a
|
||||
character, in bytes */
|
||||
/*----------------------*/
|
||||
/* End of definitions copied from dtype_t */
|
||||
/* @} */
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1994, 2011, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -845,13 +846,10 @@ rec_get_converted_size_comp_prefix_low(
|
||||
|
||||
if (fixed_len) {
|
||||
#ifdef UNIV_DEBUG
|
||||
ulint mbminlen = DATA_MBMINLEN(col->mbminmaxlen);
|
||||
ulint mbmaxlen = DATA_MBMAXLEN(col->mbminmaxlen);
|
||||
|
||||
ut_ad(len <= fixed_len);
|
||||
|
||||
ut_ad(!mbmaxlen || len >= mbminlen
|
||||
* (fixed_len / mbmaxlen));
|
||||
ut_ad(!col->mbmaxlen || len >= col->mbminlen
|
||||
* (fixed_len / col->mbmaxlen));
|
||||
|
||||
/* dict_index_add_col() should guarantee this */
|
||||
ut_ad(!field->prefix_len
|
||||
@ -1237,14 +1235,10 @@ rec_convert_dtuple_to_rec_comp(
|
||||
it is 128 or more, or when the field is stored externally. */
|
||||
if (fixed_len) {
|
||||
#ifdef UNIV_DEBUG
|
||||
ulint mbminlen = DATA_MBMINLEN(
|
||||
ifield->col->mbminmaxlen);
|
||||
ulint mbmaxlen = DATA_MBMAXLEN(
|
||||
ifield->col->mbminmaxlen);
|
||||
|
||||
ut_ad(len <= fixed_len);
|
||||
ut_ad(!mbmaxlen || len >= mbminlen
|
||||
* (fixed_len / mbmaxlen));
|
||||
ut_ad(!ifield->col->mbmaxlen
|
||||
|| len >= ifield->col->mbminlen
|
||||
* (fixed_len / ifield->col->mbmaxlen));
|
||||
ut_ad(!dfield_is_ext(field));
|
||||
#endif /* UNIV_DEBUG */
|
||||
} else if (dfield_is_ext(field)) {
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2014, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -527,7 +528,8 @@ row_ins_cascade_calc_update_vec(
|
||||
|
||||
if (!dfield_is_null(&ufield->new_val)
|
||||
&& dtype_get_at_most_n_mbchars(
|
||||
col->prtype, col->mbminmaxlen,
|
||||
col->prtype,
|
||||
col->mbminlen, col->mbmaxlen,
|
||||
col->len,
|
||||
ufield_len,
|
||||
dfield_get_data(&ufield->new_val))
|
||||
@ -2312,7 +2314,7 @@ row_ins_index_entry_set_vals(
|
||||
= dict_field_get_col(ind_field);
|
||||
|
||||
len = dtype_get_at_most_n_mbchars(
|
||||
col->prtype, col->mbminmaxlen,
|
||||
col->prtype, col->mbminlen, col->mbmaxlen,
|
||||
ind_field->prefix_len,
|
||||
len, dfield_get_data(row_field));
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1995, 2013, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -339,7 +340,7 @@ row_merge_buf_add(
|
||||
if (ifield->prefix_len) {
|
||||
len = dtype_get_at_most_n_mbchars(
|
||||
col->prtype,
|
||||
col->mbminmaxlen,
|
||||
col->mbminlen, col->mbmaxlen,
|
||||
ifield->prefix_len,
|
||||
len, dfield_get_data(field));
|
||||
dfield_set_len(field, len);
|
||||
@ -349,8 +350,7 @@ row_merge_buf_add(
|
||||
|
||||
fixed_len = ifield->fixed_len;
|
||||
if (fixed_len && !dict_table_is_comp(index->table)
|
||||
&& DATA_MBMINLEN(col->mbminmaxlen)
|
||||
!= DATA_MBMAXLEN(col->mbminmaxlen)) {
|
||||
&& col->mbminlen != col->mbmaxlen) {
|
||||
/* CHAR in ROW_FORMAT=REDUNDANT is always
|
||||
fixed-length, but in the temporary file it is
|
||||
variable-length for variable-length character
|
||||
@ -360,14 +360,11 @@ row_merge_buf_add(
|
||||
|
||||
if (fixed_len) {
|
||||
#ifdef UNIV_DEBUG
|
||||
ulint mbminlen = DATA_MBMINLEN(col->mbminmaxlen);
|
||||
ulint mbmaxlen = DATA_MBMAXLEN(col->mbminmaxlen);
|
||||
|
||||
/* len should be between size calcualted base on
|
||||
mbmaxlen and mbminlen */
|
||||
ut_ad(len <= fixed_len);
|
||||
ut_ad(!mbmaxlen || len >= mbminlen
|
||||
* (fixed_len / mbmaxlen));
|
||||
ut_ad(!col->mbmaxlen || len >= col->mbminlen
|
||||
* (fixed_len / col->mbmaxlen));
|
||||
|
||||
ut_ad(!dfield_is_ext(field));
|
||||
#endif /* UNIV_DEBUG */
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2012, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -164,7 +165,7 @@ row_build_index_entry(
|
||||
/* If a column prefix index, take only the prefix. */
|
||||
if (ind_field->prefix_len) {
|
||||
len = dtype_get_at_most_n_mbchars(
|
||||
col->prtype, col->mbminmaxlen,
|
||||
col->prtype, col->mbminlen, col->mbmaxlen,
|
||||
ind_field->prefix_len, len,
|
||||
dfield_get_data(dfield));
|
||||
dfield_set_len(dfield, len);
|
||||
@ -546,7 +547,8 @@ row_build_row_ref(
|
||||
dfield_set_len(dfield,
|
||||
dtype_get_at_most_n_mbchars(
|
||||
dtype->prtype,
|
||||
dtype->mbminmaxlen,
|
||||
dtype->mbminlen,
|
||||
dtype->mbmaxlen,
|
||||
clust_col_prefix_len,
|
||||
len, (char*) field));
|
||||
}
|
||||
@ -660,7 +662,8 @@ notfound:
|
||||
dfield_set_len(dfield,
|
||||
dtype_get_at_most_n_mbchars(
|
||||
dtype->prtype,
|
||||
dtype->mbminmaxlen,
|
||||
dtype->mbminlen,
|
||||
dtype->mbmaxlen,
|
||||
clust_col_prefix_len,
|
||||
len, (char*) field));
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
Copyright (c) 1997, 2013, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2008, Google Inc.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
Portions of this file contain modifications contributed and copyrighted by
|
||||
Google, Inc. Those modifications are gratefully acknowledged and are described
|
||||
@ -90,8 +91,10 @@ row_sel_sec_rec_is_for_blob(
|
||||
/*========================*/
|
||||
ulint mtype, /*!< in: main type */
|
||||
ulint prtype, /*!< in: precise type */
|
||||
ulint mbminmaxlen, /*!< in: minimum and maximum length of
|
||||
a multi-byte character */
|
||||
ulint mbminlen, /*!< in: minimum length of
|
||||
a character, in bytes */
|
||||
ulint mbmaxlen, /*!< in: maximum length of
|
||||
a character, in bytes */
|
||||
const byte* clust_field, /*!< in: the locally stored part of
|
||||
the clustered index column, including
|
||||
the BLOB pointer; the clustered
|
||||
@ -141,7 +144,7 @@ row_sel_sec_rec_is_for_blob(
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
len = dtype_get_at_most_n_mbchars(prtype, mbminmaxlen,
|
||||
len = dtype_get_at_most_n_mbchars(prtype, mbminlen, mbmaxlen,
|
||||
prefix_len, len, (const char*) buf);
|
||||
|
||||
return(!cmp_data_data(mtype, prtype, buf, len, sec_field, sec_len));
|
||||
@ -225,14 +228,14 @@ row_sel_sec_rec_is_for_clust_rec(
|
||||
}
|
||||
|
||||
len = dtype_get_at_most_n_mbchars(
|
||||
col->prtype, col->mbminmaxlen,
|
||||
col->prtype, col->mbminlen, col->mbmaxlen,
|
||||
ifield->prefix_len, len, (char*) clust_field);
|
||||
|
||||
if (rec_offs_nth_extern(clust_offs, clust_pos)
|
||||
&& len < sec_len) {
|
||||
if (!row_sel_sec_rec_is_for_blob(
|
||||
col->mtype, col->prtype,
|
||||
col->mbminmaxlen,
|
||||
col->mbminlen, col->mbmaxlen,
|
||||
clust_field, clust_len,
|
||||
sec_field, sec_len,
|
||||
ifield->prefix_len,
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2014, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -990,7 +991,7 @@ row_upd_index_replace_new_col_val(
|
||||
}
|
||||
|
||||
len = dtype_get_at_most_n_mbchars(col->prtype,
|
||||
col->mbminmaxlen,
|
||||
col->mbminlen, col->mbmaxlen,
|
||||
field->prefix_len, len,
|
||||
(const char*) data);
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2009, Innobase Oy. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -49,8 +50,10 @@ ulint
|
||||
dtype_get_at_most_n_mbchars(
|
||||
/*========================*/
|
||||
ulint prtype, /*!< in: precise type */
|
||||
ulint mbminmaxlen, /*!< in: minimum and maximum length of
|
||||
a multi-byte character */
|
||||
ulint mbminlen, /*!< in: minimum length of
|
||||
a multi-byte character, in bytes */
|
||||
ulint mbmaxlen, /*!< in: maximum length of
|
||||
a multi-byte character, in bytes */
|
||||
ulint prefix_len, /*!< in: length of the requested
|
||||
prefix, in characters, multiplied by
|
||||
dtype_get_mbmaxlen(dtype) */
|
||||
@ -58,9 +61,6 @@ dtype_get_at_most_n_mbchars(
|
||||
const char* str) /*!< in: the string whose prefix
|
||||
length is being determined */
|
||||
{
|
||||
ulint mbminlen = DATA_MBMINLEN(mbminmaxlen);
|
||||
ulint mbmaxlen = DATA_MBMAXLEN(mbminmaxlen);
|
||||
|
||||
ut_a(data_len != UNIV_SQL_NULL);
|
||||
ut_ad(!mbmaxlen || !(prefix_len % mbmaxlen));
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2010, Innobase Oy. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -254,7 +255,8 @@ dict_mem_fill_column_struct(
|
||||
column->len = (unsigned int) col_len;
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
dtype_get_mblen(mtype, prtype, &mbminlen, &mbmaxlen);
|
||||
dict_col_set_mbminmaxlen(column, mbminlen, mbmaxlen);
|
||||
column->mbminlen = mbminlen;
|
||||
column->mbmaxlen = mbmaxlen;
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
}
|
||||
|
||||
|
@ -5800,8 +5800,8 @@ build_template_field(
|
||||
}
|
||||
|
||||
templ->charset = dtype_get_charset_coll(col->prtype);
|
||||
templ->mbminlen = DATA_MBMINLEN(col->mbminmaxlen);
|
||||
templ->mbmaxlen = DATA_MBMAXLEN(col->mbminmaxlen);
|
||||
templ->mbminlen = col->mbminlen;
|
||||
templ->mbmaxlen = col->mbmaxlen;
|
||||
templ->is_unsigned = col->prtype & DATA_UNSIGNED;
|
||||
|
||||
if (!dict_index_is_clust(index)
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 2005, 2013, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -100,8 +101,7 @@ innobase_col_to_mysql(
|
||||
#ifdef UNIV_DEBUG
|
||||
case DATA_MYSQL:
|
||||
ut_ad(flen >= len);
|
||||
ut_ad(DATA_MBMAXLEN(col->mbminmaxlen)
|
||||
>= DATA_MBMINLEN(col->mbminmaxlen));
|
||||
ut_ad(col->mbmaxlen >= col->mbminlen);
|
||||
memcpy(dest, data, len);
|
||||
break;
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2009, Innobase Oy. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -169,18 +170,7 @@ store the charset-collation number; one byte is left unused, though */
|
||||
#define DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE 6
|
||||
|
||||
/* Maximum multi-byte character length in bytes, plus 1 */
|
||||
#define DATA_MBMAX 5
|
||||
|
||||
/* Pack mbminlen, mbmaxlen to mbminmaxlen. */
|
||||
#define DATA_MBMINMAXLEN(mbminlen, mbmaxlen) \
|
||||
((mbmaxlen) * DATA_MBMAX + (mbminlen))
|
||||
/* Get mbminlen from mbminmaxlen. Cast the result of UNIV_EXPECT to ulint
|
||||
because in GCC it returns a long. */
|
||||
#define DATA_MBMINLEN(mbminmaxlen) ((ulint) \
|
||||
UNIV_EXPECT(((mbminmaxlen) % DATA_MBMAX), \
|
||||
1))
|
||||
/* Get mbmaxlen from mbminmaxlen. */
|
||||
#define DATA_MBMAXLEN(mbminmaxlen) ((ulint) ((mbminmaxlen) / DATA_MBMAX))
|
||||
#define DATA_MBMAX 8
|
||||
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
/*********************************************************************//**
|
||||
@ -201,8 +191,10 @@ ulint
|
||||
dtype_get_at_most_n_mbchars(
|
||||
/*========================*/
|
||||
ulint prtype, /*!< in: precise type */
|
||||
ulint mbminmaxlen, /*!< in: minimum and maximum length of
|
||||
a multi-byte character */
|
||||
ulint mbminlen, /*!< in: minimum length of
|
||||
a multi-byte character, in bytes */
|
||||
ulint mbmaxlen, /*!< in: maximum length of
|
||||
a multi-byte character, in bytes */
|
||||
ulint prefix_len, /*!< in: length of the requested
|
||||
prefix, in characters, multiplied by
|
||||
dtype_get_mbmaxlen(dtype) */
|
||||
@ -347,19 +339,6 @@ dtype_get_mbmaxlen(
|
||||
/*===============*/
|
||||
const dtype_t* type); /*!< in: type */
|
||||
/*********************************************************************//**
|
||||
Sets the minimum and maximum length of a character, in bytes. */
|
||||
UNIV_INLINE
|
||||
void
|
||||
dtype_set_mbminmaxlen(
|
||||
/*==================*/
|
||||
dtype_t* type, /*!< in/out: type */
|
||||
ulint mbminlen, /*!< in: minimum length of a char,
|
||||
in bytes, or 0 if this is not
|
||||
a character type */
|
||||
ulint mbmaxlen); /*!< in: maximum length of a char,
|
||||
in bytes, or 0 if this is not
|
||||
a character type */
|
||||
/*********************************************************************//**
|
||||
Gets the padding character code for the type.
|
||||
@return padding character code, or ULINT_UNDEFINED if no padding specified */
|
||||
UNIV_INLINE
|
||||
@ -379,7 +358,9 @@ dtype_get_fixed_size_low(
|
||||
ulint mtype, /*!< in: main type */
|
||||
ulint prtype, /*!< in: precise type */
|
||||
ulint len, /*!< in: length */
|
||||
ulint mbminmaxlen, /*!< in: minimum and maximum length of a
|
||||
ulint mbminlen, /*!< in: minimum length of a
|
||||
multibyte character, in bytes */
|
||||
ulint mbmaxlen, /*!< in: maximum length of a
|
||||
multibyte character, in bytes */
|
||||
ulint comp); /*!< in: nonzero=ROW_FORMAT=COMPACT */
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
@ -393,8 +374,8 @@ dtype_get_min_size_low(
|
||||
ulint mtype, /*!< in: main type */
|
||||
ulint prtype, /*!< in: precise type */
|
||||
ulint len, /*!< in: length */
|
||||
ulint mbminmaxlen); /*!< in: minimum and maximum length of a
|
||||
multibyte character */
|
||||
ulint mbminlen, /*!< in: minimum length of a character */
|
||||
ulint mbmaxlen); /*!< in: maximum length of a character */
|
||||
/***********************************************************************//**
|
||||
Returns the maximum size of a data type. Note: types in system tables may be
|
||||
incomplete and return incorrect information.
|
||||
@ -497,11 +478,10 @@ struct dtype_struct{
|
||||
the string, MySQL uses 1 or 2
|
||||
bytes to store the string length) */
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
unsigned mbminmaxlen:5; /*!< minimum and maximum length of a
|
||||
character, in bytes;
|
||||
DATA_MBMINMAXLEN(mbminlen,mbmaxlen);
|
||||
mbminlen=DATA_MBMINLEN(mbminmaxlen);
|
||||
mbmaxlen=DATA_MBMINLEN(mbminmaxlen) */
|
||||
unsigned mbminlen:3; /*!< minimum length of a character,
|
||||
in bytes */
|
||||
unsigned mbmaxlen:3; /*!< maximum length of a character,
|
||||
in bytes */
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
};
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2012, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -100,27 +101,6 @@ dtype_get_mblen(
|
||||
}
|
||||
}
|
||||
|
||||
/*********************************************************************//**
|
||||
Sets the minimum and maximum length of a character, in bytes. */
|
||||
UNIV_INLINE
|
||||
void
|
||||
dtype_set_mbminmaxlen(
|
||||
/*==================*/
|
||||
dtype_t* type, /*!< in/out: type */
|
||||
ulint mbminlen, /*!< in: minimum length of a char,
|
||||
in bytes, or 0 if this is not
|
||||
a character type */
|
||||
ulint mbmaxlen) /*!< in: maximum length of a char,
|
||||
in bytes, or 0 if this is not
|
||||
a character type */
|
||||
{
|
||||
ut_ad(mbminlen < DATA_MBMAX);
|
||||
ut_ad(mbmaxlen < DATA_MBMAX);
|
||||
ut_ad(mbminlen <= mbmaxlen);
|
||||
|
||||
type->mbminmaxlen = DATA_MBMINMAXLEN(mbminlen, mbmaxlen);
|
||||
}
|
||||
|
||||
/*********************************************************************//**
|
||||
Compute the mbminlen and mbmaxlen members of a data type structure. */
|
||||
UNIV_INLINE
|
||||
@ -133,7 +113,8 @@ dtype_set_mblen(
|
||||
ulint mbmaxlen;
|
||||
|
||||
dtype_get_mblen(type->mtype, type->prtype, &mbminlen, &mbmaxlen);
|
||||
dtype_set_mbminmaxlen(type, mbminlen, mbmaxlen);
|
||||
type->mbminlen = mbminlen;
|
||||
type->mbmaxlen = mbmaxlen;
|
||||
|
||||
ut_ad(dtype_validate(type));
|
||||
}
|
||||
@ -229,8 +210,7 @@ dtype_get_mbminlen(
|
||||
/*===============*/
|
||||
const dtype_t* type) /*!< in: type */
|
||||
{
|
||||
ut_ad(type);
|
||||
return(DATA_MBMINLEN(type->mbminmaxlen));
|
||||
return type->mbminlen;
|
||||
}
|
||||
/*********************************************************************//**
|
||||
Gets the maximum length of a character, in bytes.
|
||||
@ -242,8 +222,7 @@ dtype_get_mbmaxlen(
|
||||
/*===============*/
|
||||
const dtype_t* type) /*!< in: type */
|
||||
{
|
||||
ut_ad(type);
|
||||
return(DATA_MBMAXLEN(type->mbminmaxlen));
|
||||
return type->mbmaxlen;
|
||||
}
|
||||
|
||||
/*********************************************************************//**
|
||||
@ -424,8 +403,10 @@ dtype_get_fixed_size_low(
|
||||
ulint mtype, /*!< in: main type */
|
||||
ulint prtype, /*!< in: precise type */
|
||||
ulint len, /*!< in: length */
|
||||
ulint mbminmaxlen, /*!< in: minimum and maximum length of
|
||||
a multibyte character, in bytes */
|
||||
ulint mbminlen, /*!< in: minimum length of a
|
||||
multibyte character, in bytes */
|
||||
ulint mbmaxlen, /*!< in: maximum length of a
|
||||
multibyte character, in bytes */
|
||||
ulint comp) /*!< in: nonzero=ROW_FORMAT=COMPACT */
|
||||
{
|
||||
switch (mtype) {
|
||||
@ -466,11 +447,10 @@ dtype_get_fixed_size_low(
|
||||
dtype_get_charset_coll(prtype),
|
||||
&i_mbminlen, &i_mbmaxlen);
|
||||
|
||||
ut_ad(DATA_MBMINMAXLEN(i_mbminlen, i_mbmaxlen)
|
||||
== mbminmaxlen);
|
||||
ut_ad(i_mbminlen == mbminlen);
|
||||
ut_ad(i_mbmaxlen == mbmaxlen);
|
||||
#endif /* UNIV_DEBUG */
|
||||
if (DATA_MBMINLEN(mbminmaxlen)
|
||||
== DATA_MBMAXLEN(mbminmaxlen)) {
|
||||
if (mbminlen == mbmaxlen) {
|
||||
return(len);
|
||||
}
|
||||
}
|
||||
@ -502,8 +482,8 @@ dtype_get_min_size_low(
|
||||
ulint mtype, /*!< in: main type */
|
||||
ulint prtype, /*!< in: precise type */
|
||||
ulint len, /*!< in: length */
|
||||
ulint mbminmaxlen) /*!< in: minimum and maximum length of a
|
||||
multi-byte character */
|
||||
ulint mbminlen, /*!< in: minimum length of a character */
|
||||
ulint mbmaxlen) /*!< in: maximum length of a character */
|
||||
{
|
||||
switch (mtype) {
|
||||
case DATA_SYS:
|
||||
@ -533,9 +513,6 @@ dtype_get_min_size_low(
|
||||
if (prtype & DATA_BINARY_TYPE) {
|
||||
return(len);
|
||||
} else {
|
||||
ulint mbminlen = DATA_MBMINLEN(mbminmaxlen);
|
||||
ulint mbmaxlen = DATA_MBMAXLEN(mbminmaxlen);
|
||||
|
||||
if (mbminlen == mbmaxlen) {
|
||||
return(len);
|
||||
}
|
||||
@ -606,9 +583,9 @@ dtype_get_sql_null_size(
|
||||
{
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
return(dtype_get_fixed_size_low(type->mtype, type->prtype, type->len,
|
||||
type->mbminmaxlen, comp));
|
||||
type->mbminlen, type->mbmaxlen, comp));
|
||||
#else /* !UNIV_HOTBACKUP */
|
||||
return(dtype_get_fixed_size_low(type->mtype, type->prtype, type->len,
|
||||
0, 0));
|
||||
0, 0, 0));
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2014, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -119,17 +120,6 @@ dict_col_get_mbmaxlen(
|
||||
/*==================*/
|
||||
const dict_col_t* col); /*!< in: column */
|
||||
/*********************************************************************//**
|
||||
Sets the minimum and maximum number of bytes per character. */
|
||||
UNIV_INLINE
|
||||
void
|
||||
dict_col_set_mbminmaxlen(
|
||||
/*=====================*/
|
||||
dict_col_t* col, /*!< in/out: column */
|
||||
ulint mbminlen, /*!< in: minimum multi-byte
|
||||
character size, in bytes */
|
||||
ulint mbmaxlen); /*!< in: minimum multi-byte
|
||||
character size, in bytes */
|
||||
/*********************************************************************//**
|
||||
Gets the column data type. */
|
||||
UNIV_INLINE
|
||||
void
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2014, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -38,7 +39,7 @@ dict_col_get_mbminlen(
|
||||
/*==================*/
|
||||
const dict_col_t* col) /*!< in: column */
|
||||
{
|
||||
return(DATA_MBMINLEN(col->mbminmaxlen));
|
||||
return col->mbminlen;
|
||||
}
|
||||
/*********************************************************************//**
|
||||
Gets the maximum number of bytes per character.
|
||||
@ -49,25 +50,7 @@ dict_col_get_mbmaxlen(
|
||||
/*==================*/
|
||||
const dict_col_t* col) /*!< in: column */
|
||||
{
|
||||
return(DATA_MBMAXLEN(col->mbminmaxlen));
|
||||
}
|
||||
/*********************************************************************//**
|
||||
Sets the minimum and maximum number of bytes per character. */
|
||||
UNIV_INLINE
|
||||
void
|
||||
dict_col_set_mbminmaxlen(
|
||||
/*=====================*/
|
||||
dict_col_t* col, /*!< in/out: column */
|
||||
ulint mbminlen, /*!< in: minimum multi-byte
|
||||
character size, in bytes */
|
||||
ulint mbmaxlen) /*!< in: minimum multi-byte
|
||||
character size, in bytes */
|
||||
{
|
||||
ut_ad(mbminlen < DATA_MBMAX);
|
||||
ut_ad(mbmaxlen < DATA_MBMAX);
|
||||
ut_ad(mbminlen <= mbmaxlen);
|
||||
|
||||
col->mbminmaxlen = DATA_MBMINMAXLEN(mbminlen, mbmaxlen);
|
||||
return col->mbmaxlen;
|
||||
}
|
||||
/*********************************************************************//**
|
||||
Gets the column data type. */
|
||||
@ -83,7 +66,8 @@ dict_col_copy_type(
|
||||
type->mtype = col->mtype;
|
||||
type->prtype = col->prtype;
|
||||
type->len = col->len;
|
||||
type->mbminmaxlen = col->mbminmaxlen;
|
||||
type->mbminlen = col->mbminlen;
|
||||
type->mbmaxlen = col->mbmaxlen;
|
||||
}
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
|
||||
@ -105,7 +89,8 @@ dict_col_type_assert_equal(
|
||||
ut_ad(col->prtype == type->prtype);
|
||||
ut_ad(col->len == type->len);
|
||||
# ifndef UNIV_HOTBACKUP
|
||||
ut_ad(col->mbminmaxlen == type->mbminmaxlen);
|
||||
ut_ad(col->mbminlen == type->mbminlen);
|
||||
ut_ad(col->mbmaxlen == type->mbmaxlen);
|
||||
# endif /* !UNIV_HOTBACKUP */
|
||||
|
||||
return(TRUE);
|
||||
@ -123,7 +108,7 @@ dict_col_get_min_size(
|
||||
const dict_col_t* col) /*!< in: column */
|
||||
{
|
||||
return(dtype_get_min_size_low(col->mtype, col->prtype, col->len,
|
||||
col->mbminmaxlen));
|
||||
col->mbminlen, col->mbmaxlen));
|
||||
}
|
||||
/***********************************************************************//**
|
||||
Returns the maximum size of the column.
|
||||
@ -148,7 +133,7 @@ dict_col_get_fixed_size(
|
||||
ulint comp) /*!< in: nonzero=ROW_FORMAT=COMPACT */
|
||||
{
|
||||
return(dtype_get_fixed_size_low(col->mtype, col->prtype, col->len,
|
||||
col->mbminmaxlen, comp));
|
||||
col->mbminlen, col->mbmaxlen, comp));
|
||||
}
|
||||
/***********************************************************************//**
|
||||
Returns the ROW_FORMAT=REDUNDANT stored SQL NULL size of a column.
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2014, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -294,11 +295,10 @@ struct dict_col_struct{
|
||||
the string, MySQL uses 1 or 2
|
||||
bytes to store the string length) */
|
||||
|
||||
unsigned mbminmaxlen:5; /*!< minimum and maximum length of a
|
||||
character, in bytes;
|
||||
DATA_MBMINMAXLEN(mbminlen,mbmaxlen);
|
||||
mbminlen=DATA_MBMINLEN(mbminmaxlen);
|
||||
mbmaxlen=DATA_MBMINLEN(mbminmaxlen) */
|
||||
unsigned mbminlen:3; /*!< minimum length of a
|
||||
character, in bytes */
|
||||
unsigned mbmaxlen:3; /*!< maximum length of a
|
||||
character, in bytes */
|
||||
/*----------------------*/
|
||||
/* End of definitions copied from dtype_t */
|
||||
/* @} */
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1994, 2011, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -845,13 +846,10 @@ rec_get_converted_size_comp_prefix_low(
|
||||
|
||||
if (fixed_len) {
|
||||
#ifdef UNIV_DEBUG
|
||||
ulint mbminlen = DATA_MBMINLEN(col->mbminmaxlen);
|
||||
ulint mbmaxlen = DATA_MBMAXLEN(col->mbminmaxlen);
|
||||
|
||||
ut_ad(len <= fixed_len);
|
||||
|
||||
ut_ad(!mbmaxlen || len >= mbminlen
|
||||
* (fixed_len / mbmaxlen));
|
||||
ut_ad(!col->mbmaxlen || len >= col->mbminlen
|
||||
* (fixed_len / col->mbmaxlen));
|
||||
|
||||
/* dict_index_add_col() should guarantee this */
|
||||
ut_ad(!field->prefix_len
|
||||
@ -1237,14 +1235,10 @@ rec_convert_dtuple_to_rec_comp(
|
||||
it is 128 or more, or when the field is stored externally. */
|
||||
if (fixed_len) {
|
||||
#ifdef UNIV_DEBUG
|
||||
ulint mbminlen = DATA_MBMINLEN(
|
||||
ifield->col->mbminmaxlen);
|
||||
ulint mbmaxlen = DATA_MBMAXLEN(
|
||||
ifield->col->mbminmaxlen);
|
||||
|
||||
ut_ad(len <= fixed_len);
|
||||
ut_ad(!mbmaxlen || len >= mbminlen
|
||||
* (fixed_len / mbmaxlen));
|
||||
ut_ad(!ifield->col->mbmaxlen
|
||||
|| len >= ifield->col->mbminlen
|
||||
* (fixed_len / ifield->col->mbmaxlen));
|
||||
ut_ad(!dfield_is_ext(field));
|
||||
#endif /* UNIV_DEBUG */
|
||||
} else if (dfield_is_ext(field)) {
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2014, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -528,7 +529,8 @@ row_ins_cascade_calc_update_vec(
|
||||
|
||||
if (!dfield_is_null(&ufield->new_val)
|
||||
&& dtype_get_at_most_n_mbchars(
|
||||
col->prtype, col->mbminmaxlen,
|
||||
col->prtype,
|
||||
col->mbminlen, col->mbmaxlen,
|
||||
col->len,
|
||||
ufield_len,
|
||||
dfield_get_data(&ufield->new_val))
|
||||
@ -2353,7 +2355,7 @@ row_ins_index_entry_set_vals(
|
||||
= dict_field_get_col(ind_field);
|
||||
|
||||
len = dtype_get_at_most_n_mbchars(
|
||||
col->prtype, col->mbminmaxlen,
|
||||
col->prtype, col->mbminlen, col->mbmaxlen,
|
||||
ind_field->prefix_len,
|
||||
len, dfield_get_data(row_field));
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1995, 2013, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -350,7 +351,7 @@ row_merge_buf_add(
|
||||
if (ifield->prefix_len) {
|
||||
len = dtype_get_at_most_n_mbchars(
|
||||
col->prtype,
|
||||
col->mbminmaxlen,
|
||||
col->mbminlen, col->mbmaxlen,
|
||||
ifield->prefix_len,
|
||||
len, dfield_get_data(field));
|
||||
dfield_set_len(field, len);
|
||||
@ -360,8 +361,7 @@ row_merge_buf_add(
|
||||
|
||||
fixed_len = ifield->fixed_len;
|
||||
if (fixed_len && !dict_table_is_comp(index->table)
|
||||
&& DATA_MBMINLEN(col->mbminmaxlen)
|
||||
!= DATA_MBMAXLEN(col->mbminmaxlen)) {
|
||||
&& col->mbminlen != col->mbmaxlen) {
|
||||
/* CHAR in ROW_FORMAT=REDUNDANT is always
|
||||
fixed-length, but in the temporary file it is
|
||||
variable-length for variable-length character
|
||||
@ -371,14 +371,11 @@ row_merge_buf_add(
|
||||
|
||||
if (fixed_len) {
|
||||
#ifdef UNIV_DEBUG
|
||||
ulint mbminlen = DATA_MBMINLEN(col->mbminmaxlen);
|
||||
ulint mbmaxlen = DATA_MBMAXLEN(col->mbminmaxlen);
|
||||
|
||||
/* len should be between size calcualted base on
|
||||
mbmaxlen and mbminlen */
|
||||
ut_ad(len <= fixed_len);
|
||||
ut_ad(!mbmaxlen || len >= mbminlen
|
||||
* (fixed_len / mbmaxlen));
|
||||
ut_ad(!col->mbmaxlen || len >= col->mbminlen
|
||||
* (fixed_len / col->mbmaxlen));
|
||||
|
||||
ut_ad(!dfield_is_ext(field));
|
||||
#endif /* UNIV_DEBUG */
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2012, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -164,7 +165,7 @@ row_build_index_entry(
|
||||
/* If a column prefix index, take only the prefix. */
|
||||
if (ind_field->prefix_len) {
|
||||
len = dtype_get_at_most_n_mbchars(
|
||||
col->prtype, col->mbminmaxlen,
|
||||
col->prtype, col->mbminlen, col->mbmaxlen,
|
||||
ind_field->prefix_len, len,
|
||||
dfield_get_data(dfield));
|
||||
dfield_set_len(dfield, len);
|
||||
@ -562,7 +563,8 @@ row_build_row_ref(
|
||||
dfield_set_len(dfield,
|
||||
dtype_get_at_most_n_mbchars(
|
||||
dtype->prtype,
|
||||
dtype->mbminmaxlen,
|
||||
dtype->mbminlen,
|
||||
dtype->mbmaxlen,
|
||||
clust_col_prefix_len,
|
||||
len, (char*) field));
|
||||
}
|
||||
@ -676,7 +678,8 @@ notfound:
|
||||
dfield_set_len(dfield,
|
||||
dtype_get_at_most_n_mbchars(
|
||||
dtype->prtype,
|
||||
dtype->mbminmaxlen,
|
||||
dtype->mbminlen,
|
||||
dtype->mbmaxlen,
|
||||
clust_col_prefix_len,
|
||||
len, (char*) field));
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
Copyright (c) 1997, 2013, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2008, Google Inc.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
Portions of this file contain modifications contributed and copyrighted by
|
||||
Google, Inc. Those modifications are gratefully acknowledged and are described
|
||||
@ -92,8 +93,10 @@ row_sel_sec_rec_is_for_blob(
|
||||
/*========================*/
|
||||
ulint mtype, /*!< in: main type */
|
||||
ulint prtype, /*!< in: precise type */
|
||||
ulint mbminmaxlen, /*!< in: minimum and maximum length of
|
||||
a multi-byte character */
|
||||
ulint mbminlen, /*!< in: minimum length of
|
||||
a character, in bytes */
|
||||
ulint mbmaxlen, /*!< in: maximum length of
|
||||
a character, in bytes */
|
||||
const byte* clust_field, /*!< in: the locally stored part of
|
||||
the clustered index column, including
|
||||
the BLOB pointer; the clustered
|
||||
@ -143,7 +146,7 @@ row_sel_sec_rec_is_for_blob(
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
len = dtype_get_at_most_n_mbchars(prtype, mbminmaxlen,
|
||||
len = dtype_get_at_most_n_mbchars(prtype, mbminlen, mbmaxlen,
|
||||
prefix_len, len, (const char*) buf);
|
||||
|
||||
return(!cmp_data_data(mtype, prtype, buf, len, sec_field, sec_len));
|
||||
@ -227,14 +230,14 @@ row_sel_sec_rec_is_for_clust_rec(
|
||||
}
|
||||
|
||||
len = dtype_get_at_most_n_mbchars(
|
||||
col->prtype, col->mbminmaxlen,
|
||||
col->prtype, col->mbminlen, col->mbmaxlen,
|
||||
ifield->prefix_len, len, (char*) clust_field);
|
||||
|
||||
if (rec_offs_nth_extern(clust_offs, clust_pos)
|
||||
&& len < sec_len) {
|
||||
if (!row_sel_sec_rec_is_for_blob(
|
||||
col->mtype, col->prtype,
|
||||
col->mbminmaxlen,
|
||||
col->mbminlen, col->mbmaxlen,
|
||||
clust_field, clust_len,
|
||||
sec_field, sec_len,
|
||||
ifield->prefix_len,
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2014, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -1008,7 +1009,7 @@ row_upd_index_replace_new_col_val(
|
||||
}
|
||||
|
||||
len = dtype_get_at_most_n_mbchars(col->prtype,
|
||||
col->mbminmaxlen,
|
||||
col->mbminlen, col->mbmaxlen,
|
||||
field->prefix_len, len,
|
||||
(const char*) data);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user