diff options
author | unknown <evgen@moonbone.local> | 2005-06-21 22:24:58 +0400 |
---|---|---|
committer | unknown <evgen@moonbone.local> | 2005-06-21 22:24:58 +0400 |
commit | 8e45c0572bf6503b1fd126428aac203c90c949b7 (patch) | |
tree | 2dc3ef783956f27b3244a249ace5d574f63ca4d9 /sql/sql_insert.cc | |
parent | c7a681ff94d3f39360a53d940398931dd55aad66 (diff) | |
download | mariadb-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.cc | 19 |
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); } |