mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Bug#55458: Partitioned MyISAM table gets crashed by multi-table update
Bug#57113: ha_partition::extra(ha_extra_function): Assertion `m_extra_cache' failed Fix for bug#55458 included DBUG_ASSERTS causing debug builds of the server to crash on another multi-table update. Removed the asserts since they where wrong. (updated after testing the patch in 5.5). mysql-test/r/partition.result: updated result mysql-test/t/partition.test: Added test for bug#57113 sql/ha_partition.cc: Removed the assert for m_extra_cache when ::extra(HA_PREPARE_FOR_UPDATE) was called.
This commit is contained in:
@ -1,5 +1,20 @@
|
|||||||
drop table if exists t1, t2;
|
drop table if exists t1, t2;
|
||||||
#
|
#
|
||||||
|
# Bug#57113: ha_partition::extra(ha_extra_function):
|
||||||
|
# Assertion `m_extra_cache' failed
|
||||||
|
CREATE TABLE t1
|
||||||
|
(id INT NOT NULL PRIMARY KEY,
|
||||||
|
name VARCHAR(16) NOT NULL,
|
||||||
|
year YEAR,
|
||||||
|
INDEX name (name(8))
|
||||||
|
)
|
||||||
|
PARTITION BY HASH(id) PARTITIONS 2;
|
||||||
|
INSERT INTO t1 VALUES ( 1, 'FooBar', '1924' );
|
||||||
|
CREATE TABLE t2 (id INT);
|
||||||
|
INSERT INTO t2 VALUES (1),(2);
|
||||||
|
UPDATE t1, t2 SET t1.year = '1955' WHERE t1.name = 'FooBar';
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
#
|
||||||
# Bug#55458: Partitioned MyISAM table gets crashed by multi-table update
|
# Bug#55458: Partitioned MyISAM table gets crashed by multi-table update
|
||||||
#
|
#
|
||||||
CREATE TABLE t1 (
|
CREATE TABLE t1 (
|
||||||
|
@ -14,6 +14,28 @@
|
|||||||
drop table if exists t1, t2;
|
drop table if exists t1, t2;
|
||||||
--enable_warnings
|
--enable_warnings
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug#57113: ha_partition::extra(ha_extra_function):
|
||||||
|
--echo # Assertion `m_extra_cache' failed
|
||||||
|
CREATE TABLE t1
|
||||||
|
(id INT NOT NULL PRIMARY KEY,
|
||||||
|
name VARCHAR(16) NOT NULL,
|
||||||
|
year YEAR,
|
||||||
|
INDEX name (name(8))
|
||||||
|
)
|
||||||
|
PARTITION BY HASH(id) PARTITIONS 2;
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES ( 1, 'FooBar', '1924' );
|
||||||
|
|
||||||
|
CREATE TABLE t2 (id INT);
|
||||||
|
|
||||||
|
INSERT INTO t2 VALUES (1),(2);
|
||||||
|
|
||||||
|
UPDATE t1, t2 SET t1.year = '1955' WHERE t1.name = 'FooBar';
|
||||||
|
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # Bug#55458: Partitioned MyISAM table gets crashed by multi-table update
|
--echo # Bug#55458: Partitioned MyISAM table gets crashed by multi-table update
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -5550,7 +5550,6 @@ int ha_partition::extra(enum ha_extra_function operation)
|
|||||||
DBUG_RETURN(prepare_for_rename());
|
DBUG_RETURN(prepare_for_rename());
|
||||||
break;
|
break;
|
||||||
case HA_EXTRA_PREPARE_FOR_UPDATE:
|
case HA_EXTRA_PREPARE_FOR_UPDATE:
|
||||||
DBUG_ASSERT(m_extra_cache);
|
|
||||||
/*
|
/*
|
||||||
Needs to be run on the first partition in the range now, and
|
Needs to be run on the first partition in the range now, and
|
||||||
later in late_extra_cache, when switching to a new partition to scan.
|
later in late_extra_cache, when switching to a new partition to scan.
|
||||||
@ -5558,6 +5557,8 @@ int ha_partition::extra(enum ha_extra_function operation)
|
|||||||
m_extra_prepare_for_update= TRUE;
|
m_extra_prepare_for_update= TRUE;
|
||||||
if (m_part_spec.start_part != NO_CURRENT_PART_ID)
|
if (m_part_spec.start_part != NO_CURRENT_PART_ID)
|
||||||
{
|
{
|
||||||
|
if (!m_extra_cache)
|
||||||
|
m_extra_cache_part_id= m_part_spec.start_part;
|
||||||
DBUG_ASSERT(m_extra_cache_part_id == m_part_spec.start_part);
|
DBUG_ASSERT(m_extra_cache_part_id == m_part_spec.start_part);
|
||||||
VOID(m_file[m_part_spec.start_part]->extra(HA_EXTRA_PREPARE_FOR_UPDATE));
|
VOID(m_file[m_part_spec.start_part]->extra(HA_EXTRA_PREPARE_FOR_UPDATE));
|
||||||
}
|
}
|
||||||
@ -5820,19 +5821,22 @@ void ha_partition::late_extra_cache(uint partition_id)
|
|||||||
{
|
{
|
||||||
handler *file;
|
handler *file;
|
||||||
DBUG_ENTER("ha_partition::late_extra_cache");
|
DBUG_ENTER("ha_partition::late_extra_cache");
|
||||||
DBUG_PRINT("info", ("extra_cache %u partid %u size %u", m_extra_cache,
|
DBUG_PRINT("info", ("extra_cache %u prepare %u partid %u size %u",
|
||||||
|
m_extra_cache, m_extra_prepare_for_update,
|
||||||
partition_id, m_extra_cache_size));
|
partition_id, m_extra_cache_size));
|
||||||
|
|
||||||
if (!m_extra_cache && !m_extra_prepare_for_update)
|
if (!m_extra_cache && !m_extra_prepare_for_update)
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
file= m_file[partition_id];
|
file= m_file[partition_id];
|
||||||
if (m_extra_cache_size == 0)
|
if (m_extra_cache)
|
||||||
VOID(file->extra(HA_EXTRA_CACHE));
|
{
|
||||||
else
|
if (m_extra_cache_size == 0)
|
||||||
VOID(file->extra_opt(HA_EXTRA_CACHE, m_extra_cache_size));
|
VOID(file->extra(HA_EXTRA_CACHE));
|
||||||
|
else
|
||||||
|
VOID(file->extra_opt(HA_EXTRA_CACHE, m_extra_cache_size));
|
||||||
|
}
|
||||||
if (m_extra_prepare_for_update)
|
if (m_extra_prepare_for_update)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(m_extra_cache);
|
|
||||||
VOID(file->extra(HA_EXTRA_PREPARE_FOR_UPDATE));
|
VOID(file->extra(HA_EXTRA_PREPARE_FOR_UPDATE));
|
||||||
}
|
}
|
||||||
m_extra_cache_part_id= partition_id;
|
m_extra_cache_part_id= partition_id;
|
||||||
|
Reference in New Issue
Block a user