Commit c4858549 authored by Mattias Jonsson's avatar Mattias Jonsson

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.
parent af951a6c
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 @@ ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment