MDEV-7387 [PATCH] Alter table xxx CHARACTER SET utf8, CONVERT TO CHARACTER SET latin1 should fail
A contribution from Daniel Black, with minor additional enhancements.
This commit is contained in:
parent
702fdc52fa
commit
bc902a2bfc
@ -76,3 +76,35 @@ ALTER DATABASE aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
|||||||
ERROR 42000: Incorrect database name 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
|
ERROR 42000: Incorrect database name 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
|
||||||
ALTER DATABASE `` DEFAULT CHARACTER SET latin2;
|
ALTER DATABASE `` DEFAULT CHARACTER SET latin2;
|
||||||
ERROR 42000: Incorrect database name ''
|
ERROR 42000: Incorrect database name ''
|
||||||
|
USE test;
|
||||||
|
#
|
||||||
|
# Start of 10.0 tests
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# MDEV-7387 Alter table xxx CHARACTER SET utf8, CONVERT TO CHARACTER SET latin1 should fail
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a VARCHAR(10)) CHARACTER SET DEFAULT, CHARACTER SET utf8;
|
||||||
|
ERROR HY000: Conflicting declarations: 'CHARACTER SET DEFAULT' and 'CHARACTER SET utf8'
|
||||||
|
CREATE TABLE t1 (a VARCHAR(10)) CHARACTER SET utf8, CHARACTER SET DEFAULT;
|
||||||
|
ERROR HY000: Conflicting declarations: 'CHARACTER SET utf8' and 'CHARACTER SET DEFAULT'
|
||||||
|
CREATE TABLE t1 (a VARCHAR(10)) CHARACTER SET utf8, CHARACTER SET utf8;
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a VARCHAR(10)) CHARACTER SET DEFAULT, CHARACTER SET DEFAULT;
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET latin1, b VARCHAR(10) CHARACTER SET utf8);
|
||||||
|
ALTER TABLE t1 CONVERT TO CHARACTER SET utf8, CHARACTER SET latin1;
|
||||||
|
ERROR HY000: Conflicting declarations: 'CHARACTER SET utf8' and 'CHARACTER SET latin1'
|
||||||
|
ALTER TABLE t1 CONVERT TO CHARACTER SET utf8, CHARACTER SET DEFAULT;
|
||||||
|
ERROR HY000: Conflicting declarations: 'CHARACTER SET utf8' and 'CHARACTER SET DEFAULT'
|
||||||
|
ALTER TABLE t1 CONVERT TO CHARACTER SET latin1, CHARACTER SET utf8;
|
||||||
|
ERROR HY000: Conflicting declarations: 'CHARACTER SET latin1' and 'CHARACTER SET utf8'
|
||||||
|
ALTER TABLE t1 CONVERT TO CHARACTER SET latin1, CHARACTER SET DEFAULT;
|
||||||
|
ERROR HY000: Conflicting declarations: 'CHARACTER SET latin1' and 'CHARACTER SET DEFAULT'
|
||||||
|
ALTER TABLE t1 CONVERT TO CHARACTER SET DEFAULT, CHARACTER SET utf8;
|
||||||
|
ERROR HY000: Conflicting declarations: 'CHARACTER SET latin5' and 'CHARACTER SET utf8'
|
||||||
|
ALTER TABLE t1 CONVERT TO CHARACTER SET DEFAULT, CHARACTER SET latin1;
|
||||||
|
ERROR HY000: Conflicting declarations: 'CHARACTER SET latin5' and 'CHARACTER SET latin1'
|
||||||
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# End of 10.0 tests
|
||||||
|
#
|
||||||
|
@ -105,3 +105,39 @@ ALTER DATABASE DEFAULT CHARACTER SET latin2;
|
|||||||
ALTER DATABASE aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa DEFAULT CHARACTER SET latin2;
|
ALTER DATABASE aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa DEFAULT CHARACTER SET latin2;
|
||||||
--error 1102
|
--error 1102
|
||||||
ALTER DATABASE `` DEFAULT CHARACTER SET latin2;
|
ALTER DATABASE `` DEFAULT CHARACTER SET latin2;
|
||||||
|
USE test;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Start of 10.0 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-7387 Alter table xxx CHARACTER SET utf8, CONVERT TO CHARACTER SET latin1 should fail
|
||||||
|
--echo #
|
||||||
|
--error ER_CONFLICTING_DECLARATIONS
|
||||||
|
CREATE TABLE t1 (a VARCHAR(10)) CHARACTER SET DEFAULT, CHARACTER SET utf8;
|
||||||
|
--error ER_CONFLICTING_DECLARATIONS
|
||||||
|
CREATE TABLE t1 (a VARCHAR(10)) CHARACTER SET utf8, CHARACTER SET DEFAULT;
|
||||||
|
CREATE TABLE t1 (a VARCHAR(10)) CHARACTER SET utf8, CHARACTER SET utf8;
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a VARCHAR(10)) CHARACTER SET DEFAULT, CHARACTER SET DEFAULT;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET latin1, b VARCHAR(10) CHARACTER SET utf8);
|
||||||
|
--error ER_CONFLICTING_DECLARATIONS
|
||||||
|
ALTER TABLE t1 CONVERT TO CHARACTER SET utf8, CHARACTER SET latin1;
|
||||||
|
--error ER_CONFLICTING_DECLARATIONS
|
||||||
|
ALTER TABLE t1 CONVERT TO CHARACTER SET utf8, CHARACTER SET DEFAULT;
|
||||||
|
--error ER_CONFLICTING_DECLARATIONS
|
||||||
|
ALTER TABLE t1 CONVERT TO CHARACTER SET latin1, CHARACTER SET utf8;
|
||||||
|
--error ER_CONFLICTING_DECLARATIONS
|
||||||
|
ALTER TABLE t1 CONVERT TO CHARACTER SET latin1, CHARACTER SET DEFAULT;
|
||||||
|
--error ER_CONFLICTING_DECLARATIONS
|
||||||
|
ALTER TABLE t1 CONVERT TO CHARACTER SET DEFAULT, CHARACTER SET utf8;
|
||||||
|
--error ER_CONFLICTING_DECLARATIONS
|
||||||
|
ALTER TABLE t1 CONVERT TO CHARACTER SET DEFAULT, CHARACTER SET latin1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.0 tests
|
||||||
|
--echo #
|
||||||
|
@ -6296,3 +6296,22 @@ fl_create_iterator(enum handler_iterator_type type,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /*TRANS_LOG_MGM_EXAMPLE_CODE*/
|
#endif /*TRANS_LOG_MGM_EXAMPLE_CODE*/
|
||||||
|
|
||||||
|
|
||||||
|
bool HA_CREATE_INFO::check_conflicting_charset_declarations(CHARSET_INFO *cs)
|
||||||
|
{
|
||||||
|
if ((used_fields & HA_CREATE_USED_DEFAULT_CHARSET) &&
|
||||||
|
/* DEFAULT vs explicit, or explicit vs DEFAULT */
|
||||||
|
(((default_table_charset == NULL) != (cs == NULL)) ||
|
||||||
|
/* Two different explicit character sets */
|
||||||
|
(default_table_charset && cs &&
|
||||||
|
!my_charset_same(default_table_charset, cs))))
|
||||||
|
{
|
||||||
|
my_error(ER_CONFLICTING_DECLARATIONS, MYF(0),
|
||||||
|
"CHARACTER SET ", default_table_charset ?
|
||||||
|
default_table_charset->csname : "DEFAULT",
|
||||||
|
"CHARACTER SET ", cs ? cs->csname : "DEFAULT");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@ -1637,6 +1637,33 @@ struct HA_CREATE_INFO
|
|||||||
bool table_was_deleted;
|
bool table_was_deleted;
|
||||||
|
|
||||||
bool tmp_table() { return options & HA_LEX_CREATE_TMP_TABLE; }
|
bool tmp_table() { return options & HA_LEX_CREATE_TMP_TABLE; }
|
||||||
|
bool check_conflicting_charset_declarations(CHARSET_INFO *cs);
|
||||||
|
bool add_table_option_default_charset(CHARSET_INFO *cs)
|
||||||
|
{
|
||||||
|
// cs can be NULL, e.g.: CREATE TABLE t1 (..) CHARACTER SET DEFAULT;
|
||||||
|
if (check_conflicting_charset_declarations(cs))
|
||||||
|
return true;
|
||||||
|
default_table_charset= cs;
|
||||||
|
used_fields|= HA_CREATE_USED_DEFAULT_CHARSET;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
bool add_alter_list_item_convert_to_charset(CHARSET_INFO *cs)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
cs cannot be NULL, as sql_yacc.yy translates
|
||||||
|
CONVERT TO CHARACTER SET DEFAULT
|
||||||
|
to
|
||||||
|
CONVERT TO CHARACTER SET <character-set-of-the-current-database>
|
||||||
|
TODO: Should't we postpone resolution of DEFAULT until the
|
||||||
|
character set of the table owner database is loaded from its db.opt?
|
||||||
|
*/
|
||||||
|
DBUG_ASSERT(cs);
|
||||||
|
if (check_conflicting_charset_declarations(cs))
|
||||||
|
return true;
|
||||||
|
table_charset= default_table_charset= cs;
|
||||||
|
used_fields|= (HA_CREATE_USED_CHARSET | HA_CREATE_USED_DEFAULT_CHARSET);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -5803,18 +5803,8 @@ create_table_option:
|
|||||||
default_charset:
|
default_charset:
|
||||||
opt_default charset opt_equal charset_name_or_default
|
opt_default charset opt_equal charset_name_or_default
|
||||||
{
|
{
|
||||||
HA_CREATE_INFO *cinfo= &Lex->create_info;
|
if (Lex->create_info.add_table_option_default_charset($4))
|
||||||
if ((cinfo->used_fields & HA_CREATE_USED_DEFAULT_CHARSET) &&
|
|
||||||
cinfo->default_table_charset && $4 &&
|
|
||||||
!my_charset_same(cinfo->default_table_charset,$4))
|
|
||||||
{
|
|
||||||
my_error(ER_CONFLICTING_DECLARATIONS, MYF(0),
|
|
||||||
"CHARACTER SET ", cinfo->default_table_charset->csname,
|
|
||||||
"CHARACTER SET ", $4->csname);
|
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
}
|
|
||||||
Lex->create_info.default_table_charset= $4;
|
|
||||||
Lex->create_info.used_fields|= HA_CREATE_USED_DEFAULT_CHARSET;
|
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -7646,10 +7636,8 @@ alter_list_item:
|
|||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
}
|
}
|
||||||
LEX *lex= Lex;
|
LEX *lex= Lex;
|
||||||
lex->create_info.table_charset=
|
if (lex->create_info.add_alter_list_item_convert_to_charset($5))
|
||||||
lex->create_info.default_table_charset= $5;
|
MYSQL_YYABORT;
|
||||||
lex->create_info.used_fields|= (HA_CREATE_USED_CHARSET |
|
|
||||||
HA_CREATE_USED_DEFAULT_CHARSET);
|
|
||||||
lex->alter_info.flags|= Alter_info::ALTER_CONVERT;
|
lex->alter_info.flags|= Alter_info::ALTER_CONVERT;
|
||||||
}
|
}
|
||||||
| create_table_options_space_separated
|
| create_table_options_space_separated
|
||||||
|
Loading…
x
Reference in New Issue
Block a user