mirror of
https://github.com/MariaDB/server.git
synced 2025-01-27 17:33:44 +01:00
Bug#2451 ALTER doesn't result in an error on CHARACTER SET and COLLATION conflict
This commit is contained in:
parent
3d2e2ddd12
commit
f71662695d
27 changed files with 95 additions and 18 deletions
include
mysql-test
sql
share
czech
danish
dutch
english
estonian
french
german
greek
hungarian
italian
japanese
korean
norwegian-ny
norwegian
polish
portuguese
romanian
russian
serbian
slovak
spanish
swedish
ukrainian
|
@ -318,4 +318,5 @@
|
|||
#define ER_WARN_INVALID_TIMESTAMP 1299
|
||||
#define ER_INVALID_CHARACTER_STRING 1300
|
||||
#define ER_WARN_ALLOWED_PACKET_OVERFLOWED 1301
|
||||
#define ER_ERROR_MESSAGES 302
|
||||
#define ER_CONFLICTING_DECLARATIONS 1302
|
||||
#define ER_ERROR_MESSAGES 303
|
||||
|
|
|
@ -54,4 +54,12 @@ t1 CREATE TABLE `t1` (
|
|||
`a` char(10) collate latin1_german1_ci default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci
|
||||
DROP TABLE t1;
|
||||
create table t1 (a char) character set latin1 character set latin2;
|
||||
ERROR HY000: Conflicting declarations: 'CHARACTER SET latin1' and 'CHARACTER SET latin2'
|
||||
create table t1 (a char) character set latin1 collate latin2_bin;
|
||||
ERROR 42000: COLLATION 'latin2_bin' is not valid for CHARACTER SET 'latin1'
|
||||
create database d1 default character set latin1 character set latin2;
|
||||
ERROR HY000: Conflicting declarations: 'CHARACTER SET latin1' and 'CHARACTER SET latin2'
|
||||
create database d1 default character set latin1 collate latin2_bin;
|
||||
ERROR 42000: COLLATION 'latin2_bin' is not valid for CHARACTER SET 'latin1'
|
||||
DROP DATABASE mysqltest1;
|
||||
|
|
|
@ -71,6 +71,18 @@ SHOW CREATE TABLE t1;
|
|||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug#
|
||||
# CREATE TABLE and CREATE DATABASE didn't fail in some cases
|
||||
#
|
||||
--error 1302
|
||||
create table t1 (a char) character set latin1 character set latin2;
|
||||
--error 1253
|
||||
create table t1 (a char) character set latin1 collate latin2_bin;
|
||||
--error 1302
|
||||
create database d1 default character set latin1 character set latin2;
|
||||
--error 1253
|
||||
create database d1 default character set latin1 collate latin2_bin;
|
||||
|
||||
#
|
||||
#
|
||||
DROP DATABASE mysqltest1;
|
||||
|
|
|
@ -314,3 +314,4 @@ character-set=latin2
|
|||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||
"Conflicting declarations: '%s' and '%s'"
|
||||
|
|
|
@ -308,3 +308,4 @@ character-set=latin1
|
|||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||
"Conflicting declarations: '%s' and '%s'"
|
||||
|
|
|
@ -316,3 +316,4 @@ character-set=latin1
|
|||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||
"Conflicting declarations: '%s' and '%s'"
|
||||
|
|
|
@ -305,3 +305,4 @@ character-set=latin1
|
|||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||
"Conflicting declarations: '%s' and '%s'"
|
||||
|
|
|
@ -310,3 +310,4 @@ character-set=latin7
|
|||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||
"Conflicting declarations: '%s' and '%s'"
|
||||
|
|
|
@ -305,3 +305,4 @@ character-set=latin1
|
|||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||
"Conflicting declarations: '%s' and '%s'"
|
||||
|
|
|
@ -317,3 +317,4 @@ character-set=latin1
|
|||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||
"Conflicting declarations: '%s' and '%s'"
|
||||
|
|
|
@ -305,3 +305,4 @@ character-set=greek
|
|||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||
"Conflicting declarations: '%s' and '%s'"
|
||||
|
|
|
@ -307,3 +307,4 @@ character-set=latin2
|
|||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||
"Conflicting declarations: '%s' and '%s'"
|
||||
|
|
|
@ -305,3 +305,4 @@ character-set=latin1
|
|||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||
"Conflicting declarations: '%s' and '%s'"
|
||||
|
|
|
@ -307,3 +307,4 @@ character-set=ujis
|
|||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||
"Conflicting declarations: '%s' and '%s'"
|
||||
|
|
|
@ -305,3 +305,4 @@ character-set=euckr
|
|||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||
"Conflicting declarations: '%s' and '%s'"
|
||||
|
|
|
@ -307,3 +307,4 @@ character-set=latin1
|
|||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||
"Conflicting declarations: '%s' and '%s'"
|
||||
|
|
|
@ -307,3 +307,4 @@ character-set=latin1
|
|||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||
"Conflicting declarations: '%s' and '%s'"
|
||||
|
|
|
@ -309,3 +309,4 @@ character-set=latin2
|
|||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||
"Conflicting declarations: '%s' and '%s'"
|
||||
|
|
|
@ -306,3 +306,4 @@ character-set=latin1
|
|||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||
"Conflicting declarations: '%s' and '%s'"
|
||||
|
|
|
@ -309,3 +309,4 @@ character-set=latin2
|
|||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||
"Conflicting declarations: '%s' and '%s'"
|
||||
|
|
|
@ -307,3 +307,4 @@ character-set=koi8r
|
|||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||
"Conflicting declarations: '%s' and '%s'"
|
||||
|
|
|
@ -311,3 +311,4 @@ character-set=cp1250
|
|||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||
"Conflicting declarations: '%s' and '%s'"
|
||||
|
|
|
@ -313,3 +313,4 @@ character-set=latin2
|
|||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||
"Conflicting declarations: '%s' and '%s'"
|
||||
|
|
|
@ -307,3 +307,4 @@ character-set=latin1
|
|||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||
"Conflicting declarations: '%s' and '%s'"
|
||||
|
|
|
@ -305,3 +305,4 @@ character-set=latin1
|
|||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||
"Conflicting declarations: '%s' and '%s'"
|
||||
|
|
|
@ -310,3 +310,4 @@ character-set=koi8u
|
|||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||
"Conflicting declarations: '%s' and '%s'"
|
||||
|
|
|
@ -1049,7 +1049,10 @@ create:
|
|||
lex->col_list.empty();
|
||||
}
|
||||
| CREATE DATABASE opt_if_not_exists ident
|
||||
{ Lex->create_info.default_table_charset=NULL; }
|
||||
{
|
||||
Lex->create_info.default_table_charset= NULL;
|
||||
Lex->create_info.used_fields= 0;
|
||||
}
|
||||
opt_create_database_options
|
||||
{
|
||||
LEX *lex=Lex;
|
||||
|
@ -1136,11 +1139,8 @@ create_database_options:
|
|||
| create_database_options create_database_option {};
|
||||
|
||||
create_database_option:
|
||||
opt_default COLLATE_SYM collation_name_or_default
|
||||
{ Lex->create_info.default_table_charset=$3; }
|
||||
| opt_default charset charset_name_or_default
|
||||
{ Lex->create_info.default_table_charset=$3; }
|
||||
;
|
||||
default_collation {}
|
||||
| default_charset {};
|
||||
|
||||
opt_table_options:
|
||||
/* empty */ { $$= 0; }
|
||||
|
@ -1200,21 +1200,49 @@ create_table_option:
|
|||
table_list->next=0;
|
||||
lex->create_info.used_fields|= HA_CREATE_USED_UNION;
|
||||
}
|
||||
| opt_default charset opt_equal charset_name_or_default
|
||||
{
|
||||
Lex->create_info.default_table_charset= $4;
|
||||
Lex->create_info.used_fields|= HA_CREATE_USED_DEFAULT_CHARSET;
|
||||
}
|
||||
| opt_default COLLATE_SYM opt_equal collation_name_or_default
|
||||
{
|
||||
Lex->create_info.default_table_charset= $4;
|
||||
Lex->create_info.used_fields|= HA_CREATE_USED_DEFAULT_CHARSET;
|
||||
}
|
||||
| default_charset
|
||||
| default_collation
|
||||
| INSERT_METHOD opt_equal merge_insert_types { Lex->create_info.merge_insert_method= $3; Lex->create_info.used_fields|= HA_CREATE_USED_INSERT_METHOD;}
|
||||
| DATA_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys
|
||||
{ Lex->create_info.data_file_name= $4.str; }
|
||||
| INDEX_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys { Lex->create_info.index_file_name= $4.str; };
|
||||
|
||||
default_charset:
|
||||
opt_default charset opt_equal charset_name_or_default
|
||||
{
|
||||
HA_CREATE_INFO *cinfo= &Lex->create_info;
|
||||
if ((cinfo->used_fields & HA_CREATE_USED_DEFAULT_CHARSET) &&
|
||||
cinfo->default_table_charset && $4 &&
|
||||
!my_charset_same(cinfo->default_table_charset,$4))
|
||||
{
|
||||
char cs1[32];
|
||||
char cs2[32];
|
||||
my_snprintf(cs1, sizeof(cs1), "CHARACTER SET %s",
|
||||
cinfo->default_table_charset->csname);
|
||||
my_snprintf(cs2, sizeof(cs2), "CHARACTER SET %s", $4->csname);
|
||||
net_printf(YYTHD, ER_CONFLICTING_DECLARATIONS, cs1, cs2);
|
||||
YYABORT;
|
||||
}
|
||||
Lex->create_info.default_table_charset= $4;
|
||||
Lex->create_info.used_fields|= HA_CREATE_USED_DEFAULT_CHARSET;
|
||||
};
|
||||
|
||||
default_collation:
|
||||
opt_default COLLATE_SYM opt_equal collation_name_or_default
|
||||
{
|
||||
HA_CREATE_INFO *cinfo= &Lex->create_info;
|
||||
if ((cinfo->used_fields & HA_CREATE_USED_DEFAULT_CHARSET) &&
|
||||
cinfo->default_table_charset && $4 &&
|
||||
!my_charset_same(cinfo->default_table_charset,$4))
|
||||
{
|
||||
net_printf(YYTHD,ER_COLLATION_CHARSET_MISMATCH,
|
||||
$4->name, cinfo->default_table_charset->csname);
|
||||
YYABORT;
|
||||
}
|
||||
Lex->create_info.default_table_charset= $4;
|
||||
Lex->create_info.used_fields|= HA_CREATE_USED_DEFAULT_CHARSET;
|
||||
};
|
||||
|
||||
storage_engines:
|
||||
ident_or_text
|
||||
{
|
||||
|
@ -1824,7 +1852,12 @@ alter:
|
|||
}
|
||||
alter_list
|
||||
{}
|
||||
| ALTER DATABASE ident opt_create_database_options
|
||||
| ALTER DATABASE ident
|
||||
{
|
||||
Lex->create_info.default_table_charset= NULL;
|
||||
Lex->create_info.used_fields= 0;
|
||||
}
|
||||
opt_create_database_options
|
||||
{
|
||||
LEX *lex=Lex;
|
||||
lex->sql_command=SQLCOM_ALTER_DB;
|
||||
|
|
Loading…
Add table
Reference in a new issue