1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

mysql-5.5.38 merge

This commit is contained in:
Sergei Golubchik
2014-06-03 09:55:08 +02:00
29 changed files with 529 additions and 93 deletions

View File

@ -1,4 +1,4 @@
/* Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
/* Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -182,12 +182,19 @@ fk_truncate_illegal_if_parent(THD *thd, TABLE *table)
@param table_ref Table list element for the table to be truncated.
@param is_tmp_table True if element refers to a temp table.
@retval 0 Success.
@retval > 0 Error code.
@retval TRUNCATE_OK Truncate was successful and statement can be safely
binlogged.
@retval TRUNCATE_FAILED_BUT_BINLOG Truncate failed but still go ahead with
binlogging as in case of non transactional tables
partial truncation is possible.
@retval TRUNCATE_FAILED_SKIP_BINLOG Truncate was not successful hence donot
binlong the statement.
*/
int Truncate_statement::handler_truncate(THD *thd, TABLE_LIST *table_ref,
bool is_tmp_table)
enum Truncate_statement::truncate_result
Truncate_statement::handler_truncate(THD *thd, TABLE_LIST *table_ref,
bool is_tmp_table)
{
int error= 0;
uint flags;
@ -229,16 +236,30 @@ int Truncate_statement::handler_truncate(THD *thd, TABLE_LIST *table_ref,
/* Open the table as it will handle some required preparations. */
if (open_and_lock_tables(thd, table_ref, FALSE, flags))
DBUG_RETURN(1);
DBUG_RETURN(TRUNCATE_FAILED_SKIP_BINLOG);
/* Whether to truncate regardless of foreign keys. */
if (! (thd->variables.option_bits & OPTION_NO_FOREIGN_KEY_CHECKS))
error= fk_truncate_illegal_if_parent(thd, table_ref->table);
if (fk_truncate_illegal_if_parent(thd, table_ref->table))
DBUG_RETURN(TRUNCATE_FAILED_SKIP_BINLOG);
if (!error && (error= table_ref->table->file->ha_truncate()))
error= table_ref->table->file->ha_truncate();
if (error)
{
table_ref->table->file->print_error(error, MYF(0));
DBUG_RETURN(error);
/*
If truncate method is not implemented then we don't binlog the
statement. If truncation has failed in a transactional engine then also we
donot binlog the statment. Only in non transactional engine we binlog
inspite of errors.
*/
if (error == HA_ERR_WRONG_COMMAND ||
table_ref->table->file->has_transactions())
DBUG_RETURN(TRUNCATE_FAILED_SKIP_BINLOG);
else
DBUG_RETURN(TRUNCATE_FAILED_BUT_BINLOG);
}
DBUG_RETURN(TRUNCATE_OK);
}
@ -473,10 +494,14 @@ bool Truncate_statement::truncate_table(THD *thd, TABLE_LIST *table_ref)
/*
All effects of a TRUNCATE TABLE operation are committed even if
truncation fails. Thus, the query must be written to the binary
log. The only exception is a unimplemented truncate method.
truncation fails in the case of non transactional tables. Thus, the
query must be written to the binary log. The only exception is a
unimplemented truncate method.
*/
binlog_stmt= !error || error != HA_ERR_WRONG_COMMAND;
if (error == TRUNCATE_OK || error == TRUNCATE_FAILED_BUT_BINLOG)
binlog_stmt= true;
else
binlog_stmt= false;
}
/*