summaryrefslogtreecommitdiff
path: root/sql/sql_truncate.cc
diff options
context:
space:
mode:
authorSergei Golubchik <sergii@pisem.net>2014-06-03 09:55:08 +0200
committerSergei Golubchik <sergii@pisem.net>2014-06-03 09:55:08 +0200
commit5d16592d44d8dd7147ee868c661af842ec0f1568 (patch)
tree57f83c95bf23bdb90bd05e1134ffaaa0e015249f /sql/sql_truncate.cc
parent2d687cad5d1154418603a16e58772d91f37d4cbd (diff)
parentc1fd09f3d4848ae59605564ded9628307d59dd27 (diff)
downloadmariadb-git-5d16592d44d8dd7147ee868c661af842ec0f1568.tar.gz
mysql-5.5.38 merge
Diffstat (limited to 'sql/sql_truncate.cc')
-rw-r--r--sql/sql_truncate.cc51
1 files changed, 38 insertions, 13 deletions
diff --git a/sql/sql_truncate.cc b/sql/sql_truncate.cc
index d47fb24eaba..92fc4205656 100644
--- a/sql/sql_truncate.cc
+++ b/sql/sql_truncate.cc
@@ -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;
}
/*