summaryrefslogtreecommitdiff
path: root/sql/sql_insert.cc
diff options
context:
space:
mode:
authorunknown <evgen@moonbone.local>2005-06-21 22:24:58 +0400
committerunknown <evgen@moonbone.local>2005-06-21 22:24:58 +0400
commit8e45c0572bf6503b1fd126428aac203c90c949b7 (patch)
tree2dc3ef783956f27b3244a249ace5d574f63ca4d9 /sql/sql_insert.cc
parentc7a681ff94d3f39360a53d940398931dd55aad66 (diff)
downloadmariadb-git-8e45c0572bf6503b1fd126428aac203c90c949b7.tar.gz
Fix bug #10886 - INSERT ... SELECT ... ON DUPLICATE KEY UPDATE produces bad results
Temporary field wasn't restored to default values after ON DUPLICATE KEY UPDATE event, which results in wrong data being inserted in new record. sql/sql_insert.cc: Fix bug #10886 - INSERT ... SELECT ... ON DUPLICATE KEY UPDATE produces bad results mysql-test/t/insert_select.test: Test case for bug #10886 - INSERT ... SELECT ... ON DUPLICATE KEY UPDATE produces bad results mysql-test/r/insert_select.result: Test case for bug #10886 - INSERT ... SELECT ... ON DUPLICATE KEY UPDATE produces bad results
Diffstat (limited to 'sql/sql_insert.cc')
-rw-r--r--sql/sql_insert.cc19
1 files changed, 15 insertions, 4 deletions
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index 718e6b00ddc..1b3c58032f2 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -1625,11 +1625,22 @@ bool select_insert::send_data(List<Item> &values)
store_values(values);
error=thd->net.report_error || write_record(table,&info);
thd->count_cuted_fields= CHECK_FIELD_IGNORE;
- if (!error && table->next_number_field) // Clear for next record
+
+ if (!error)
{
- table->next_number_field->reset();
- if (! last_insert_id && thd->insert_id_used)
- last_insert_id=thd->insert_id();
+ /*
+ Restore fields of the record since it is possible that they were
+ changed by ON DUPLICATE KEY UPDATE clause.
+ */
+ if (info.handle_duplicates == DUP_UPDATE)
+ restore_record(table, default_values);
+
+ if (table->next_number_field) // Clear for next record
+ {
+ table->next_number_field->reset();
+ if (! last_insert_id && thd->insert_id_used)
+ last_insert_id=thd->insert_id();
+ }
}
DBUG_RETURN(error);
}