merge
This commit is contained in:
commit
c0c524c3c5
@ -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 (
|
||||||
|
13
mysql-test/r/partition_binlog_stmt.result
Normal file
13
mysql-test/r/partition_binlog_stmt.result
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
#
|
||||||
|
# Bug#51851: Server with SBR locks mutex twice on LOAD DATA into
|
||||||
|
# partitioned MyISAM table
|
||||||
|
CREATE TABLE t1
|
||||||
|
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
name TINYBLOB NOT NULL,
|
||||||
|
modified TIMESTAMP DEFAULT '0000-00-00 00:00:00',
|
||||||
|
INDEX namelocs (name(255))) ENGINE = MyISAM
|
||||||
|
PARTITION BY HASH(id) PARTITIONS 2;
|
||||||
|
LOAD DATA LOCAL INFILE 'init_file.txt'
|
||||||
|
INTO TABLE t1 (name);
|
||||||
|
DROP 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 #
|
||||||
|
26
mysql-test/t/partition_binlog_stmt.test
Normal file
26
mysql-test/t/partition_binlog_stmt.test
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
--source include/have_partition.inc
|
||||||
|
--source include/have_binlog_format_statement.inc
|
||||||
|
|
||||||
|
--disable_warnings
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug#51851: Server with SBR locks mutex twice on LOAD DATA into
|
||||||
|
--echo # partitioned MyISAM table
|
||||||
|
--write_file init_file.txt
|
||||||
|
abcd
|
||||||
|
EOF
|
||||||
|
|
||||||
|
CREATE TABLE t1
|
||||||
|
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
name TINYBLOB NOT NULL,
|
||||||
|
modified TIMESTAMP DEFAULT '0000-00-00 00:00:00',
|
||||||
|
INDEX namelocs (name(255))) ENGINE = MyISAM
|
||||||
|
PARTITION BY HASH(id) PARTITIONS 2;
|
||||||
|
|
||||||
|
LOAD DATA LOCAL INFILE 'init_file.txt'
|
||||||
|
INTO TABLE t1 (name);
|
||||||
|
|
||||||
|
--remove_file init_file.txt
|
||||||
|
DROP TABLE t1;
|
@ -2451,6 +2451,21 @@ err1:
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
MODULE open/close object
|
MODULE open/close object
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
A destructor for partition-specific TABLE_SHARE data.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void ha_data_partition_destroy(void *ha_data)
|
||||||
|
{
|
||||||
|
if (ha_data)
|
||||||
|
{
|
||||||
|
HA_DATA_PARTITION *ha_part_data= (HA_DATA_PARTITION*) ha_data;
|
||||||
|
pthread_mutex_destroy(&ha_part_data->LOCK_auto_inc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Open handler object
|
Open handler object
|
||||||
|
|
||||||
@ -2607,6 +2622,8 @@ int ha_partition::open(const char *name, int mode, uint test_if_locked)
|
|||||||
}
|
}
|
||||||
DBUG_PRINT("info", ("table_share->ha_data 0x%p", ha_data));
|
DBUG_PRINT("info", ("table_share->ha_data 0x%p", ha_data));
|
||||||
bzero(ha_data, sizeof(HA_DATA_PARTITION));
|
bzero(ha_data, sizeof(HA_DATA_PARTITION));
|
||||||
|
table_share->ha_data_destroy= ha_data_partition_destroy;
|
||||||
|
VOID(pthread_mutex_init(&ha_data->LOCK_auto_inc, MY_MUTEX_INIT_FAST));
|
||||||
}
|
}
|
||||||
if (is_not_tmp_table)
|
if (is_not_tmp_table)
|
||||||
pthread_mutex_unlock(&table_share->mutex);
|
pthread_mutex_unlock(&table_share->mutex);
|
||||||
@ -5555,7 +5572,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.
|
||||||
@ -5563,6 +5579,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));
|
||||||
}
|
}
|
||||||
@ -5825,19 +5843,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)
|
||||||
|
{
|
||||||
if (m_extra_cache_size == 0)
|
if (m_extra_cache_size == 0)
|
||||||
VOID(file->extra(HA_EXTRA_CACHE));
|
VOID(file->extra(HA_EXTRA_CACHE));
|
||||||
else
|
else
|
||||||
VOID(file->extra_opt(HA_EXTRA_CACHE, m_extra_cache_size));
|
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;
|
||||||
|
@ -44,6 +44,7 @@ typedef struct st_partition_share
|
|||||||
typedef struct st_ha_data_partition
|
typedef struct st_ha_data_partition
|
||||||
{
|
{
|
||||||
ulonglong next_auto_inc_val; /**< first non reserved value */
|
ulonglong next_auto_inc_val; /**< first non reserved value */
|
||||||
|
pthread_mutex_t LOCK_auto_inc;
|
||||||
bool auto_inc_initialized;
|
bool auto_inc_initialized;
|
||||||
} HA_DATA_PARTITION;
|
} HA_DATA_PARTITION;
|
||||||
|
|
||||||
@ -948,8 +949,9 @@ private:
|
|||||||
DBUG_ASSERT(table_share->ha_data && !auto_increment_lock);
|
DBUG_ASSERT(table_share->ha_data && !auto_increment_lock);
|
||||||
if(table_share->tmp_table == NO_TMP_TABLE)
|
if(table_share->tmp_table == NO_TMP_TABLE)
|
||||||
{
|
{
|
||||||
|
HA_DATA_PARTITION *ha_data= (HA_DATA_PARTITION*) table_share->ha_data;
|
||||||
auto_increment_lock= TRUE;
|
auto_increment_lock= TRUE;
|
||||||
pthread_mutex_lock(&table_share->mutex);
|
pthread_mutex_lock(&ha_data->LOCK_auto_inc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
virtual void unlock_auto_increment()
|
virtual void unlock_auto_increment()
|
||||||
@ -962,7 +964,8 @@ private:
|
|||||||
*/
|
*/
|
||||||
if(auto_increment_lock && !auto_increment_safe_stmt_log_lock)
|
if(auto_increment_lock && !auto_increment_safe_stmt_log_lock)
|
||||||
{
|
{
|
||||||
pthread_mutex_unlock(&table_share->mutex);
|
HA_DATA_PARTITION *ha_data= (HA_DATA_PARTITION*) table_share->ha_data;
|
||||||
|
pthread_mutex_unlock(&ha_data->LOCK_auto_inc);
|
||||||
auto_increment_lock= FALSE;
|
auto_increment_lock= FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
10
sql/table.cc
10
sql/table.cc
@ -425,6 +425,11 @@ void free_table_share(TABLE_SHARE *share)
|
|||||||
key_info->flags= 0;
|
key_info->flags= 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (share->ha_data_destroy)
|
||||||
|
{
|
||||||
|
share->ha_data_destroy(share->ha_data);
|
||||||
|
share->ha_data_destroy= NULL;
|
||||||
|
}
|
||||||
/* We must copy mem_root from share because share is allocated through it */
|
/* We must copy mem_root from share because share is allocated through it */
|
||||||
memcpy((char*) &mem_root, (char*) &share->mem_root, sizeof(mem_root));
|
memcpy((char*) &mem_root, (char*) &share->mem_root, sizeof(mem_root));
|
||||||
free_root(&mem_root, MYF(0)); // Free's share
|
free_root(&mem_root, MYF(0)); // Free's share
|
||||||
@ -1616,6 +1621,11 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, uchar *head,
|
|||||||
delete crypted;
|
delete crypted;
|
||||||
delete handler_file;
|
delete handler_file;
|
||||||
hash_free(&share->name_hash);
|
hash_free(&share->name_hash);
|
||||||
|
if (share->ha_data_destroy)
|
||||||
|
{
|
||||||
|
share->ha_data_destroy(share->ha_data);
|
||||||
|
share->ha_data_destroy= NULL;
|
||||||
|
}
|
||||||
|
|
||||||
open_table_error(share, error, share->open_errno, errarg);
|
open_table_error(share, error, share->open_errno, errarg);
|
||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
|
@ -463,6 +463,7 @@ typedef struct st_table_share
|
|||||||
|
|
||||||
/** place to store storage engine specific data */
|
/** place to store storage engine specific data */
|
||||||
void *ha_data;
|
void *ha_data;
|
||||||
|
void (*ha_data_destroy)(void *); /* An optional destructor for ha_data. */
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user