summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/suite/parts/r/reorganize.result13
-rw-r--r--mysql-test/suite/parts/t/reorganize.test20
-rw-r--r--sql/ha_partition.cc4
-rw-r--r--sql/sql_partition.cc2
4 files changed, 38 insertions, 1 deletions
diff --git a/mysql-test/suite/parts/r/reorganize.result b/mysql-test/suite/parts/r/reorganize.result
new file mode 100644
index 00000000000..5e6fe176edc
--- /dev/null
+++ b/mysql-test/suite/parts/r/reorganize.result
@@ -0,0 +1,13 @@
+#
+# MDEV-23248 Server crashes in mi_extra /
+# ha_partition::loop_extra_alter upon REORGANIZE
+#
+CREATE TABLE t1 (a INT, b INT) ENGINE=MyISAM PARTITION BY RANGE (a) SUBPARTITION BY HASH (a) SUBPARTITIONS 70 (PARTITION p1 VALUES LESS THAN (100), PARTITION p2 VALUES LESS THAN MAXVALUE);
+INSERT INTO t1 SELECT 4, 6 FROM seq_1_to_131072;
+UPDATE t1 SET a = 7;
+set @org_debug=@@debug_dbug;
+set @@debug_dbug="+d,debug_abort_copy_partitions";
+ALTER TABLE t1 REORGANIZE PARTITION p1,p2 INTO (PARTITION p1 VALUES LESS THAN (5), PARTITION p2 VALUES LESS THAN MAXVALUE);
+ERROR 42000: Table 't1' uses an extension that doesn't exist in this MariaDB version
+set @@debug_dbug=@org_debug;
+DROP TABLE t1;
diff --git a/mysql-test/suite/parts/t/reorganize.test b/mysql-test/suite/parts/t/reorganize.test
new file mode 100644
index 00000000000..66641254468
--- /dev/null
+++ b/mysql-test/suite/parts/t/reorganize.test
@@ -0,0 +1,20 @@
+--source include/have_sequence.inc
+--source include/have_partition.inc
+--source include/have_debug.inc
+
+--echo #
+--echo # MDEV-23248 Server crashes in mi_extra /
+--echo # ha_partition::loop_extra_alter upon REORGANIZE
+--echo #
+
+CREATE TABLE t1 (a INT, b INT) ENGINE=MyISAM PARTITION BY RANGE (a) SUBPARTITION BY HASH (a) SUBPARTITIONS 70 (PARTITION p1 VALUES LESS THAN (100), PARTITION p2 VALUES LESS THAN MAXVALUE);
+INSERT INTO t1 SELECT 4, 6 FROM seq_1_to_131072;
+UPDATE t1 SET a = 7;
+
+set @org_debug=@@debug_dbug;
+set @@debug_dbug="+d,debug_abort_copy_partitions";
+--error ER_UNSUPPORTED_EXTENSION
+ALTER TABLE t1 REORGANIZE PARTITION p1,p2 INTO (PARTITION p1 VALUES LESS THAN (5), PARTITION p2 VALUES LESS THAN MAXVALUE);
+set @@debug_dbug=@org_debug;
+
+DROP TABLE t1;
diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc
index d4cab001a9a..c742524a236 100644
--- a/sql/ha_partition.cc
+++ b/sql/ha_partition.cc
@@ -2025,6 +2025,7 @@ int ha_partition::change_partitions(HA_CREATE_INFO *create_info,
DBUG_ASSERT(part_elem->part_state == PART_TO_BE_REORGED);
part_elem->part_state= PART_TO_BE_DROPPED;
}
+ DBUG_ASSERT(m_new_file == 0);
m_new_file= new_file_array;
if (unlikely((error= copy_partitions(copied, deleted))))
{
@@ -2033,6 +2034,7 @@ int ha_partition::change_partitions(HA_CREATE_INFO *create_info,
They will later be deleted through the ddl-log.
*/
cleanup_new_partition(part_count);
+ m_new_file= 0;
}
DBUG_RETURN(error);
}
@@ -2124,6 +2126,8 @@ int ha_partition::copy_partitions(ulonglong * const copied,
file->ha_rnd_end();
reorg_part++;
}
+ DBUG_EXECUTE_IF("debug_abort_copy_partitions",
+ DBUG_RETURN(HA_ERR_UNSUPPORTED); );
DBUG_RETURN(FALSE);
error:
m_reorged_file[reorg_part]->ha_rnd_end();
diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc
index 4e9c78480b5..972684df378 100644
--- a/sql/sql_partition.cc
+++ b/sql/sql_partition.cc
@@ -7487,11 +7487,11 @@ uint fast_alter_partition_table(THD *thd, TABLE *table,
mysql_write_frm(lpt, WFRM_WRITE_SHADOW) ||
ERROR_INJECT_CRASH("crash_change_partition_2") ||
ERROR_INJECT_ERROR("fail_change_partition_2") ||
- (close_table_on_failure= TRUE, FALSE) ||
write_log_add_change_partition(lpt) ||
ERROR_INJECT_CRASH("crash_change_partition_3") ||
ERROR_INJECT_ERROR("fail_change_partition_3") ||
mysql_change_partitions(lpt) ||
+ (close_table_on_failure= TRUE, FALSE) ||
ERROR_INJECT_CRASH("crash_change_partition_4") ||
ERROR_INJECT_ERROR("fail_change_partition_4") ||
wait_while_table_is_used(thd, table, HA_EXTRA_NOT_USED) ||