← Back to team overview

maria-developers team mailing list archive

Please review a patch for MDEV-19284 and MDEV-19285 (instant ALTER)

 

Hi Marko and Eugene,

please review a patch fixing:

- MDEV-19284 INSTANT ALTER with ucs2-to-utf16 conversion produces bad data
- MDEV-19285 INSTANT ALTER from ascii_general_ci to latin1_general_ci produces currupt data


Thanks!
commit 8ac8df9685bb0ee591602e4ca76a45725fa364de
Author: Alexander Barkov <bar@xxxxxxxxxxx>
Date:   Fri Apr 19 13:32:21 2019 +0400

    A joint patch for MDEV-19284 and MDEV-19285 (INSTANT ALTER)
    
    This patch fixes:
    
    - MDEV-19284 INSTANT ALTER with ucs2-to-utf16 conversion produces bad data
    - MDEV-19285 INSTANT ALTER from ascii_general_ci to latin1_general_ci produces currupt data
    
    1. Cleanup: Adding a helper method
       Field_longstr::csinfo_change_allows_instant_alter(),
       to remove some duplicate code in field.cc.
    
    2. Cleanup: removing Type_handler::Charsets_are_compatible() and static
       function charsets_are_compatible() and
       introducing new methods in the recently added class Charset instead:
       - encoding_allows_reinterpret_as()
       - encoding_and_order_allow_reinterpret_as()
    
    3. Buf fix: Removing the code that allowed instant conversion for
       ascii-to->8bit and ucs2-to->utf16.
       This actuallt fixes MDEV-19284 and MDEV-19285.
    
    4. Bug fix: Adding a helper method Charset::collation_specific_name().
       The old correspoding code in Type_handler::Charsets_are_compatible()
       was not safe against (badly named) used-definer collations whose
       character set name can be longer than collation name.

diff --git a/mysql-test/suite/innodb/r/instant_alter_charset.result b/mysql-test/suite/innodb/r/instant_alter_charset.result
index 6242b167412..3bf51de06ab 100644
--- a/mysql-test/suite/innodb/r/instant_alter_charset.result
+++ b/mysql-test/suite/innodb/r/instant_alter_charset.result
@@ -21,6 +21,10 @@ algorithm=inplace;
 alter table rebuild
 change a a varchar(150) charset latin1 not null default 'asdf',
 algorithm=inplace;
+ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+alter table rebuild
+change a a varchar(150) charset latin1 not null default 'asdf',
+algorithm=copy;
 select name, prtype, len from information_schema.innodb_sys_columns
 where table_id = @id;
 name	prtype	len
@@ -40,7 +44,7 @@ e mediumtext charset ascii,
 f longtext charset ascii
 ) engine=innodb;
 alter table supported_types
-convert to charset latin1,
+convert to charset ascii collate ascii_bin,
 algorithm=instant;
 drop table supported_types;
 create table various_cases (
@@ -49,7 +53,7 @@ b varchar(150) as (a) virtual,
 c varchar(150) as (a) persistent
 ) engine=innodb;
 alter table various_cases
-change a a char(150) charset latin1,
+change a a char(150) charset ascii collate ascii_bin,
 algorithm=inplace;
 alter table various_cases
 change a a varchar(222),
@@ -75,7 +79,7 @@ d longtext charset ascii,
 footer int
 ) engine=innodb;
 alter table all_texts
-convert to charset latin1 collate latin1_general_ci,
+convert to charset ascii collate ascii_bin,
 algorithm=instant;
 drop table all_texts;
 create table all_binaries (
@@ -217,6 +221,11 @@ alter table latin1_swedish_special_case
 modify instant1 varchar(150) charset latin1 collate latin1_swedish_ci,
 modify instant2 char(150) charset latin1 collate latin1_swedish_ci,
 algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+alter table latin1_swedish_special_case
+modify instant1 varchar(150) charset latin1 collate latin1_swedish_ci,
+modify instant2 char(150) charset latin1 collate latin1_swedish_ci,
+algorithm=copy;
 select c.name, c.prtype, c.mtype, c.len from information_schema.innodb_sys_columns as c inner join information_schema.innodb_sys_tables t on c.table_id = t.table_id
 where t.name = 'test/latin1_swedish_special_case';
 name	prtype	mtype	len
@@ -251,6 +260,10 @@ c varchar(300) charset ascii
 alter table boundary_255
 modify a varchar(50) charset utf8mb3,
 algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+alter table boundary_255
+modify a varchar(50) charset utf8mb3,
+algorithm=copy;
 alter table boundary_255
 modify b varchar(200) charset utf8mb3,
 algorithm=instant;
@@ -258,6 +271,7 @@ ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column ty
 alter table boundary_255
 modify c varchar(300) charset utf8mb3,
 algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table boundary_255;
 create table fully_compatible (
 id int auto_increment unique key,
@@ -299,28 +313,7 @@ insert into fully_compatible (from_charset, from_collate, to_charset, to_collate
 ('utf8mb3', 'utf8mb3_general_nopad_ci',     'utf8mb4', 'utf8mb4_general_nopad_ci'),
 ('utf8mb3', 'utf8mb3_nopad_bin',            'utf8mb4', 'utf8mb4_nopad_bin'),
 ('utf8mb3', 'utf8mb3_unicode_nopad_ci',     'utf8mb4', 'utf8mb4_unicode_nopad_ci'),
-('utf8mb3', 'utf8mb3_unicode_520_nopad_ci', 'utf8mb4', 'utf8mb4_unicode_520_nopad_ci'),
-('ucs2',    'ucs2_general_ci',       'utf16',   'utf16_general_ci'),
-('ucs2',    'ucs2_unicode_ci',       'utf16',   'utf16_unicode_ci'),
-('ucs2',    'ucs2_icelandic_ci',     'utf16',   'utf16_icelandic_ci'),
-('ucs2',    'ucs2_latvian_ci',       'utf16',   'utf16_latvian_ci'),
-('ucs2',    'ucs2_romanian_ci',      'utf16',   'utf16_romanian_ci'),
-('ucs2',    'ucs2_slovenian_ci',     'utf16',   'utf16_slovenian_ci'),
-('ucs2',    'ucs2_polish_ci',        'utf16',   'utf16_polish_ci'),
-('ucs2',    'ucs2_estonian_ci',      'utf16',   'utf16_estonian_ci'),
-('ucs2',    'ucs2_spanish_ci',       'utf16',   'utf16_spanish_ci'),
-('ucs2',    'ucs2_general_ci',       'utf16',   'utf16_general_ci'),
-('ascii', 'ascii_general_ci',       'utf8mb3', 'utf8mb3_general_ci'),
-('ascii', 'ascii_general_ci',       'utf8mb4', 'utf8mb4_general_ci'),
-('ascii', 'ascii_general_ci',       'latin1', 'latin1_general_ci'),
-('ascii', 'ascii_bin',              'latin1', 'latin1_bin'),
-('ascii', 'ascii_nopad_bin',        'latin1', 'latin1_nopad_bin'),
-('ascii', 'ascii_general_ci',       'latin2', 'latin2_general_ci'),
-('ascii', 'ascii_general_ci',       'latin7', 'latin7_general_ci'),
-('ascii', 'ascii_bin',              'koi8u',  'koi8u_bin'),
-('ascii', 'ascii_bin',              'ujis',   'ujis_bin'),
-('ascii', 'ascii_bin',              'big5',   'big5_bin'),
-('ascii', 'ascii_bin',              'gbk',    'gbk_bin')
+('utf8mb3', 'utf8mb3_unicode_520_nopad_ci', 'utf8mb4', 'utf8mb4_unicode_520_nopad_ci')
 ;
 create table tmp (
 a varchar(50) charset utf8mb3 collate utf8mb3_general_ci,
@@ -751,288 +744,234 @@ check table tmp;
 Table	Op	Msg_type	Msg_text
 test.tmp	check	status	OK
 drop table tmp;
+drop table fully_compatible;
+create table compatible_without_index (
+id int auto_increment unique key,
+from_charset char(255),
+from_collate char(255),
+to_charset char(255),
+to_collate char(255)
+);
+insert into compatible_without_index (from_charset, from_collate, to_charset, to_collate) values
+('utf8mb3', 'utf8mb3_general_ci',       'utf8mb4', 'utf8mb4_vietnamese_ci'),
+('utf8mb3', 'utf8mb3_bin',              'utf8mb4', 'utf8mb4_vietnamese_ci'),
+('utf8mb3', 'utf8mb3_general_nopad_ci', 'utf8mb4', 'utf8mb4_vietnamese_ci'),
+('utf8mb3', 'utf8mb3_nopad_bin',        'utf8mb4', 'utf8mb4_vietnamese_ci'),
+('ascii',   'ascii_general_ci',      'ascii',   'ascii_bin'),
+('utf8mb3', 'utf8mb3_roman_ci',      'utf8mb3', 'utf8mb3_lithuanian_ci'),
+('utf8mb4', 'utf8mb4_thai_520_w2',   'utf8mb4', 'utf8mb4_persian_ci'),
+('utf8mb3', 'utf8mb3_myanmar_ci',    'utf8mb4', 'utf8mb4_german2_ci'),
+('utf8mb3', 'utf8mb3_general_ci',    'utf8mb3', 'utf8mb3_unicode_ci'),
+('latin1',  'latin1_general_cs',     'latin1',  'latin1_general_ci'),
+('utf16',   'utf16_general_ci',      'utf16',   'utf16_german2_ci')
+;
 create table tmp (
-a varchar(50) charset ucs2 collate ucs2_general_ci,
-b varchar(50) charset ucs2 collate ucs2_general_ci primary key
+a varchar(50) charset utf8mb3 collate utf8mb3_general_ci,
+b varchar(50) charset utf8mb3 collate utf8mb3_general_ci unique key,
+c varchar(50) charset utf8mb3 collate utf8mb3_general_ci primary key
 ) engine=innodb;
-insert into tmp values ('AAA', 'AAA'), ('bbb', 'bbb');
 alter table tmp
-change a a varchar(50) charset utf16 collate utf16_general_ci,
-modify b varchar(50) charset utf16 collate utf16_general_ci,
+change a a varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
 algorithm=instant;
-check table tmp;
-Table	Op	Msg_type	Msg_text
-test.tmp	check	status	OK
-drop table tmp;
-create table tmp (
-a varchar(50) charset ucs2 collate ucs2_unicode_ci,
-b varchar(50) charset ucs2 collate ucs2_unicode_ci primary key
-) engine=innodb;
-insert into tmp values ('AAA', 'AAA'), ('bbb', 'bbb');
 alter table tmp
-change a a varchar(50) charset utf16 collate utf16_unicode_ci,
-modify b varchar(50) charset utf16 collate utf16_unicode_ci,
+modify b varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
 algorithm=instant;
-check table tmp;
-Table	Op	Msg_type	Msg_text
-test.tmp	check	status	OK
-drop table tmp;
-create table tmp (
-a varchar(50) charset ucs2 collate ucs2_icelandic_ci,
-b varchar(50) charset ucs2 collate ucs2_icelandic_ci primary key
-) engine=innodb;
-insert into tmp values ('AAA', 'AAA'), ('bbb', 'bbb');
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-change a a varchar(50) charset utf16 collate utf16_icelandic_ci,
-modify b varchar(50) charset utf16 collate utf16_icelandic_ci,
+modify c varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
 algorithm=instant;
-check table tmp;
-Table	Op	Msg_type	Msg_text
-test.tmp	check	status	OK
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ucs2 collate ucs2_latvian_ci,
-b varchar(50) charset ucs2 collate ucs2_latvian_ci primary key
+a varchar(50) charset utf8mb3 collate utf8mb3_bin,
+b varchar(50) charset utf8mb3 collate utf8mb3_bin unique key,
+c varchar(50) charset utf8mb3 collate utf8mb3_bin primary key
 ) engine=innodb;
-insert into tmp values ('AAA', 'AAA'), ('bbb', 'bbb');
 alter table tmp
-change a a varchar(50) charset utf16 collate utf16_latvian_ci,
-modify b varchar(50) charset utf16 collate utf16_latvian_ci,
+change a a varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
 algorithm=instant;
-check table tmp;
-Table	Op	Msg_type	Msg_text
-test.tmp	check	status	OK
-drop table tmp;
-create table tmp (
-a varchar(50) charset ucs2 collate ucs2_romanian_ci,
-b varchar(50) charset ucs2 collate ucs2_romanian_ci primary key
-) engine=innodb;
-insert into tmp values ('AAA', 'AAA'), ('bbb', 'bbb');
 alter table tmp
-change a a varchar(50) charset utf16 collate utf16_romanian_ci,
-modify b varchar(50) charset utf16 collate utf16_romanian_ci,
+modify b varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
 algorithm=instant;
-check table tmp;
-Table	Op	Msg_type	Msg_text
-test.tmp	check	status	OK
-drop table tmp;
-create table tmp (
-a varchar(50) charset ucs2 collate ucs2_slovenian_ci,
-b varchar(50) charset ucs2 collate ucs2_slovenian_ci primary key
-) engine=innodb;
-insert into tmp values ('AAA', 'AAA'), ('bbb', 'bbb');
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-change a a varchar(50) charset utf16 collate utf16_slovenian_ci,
-modify b varchar(50) charset utf16 collate utf16_slovenian_ci,
+modify c varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
 algorithm=instant;
-check table tmp;
-Table	Op	Msg_type	Msg_text
-test.tmp	check	status	OK
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ucs2 collate ucs2_polish_ci,
-b varchar(50) charset ucs2 collate ucs2_polish_ci primary key
+a varchar(50) charset utf8mb3 collate utf8mb3_general_nopad_ci,
+b varchar(50) charset utf8mb3 collate utf8mb3_general_nopad_ci unique key,
+c varchar(50) charset utf8mb3 collate utf8mb3_general_nopad_ci primary key
 ) engine=innodb;
-insert into tmp values ('AAA', 'AAA'), ('bbb', 'bbb');
 alter table tmp
-change a a varchar(50) charset utf16 collate utf16_polish_ci,
-modify b varchar(50) charset utf16 collate utf16_polish_ci,
+change a a varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
 algorithm=instant;
-check table tmp;
-Table	Op	Msg_type	Msg_text
-test.tmp	check	status	OK
-drop table tmp;
-create table tmp (
-a varchar(50) charset ucs2 collate ucs2_estonian_ci,
-b varchar(50) charset ucs2 collate ucs2_estonian_ci primary key
-) engine=innodb;
-insert into tmp values ('AAA', 'AAA'), ('bbb', 'bbb');
 alter table tmp
-change a a varchar(50) charset utf16 collate utf16_estonian_ci,
-modify b varchar(50) charset utf16 collate utf16_estonian_ci,
+modify b varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
 algorithm=instant;
-check table tmp;
-Table	Op	Msg_type	Msg_text
-test.tmp	check	status	OK
-drop table tmp;
-create table tmp (
-a varchar(50) charset ucs2 collate ucs2_spanish_ci,
-b varchar(50) charset ucs2 collate ucs2_spanish_ci primary key
-) engine=innodb;
-insert into tmp values ('AAA', 'AAA'), ('bbb', 'bbb');
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-change a a varchar(50) charset utf16 collate utf16_spanish_ci,
-modify b varchar(50) charset utf16 collate utf16_spanish_ci,
+modify c varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
 algorithm=instant;
-check table tmp;
-Table	Op	Msg_type	Msg_text
-test.tmp	check	status	OK
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ucs2 collate ucs2_general_ci,
-b varchar(50) charset ucs2 collate ucs2_general_ci primary key
+a varchar(50) charset utf8mb3 collate utf8mb3_nopad_bin,
+b varchar(50) charset utf8mb3 collate utf8mb3_nopad_bin unique key,
+c varchar(50) charset utf8mb3 collate utf8mb3_nopad_bin primary key
 ) engine=innodb;
-insert into tmp values ('AAA', 'AAA'), ('bbb', 'bbb');
 alter table tmp
-change a a varchar(50) charset utf16 collate utf16_general_ci,
-modify b varchar(50) charset utf16 collate utf16_general_ci,
+change a a varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
+algorithm=instant;
+alter table tmp
+modify b varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
 algorithm=instant;
-check table tmp;
-Table	Op	Msg_type	Msg_text
-test.tmp	check	status	OK
-drop table tmp;
-create table tmp (
-a varchar(50) charset ascii collate ascii_general_ci,
-b varchar(50) charset ascii collate ascii_general_ci primary key
-) engine=innodb;
-insert into tmp values ('AAA', 'AAA'), ('bbb', 'bbb');
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-change a a varchar(50) charset utf8mb3 collate utf8mb3_general_ci,
-modify b varchar(50) charset utf8mb3 collate utf8mb3_general_ci,
+modify c varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
 algorithm=instant;
-check table tmp;
-Table	Op	Msg_type	Msg_text
-test.tmp	check	status	OK
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
 a varchar(50) charset ascii collate ascii_general_ci,
-b varchar(50) charset ascii collate ascii_general_ci primary key
+b varchar(50) charset ascii collate ascii_general_ci unique key,
+c varchar(50) charset ascii collate ascii_general_ci primary key
 ) engine=innodb;
-insert into tmp values ('AAA', 'AAA'), ('bbb', 'bbb');
 alter table tmp
-change a a varchar(50) charset utf8mb4 collate utf8mb4_general_ci,
-modify b varchar(50) charset utf8mb4 collate utf8mb4_general_ci,
+change a a varchar(50) charset ascii collate ascii_bin,
 algorithm=instant;
-check table tmp;
-Table	Op	Msg_type	Msg_text
-test.tmp	check	status	OK
-drop table tmp;
-create table tmp (
-a varchar(50) charset ascii collate ascii_general_ci,
-b varchar(50) charset ascii collate ascii_general_ci primary key
-) engine=innodb;
-insert into tmp values ('AAA', 'AAA'), ('bbb', 'bbb');
 alter table tmp
-change a a varchar(50) charset latin1 collate latin1_general_ci,
-modify b varchar(50) charset latin1 collate latin1_general_ci,
+modify b varchar(50) charset ascii collate ascii_bin,
 algorithm=instant;
-check table tmp;
-Table	Op	Msg_type	Msg_text
-test.tmp	check	status	OK
-drop table tmp;
-create table tmp (
-a varchar(50) charset ascii collate ascii_bin,
-b varchar(50) charset ascii collate ascii_bin primary key
-) engine=innodb;
-insert into tmp values ('AAA', 'AAA'), ('bbb', 'bbb');
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-change a a varchar(50) charset latin1 collate latin1_bin,
-modify b varchar(50) charset latin1 collate latin1_bin,
+modify c varchar(50) charset ascii collate ascii_bin,
 algorithm=instant;
-check table tmp;
-Table	Op	Msg_type	Msg_text
-test.tmp	check	status	OK
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_nopad_bin,
-b varchar(50) charset ascii collate ascii_nopad_bin primary key
+a varchar(50) charset utf8mb3 collate utf8mb3_roman_ci,
+b varchar(50) charset utf8mb3 collate utf8mb3_roman_ci unique key,
+c varchar(50) charset utf8mb3 collate utf8mb3_roman_ci primary key
 ) engine=innodb;
-insert into tmp values ('AAA', 'AAA'), ('bbb', 'bbb');
 alter table tmp
-change a a varchar(50) charset latin1 collate latin1_nopad_bin,
-modify b varchar(50) charset latin1 collate latin1_nopad_bin,
+change a a varchar(50) charset utf8mb3 collate utf8mb3_lithuanian_ci,
 algorithm=instant;
-check table tmp;
-Table	Op	Msg_type	Msg_text
-test.tmp	check	status	OK
-drop table tmp;
-create table tmp (
-a varchar(50) charset ascii collate ascii_general_ci,
-b varchar(50) charset ascii collate ascii_general_ci primary key
-) engine=innodb;
-insert into tmp values ('AAA', 'AAA'), ('bbb', 'bbb');
 alter table tmp
-change a a varchar(50) charset latin2 collate latin2_general_ci,
-modify b varchar(50) charset latin2 collate latin2_general_ci,
+modify b varchar(50) charset utf8mb3 collate utf8mb3_lithuanian_ci,
 algorithm=instant;
-check table tmp;
-Table	Op	Msg_type	Msg_text
-test.tmp	check	status	OK
-drop table tmp;
-create table tmp (
-a varchar(50) charset ascii collate ascii_general_ci,
-b varchar(50) charset ascii collate ascii_general_ci primary key
-) engine=innodb;
-insert into tmp values ('AAA', 'AAA'), ('bbb', 'bbb');
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-change a a varchar(50) charset latin7 collate latin7_general_ci,
-modify b varchar(50) charset latin7 collate latin7_general_ci,
+modify c varchar(50) charset utf8mb3 collate utf8mb3_lithuanian_ci,
 algorithm=instant;
-check table tmp;
-Table	Op	Msg_type	Msg_text
-test.tmp	check	status	OK
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_bin,
-b varchar(50) charset ascii collate ascii_bin primary key
+a varchar(50) charset utf8mb4 collate utf8mb4_thai_520_w2,
+b varchar(50) charset utf8mb4 collate utf8mb4_thai_520_w2 unique key,
+c varchar(50) charset utf8mb4 collate utf8mb4_thai_520_w2 primary key
 ) engine=innodb;
-insert into tmp values ('AAA', 'AAA'), ('bbb', 'bbb');
 alter table tmp
-change a a varchar(50) charset koi8u collate koi8u_bin,
-modify b varchar(50) charset koi8u collate koi8u_bin,
+change a a varchar(50) charset utf8mb4 collate utf8mb4_persian_ci,
+algorithm=instant;
+alter table tmp
+modify b varchar(50) charset utf8mb4 collate utf8mb4_persian_ci,
 algorithm=instant;
-check table tmp;
-Table	Op	Msg_type	Msg_text
-test.tmp	check	status	OK
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+alter table tmp
+modify c varchar(50) charset utf8mb4 collate utf8mb4_persian_ci,
+algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_bin,
-b varchar(50) charset ascii collate ascii_bin primary key
+a varchar(50) charset utf8mb3 collate utf8mb3_myanmar_ci,
+b varchar(50) charset utf8mb3 collate utf8mb3_myanmar_ci unique key,
+c varchar(50) charset utf8mb3 collate utf8mb3_myanmar_ci primary key
 ) engine=innodb;
-insert into tmp values ('AAA', 'AAA'), ('bbb', 'bbb');
 alter table tmp
-change a a varchar(50) charset ujis collate ujis_bin,
-modify b varchar(50) charset ujis collate ujis_bin,
+change a a varchar(50) charset utf8mb4 collate utf8mb4_german2_ci,
+algorithm=instant;
+alter table tmp
+modify b varchar(50) charset utf8mb4 collate utf8mb4_german2_ci,
 algorithm=instant;
-check table tmp;
-Table	Op	Msg_type	Msg_text
-test.tmp	check	status	OK
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+alter table tmp
+modify c varchar(50) charset utf8mb4 collate utf8mb4_german2_ci,
+algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_bin,
-b varchar(50) charset ascii collate ascii_bin primary key
+a varchar(50) charset utf8mb3 collate utf8mb3_general_ci,
+b varchar(50) charset utf8mb3 collate utf8mb3_general_ci unique key,
+c varchar(50) charset utf8mb3 collate utf8mb3_general_ci primary key
 ) engine=innodb;
-insert into tmp values ('AAA', 'AAA'), ('bbb', 'bbb');
 alter table tmp
-change a a varchar(50) charset big5 collate big5_bin,
-modify b varchar(50) charset big5 collate big5_bin,
+change a a varchar(50) charset utf8mb3 collate utf8mb3_unicode_ci,
+algorithm=instant;
+alter table tmp
+modify b varchar(50) charset utf8mb3 collate utf8mb3_unicode_ci,
 algorithm=instant;
-check table tmp;
-Table	Op	Msg_type	Msg_text
-test.tmp	check	status	OK
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+alter table tmp
+modify c varchar(50) charset utf8mb3 collate utf8mb3_unicode_ci,
+algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_bin,
-b varchar(50) charset ascii collate ascii_bin primary key
+a varchar(50) charset latin1 collate latin1_general_cs,
+b varchar(50) charset latin1 collate latin1_general_cs unique key,
+c varchar(50) charset latin1 collate latin1_general_cs primary key
 ) engine=innodb;
-insert into tmp values ('AAA', 'AAA'), ('bbb', 'bbb');
 alter table tmp
-change a a varchar(50) charset gbk collate gbk_bin,
-modify b varchar(50) charset gbk collate gbk_bin,
+change a a varchar(50) charset latin1 collate latin1_general_ci,
 algorithm=instant;
-check table tmp;
-Table	Op	Msg_type	Msg_text
-test.tmp	check	status	OK
+alter table tmp
+modify b varchar(50) charset latin1 collate latin1_general_ci,
+algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+alter table tmp
+modify c varchar(50) charset latin1 collate latin1_general_ci,
+algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
-drop table fully_compatible;
-create table compatible_without_index (
+create table tmp (
+a varchar(50) charset utf16 collate utf16_general_ci,
+b varchar(50) charset utf16 collate utf16_general_ci unique key,
+c varchar(50) charset utf16 collate utf16_general_ci primary key
+) engine=innodb;
+alter table tmp
+change a a varchar(50) charset utf16 collate utf16_german2_ci,
+algorithm=instant;
+alter table tmp
+modify b varchar(50) charset utf16 collate utf16_german2_ci,
+algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+alter table tmp
+modify c varchar(50) charset utf16 collate utf16_german2_ci,
+algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+drop table tmp;
+drop table compatible_without_index;
+create table fully_incompatible (
 id int auto_increment unique key,
 from_charset char(255),
 from_collate char(255),
 to_charset char(255),
 to_collate char(255)
 );
-insert into compatible_without_index (from_charset, from_collate, to_charset, to_collate) values
+insert into fully_incompatible (from_charset, from_collate, to_charset, to_collate) values
+('ascii', 'ascii_general_ci',       'utf8mb3', 'utf8mb3_general_ci'),
+('ascii', 'ascii_general_ci',       'utf8mb4', 'utf8mb4_general_ci'),
+('ascii', 'ascii_general_ci',       'latin1', 'latin1_general_ci'),
+('ascii', 'ascii_bin',              'latin1', 'latin1_bin'),
+('ascii', 'ascii_nopad_bin',        'latin1', 'latin1_nopad_bin'),
+('ascii', 'ascii_general_ci',       'latin2', 'latin2_general_ci'),
+('ascii', 'ascii_general_ci',       'latin7', 'latin7_general_ci'),
+('ascii', 'ascii_bin',              'koi8u',  'koi8u_bin'),
+('ascii', 'ascii_bin',              'ujis',   'ujis_bin'),
+('ascii', 'ascii_bin',              'big5',   'big5_bin'),
+('ascii', 'ascii_bin',              'gbk',    'gbk_bin'),
 ('ascii', 'ascii_general_ci',       'utf8mb3', 'utf8mb3_swedish_ci'),
 ('ascii', 'ascii_bin',              'latin1', 'latin1_swedish_ci'),
 ('ascii', 'ascii_general_nopad_ci', 'latin1', 'latin1_swedish_ci'),
@@ -1048,641 +987,665 @@ insert into compatible_without_index (from_charset, from_collate, to_charset, to
 ('ascii', 'ascii_bin',              'utf8mb4', 'utf8mb4_danish_ci'),
 ('ascii', 'ascii_general_nopad_ci', 'utf8mb4', 'utf8mb4_danish_ci'),
 ('ascii', 'ascii_nopad_bin',        'utf8mb4', 'utf8mb4_danish_ci'),
-('utf8mb3', 'utf8mb3_general_ci',       'utf8mb4', 'utf8mb4_vietnamese_ci'),
-('utf8mb3', 'utf8mb3_bin',              'utf8mb4', 'utf8mb4_vietnamese_ci'),
-('utf8mb3', 'utf8mb3_general_nopad_ci', 'utf8mb4', 'utf8mb4_vietnamese_ci'),
-('utf8mb3', 'utf8mb3_nopad_bin',        'utf8mb4', 'utf8mb4_vietnamese_ci'),
-('ascii',  'ascii_general_ci',     'gbk',  'gbk_chinese_ci'),
-('ascii',  'ascii_general_ci',     'gbk',  'gbk_chinese_nopad_ci'),
+('ascii', 'ascii_general_ci',     'gbk',  'gbk_chinese_ci'),
+('ascii', 'ascii_general_ci',     'gbk',  'gbk_chinese_nopad_ci'),
+('ascii', 'ascii_general_ci',      'ujis',    'ujis_japanese_ci'),
+('ascii', 'ascii_general_ci',      'big5',    'big5_chinese_ci'),
+('ascii', 'ascii_general_ci',      'latin2',  'latin2_croatian_ci'),
+('ascii', 'ascii_general_ci',      'latin7',  'latin7_estonian_cs'),
+('ucs2',  'ucs2_general_ci',       'utf16',   'utf16_general_ci'),
+('ucs2',  'ucs2_unicode_ci',       'utf16',   'utf16_unicode_ci'),
+('ucs2',  'ucs2_icelandic_ci',     'utf16',   'utf16_icelandic_ci'),
+('ucs2',  'ucs2_latvian_ci',       'utf16',   'utf16_latvian_ci'),
+('ucs2',  'ucs2_romanian_ci',      'utf16',   'utf16_romanian_ci'),
+('ucs2',  'ucs2_slovenian_ci',     'utf16',   'utf16_slovenian_ci'),
+('ucs2',  'ucs2_polish_ci',        'utf16',   'utf16_polish_ci'),
+('ucs2',  'ucs2_estonian_ci',      'utf16',   'utf16_estonian_ci'),
+('ucs2',  'ucs2_spanish_ci',       'utf16',   'utf16_spanish_ci'),
+('ucs2',  'ucs2_general_ci',       'utf16',   'utf16_general_ci'),
 ('ucs2',  'ucs2_myanmar_ci',          'utf16', 'utf16_thai_520_w2'),
 ('ucs2',  'ucs2_general_ci',          'utf16', 'utf16_unicode_nopad_ci'),
 ('ucs2',  'ucs2_general_mysql500_ci', 'utf16', 'utf16_spanish2_ci'),
-('ascii',   'ascii_general_ci',      'ascii',   'ascii_bin'),
-('utf8mb3', 'utf8mb3_roman_ci',      'utf8mb3', 'utf8mb3_lithuanian_ci'),
-('utf8mb4', 'utf8mb4_thai_520_w2',   'utf8mb4', 'utf8mb4_persian_ci'),
-('utf8mb3', 'utf8mb3_myanmar_ci',    'utf8mb4', 'utf8mb4_german2_ci'),
-('utf8mb3', 'utf8mb3_general_ci',    'utf8mb3', 'utf8mb3_unicode_ci'),
-('latin1',  'latin1_general_cs',     'latin1',  'latin1_general_ci'),
-('ascii',   'ascii_general_ci',      'ujis',    'ujis_japanese_ci'),
-('ascii',   'ascii_general_ci',      'big5',    'big5_chinese_ci'),
-('ascii',   'ascii_general_ci',      'latin2',  'latin2_croatian_ci'),
-('ascii',   'ascii_general_ci',      'latin7',  'latin7_estonian_cs'),
-('utf16',   'utf16_general_ci',      'utf16',   'utf16_german2_ci')
+('utf8mb4', 'utf8mb4_general_ci', 'utf8mb3', 'utf8mb3_general_ci'),
+('utf8mb4', 'utf8mb4_general_ci', 'ascii', 'ascii_general_ci'),
+('utf8mb3', 'utf8mb3_general_ci', 'ascii', 'ascii_general_ci'),
+('utf8mb3', 'utf8mb3_general_ci', 'latin1', 'latin1_general_ci'),
+('utf16', 'utf16_general_ci', 'utf32', 'utf32_general_ci'),
+('latin1', 'latin1_general_ci',   'ascii', 'ascii_general_ci'),
+('ascii', 'ascii_general_ci',     'swe7', 'swe7_swedish_ci'),
+('eucjpms', 'eucjpms_japanese_nopad_ci', 'geostd8', 'geostd8_general_ci'),
+('latin1', 'latin1_general_ci',   'utf16', 'utf16_general_ci')
 ;
 create table tmp (
-a varchar(50) charset ascii collate ascii_general_ci,
-b varchar(50) charset ascii collate ascii_general_ci unique key,
-c varchar(50) charset ascii collate ascii_general_ci primary key
+a varchar(150) charset ascii collate ascii_general_ci,
+b text(150) charset ascii collate ascii_general_ci,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset utf8mb3 collate utf8mb3_swedish_ci,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset utf8mb3 collate utf8mb3_swedish_ci,
+change a a varchar(150) charset utf8mb3 collate utf8mb3_general_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset utf8mb3 collate utf8mb3_swedish_ci,
+modify b text charset utf8mb3 collate utf8mb3_general_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_bin,
-b varchar(50) charset ascii collate ascii_bin unique key,
-c varchar(50) charset ascii collate ascii_bin primary key
+a varchar(150) charset ascii collate ascii_general_ci,
+b text(150) charset ascii collate ascii_general_ci,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset latin1 collate latin1_swedish_ci,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset latin1 collate latin1_swedish_ci,
+change a a varchar(150) charset utf8mb4 collate utf8mb4_general_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset latin1 collate latin1_swedish_ci,
+modify b text charset utf8mb4 collate utf8mb4_general_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_general_nopad_ci,
-b varchar(50) charset ascii collate ascii_general_nopad_ci unique key,
-c varchar(50) charset ascii collate ascii_general_nopad_ci primary key
+a varchar(150) charset ascii collate ascii_general_ci,
+b text(150) charset ascii collate ascii_general_ci,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset latin1 collate latin1_swedish_ci,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset latin1 collate latin1_swedish_ci,
+change a a varchar(150) charset latin1 collate latin1_general_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset latin1 collate latin1_swedish_ci,
+modify b text charset latin1 collate latin1_general_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_nopad_bin,
-b varchar(50) charset ascii collate ascii_nopad_bin unique key,
-c varchar(50) charset ascii collate ascii_nopad_bin primary key
+a varchar(150) charset ascii collate ascii_bin,
+b text(150) charset ascii collate ascii_bin,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset latin1 collate latin1_swedish_ci,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset latin1 collate latin1_swedish_ci,
+change a a varchar(150) charset latin1 collate latin1_bin,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset latin1 collate latin1_swedish_ci,
+modify b text charset latin1 collate latin1_bin,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_general_ci,
-b varchar(50) charset ascii collate ascii_general_ci unique key,
-c varchar(50) charset ascii collate ascii_general_ci primary key
+a varchar(150) charset ascii collate ascii_nopad_bin,
+b text(150) charset ascii collate ascii_nopad_bin,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset koi8u collate koi8u_bin,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset koi8u collate koi8u_bin,
+change a a varchar(150) charset latin1 collate latin1_nopad_bin,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset koi8u collate koi8u_bin,
+modify b text charset latin1 collate latin1_nopad_bin,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_general_nopad_ci,
-b varchar(50) charset ascii collate ascii_general_nopad_ci unique key,
-c varchar(50) charset ascii collate ascii_general_nopad_ci primary key
+a varchar(150) charset ascii collate ascii_general_ci,
+b text(150) charset ascii collate ascii_general_ci,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset koi8u collate koi8u_bin,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset koi8u collate koi8u_bin,
+change a a varchar(150) charset latin2 collate latin2_general_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset koi8u collate koi8u_bin,
+modify b text charset latin2 collate latin2_general_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_nopad_bin,
-b varchar(50) charset ascii collate ascii_nopad_bin unique key,
-c varchar(50) charset ascii collate ascii_nopad_bin primary key
+a varchar(150) charset ascii collate ascii_general_ci,
+b text(150) charset ascii collate ascii_general_ci,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset koi8u collate koi8u_bin,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset koi8u collate koi8u_bin,
+change a a varchar(150) charset latin7 collate latin7_general_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset koi8u collate koi8u_bin,
+modify b text charset latin7 collate latin7_general_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_general_ci,
-b varchar(50) charset ascii collate ascii_general_ci unique key,
-c varchar(50) charset ascii collate ascii_general_ci primary key
+a varchar(150) charset ascii collate ascii_bin,
+b text(150) charset ascii collate ascii_bin,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset latin1 collate latin1_swedish_ci,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset latin1 collate latin1_swedish_ci,
+change a a varchar(150) charset koi8u collate koi8u_bin,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset latin1 collate latin1_swedish_ci,
+modify b text charset koi8u collate koi8u_bin,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_bin,
-b varchar(50) charset ascii collate ascii_bin unique key,
-c varchar(50) charset ascii collate ascii_bin primary key
+a varchar(150) charset ascii collate ascii_bin,
+b text(150) charset ascii collate ascii_bin,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset utf8mb3 collate utf8mb3_swedish_ci,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset utf8mb3 collate utf8mb3_swedish_ci,
+change a a varchar(150) charset ujis collate ujis_bin,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset utf8mb3 collate utf8mb3_swedish_ci,
+modify b text charset ujis collate ujis_bin,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_general_nopad_ci,
-b varchar(50) charset ascii collate ascii_general_nopad_ci unique key,
-c varchar(50) charset ascii collate ascii_general_nopad_ci primary key
+a varchar(150) charset ascii collate ascii_bin,
+b text(150) charset ascii collate ascii_bin,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset utf8mb3 collate utf8mb3_swedish_ci,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset utf8mb3 collate utf8mb3_swedish_ci,
+change a a varchar(150) charset big5 collate big5_bin,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset utf8mb3 collate utf8mb3_swedish_ci,
+modify b text charset big5 collate big5_bin,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_nopad_bin,
-b varchar(50) charset ascii collate ascii_nopad_bin unique key,
-c varchar(50) charset ascii collate ascii_nopad_bin primary key
+a varchar(150) charset ascii collate ascii_bin,
+b text(150) charset ascii collate ascii_bin,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset utf8mb3 collate utf8mb3_swedish_ci,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset utf8mb3 collate utf8mb3_swedish_ci,
+change a a varchar(150) charset gbk collate gbk_bin,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset utf8mb3 collate utf8mb3_swedish_ci,
+modify b text charset gbk collate gbk_bin,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_general_ci,
-b varchar(50) charset ascii collate ascii_general_ci unique key,
-c varchar(50) charset ascii collate ascii_general_ci primary key
+a varchar(150) charset ascii collate ascii_general_ci,
+b text(150) charset ascii collate ascii_general_ci,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset utf8mb4 collate utf8mb4_danish_ci,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset utf8mb4 collate utf8mb4_danish_ci,
+change a a varchar(150) charset utf8mb3 collate utf8mb3_swedish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset utf8mb4 collate utf8mb4_danish_ci,
+modify b text charset utf8mb3 collate utf8mb3_swedish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_bin,
-b varchar(50) charset ascii collate ascii_bin unique key,
-c varchar(50) charset ascii collate ascii_bin primary key
+a varchar(150) charset ascii collate ascii_bin,
+b text(150) charset ascii collate ascii_bin,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset utf8mb4 collate utf8mb4_danish_ci,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset utf8mb4 collate utf8mb4_danish_ci,
+change a a varchar(150) charset latin1 collate latin1_swedish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset utf8mb4 collate utf8mb4_danish_ci,
+modify b text charset latin1 collate latin1_swedish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_general_nopad_ci,
-b varchar(50) charset ascii collate ascii_general_nopad_ci unique key,
-c varchar(50) charset ascii collate ascii_general_nopad_ci primary key
+a varchar(150) charset ascii collate ascii_general_nopad_ci,
+b text(150) charset ascii collate ascii_general_nopad_ci,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset utf8mb4 collate utf8mb4_danish_ci,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset utf8mb4 collate utf8mb4_danish_ci,
+change a a varchar(150) charset latin1 collate latin1_swedish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset utf8mb4 collate utf8mb4_danish_ci,
+modify b text charset latin1 collate latin1_swedish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_nopad_bin,
-b varchar(50) charset ascii collate ascii_nopad_bin unique key,
-c varchar(50) charset ascii collate ascii_nopad_bin primary key
+a varchar(150) charset ascii collate ascii_nopad_bin,
+b text(150) charset ascii collate ascii_nopad_bin,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset utf8mb4 collate utf8mb4_danish_ci,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset utf8mb4 collate utf8mb4_danish_ci,
+change a a varchar(150) charset latin1 collate latin1_swedish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset utf8mb4 collate utf8mb4_danish_ci,
+modify b text charset latin1 collate latin1_swedish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset utf8mb3 collate utf8mb3_general_ci,
-b varchar(50) charset utf8mb3 collate utf8mb3_general_ci unique key,
-c varchar(50) charset utf8mb3 collate utf8mb3_general_ci primary key
+a varchar(150) charset ascii collate ascii_general_ci,
+b text(150) charset ascii collate ascii_general_ci,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
+change a a varchar(150) charset koi8u collate koi8u_bin,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
+modify b text charset koi8u collate koi8u_bin,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset utf8mb3 collate utf8mb3_bin,
-b varchar(50) charset utf8mb3 collate utf8mb3_bin unique key,
-c varchar(50) charset utf8mb3 collate utf8mb3_bin primary key
+a varchar(150) charset ascii collate ascii_general_nopad_ci,
+b text(150) charset ascii collate ascii_general_nopad_ci,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
+change a a varchar(150) charset koi8u collate koi8u_bin,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
+modify b text charset koi8u collate koi8u_bin,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset utf8mb3 collate utf8mb3_general_nopad_ci,
-b varchar(50) charset utf8mb3 collate utf8mb3_general_nopad_ci unique key,
-c varchar(50) charset utf8mb3 collate utf8mb3_general_nopad_ci primary key
+a varchar(150) charset ascii collate ascii_nopad_bin,
+b text(150) charset ascii collate ascii_nopad_bin,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
+change a a varchar(150) charset koi8u collate koi8u_bin,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
+modify b text charset koi8u collate koi8u_bin,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset utf8mb3 collate utf8mb3_nopad_bin,
-b varchar(50) charset utf8mb3 collate utf8mb3_nopad_bin unique key,
-c varchar(50) charset utf8mb3 collate utf8mb3_nopad_bin primary key
+a varchar(150) charset ascii collate ascii_general_ci,
+b text(150) charset ascii collate ascii_general_ci,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
+change a a varchar(150) charset latin1 collate latin1_swedish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset utf8mb4 collate utf8mb4_vietnamese_ci,
+modify b text charset latin1 collate latin1_swedish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_general_ci,
-b varchar(50) charset ascii collate ascii_general_ci unique key,
-c varchar(50) charset ascii collate ascii_general_ci primary key
+a varchar(150) charset ascii collate ascii_bin,
+b text(150) charset ascii collate ascii_bin,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset gbk collate gbk_chinese_ci,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset gbk collate gbk_chinese_ci,
+change a a varchar(150) charset utf8mb3 collate utf8mb3_swedish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset gbk collate gbk_chinese_ci,
+modify b text charset utf8mb3 collate utf8mb3_swedish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_general_ci,
-b varchar(50) charset ascii collate ascii_general_ci unique key,
-c varchar(50) charset ascii collate ascii_general_ci primary key
+a varchar(150) charset ascii collate ascii_general_nopad_ci,
+b text(150) charset ascii collate ascii_general_nopad_ci,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset gbk collate gbk_chinese_nopad_ci,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset gbk collate gbk_chinese_nopad_ci,
+change a a varchar(150) charset utf8mb3 collate utf8mb3_swedish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset gbk collate gbk_chinese_nopad_ci,
+modify b text charset utf8mb3 collate utf8mb3_swedish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ucs2 collate ucs2_myanmar_ci,
-b varchar(50) charset ucs2 collate ucs2_myanmar_ci unique key,
-c varchar(50) charset ucs2 collate ucs2_myanmar_ci primary key
+a varchar(150) charset ascii collate ascii_nopad_bin,
+b text(150) charset ascii collate ascii_nopad_bin,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset utf16 collate utf16_thai_520_w2,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset utf16 collate utf16_thai_520_w2,
+change a a varchar(150) charset utf8mb3 collate utf8mb3_swedish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset utf16 collate utf16_thai_520_w2,
+modify b text charset utf8mb3 collate utf8mb3_swedish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ucs2 collate ucs2_general_ci,
-b varchar(50) charset ucs2 collate ucs2_general_ci unique key,
-c varchar(50) charset ucs2 collate ucs2_general_ci primary key
+a varchar(150) charset ascii collate ascii_general_ci,
+b text(150) charset ascii collate ascii_general_ci,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset utf16 collate utf16_unicode_nopad_ci,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset utf16 collate utf16_unicode_nopad_ci,
+change a a varchar(150) charset utf8mb4 collate utf8mb4_danish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset utf16 collate utf16_unicode_nopad_ci,
+modify b text charset utf8mb4 collate utf8mb4_danish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ucs2 collate ucs2_general_mysql500_ci,
-b varchar(50) charset ucs2 collate ucs2_general_mysql500_ci unique key,
-c varchar(50) charset ucs2 collate ucs2_general_mysql500_ci primary key
+a varchar(150) charset ascii collate ascii_bin,
+b text(150) charset ascii collate ascii_bin,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset utf16 collate utf16_spanish2_ci,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset utf16 collate utf16_spanish2_ci,
+change a a varchar(150) charset utf8mb4 collate utf8mb4_danish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset utf16 collate utf16_spanish2_ci,
+modify b text charset utf8mb4 collate utf8mb4_danish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_general_ci,
-b varchar(50) charset ascii collate ascii_general_ci unique key,
-c varchar(50) charset ascii collate ascii_general_ci primary key
+a varchar(150) charset ascii collate ascii_general_nopad_ci,
+b text(150) charset ascii collate ascii_general_nopad_ci,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset ascii collate ascii_bin,
-algorithm=instant;
-alter table tmp
-modify b varchar(50) charset ascii collate ascii_bin,
+change a a varchar(150) charset utf8mb4 collate utf8mb4_danish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset ascii collate ascii_bin,
+modify b text charset utf8mb4 collate utf8mb4_danish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset utf8mb3 collate utf8mb3_roman_ci,
-b varchar(50) charset utf8mb3 collate utf8mb3_roman_ci unique key,
-c varchar(50) charset utf8mb3 collate utf8mb3_roman_ci primary key
+a varchar(150) charset ascii collate ascii_nopad_bin,
+b text(150) charset ascii collate ascii_nopad_bin,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset utf8mb3 collate utf8mb3_lithuanian_ci,
+change a a varchar(150) charset utf8mb4 collate utf8mb4_danish_ci,
 algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify b varchar(50) charset utf8mb3 collate utf8mb3_lithuanian_ci,
+modify b text charset utf8mb4 collate utf8mb4_danish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+drop table tmp;
+create table tmp (
+a varchar(150) charset ascii collate ascii_general_ci,
+b text(150) charset ascii collate ascii_general_ci,
+unique key b_idx (b(150))
+) engine=innodb;
 alter table tmp
-modify c varchar(50) charset utf8mb3 collate utf8mb3_lithuanian_ci,
+change a a varchar(150) charset gbk collate gbk_chinese_ci,
+algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+alter table tmp
+modify b text charset gbk collate gbk_chinese_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset utf8mb4 collate utf8mb4_thai_520_w2,
-b varchar(50) charset utf8mb4 collate utf8mb4_thai_520_w2 unique key,
-c varchar(50) charset utf8mb4 collate utf8mb4_thai_520_w2 primary key
+a varchar(150) charset ascii collate ascii_general_ci,
+b text(150) charset ascii collate ascii_general_ci,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset utf8mb4 collate utf8mb4_persian_ci,
+change a a varchar(150) charset gbk collate gbk_chinese_nopad_ci,
 algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify b varchar(50) charset utf8mb4 collate utf8mb4_persian_ci,
+modify b text charset gbk collate gbk_chinese_nopad_ci,
+algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+drop table tmp;
+create table tmp (
+a varchar(150) charset ascii collate ascii_general_ci,
+b text(150) charset ascii collate ascii_general_ci,
+unique key b_idx (b(150))
+) engine=innodb;
+alter table tmp
+change a a varchar(150) charset ujis collate ujis_japanese_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset utf8mb4 collate utf8mb4_persian_ci,
+modify b text charset ujis collate ujis_japanese_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset utf8mb3 collate utf8mb3_myanmar_ci,
-b varchar(50) charset utf8mb3 collate utf8mb3_myanmar_ci unique key,
-c varchar(50) charset utf8mb3 collate utf8mb3_myanmar_ci primary key
+a varchar(150) charset ascii collate ascii_general_ci,
+b text(150) charset ascii collate ascii_general_ci,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset utf8mb4 collate utf8mb4_german2_ci,
+change a a varchar(150) charset big5 collate big5_chinese_ci,
 algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify b varchar(50) charset utf8mb4 collate utf8mb4_german2_ci,
+modify b text charset big5 collate big5_chinese_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+drop table tmp;
+create table tmp (
+a varchar(150) charset ascii collate ascii_general_ci,
+b text(150) charset ascii collate ascii_general_ci,
+unique key b_idx (b(150))
+) engine=innodb;
 alter table tmp
-modify c varchar(50) charset utf8mb4 collate utf8mb4_german2_ci,
+change a a varchar(150) charset latin2 collate latin2_croatian_ci,
+algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+alter table tmp
+modify b text charset latin2 collate latin2_croatian_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset utf8mb3 collate utf8mb3_general_ci,
-b varchar(50) charset utf8mb3 collate utf8mb3_general_ci unique key,
-c varchar(50) charset utf8mb3 collate utf8mb3_general_ci primary key
+a varchar(150) charset ascii collate ascii_general_ci,
+b text(150) charset ascii collate ascii_general_ci,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset utf8mb3 collate utf8mb3_unicode_ci,
+change a a varchar(150) charset latin7 collate latin7_estonian_cs,
 algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify b varchar(50) charset utf8mb3 collate utf8mb3_unicode_ci,
+modify b text charset latin7 collate latin7_estonian_cs,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+drop table tmp;
+create table tmp (
+a varchar(150) charset ucs2 collate ucs2_general_ci,
+b text(150) charset ucs2 collate ucs2_general_ci,
+unique key b_idx (b(150))
+) engine=innodb;
 alter table tmp
-modify c varchar(50) charset utf8mb3 collate utf8mb3_unicode_ci,
+change a a varchar(150) charset utf16 collate utf16_general_ci,
+algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+alter table tmp
+modify b text charset utf16 collate utf16_general_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset latin1 collate latin1_general_cs,
-b varchar(50) charset latin1 collate latin1_general_cs unique key,
-c varchar(50) charset latin1 collate latin1_general_cs primary key
+a varchar(150) charset ucs2 collate ucs2_unicode_ci,
+b text(150) charset ucs2 collate ucs2_unicode_ci,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset latin1 collate latin1_general_ci,
+change a a varchar(150) charset utf16 collate utf16_unicode_ci,
 algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify b varchar(50) charset latin1 collate latin1_general_ci,
+modify b text charset utf16 collate utf16_unicode_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+drop table tmp;
+create table tmp (
+a varchar(150) charset ucs2 collate ucs2_icelandic_ci,
+b text(150) charset ucs2 collate ucs2_icelandic_ci,
+unique key b_idx (b(150))
+) engine=innodb;
 alter table tmp
-modify c varchar(50) charset latin1 collate latin1_general_ci,
+change a a varchar(150) charset utf16 collate utf16_icelandic_ci,
+algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+alter table tmp
+modify b text charset utf16 collate utf16_icelandic_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_general_ci,
-b varchar(50) charset ascii collate ascii_general_ci unique key,
-c varchar(50) charset ascii collate ascii_general_ci primary key
+a varchar(150) charset ucs2 collate ucs2_latvian_ci,
+b text(150) charset ucs2 collate ucs2_latvian_ci,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset ujis collate ujis_japanese_ci,
+change a a varchar(150) charset utf16 collate utf16_latvian_ci,
+algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+alter table tmp
+modify b text charset utf16 collate utf16_latvian_ci,
 algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+drop table tmp;
+create table tmp (
+a varchar(150) charset ucs2 collate ucs2_romanian_ci,
+b text(150) charset ucs2 collate ucs2_romanian_ci,
+unique key b_idx (b(150))
+) engine=innodb;
 alter table tmp
-modify b varchar(50) charset ujis collate ujis_japanese_ci,
+change a a varchar(150) charset utf16 collate utf16_romanian_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset ujis collate ujis_japanese_ci,
+modify b text charset utf16 collate utf16_romanian_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_general_ci,
-b varchar(50) charset ascii collate ascii_general_ci unique key,
-c varchar(50) charset ascii collate ascii_general_ci primary key
+a varchar(150) charset ucs2 collate ucs2_slovenian_ci,
+b text(150) charset ucs2 collate ucs2_slovenian_ci,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset big5 collate big5_chinese_ci,
+change a a varchar(150) charset utf16 collate utf16_slovenian_ci,
+algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+alter table tmp
+modify b text charset utf16 collate utf16_slovenian_ci,
 algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+drop table tmp;
+create table tmp (
+a varchar(150) charset ucs2 collate ucs2_polish_ci,
+b text(150) charset ucs2 collate ucs2_polish_ci,
+unique key b_idx (b(150))
+) engine=innodb;
 alter table tmp
-modify b varchar(50) charset big5 collate big5_chinese_ci,
+change a a varchar(150) charset utf16 collate utf16_polish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset big5 collate big5_chinese_ci,
+modify b text charset utf16 collate utf16_polish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_general_ci,
-b varchar(50) charset ascii collate ascii_general_ci unique key,
-c varchar(50) charset ascii collate ascii_general_ci primary key
+a varchar(150) charset ucs2 collate ucs2_estonian_ci,
+b text(150) charset ucs2 collate ucs2_estonian_ci,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset latin2 collate latin2_croatian_ci,
+change a a varchar(150) charset utf16 collate utf16_estonian_ci,
+algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+alter table tmp
+modify b text charset utf16 collate utf16_estonian_ci,
 algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+drop table tmp;
+create table tmp (
+a varchar(150) charset ucs2 collate ucs2_spanish_ci,
+b text(150) charset ucs2 collate ucs2_spanish_ci,
+unique key b_idx (b(150))
+) engine=innodb;
 alter table tmp
-modify b varchar(50) charset latin2 collate latin2_croatian_ci,
+change a a varchar(150) charset utf16 collate utf16_spanish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset latin2 collate latin2_croatian_ci,
+modify b text charset utf16 collate utf16_spanish_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset ascii collate ascii_general_ci,
-b varchar(50) charset ascii collate ascii_general_ci unique key,
-c varchar(50) charset ascii collate ascii_general_ci primary key
+a varchar(150) charset ucs2 collate ucs2_general_ci,
+b text(150) charset ucs2 collate ucs2_general_ci,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset latin7 collate latin7_estonian_cs,
+change a a varchar(150) charset utf16 collate utf16_general_ci,
+algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+alter table tmp
+modify b text charset utf16 collate utf16_general_ci,
 algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+drop table tmp;
+create table tmp (
+a varchar(150) charset ucs2 collate ucs2_myanmar_ci,
+b text(150) charset ucs2 collate ucs2_myanmar_ci,
+unique key b_idx (b(150))
+) engine=innodb;
 alter table tmp
-modify b varchar(50) charset latin7 collate latin7_estonian_cs,
+change a a varchar(150) charset utf16 collate utf16_thai_520_w2,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset latin7 collate latin7_estonian_cs,
+modify b text charset utf16 collate utf16_thai_520_w2,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 create table tmp (
-a varchar(50) charset utf16 collate utf16_general_ci,
-b varchar(50) charset utf16 collate utf16_general_ci unique key,
-c varchar(50) charset utf16 collate utf16_general_ci primary key
+a varchar(150) charset ucs2 collate ucs2_general_ci,
+b text(150) charset ucs2 collate ucs2_general_ci,
+unique key b_idx (b(150))
 ) engine=innodb;
 alter table tmp
-change a a varchar(50) charset utf16 collate utf16_german2_ci,
+change a a varchar(150) charset utf16 collate utf16_unicode_nopad_ci,
 algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify b varchar(50) charset utf16 collate utf16_german2_ci,
+modify b text charset utf16 collate utf16_unicode_nopad_ci,
+algorithm=instant;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+drop table tmp;
+create table tmp (
+a varchar(150) charset ucs2 collate ucs2_general_mysql500_ci,
+b text(150) charset ucs2 collate ucs2_general_mysql500_ci,
+unique key b_idx (b(150))
+) engine=innodb;
+alter table tmp
+change a a varchar(150) charset utf16 collate utf16_spanish2_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 alter table tmp
-modify c varchar(50) charset utf16 collate utf16_german2_ci,
+modify b text charset utf16 collate utf16_spanish2_ci,
 algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
-drop table compatible_without_index;
-create table fully_incompatible (
-id int auto_increment unique key,
-from_charset char(255),
-from_collate char(255),
-to_charset char(255),
-to_collate char(255)
-);
-insert into fully_incompatible (from_charset, from_collate, to_charset, to_collate) values
-('utf8mb4', 'utf8mb4_general_ci', 'utf8mb3', 'utf8mb3_general_ci'),
-('utf8mb4', 'utf8mb4_general_ci', 'ascii', 'ascii_general_ci'),
-('utf8mb3', 'utf8mb3_general_ci', 'ascii', 'ascii_general_ci'),
-('utf8mb3', 'utf8mb3_general_ci', 'latin1', 'latin1_general_ci'),
-('utf16', 'utf16_general_ci', 'utf32', 'utf32_general_ci'),
-('latin1', 'latin1_general_ci',   'ascii', 'ascii_general_ci'),
-('ascii', 'ascii_general_ci',     'swe7', 'swe7_swedish_ci'),
-('eucjpms', 'eucjpms_japanese_nopad_ci', 'geostd8', 'geostd8_general_ci'),
-('latin1', 'latin1_general_ci',   'utf16', 'utf16_general_ci')
-;
 create table tmp (
 a varchar(150) charset utf8mb4 collate utf8mb4_general_ci,
 b text(150) charset utf8mb4 collate utf8mb4_general_ci,
@@ -1810,3 +1773,23 @@ algorithm=instant;
 ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
 drop table tmp;
 drop table fully_incompatible;
+#
+# MDEV-19284 INSTANT ALTER with ucs2-to-utf16 conversion produces bad data
+#
+CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET ucs2, PRIMARY KEY(a)) ENGINE=InnoDB;
+INSERT INTO t1 VALUES ('a'),(0xD800);
+ALTER TABLE t1 ALGORITHM=COPY, MODIFY a VARCHAR(10) CHARACTER SET utf16;
+ERROR 22007: Incorrect string value: '\xD8\x00' for column `test`.`t1`.`a` at row 2
+ALTER TABLE t1 ALGORITHM=INSTANT, MODIFY a VARCHAR(10) CHARACTER SET utf16;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+DROP TABLE t1;
+#
+# MDEV-19285 INSTANT ALTER from ascii_general_ci to latin1_general_ci produces currupt data
+#
+CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET ascii COLLATE ascii_general_ci, PRIMARY KEY(a)) ENGINE=InnoDB;
+INSERT INTO t1 VALUES ('a'),(0xC0),('b');
+ALTER TABLE t1 ALGORITHM=COPY, MODIFY a VARCHAR(10) CHARACTER SET latin1 COLLATE latin1_general_ci;
+ERROR 22007: Incorrect string value: '\xC0' for column `test`.`t1`.`a` at row 3
+ALTER TABLE t1 ALGORITHM=INSTANT, MODIFY a VARCHAR(10) CHARACTER SET latin1 COLLATE latin1_general_ci;
+ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
+DROP TABLE t1;
diff --git a/mysql-test/suite/innodb/t/instant_alter_charset.test b/mysql-test/suite/innodb/t/instant_alter_charset.test
index 82ab9f9eb94..51b93db7b1f 100644
--- a/mysql-test/suite/innodb/t/instant_alter_charset.test
+++ b/mysql-test/suite/innodb/t/instant_alter_charset.test
@@ -20,9 +20,13 @@ select c.prtype, c.len from information_schema.innodb_sys_columns as c inner joi
 alter table no_rebuild
   change a a char(150) charset utf8mb3 collate utf8mb3_spanish_ci,
   algorithm=inplace;
+--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
 alter table rebuild
   change a a varchar(150) charset latin1 not null default 'asdf',
   algorithm=inplace;
+alter table rebuild
+  change a a varchar(150) charset latin1 not null default 'asdf',
+  algorithm=copy;
 select name, prtype, len from information_schema.innodb_sys_columns
   where table_id = @id;
 select c.prtype, c.len from information_schema.innodb_sys_columns as c inner join information_schema.innodb_sys_tables t on c.table_id = t.table_id
@@ -41,7 +45,7 @@ create table supported_types (
 ) engine=innodb;
 
 alter table supported_types
-  convert to charset latin1,
+  convert to charset ascii collate ascii_bin,
   algorithm=instant;
 
 drop table supported_types;
@@ -53,7 +57,7 @@ create table various_cases (
 ) engine=innodb;
 
 alter table various_cases
-  change a a char(150) charset latin1,
+  change a a char(150) charset ascii collate ascii_bin,
   algorithm=inplace;
 
 --error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
@@ -88,7 +92,7 @@ create table all_texts (
 ) engine=innodb;
 
 alter table all_texts
-  convert to charset latin1 collate latin1_general_ci,
+  convert to charset ascii collate ascii_bin,
   algorithm=instant;
 
 drop table all_texts;
@@ -244,10 +248,15 @@ alter table latin1_swedish_special_case
   modify copy1 varchar(150) charset latin1 collate latin1_swedish_ci,
   modify copy2 char(150) charset latin1 collate latin1_swedish_ci,
   algorithm=copy;
+--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
 alter table latin1_swedish_special_case
   modify instant1 varchar(150) charset latin1 collate latin1_swedish_ci,
   modify instant2 char(150) charset latin1 collate latin1_swedish_ci,
   algorithm=instant;
+alter table latin1_swedish_special_case
+  modify instant1 varchar(150) charset latin1 collate latin1_swedish_ci,
+  modify instant2 char(150) charset latin1 collate latin1_swedish_ci,
+  algorithm=copy;
 select c.name, c.prtype, c.mtype, c.len from information_schema.innodb_sys_columns as c inner join information_schema.innodb_sys_tables t on c.table_id = t.table_id
   where t.name = 'test/latin1_swedish_special_case';
 alter table latin1_swedish_special_case
@@ -275,11 +284,16 @@ create table boundary_255 (
   c varchar(300) charset ascii
 ) engine=innodb;
 
+--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
 alter table boundary_255
   modify a varchar(50) charset utf8mb3,
   algorithm=instant;
+alter table boundary_255
+  modify a varchar(50) charset utf8mb3,
+  algorithm=copy;
 
 if ($row_format == 'redundant') {
+--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
 alter table boundary_255
   modify b varchar(200) charset utf8mb3,
   algorithm=instant;
@@ -291,6 +305,7 @@ alter table boundary_255
   algorithm=instant;
 }
 
+--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
 alter table boundary_255
   modify c varchar(300) charset utf8mb3,
   algorithm=instant;
@@ -338,30 +353,7 @@ insert into fully_compatible (from_charset, from_collate, to_charset, to_collate
   ('utf8mb3', 'utf8mb3_general_nopad_ci',     'utf8mb4', 'utf8mb4_general_nopad_ci'),
   ('utf8mb3', 'utf8mb3_nopad_bin',            'utf8mb4', 'utf8mb4_nopad_bin'),
   ('utf8mb3', 'utf8mb3_unicode_nopad_ci',     'utf8mb4', 'utf8mb4_unicode_nopad_ci'),
-  ('utf8mb3', 'utf8mb3_unicode_520_nopad_ci', 'utf8mb4', 'utf8mb4_unicode_520_nopad_ci'),
-
-  ('ucs2',    'ucs2_general_ci',       'utf16',   'utf16_general_ci'),
-  ('ucs2',    'ucs2_unicode_ci',       'utf16',   'utf16_unicode_ci'),
-  ('ucs2',    'ucs2_icelandic_ci',     'utf16',   'utf16_icelandic_ci'),
-  ('ucs2',    'ucs2_latvian_ci',       'utf16',   'utf16_latvian_ci'),
-  ('ucs2',    'ucs2_romanian_ci',      'utf16',   'utf16_romanian_ci'),
-  ('ucs2',    'ucs2_slovenian_ci',     'utf16',   'utf16_slovenian_ci'),
-  ('ucs2',    'ucs2_polish_ci',        'utf16',   'utf16_polish_ci'),
-  ('ucs2',    'ucs2_estonian_ci',      'utf16',   'utf16_estonian_ci'),
-  ('ucs2',    'ucs2_spanish_ci',       'utf16',   'utf16_spanish_ci'),
-  ('ucs2',    'ucs2_general_ci',       'utf16',   'utf16_general_ci'),
-
-  ('ascii', 'ascii_general_ci',       'utf8mb3', 'utf8mb3_general_ci'),
-  ('ascii', 'ascii_general_ci',       'utf8mb4', 'utf8mb4_general_ci'),
-  ('ascii', 'ascii_general_ci',       'latin1', 'latin1_general_ci'),
-  ('ascii', 'ascii_bin',              'latin1', 'latin1_bin'),
-  ('ascii', 'ascii_nopad_bin',        'latin1', 'latin1_nopad_bin'),
-  ('ascii', 'ascii_general_ci',       'latin2', 'latin2_general_ci'),
-  ('ascii', 'ascii_general_ci',       'latin7', 'latin7_general_ci'),
-  ('ascii', 'ascii_bin',              'koi8u',  'koi8u_bin'),
-  ('ascii', 'ascii_bin',              'ujis',   'ujis_bin'),
-  ('ascii', 'ascii_bin',              'big5',   'big5_bin'),
-  ('ascii', 'ascii_bin',              'gbk',    'gbk_bin')
+  ('utf8mb3', 'utf8mb3_unicode_520_nopad_ci', 'utf8mb4', 'utf8mb4_unicode_520_nopad_ci')
 ;
 
 let $data_size = `select count(*) from fully_compatible`;
@@ -404,47 +396,19 @@ create table compatible_without_index (
 );
 
 insert into compatible_without_index (from_charset, from_collate, to_charset, to_collate) values
-  ('ascii', 'ascii_general_ci',       'utf8mb3', 'utf8mb3_swedish_ci'),
-  ('ascii', 'ascii_bin',              'latin1', 'latin1_swedish_ci'),
-  ('ascii', 'ascii_general_nopad_ci', 'latin1', 'latin1_swedish_ci'),
-  ('ascii', 'ascii_nopad_bin',        'latin1', 'latin1_swedish_ci'),
-
-  ('ascii', 'ascii_general_ci',       'koi8u', 'koi8u_bin'),
-  ('ascii', 'ascii_general_nopad_ci', 'koi8u', 'koi8u_bin'),
-  ('ascii', 'ascii_nopad_bin',        'koi8u', 'koi8u_bin'),
-
-  ('ascii', 'ascii_general_ci',       'latin1', 'latin1_swedish_ci'),
-  ('ascii', 'ascii_bin',              'utf8mb3', 'utf8mb3_swedish_ci'),
-  ('ascii', 'ascii_general_nopad_ci', 'utf8mb3', 'utf8mb3_swedish_ci'),
-  ('ascii', 'ascii_nopad_bin',        'utf8mb3', 'utf8mb3_swedish_ci'),
-
-  ('ascii', 'ascii_general_ci',       'utf8mb4', 'utf8mb4_danish_ci'),
-  ('ascii', 'ascii_bin',              'utf8mb4', 'utf8mb4_danish_ci'),
-  ('ascii', 'ascii_general_nopad_ci', 'utf8mb4', 'utf8mb4_danish_ci'),
-  ('ascii', 'ascii_nopad_bin',        'utf8mb4', 'utf8mb4_danish_ci'),
 
   ('utf8mb3', 'utf8mb3_general_ci',       'utf8mb4', 'utf8mb4_vietnamese_ci'),
   ('utf8mb3', 'utf8mb3_bin',              'utf8mb4', 'utf8mb4_vietnamese_ci'),
   ('utf8mb3', 'utf8mb3_general_nopad_ci', 'utf8mb4', 'utf8mb4_vietnamese_ci'),
   ('utf8mb3', 'utf8mb3_nopad_bin',        'utf8mb4', 'utf8mb4_vietnamese_ci'),
 
-  ('ascii',  'ascii_general_ci',     'gbk',  'gbk_chinese_ci'),
-  ('ascii',  'ascii_general_ci',     'gbk',  'gbk_chinese_nopad_ci'),
-
-  ('ucs2',  'ucs2_myanmar_ci',          'utf16', 'utf16_thai_520_w2'),
-  ('ucs2',  'ucs2_general_ci',          'utf16', 'utf16_unicode_nopad_ci'),
-  ('ucs2',  'ucs2_general_mysql500_ci', 'utf16', 'utf16_spanish2_ci'),
-
   ('ascii',   'ascii_general_ci',      'ascii',   'ascii_bin'),
   ('utf8mb3', 'utf8mb3_roman_ci',      'utf8mb3', 'utf8mb3_lithuanian_ci'),
   ('utf8mb4', 'utf8mb4_thai_520_w2',   'utf8mb4', 'utf8mb4_persian_ci'),
   ('utf8mb3', 'utf8mb3_myanmar_ci',    'utf8mb4', 'utf8mb4_german2_ci'),
   ('utf8mb3', 'utf8mb3_general_ci',    'utf8mb3', 'utf8mb3_unicode_ci'),
   ('latin1',  'latin1_general_cs',     'latin1',  'latin1_general_ci'),
-  ('ascii',   'ascii_general_ci',      'ujis',    'ujis_japanese_ci'),
-  ('ascii',   'ascii_general_ci',      'big5',    'big5_chinese_ci'),
-  ('ascii',   'ascii_general_ci',      'latin2',  'latin2_croatian_ci'),
-  ('ascii',   'ascii_general_ci',      'latin7',  'latin7_estonian_cs'),
+
   ('utf16',   'utf16_general_ci',      'utf16',   'utf16_german2_ci')
 ;
 
@@ -494,6 +458,59 @@ create table fully_incompatible (
 );
 
 insert into fully_incompatible (from_charset, from_collate, to_charset, to_collate) values
+  ('ascii', 'ascii_general_ci',       'utf8mb3', 'utf8mb3_general_ci'),
+  ('ascii', 'ascii_general_ci',       'utf8mb4', 'utf8mb4_general_ci'),
+  ('ascii', 'ascii_general_ci',       'latin1', 'latin1_general_ci'),
+  ('ascii', 'ascii_bin',              'latin1', 'latin1_bin'),
+  ('ascii', 'ascii_nopad_bin',        'latin1', 'latin1_nopad_bin'),
+  ('ascii', 'ascii_general_ci',       'latin2', 'latin2_general_ci'),
+  ('ascii', 'ascii_general_ci',       'latin7', 'latin7_general_ci'),
+  ('ascii', 'ascii_bin',              'koi8u',  'koi8u_bin'),
+  ('ascii', 'ascii_bin',              'ujis',   'ujis_bin'),
+  ('ascii', 'ascii_bin',              'big5',   'big5_bin'),
+  ('ascii', 'ascii_bin',              'gbk',    'gbk_bin'),
+
+  ('ascii', 'ascii_general_ci',       'utf8mb3', 'utf8mb3_swedish_ci'),
+  ('ascii', 'ascii_bin',              'latin1', 'latin1_swedish_ci'),
+  ('ascii', 'ascii_general_nopad_ci', 'latin1', 'latin1_swedish_ci'),
+  ('ascii', 'ascii_nopad_bin',        'latin1', 'latin1_swedish_ci'),
+
+  ('ascii', 'ascii_general_ci',       'koi8u', 'koi8u_bin'),
+  ('ascii', 'ascii_general_nopad_ci', 'koi8u', 'koi8u_bin'),
+  ('ascii', 'ascii_nopad_bin',        'koi8u', 'koi8u_bin'),
+
+  ('ascii', 'ascii_general_ci',       'latin1', 'latin1_swedish_ci'),
+  ('ascii', 'ascii_bin',              'utf8mb3', 'utf8mb3_swedish_ci'),
+  ('ascii', 'ascii_general_nopad_ci', 'utf8mb3', 'utf8mb3_swedish_ci'),
+  ('ascii', 'ascii_nopad_bin',        'utf8mb3', 'utf8mb3_swedish_ci'),
+
+  ('ascii', 'ascii_general_ci',       'utf8mb4', 'utf8mb4_danish_ci'),
+  ('ascii', 'ascii_bin',              'utf8mb4', 'utf8mb4_danish_ci'),
+  ('ascii', 'ascii_general_nopad_ci', 'utf8mb4', 'utf8mb4_danish_ci'),
+  ('ascii', 'ascii_nopad_bin',        'utf8mb4', 'utf8mb4_danish_ci'),
+
+  ('ascii', 'ascii_general_ci',     'gbk',  'gbk_chinese_ci'),
+  ('ascii', 'ascii_general_ci',     'gbk',  'gbk_chinese_nopad_ci'),
+
+  ('ascii', 'ascii_general_ci',      'ujis',    'ujis_japanese_ci'),
+  ('ascii', 'ascii_general_ci',      'big5',    'big5_chinese_ci'),
+  ('ascii', 'ascii_general_ci',      'latin2',  'latin2_croatian_ci'),
+  ('ascii', 'ascii_general_ci',      'latin7',  'latin7_estonian_cs'),
+
+  ('ucs2',  'ucs2_general_ci',       'utf16',   'utf16_general_ci'),
+  ('ucs2',  'ucs2_unicode_ci',       'utf16',   'utf16_unicode_ci'),
+  ('ucs2',  'ucs2_icelandic_ci',     'utf16',   'utf16_icelandic_ci'),
+  ('ucs2',  'ucs2_latvian_ci',       'utf16',   'utf16_latvian_ci'),
+  ('ucs2',  'ucs2_romanian_ci',      'utf16',   'utf16_romanian_ci'),
+  ('ucs2',  'ucs2_slovenian_ci',     'utf16',   'utf16_slovenian_ci'),
+  ('ucs2',  'ucs2_polish_ci',        'utf16',   'utf16_polish_ci'),
+  ('ucs2',  'ucs2_estonian_ci',      'utf16',   'utf16_estonian_ci'),
+  ('ucs2',  'ucs2_spanish_ci',       'utf16',   'utf16_spanish_ci'),
+  ('ucs2',  'ucs2_general_ci',       'utf16',   'utf16_general_ci'),
+  ('ucs2',  'ucs2_myanmar_ci',          'utf16', 'utf16_thai_520_w2'),
+  ('ucs2',  'ucs2_general_ci',          'utf16', 'utf16_unicode_nopad_ci'),
+  ('ucs2',  'ucs2_general_mysql500_ci', 'utf16', 'utf16_spanish2_ci'),
+
   ('utf8mb4', 'utf8mb4_general_ci', 'utf8mb3', 'utf8mb3_general_ci'),
   ('utf8mb4', 'utf8mb4_general_ci', 'ascii', 'ascii_general_ci'),
   ('utf8mb3', 'utf8mb3_general_ci', 'ascii', 'ascii_general_ci'),
@@ -536,3 +553,27 @@ while ($counter <= $data_size) {
 }
 
 drop table fully_incompatible;
+
+--echo #
+--echo # MDEV-19284 INSTANT ALTER with ucs2-to-utf16 conversion produces bad data
+--echo #
+
+CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET ucs2, PRIMARY KEY(a)) ENGINE=InnoDB;
+INSERT INTO t1 VALUES ('a'),(0xD800);
+--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
+ALTER TABLE t1 ALGORITHM=COPY, MODIFY a VARCHAR(10) CHARACTER SET utf16;
+--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
+ALTER TABLE t1 ALGORITHM=INSTANT, MODIFY a VARCHAR(10) CHARACTER SET utf16;
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-19285 INSTANT ALTER from ascii_general_ci to latin1_general_ci produces currupt data
+--echo #
+
+CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET ascii COLLATE ascii_general_ci, PRIMARY KEY(a)) ENGINE=InnoDB;
+INSERT INTO t1 VALUES ('a'),(0xC0),('b');
+--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
+ALTER TABLE t1 ALGORITHM=COPY, MODIFY a VARCHAR(10) CHARACTER SET latin1 COLLATE latin1_general_ci;
+--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
+ALTER TABLE t1 ALGORITHM=INSTANT, MODIFY a VARCHAR(10) CHARACTER SET latin1 COLLATE latin1_general_ci;
+DROP TABLE t1;
diff --git a/sql/field.cc b/sql/field.cc
index 72dc52143a0..f87b90bb484 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -7079,6 +7079,17 @@ int Field_str::store(double nr)
 }
 
 
+bool Field_longstr::
+  csinfo_change_allows_instant_alter(const Create_field *to) const
+{
+  Charset cs(field_charset);
+  const bool part_of_a_key= !to->field->part_of_key.is_clear_all();
+  return part_of_a_key ?
+    cs.encoding_and_order_allow_reinterpret_as(to->charset) :
+    cs.encoding_allows_reinterpret_as(to->charset);
+}
+
+
 uint Field_string::is_equal(Create_field *new_field)
 {
   DBUG_ASSERT(!compression_method());
@@ -7089,9 +7100,7 @@ uint Field_string::is_equal(Create_field *new_field)
   if (new_field->char_length < char_length())
     return IS_EQUAL_NO;
 
-  const bool part_of_a_key= !new_field->field->part_of_key.is_clear_all();
-  if (!Type_handler::Charsets_are_compatible(field_charset, new_field->charset,
-					     part_of_a_key))
+  if (!csinfo_change_allows_instant_alter(new_field))
     return IS_EQUAL_NO;
 
   if (new_field->length == max_display_length())
@@ -7941,9 +7950,7 @@ uint Field_varstring::is_equal(Create_field *new_field)
   if (!new_field->compression_method() != !compression_method())
     return IS_EQUAL_NO;
 
-  bool part_of_a_key= !new_field->field->part_of_key.is_clear_all();
-  if (!Type_handler::Charsets_are_compatible(field_charset, new_field->charset,
-                                             part_of_a_key))
+  if (!csinfo_change_allows_instant_alter(new_field))
     return IS_EQUAL_NO;
 
   const Type_handler *new_type_handler= new_field->type_handler();
@@ -8738,12 +8745,8 @@ uint Field_blob::is_equal(Create_field *new_field)
     return IS_EQUAL_NO;
   }
 
-  bool part_of_a_key= !new_field->field->part_of_key.is_clear_all();
-  if (!Type_handler::Charsets_are_compatible(field_charset, new_field->charset,
-                                             part_of_a_key))
-  {
+  if (!csinfo_change_allows_instant_alter(new_field))
     return IS_EQUAL_NO;
-  }
 
   if (field_charset != new_field->charset)
   {
diff --git a/sql/field.h b/sql/field.h
index 35597d72927..57d9c4f3409 100644
--- a/sql/field.h
+++ b/sql/field.h
@@ -1923,6 +1923,7 @@ class Field_longstr :public Field_str
                CHARSET_INFO *cs, size_t nchars);
   String *uncompress(String *val_buffer, String *val_ptr,
                      const uchar *from, uint from_length);
+  bool csinfo_change_allows_instant_alter(const Create_field *to) const;
 public:
   Field_longstr(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
                 uchar null_bit_arg, utype unireg_check_arg,
diff --git a/sql/sql_string.h b/sql/sql_string.h
index fa941c8156e..67b27e52bb5 100644
--- a/sql/sql_string.h
+++ b/sql/sql_string.h
@@ -159,6 +159,14 @@ class Charset
   {
     swap_variables(CHARSET_INFO*, m_charset, other.m_charset);
   }
+  /*
+    Collation name without the character set name.
+    For example, in case of "latin1_swedish_ci",
+    this method returns "_swedish_ci".
+  */
+  LEX_CSTRING collation_specific_name() const;
+  bool encoding_allows_reinterpret_as(CHARSET_INFO *cs) const;
+  bool encoding_and_order_allow_reinterpret_as(CHARSET_INFO *cs) const;
 };
 
 
diff --git a/sql/sql_type.cc b/sql/sql_type.cc
index 4906eee064d..85d1f5ae843 100644
--- a/sql/sql_type.cc
+++ b/sql/sql_type.cc
@@ -8206,48 +8206,55 @@ Type_handler_timestamp_common::Item_param_val_native(THD *thd,
     TIME_to_native(thd, &ltime, to, item->datetime_precision(thd));
 }
 
-static bool charsets_are_compatible(const char *old_cs_name,
-                                    const CHARSET_INFO *new_ci)
-{
-  const char *new_cs_name= new_ci->csname;
 
-  if (!strcmp(old_cs_name, new_cs_name))
-    return true;
+LEX_CSTRING Charset::collation_specific_name() const
+{
+  /*
+    User defined collations can provide arbitrary names
+    for character sets and collations, so a collation
+    name not necessarily starts with the character set name.
+  */
+  size_t csname_length= strlen(m_charset->csname);
+  if (strncmp(m_charset->name, m_charset->csname, csname_length))
+    return {NULL, 0};
+  const char *ptr= m_charset->name + csname_length;
+  return {ptr, strlen(ptr) };
+}
 
-  if (!strcmp(old_cs_name, MY_UTF8MB3) && !strcmp(new_cs_name, MY_UTF8MB4))
-    return true;
 
-  if (!strcmp(old_cs_name, "ascii") && !(new_ci->state & MY_CS_NONASCII))
+bool
+Charset::encoding_allows_reinterpret_as(const CHARSET_INFO *cs) const
+{
+  if (!strcmp(m_charset->csname, cs->csname))
     return true;
 
-  if (!strcmp(old_cs_name, "ucs2") && !strcmp(new_cs_name, "utf16"))
+  if (!strcmp(m_charset->csname, MY_UTF8MB3) &&
+      !strcmp(cs->csname, MY_UTF8MB4))
     return true;
 
+  /*
+    Originally we allowed here instat ALTER for ASCII-to-LATIN1
+    and UCS2-to-UTF16, but this was wrong:
+    - MariaDB's ascii is not a subset for 8-bit character sets
+      like latin1, because it allows storing bytes 0x80..0xFF as
+      "unassigned" characters (see MDEV-19285).
+    - MariaDB's ucs2 (as in Uncode-1.1) is not a subset for UTF16,
+      because they treat surrogate codes differently (MDEV-19284).
+  */
   return false;
 }
 
-bool Type_handler::Charsets_are_compatible(const CHARSET_INFO *old_ci,
-                                           const CHARSET_INFO *new_ci,
-                                           bool part_of_a_key)
-{
-  const char *old_cs_name= old_ci->csname;
-  const char *new_cs_name= new_ci->csname;
-
-  if (!charsets_are_compatible(old_cs_name, new_ci))
-  {
-    return false;
-  }
-
-  if (!part_of_a_key)
-  {
-    return true;
-  }
 
-  if (strcmp(old_ci->name + strlen(old_cs_name),
-             new_ci->name + strlen(new_cs_name)))
-  {
+bool
+Charset::encoding_and_order_allow_reinterpret_as(CHARSET_INFO *cs)
+                                                 const
+{
+  if (!encoding_allows_reinterpret_as(cs))
     return false;
-  }
-
-  return true;
+  LEX_CSTRING name0= collation_specific_name();
+  LEX_CSTRING name1= Charset(cs).collation_specific_name();
+  return
+    name0.length &&
+    name0.length == name1.length &&
+    !memcmp(name0.str, name1.str, name0.length);
 }
diff --git a/sql/sql_type.h b/sql/sql_type.h
index da9913c1265..feb5c45c965 100644
--- a/sql/sql_type.h
+++ b/sql/sql_type.h
@@ -3697,10 +3697,6 @@ class Type_handler
 
   virtual bool
   Vers_history_point_resolve_unit(THD *thd, Vers_history_point *point) const;
-
-  static bool Charsets_are_compatible(const CHARSET_INFO *old_ci,
-                                      const CHARSET_INFO *new_ci,
-                                      bool part_of_a_key);
 };
 
 

Follow ups