mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
BUG#14139: When handling "CREATE TABLE(field_X type_spec,...) SELECT smth AS field_X, ...."
avoid multiplying length of field_X by charset->mbmaxlen twice when calculating space required for field_X in the new table.
This commit is contained in:
parent
7510c45423
commit
2219ada7f6
5 changed files with 41 additions and 2 deletions
|
@ -621,3 +621,14 @@ create table if not exists t1 (a int);
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1050 Table 't1' already exists
|
Note 1050 Table 't1' already exists
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
create table t1 (
|
||||||
|
a varchar(112) charset utf8 collate utf8_bin not null,
|
||||||
|
primary key (a)
|
||||||
|
) select 'test' as a ;
|
||||||
|
show create table t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` varchar(112) character set utf8 collate utf8_bin NOT NULL default '',
|
||||||
|
PRIMARY KEY (`a`)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
drop table t1;
|
||||||
|
|
|
@ -526,4 +526,12 @@ create table t1 (a int);
|
||||||
create table if not exists t1 (a int);
|
create table if not exists t1 (a int);
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
# BUG#14139
|
||||||
|
create table t1 (
|
||||||
|
a varchar(112) charset utf8 collate utf8_bin not null,
|
||||||
|
primary key (a)
|
||||||
|
) select 'test' as a ;
|
||||||
|
show create table t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
|
12
sql/field.cc
12
sql/field.cc
|
@ -6511,8 +6511,20 @@ bool Field_num::eq_def(Field *field)
|
||||||
** Handling of field and create_field
|
** Handling of field and create_field
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Convert create_field::length from number of characters to number of bytes
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
create_field::create_length_to_internal_length()
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Convert create_field::length from number of characters to number of bytes,
|
||||||
|
save original value in chars_length.
|
||||||
|
*/
|
||||||
|
|
||||||
void create_field::create_length_to_internal_length(void)
|
void create_field::create_length_to_internal_length(void)
|
||||||
{
|
{
|
||||||
|
chars_length= length;
|
||||||
switch (sql_type) {
|
switch (sql_type) {
|
||||||
case MYSQL_TYPE_TINY_BLOB:
|
case MYSQL_TYPE_TINY_BLOB:
|
||||||
case MYSQL_TYPE_MEDIUM_BLOB:
|
case MYSQL_TYPE_MEDIUM_BLOB:
|
||||||
|
|
|
@ -1180,7 +1180,15 @@ public:
|
||||||
LEX_STRING comment; // Comment for field
|
LEX_STRING comment; // Comment for field
|
||||||
Item *def; // Default value
|
Item *def; // Default value
|
||||||
enum enum_field_types sql_type;
|
enum enum_field_types sql_type;
|
||||||
|
/*
|
||||||
|
At various stages in execution this can be length of field in bytes or
|
||||||
|
max number of characters.
|
||||||
|
*/
|
||||||
uint32 length;
|
uint32 length;
|
||||||
|
/*
|
||||||
|
The value of 'length' before a call to create_length_to_internal_length
|
||||||
|
*/
|
||||||
|
uint32 chars_length;
|
||||||
uint decimals,flags,pack_length;
|
uint decimals,flags,pack_length;
|
||||||
Field::utype unireg_check;
|
Field::utype unireg_check;
|
||||||
TYPELIB *interval; // Which interval to use
|
TYPELIB *interval; // Which interval to use
|
||||||
|
|
|
@ -643,8 +643,8 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
|
||||||
sql_field->charset= (dup_field->charset ?
|
sql_field->charset= (dup_field->charset ?
|
||||||
dup_field->charset :
|
dup_field->charset :
|
||||||
create_info->default_table_charset);
|
create_info->default_table_charset);
|
||||||
sql_field->length= dup_field->length;
|
sql_field->length= dup_field->chars_length;
|
||||||
sql_field->pack_length= dup_field->pack_length;
|
sql_field->pack_length= dup_field->pack_length;
|
||||||
sql_field->create_length_to_internal_length();
|
sql_field->create_length_to_internal_length();
|
||||||
sql_field->decimals= dup_field->decimals;
|
sql_field->decimals= dup_field->decimals;
|
||||||
sql_field->flags= dup_field->flags;
|
sql_field->flags= dup_field->flags;
|
||||||
|
|
Loading…
Reference in a new issue