mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 20:12:31 +01:00
merge of bug#58147, including rename of the new argument,
to_binlog -> binlog_stmt.
This commit is contained in:
commit
1956220002
5 changed files with 112 additions and 6 deletions
56
mysql-test/r/partition_binlog.result
Normal file
56
mysql-test/r/partition_binlog.result
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
#
|
||||||
|
# Bug#58147: ALTER TABLE w/ TRUNCATE PARTITION fails
|
||||||
|
# but the statement is written to binlog
|
||||||
|
#
|
||||||
|
CREATE TABLE t1(id INT)
|
||||||
|
PARTITION BY RANGE (id)
|
||||||
|
(PARTITION p0 VALUES LESS THAN (100),
|
||||||
|
PARTITION pmax VALUES LESS THAN (MAXVALUE));
|
||||||
|
INSERT INTO t1 VALUES (1), (10), (100), (1000);
|
||||||
|
ALTER TABLE t1 TRUNCATE PARTITION p1;
|
||||||
|
ERROR HY000: Incorrect partition name
|
||||||
|
ALTER TABLE t1 DROP PARTITION p1;
|
||||||
|
ERROR HY000: Error in list of partitions to DROP
|
||||||
|
# No error returned, output in table format instead:
|
||||||
|
ALTER TABLE t1 ANALYZE PARTITION p1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze error Error in list of partitions to test.t1
|
||||||
|
ALTER TABLE t1 CHECK PARTITION p1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 check error Error in list of partitions to test.t1
|
||||||
|
ALTER TABLE t1 OPTIMIZE PARTITION p1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 optimize error Error in list of partitions to test.t1
|
||||||
|
ALTER TABLE t1 REPAIR PARTITION p1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 repair error Error in list of partitions to test.t1
|
||||||
|
ALTER TABLE t1 ANALYZE PARTITION p0;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze status OK
|
||||||
|
ALTER TABLE t1 CHECK PARTITION p0;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 check status OK
|
||||||
|
ALTER TABLE t1 OPTIMIZE PARTITION p0;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 optimize status OK
|
||||||
|
ALTER TABLE t1 REPAIR PARTITION p0;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 repair status OK
|
||||||
|
ALTER TABLE t1 TRUNCATE PARTITION p0;
|
||||||
|
ALTER TABLE t1 DROP PARTITION p0;
|
||||||
|
show binlog events in 'master-bin.000001' from <binlog_start>;
|
||||||
|
Log_name Pos Event_type Server_id End_log_pos Info
|
||||||
|
master-bin.000001 # Query # # use `test`; CREATE TABLE t1(id INT)
|
||||||
|
PARTITION BY RANGE (id)
|
||||||
|
(PARTITION p0 VALUES LESS THAN (100),
|
||||||
|
PARTITION pmax VALUES LESS THAN (MAXVALUE))
|
||||||
|
master-bin.000001 # Query # # BEGIN
|
||||||
|
master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (1), (10), (100), (1000)
|
||||||
|
master-bin.000001 # Query # # COMMIT
|
||||||
|
master-bin.000001 # Query # # use `test`; ALTER TABLE t1 ANALYZE PARTITION p0
|
||||||
|
master-bin.000001 # Query # # use `test`; ALTER TABLE t1 OPTIMIZE PARTITION p0
|
||||||
|
master-bin.000001 # Query # # use `test`; ALTER TABLE t1 REPAIR PARTITION p0
|
||||||
|
master-bin.000001 # Query # # use `test`; ALTER TABLE t1 TRUNCATE PARTITION p0
|
||||||
|
master-bin.000001 # Query # # use `test`; ALTER TABLE t1 DROP PARTITION p0
|
||||||
|
DROP TABLE t1;
|
42
mysql-test/t/partition_binlog.test
Normal file
42
mysql-test/t/partition_binlog.test
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
--source include/have_log_bin.inc
|
||||||
|
|
||||||
|
--disable_warnings
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug#58147: ALTER TABLE w/ TRUNCATE PARTITION fails
|
||||||
|
--echo # but the statement is written to binlog
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--let $binlog_file=query_get_value(SHOW MASTER STATUS, File, 1)
|
||||||
|
--let $binlog_start=query_get_value(SHOW MASTER STATUS, Position, 1)
|
||||||
|
|
||||||
|
CREATE TABLE t1(id INT)
|
||||||
|
PARTITION BY RANGE (id)
|
||||||
|
(PARTITION p0 VALUES LESS THAN (100),
|
||||||
|
PARTITION pmax VALUES LESS THAN (MAXVALUE));
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES (1), (10), (100), (1000);
|
||||||
|
|
||||||
|
--error ER_WRONG_PARTITION_NAME
|
||||||
|
ALTER TABLE t1 TRUNCATE PARTITION p1;
|
||||||
|
--error ER_DROP_PARTITION_NON_EXISTENT
|
||||||
|
ALTER TABLE t1 DROP PARTITION p1;
|
||||||
|
|
||||||
|
--echo # No error returned, output in table format instead:
|
||||||
|
ALTER TABLE t1 ANALYZE PARTITION p1;
|
||||||
|
ALTER TABLE t1 CHECK PARTITION p1;
|
||||||
|
ALTER TABLE t1 OPTIMIZE PARTITION p1;
|
||||||
|
ALTER TABLE t1 REPAIR PARTITION p1;
|
||||||
|
|
||||||
|
ALTER TABLE t1 ANALYZE PARTITION p0;
|
||||||
|
ALTER TABLE t1 CHECK PARTITION p0;
|
||||||
|
ALTER TABLE t1 OPTIMIZE PARTITION p0;
|
||||||
|
ALTER TABLE t1 REPAIR PARTITION p0;
|
||||||
|
ALTER TABLE t1 TRUNCATE PARTITION p0;
|
||||||
|
ALTER TABLE t1 DROP PARTITION p0;
|
||||||
|
|
||||||
|
--source include/show_binlog_events.inc
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
|
@ -3428,7 +3428,7 @@ int ha_partition::truncate()
|
||||||
ALTER TABLE t TRUNCATE PARTITION ...
|
ALTER TABLE t TRUNCATE PARTITION ...
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int ha_partition::truncate_partition(Alter_info *alter_info)
|
int ha_partition::truncate_partition(Alter_info *alter_info, bool *binlog_stmt)
|
||||||
{
|
{
|
||||||
int error= 0;
|
int error= 0;
|
||||||
List_iterator<partition_element> part_it(m_part_info->partitions);
|
List_iterator<partition_element> part_it(m_part_info->partitions);
|
||||||
|
@ -3440,6 +3440,9 @@ int ha_partition::truncate_partition(Alter_info *alter_info)
|
||||||
PART_ADMIN);
|
PART_ADMIN);
|
||||||
DBUG_ENTER("ha_partition::truncate_partition");
|
DBUG_ENTER("ha_partition::truncate_partition");
|
||||||
|
|
||||||
|
/* Only binlog when it starts any call to the partitions handlers */
|
||||||
|
*binlog_stmt= false;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
TRUNCATE also means resetting auto_increment. Hence, reset
|
TRUNCATE also means resetting auto_increment. Hence, reset
|
||||||
it so that it will be initialized again at the next use.
|
it so that it will be initialized again at the next use.
|
||||||
|
@ -3453,6 +3456,8 @@ int ha_partition::truncate_partition(Alter_info *alter_info)
|
||||||
(!(alter_info->flags & ALTER_ALL_PARTITION)))
|
(!(alter_info->flags & ALTER_ALL_PARTITION)))
|
||||||
DBUG_RETURN(HA_ERR_NO_PARTITION_FOUND);
|
DBUG_RETURN(HA_ERR_NO_PARTITION_FOUND);
|
||||||
|
|
||||||
|
*binlog_stmt= true;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
partition_element *part_elem= part_it++;
|
partition_element *part_elem= part_it++;
|
||||||
|
|
|
@ -362,7 +362,7 @@ public:
|
||||||
@remark This method is a partitioning-specific hook
|
@remark This method is a partitioning-specific hook
|
||||||
and thus not a member of the general SE API.
|
and thus not a member of the general SE API.
|
||||||
*/
|
*/
|
||||||
int truncate_partition(Alter_info *);
|
int truncate_partition(Alter_info *, bool *binlog_stmt);
|
||||||
|
|
||||||
virtual bool is_fatal_error(int error, uint flags)
|
virtual bool is_fatal_error(int error, uint flags)
|
||||||
{
|
{
|
||||||
|
|
|
@ -110,6 +110,7 @@ bool Alter_table_truncate_partition_statement::execute(THD *thd)
|
||||||
ha_partition *partition;
|
ha_partition *partition;
|
||||||
ulong timeout= thd->variables.lock_wait_timeout;
|
ulong timeout= thd->variables.lock_wait_timeout;
|
||||||
TABLE_LIST *first_table= thd->lex->select_lex.table_list.first;
|
TABLE_LIST *first_table= thd->lex->select_lex.table_list.first;
|
||||||
|
bool binlog_stmt;
|
||||||
DBUG_ENTER("Alter_table_truncate_partition_statement::execute");
|
DBUG_ENTER("Alter_table_truncate_partition_statement::execute");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -161,16 +162,18 @@ bool Alter_table_truncate_partition_statement::execute(THD *thd)
|
||||||
partition= (ha_partition *) first_table->table->file;
|
partition= (ha_partition *) first_table->table->file;
|
||||||
|
|
||||||
/* Invoke the handler method responsible for truncating the partition. */
|
/* Invoke the handler method responsible for truncating the partition. */
|
||||||
if ((error= partition->truncate_partition(&thd->lex->alter_info)))
|
if ((error= partition->truncate_partition(&thd->lex->alter_info,
|
||||||
|
&binlog_stmt)))
|
||||||
first_table->table->file->print_error(error, MYF(0));
|
first_table->table->file->print_error(error, MYF(0));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
All effects of a truncate operation are committed even if the
|
All effects of a truncate operation are committed even if the
|
||||||
operation fails. Thus, the query must be written to the binary
|
operation fails. Thus, the query must be written to the binary
|
||||||
log. The only exception is a unimplemented truncate method. Also,
|
log. The exception is a unimplemented truncate method or failure
|
||||||
it is logged in statement format, regardless of the binlog format.
|
before any call to handler::truncate() is done.
|
||||||
|
Also, it is logged in statement format, regardless of the binlog format.
|
||||||
*/
|
*/
|
||||||
if (error != HA_ERR_WRONG_COMMAND)
|
if (error != HA_ERR_WRONG_COMMAND && binlog_stmt)
|
||||||
error|= write_bin_log(thd, !error, thd->query(), thd->query_length());
|
error|= write_bin_log(thd, !error, thd->query(), thd->query_length());
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue