Commit c144e1a2 authored by unknown's avatar unknown

Fixed bug #5835 load data infile...replace error with InnoDB table.


sql/ha_innodb.cc:
  Note that LOAD DATA INFILE REPLACE also handles a duplicate key error
  itself, and we must not decrement the autoinc counter if we are
  performing that statement.
parent 234a8ec0
...@@ -2445,9 +2445,10 @@ ha_innobase::write_row( ...@@ -2445,9 +2445,10 @@ ha_innobase::write_row(
/* If the insert did not succeed we restore the value of /* If the insert did not succeed we restore the value of
the auto-inc counter we used; note that this behavior was the auto-inc counter we used; note that this behavior was
introduced only in version 4.0.4. introduced only in version 4.0.4.
NOTE that a REPLACE command handles a duplicate key error NOTE that a REPLACE command and LOAD DATA INFILE REPLACE
handles a duplicate key error
itself, and we must not decrement the autoinc counter itself, and we must not decrement the autoinc counter
if we are performing a REPLACE statement. if we are performing a those statements.
NOTE 2: if there was an error, for example a deadlock, NOTE 2: if there was an error, for example a deadlock,
which caused InnoDB to roll back the whole transaction which caused InnoDB to roll back the whole transaction
already in the call of row_insert_for_mysql(), we may no already in the call of row_insert_for_mysql(), we may no
...@@ -2459,7 +2460,9 @@ ha_innobase::write_row( ...@@ -2459,7 +2460,9 @@ ha_innobase::write_row(
if (error == DB_DUPLICATE_KEY if (error == DB_DUPLICATE_KEY
&& (user_thd->lex->sql_command == SQLCOM_REPLACE && (user_thd->lex->sql_command == SQLCOM_REPLACE
|| user_thd->lex->sql_command || user_thd->lex->sql_command
== SQLCOM_REPLACE_SELECT)) { == SQLCOM_REPLACE_SELECT
|| (user_thd->lex->sql_command == SQLCOM_LOAD
&& user_thd->lex->duplicates == DUP_REPLACE))) {
skip_auto_inc_decr= TRUE; skip_auto_inc_decr= TRUE;
} }
...@@ -5484,6 +5487,7 @@ innobase_query_is_replace(void) ...@@ -5484,6 +5487,7 @@ innobase_query_is_replace(void)
thd = (THD *)innobase_current_thd(); thd = (THD *)innobase_current_thd();
if ( thd->lex->sql_command == SQLCOM_REPLACE || if ( thd->lex->sql_command == SQLCOM_REPLACE ||
thd->lex->sql_command == SQLCOM_REPLACE_SELECT ||
( thd->lex->sql_command == SQLCOM_LOAD && ( thd->lex->sql_command == SQLCOM_LOAD &&
thd->lex->duplicates == DUP_REPLACE )) { thd->lex->duplicates == DUP_REPLACE )) {
return true; return true;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment