diff options
author | Thirunarayanan Balathandayuthapani <thiru@mariadb.com> | 2020-02-28 14:29:05 +0530 |
---|---|---|
committer | Thirunarayanan Balathandayuthapani <thiru@mariadb.com> | 2020-02-28 14:29:05 +0530 |
commit | f56dd0a12dc7d7c3020625e76a532ee77386b2ca (patch) | |
tree | 378d5cdbbf2f4d21c1fc0dc5028f5e0c006b11fe | |
parent | a17a327f116302612a889af7c448ef1cd8243f28 (diff) | |
download | mariadb-git-f56dd0a12dc7d7c3020625e76a532ee77386b2ca.tar.gz |
MDEV-21693 ALGORITHM=INSTANT does not work for partitioned tables
- Flag ALTER_STORED_COLUMN_TYPE set while doing varchar extension
for partition table. Basically all partition supports
can_be_converted_by_engine() then it should be set to
ALTER_COLUMN_TYPE_CHANGE_BY_ENGINE.
-rw-r--r-- | mysql-test/suite/parts/r/partition_special_innodb.result | 8 | ||||
-rw-r--r-- | mysql-test/suite/parts/t/partition_special_innodb.test | 10 | ||||
-rw-r--r-- | sql/ha_partition.cc | 36 | ||||
-rw-r--r-- | sql/ha_partition.h | 11 |
4 files changed, 64 insertions, 1 deletions
diff --git a/mysql-test/suite/parts/r/partition_special_innodb.result b/mysql-test/suite/parts/r/partition_special_innodb.result index c375c2d2232..01c6e1f9e64 100644 --- a/mysql-test/suite/parts/r/partition_special_innodb.result +++ b/mysql-test/suite/parts/r/partition_special_innodb.result @@ -327,3 +327,11 @@ disconnect con3; disconnect con2; disconnect con1; connection default; +CREATE TABLE t1( +f1 INT, f2 VARCHAR(10) CHARSET ascii, +f3 CHAR(150) CHARSET ascii, +f4 TEXT CHARSET ascii)ENGINE=InnoDB +PARTITION BY RANGE(f1) (PARTITION p1 VALUES LESS THAN(10), +PARTITION p2 VALUES LESS THAN (100)); +ALTER TABLE t1 convert to charset ascii collate ascii_bin, ALGORITHM=INSTANT; +DROP TABLE t1; diff --git a/mysql-test/suite/parts/t/partition_special_innodb.test b/mysql-test/suite/parts/t/partition_special_innodb.test index 1fc9ac7fafc..ef7cf4bd4cf 100644 --- a/mysql-test/suite/parts/t/partition_special_innodb.test +++ b/mysql-test/suite/parts/t/partition_special_innodb.test @@ -205,3 +205,13 @@ DROP TABLE t4; --disconnect con1 --connection default # End of Test #3 + +# MDEV-21693 ALGORITHM=INSTANT does not work for partitioned tables +CREATE TABLE t1( + f1 INT, f2 VARCHAR(10) CHARSET ascii, + f3 CHAR(150) CHARSET ascii, + f4 TEXT CHARSET ascii)ENGINE=InnoDB + PARTITION BY RANGE(f1) (PARTITION p1 VALUES LESS THAN(10), + PARTITION p2 VALUES LESS THAN (100)); +ALTER TABLE t1 convert to charset ascii collate ascii_bin, ALGORITHM=INSTANT; +DROP TABLE t1; diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index bcd419562b1..53bcd4df5c5 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -1,6 +1,6 @@ /* Copyright (c) 2005, 2019, Oracle and/or its affiliates. - Copyright (c) 2009, 2019, MariaDB + Copyright (c) 2009, 2020, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -11799,6 +11799,40 @@ void ha_partition::clear_top_table_fields() DBUG_VOID_RETURN; } +bool +ha_partition::can_convert_string(const Field_string* field, + const Column_definition& new_type) const +{ + for (uint index= 0; index < m_tot_parts; index++) + { + if (!m_file[index]->can_convert_string(field, new_type)) + return false; + } + return true; +} + +bool +ha_partition::can_convert_varstring(const Field_varstring* field, + const Column_definition& new_type) const{ + for (uint index= 0; index < m_tot_parts; index++) + { + if (!m_file[index]->can_convert_varstring(field, new_type)) + return false; + } + return true; +} + +bool +ha_partition::can_convert_blob(const Field_blob* field, + const Column_definition& new_type) const +{ + for (uint index= 0; index < m_tot_parts; index++) + { + if (!m_file[index]->can_convert_blob(field, new_type)) + return false; + } + return true; +} struct st_mysql_storage_engine partition_storage_engine= { MYSQL_HANDLERTON_INTERFACE_VERSION }; diff --git a/sql/ha_partition.h b/sql/ha_partition.h index 5b8718cd3ae..78561d0ec27 100644 --- a/sql/ha_partition.h +++ b/sql/ha_partition.h @@ -1640,5 +1640,16 @@ public: friend int cmp_key_rowid_part_id(void *ptr, uchar *ref1, uchar *ref2); friend int cmp_key_part_id(void *key_p, uchar *ref1, uchar *ref2); + bool can_convert_string( + const Field_string* field, + const Column_definition& new_field) const override; + + bool can_convert_varstring( + const Field_varstring* field, + const Column_definition& new_field) const override; + + bool can_convert_blob( + const Field_blob* field, + const Column_definition& new_field) const override; }; #endif /* HA_PARTITION_INCLUDED */ |