1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-27 18:02:13 +03:00

Bug#42643: InnoDB does not support replication of TRUNCATE TABLE

Post-merge fix: Retrieve handler statistics to workaround quirks
of the archive storage engine.
This commit is contained in:
Davi Arnaut
2010-05-27 17:40:54 -03:00
parent 303fe45abf
commit 2d3e5019d4
3 changed files with 39 additions and 0 deletions

View File

@ -51,6 +51,22 @@ delete_all_rows(THD *thd, TABLE *table)
/* Replication of truncate table must be statement based. */
thd->clear_current_stmt_binlog_format_row();
/*
Update handler statistics (e.g. table->file->stats.records).
Might be used by the storage engine to aggregate information
necessary to allow deletion. Currently, this seems to be
meaningful only to the archive storage engine, which uses
the info method to set the number of records. Although
archive does not support deletion, it becomes necessary in
order to return a error if the table is not empty.
*/
error= table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
if (error && error != HA_ERR_WRONG_COMMAND)
{
table->file->print_error(error, MYF(0));
goto end;
}
/*
Attempt to delete all rows in the table.
If it is unsupported, switch to row by row deletion.
@ -455,6 +471,11 @@ bool mysql_truncate_table(THD *thd, TABLE_LIST *table_ref)
trans_rollback(thd);
}
/*
A locked table ticket was upgraded to a exclusive lock. After the
the query has been written to the binary log, downgrade the lock
to a shared one.
*/
if (mdl_ticket)
mdl_ticket->downgrade_exclusive_lock(MDL_SHARED_NO_READ_WRITE);