diff options
author | unknown <aelkin@dl145j.mysql.com> | 2007-09-15 21:25:56 +0200 |
---|---|---|
committer | unknown <aelkin@dl145j.mysql.com> | 2007-09-15 21:25:56 +0200 |
commit | e35c1ab9a287264ec167f6c17c690aabbf921715 (patch) | |
tree | fc09beb28356b1412aac29629c639e209c908fe6 /sql/sql_insert.cc | |
parent | 48f38afb8ee84ea6a08710374a54098581683444 (diff) | |
parent | 69604f4db10f125651ab0620320dbd91253c5bc6 (diff) | |
download | mariadb-git-e35c1ab9a287264ec167f6c17c690aabbf921715.tar.gz |
Merge dl145j.mysql.com:/tmp/andrei/mysql-5.0-rpl
into dl145j.mysql.com:/tmp/andrei/5.1-merge
BitKeeper/deleted/.del-sp_trans_log.result:
Auto merged
BitKeeper/deleted/.del-sp_trans_log.test:
Auto merged
mysql-test/suite/rpl/r/rpl_packet.result:
Auto merged
sql/sql_delete.cc:
Auto merged
sql/sql_update.cc:
Auto merged
mysql-test/suite/binlog/r/binlog_stm_mix_innodb_myisam.result:
should be re-recorded
mysql-test/extra/binlog_tests/mix_innodb_myisam_binlog.test:
manual merge
mysql-test/suite/rpl/t/rpl_packet.test:
manual merge
sql/slave.cc:
manual merge
sql/sql_insert.cc:
manual merge - installing 5.0 patch logics
sql/sql_load.cc:
manual merge
Diffstat (limited to 'sql/sql_insert.cc')
-rw-r--r-- | sql/sql_insert.cc | 87 |
1 files changed, 43 insertions, 44 deletions
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 157309a3366..16ad280c690 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -839,59 +839,58 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list, } transactional_table= table->file->has_transactions(); - if ((changed= (info.copied || info.deleted || info.updated)) || - was_insert_delayed) + if ((changed= (info.copied || info.deleted || info.updated))) { /* Invalidate the table in the query cache if something changed. For the transactional algorithm to work the invalidation must be before binlog writing and ha_autocommit_or_rollback */ - if (changed) - query_cache_invalidate3(thd, table_list, 1); - if (error <= 0 || !transactional_table) + query_cache_invalidate3(thd, table_list, 1); + } + if (changed && error <= 0 || thd->transaction.stmt.modified_non_trans_table + || was_insert_delayed) + { + if (mysql_bin_log.is_open()) { - if (mysql_bin_log.is_open()) + if (error <= 0) { - if (error <= 0) - { - /* - [Guilhem wrote] Temporary errors may have filled - thd->net.last_error/errno. For example if there has - been a disk full error when writing the row, and it was - MyISAM, then thd->net.last_error/errno will be set to - "disk full"... and the my_pwrite() will wait until free - space appears, and so when it finishes then the - write_row() was entirely successful - */ - /* todo: consider removing */ - thd->clear_error(); - } - /* bug#22725: - - A query which per-row-loop can not be interrupted with - KILLED, like INSERT, and that does not invoke stored - routines can be binlogged with neglecting the KILLED error. - - If there was no error (error == zero) until after the end of - inserting loop the KILLED flag that appeared later can be - disregarded since previously possible invocation of stored - routines did not result in any error due to the KILLED. In - such case the flag is ignored for constructing binlog event. - */ - DBUG_ASSERT(thd->killed != THD::KILL_BAD_DATA || error > 0); - if (thd->binlog_query(THD::ROW_QUERY_TYPE, - thd->query, thd->query_length, - transactional_table, FALSE, - (error>0) ? thd->killed : THD::NOT_KILLED) && - transactional_table) - { - error=1; - } - } - if (thd->transaction.stmt.modified_non_trans_table) - thd->transaction.all.modified_non_trans_table= TRUE; + /* + [Guilhem wrote] Temporary errors may have filled + thd->net.last_error/errno. For example if there has + been a disk full error when writing the row, and it was + MyISAM, then thd->net.last_error/errno will be set to + "disk full"... and the my_pwrite() will wait until free + space appears, and so when it finishes then the + write_row() was entirely successful + */ + /* todo: consider removing */ + thd->clear_error(); + } + /* bug#22725: + + A query which per-row-loop can not be interrupted with + KILLED, like INSERT, and that does not invoke stored + routines can be binlogged with neglecting the KILLED error. + + If there was no error (error == zero) until after the end of + inserting loop the KILLED flag that appeared later can be + disregarded since previously possible invocation of stored + routines did not result in any error due to the KILLED. In + such case the flag is ignored for constructing binlog event. + */ + DBUG_ASSERT(thd->killed != THD::KILL_BAD_DATA || error > 0); + if (thd->binlog_query(THD::ROW_QUERY_TYPE, + thd->query, thd->query_length, + transactional_table, FALSE, + (error>0) ? thd->killed : THD::NOT_KILLED) && + transactional_table) + { + error=1; + } } + if (thd->transaction.stmt.modified_non_trans_table) + thd->transaction.all.modified_non_trans_table= TRUE; } DBUG_ASSERT(transactional_table || !changed || thd->transaction.stmt.modified_non_trans_table); |