summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThirunarayanan Balathandayuthapani <thiru@mariadb.com>2020-02-26 15:49:49 +0530
committerThirunarayanan Balathandayuthapani <thiru@mariadb.com>2020-02-26 15:49:49 +0530
commit55ffda5600eac9ec76041cf7c3ceeefd55b55af4 (patch)
tree13a1e4eead06d5e3eaa1c4d66327d5443c7fa49f
parente637355156cb28388a291b0e3a5e9ee863b2854d (diff)
downloadmariadb-git-bb-10.4-MDEV-21693.tar.gz
MDEV-21693 ALGORITHM=INSTANT does not work for partitioned tablesbb-10.4-MDEV-21693
- 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.result5
-rw-r--r--mysql-test/suite/parts/t/partition_special_innodb.test8
-rw-r--r--sql/ha_partition.cc36
-rw-r--r--sql/ha_partition.h11
4 files changed, 59 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..d1ab6b579fe 100644
--- a/mysql-test/suite/parts/r/partition_special_innodb.result
+++ b/mysql-test/suite/parts/r/partition_special_innodb.result
@@ -327,3 +327,8 @@ disconnect con3;
disconnect con2;
disconnect con1;
connection default;
+CREATE TABLE t1(f1 INT, f2 VARCHAR(10))ENGINE=InnoDB
+PARTITION BY RANGE(f1) (PARTITION p1 VALUES LESS THAN(10),
+PARTITION p2 VALUES LESS THAN (100));
+ALTER TABLE t1 MODIFY COLUMN f2 VARCHAR(30), 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..ddbe4cbf257 100644
--- a/mysql-test/suite/parts/t/partition_special_innodb.test
+++ b/mysql-test/suite/parts/t/partition_special_innodb.test
@@ -205,3 +205,11 @@ 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))ENGINE=InnoDB
+ PARTITION BY RANGE(f1) (PARTITION p1 VALUES LESS THAN(10),
+ PARTITION p2 VALUES LESS THAN (100));
+ALTER TABLE t1 MODIFY COLUMN f2 VARCHAR(30), 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 */