From: Andrei Elkin Date: December 21 2010 10:55am Subject: bzr commit into mysql-trunk-bugfixing branch (andrei.elkin:3459) List-Archive: http://lists.mysql.com/commits/127387 Message-Id: <201012211055.oBLAtKce007978@mysql1000.dsl.inet.fi> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1694926186==" --===============1694926186== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/andrei/MySQL/BZR/2a-23May/mysql-trunk-bugfixing/ based on revid:andrei.elkin@stripped 3459 Andrei Elkin 2010-12-21 [merge] merge from mysql-trunk-bugfixing repo to local branch with bug fixes modified: mysql-test/extra/rpl_tests/rpl_auto_increment.test mysql-test/suite/rpl/r/rpl_auto_increment.result sql/log_event.cc sql/log_event.h sql/rpl_record.cc sql/rpl_record.h === modified file 'mysql-test/extra/rpl_tests/rpl_auto_increment.test' --- a/mysql-test/extra/rpl_tests/rpl_auto_increment.test 2010-12-19 17:22:30 +0000 +++ b/mysql-test/extra/rpl_tests/rpl_auto_increment.test 2010-12-21 10:39:20 +0000 @@ -229,5 +229,31 @@ source include/diff_tables.inc; DROP TABLE t1; DROP TABLE t2; SET SQL_MODE=''; +sync_slave_with_master; + +# +# BUG#56662 +# The test verifies if the assertion of "next_insert_id == 0" +# will fail in ha_external_lock() function. +# +connection master; +CREATE TABLE t1 (id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, data INT) ENGINE=innodb; + +BEGIN; +--echo # Set sql_mode with NO_AUTO_VALUE_ON_ZERO for allowing +--echo # zero to fill the auto_increment field. +SET SQL_MODE=NO_AUTO_VALUE_ON_ZERO; +INSERT INTO t1(id,data) VALUES(0,2); +--echo # Resetting sql_mode without NO_AUTO_VALUE_ON_ZERO to +--echo # affect the execution of the transaction on slave. +SET SQL_MODE=0; +COMMIT; +SELECT * FROM t1; +sync_slave_with_master; +SELECT * FROM t1; + +connection master; +DROP TABLE t1; +sync_slave_with_master; --source include/rpl_end.inc === modified file 'mysql-test/suite/rpl/r/rpl_auto_increment.result' --- a/mysql-test/suite/rpl/r/rpl_auto_increment.result 2010-12-19 17:07:28 +0000 +++ b/mysql-test/suite/rpl/r/rpl_auto_increment.result 2010-12-21 04:47:22 +0000 @@ -303,4 +303,21 @@ include/diff_tables.inc [master:t2, slav DROP TABLE t1; DROP TABLE t2; SET SQL_MODE=''; +CREATE TABLE t1 (id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, data INT) ENGINE=innodb; +BEGIN; +# Set sql_mode with NO_AUTO_VALUE_ON_ZERO for allowing +# zero to fill the auto_increment field. +SET SQL_MODE=NO_AUTO_VALUE_ON_ZERO; +INSERT INTO t1(id,data) VALUES(0,2); +# Resetting sql_mode without NO_AUTO_VALUE_ON_ZERO to +# affect the execution of the transaction on slave. +SET SQL_MODE=0; +COMMIT; +SELECT * FROM t1; +id data +0 2 +SELECT * FROM t1; +id data +0 2 +DROP TABLE t1; include/rpl_end.inc === modified file 'sql/log_event.cc' --- a/sql/log_event.cc 2010-12-14 17:37:12 +0000 +++ b/sql/log_event.cc 2010-12-21 10:39:20 +0000 @@ -8089,6 +8089,14 @@ int Rows_log_event::do_apply_event(Relay // Do event specific preparations error= do_before_row_operations(rli); + /* + Bug#56662 Assertion failed: next_insert_id == 0, file handler.cc + Don't allow generation of auto_increment value when processing + rows event by setting 'MODE_NO_AUTO_VALUE_ON_ZERO'. + */ + ulong saved_sql_mode= thd->variables.sql_mode; + thd->variables.sql_mode= MODE_NO_AUTO_VALUE_ON_ZERO; + // row processing loop while (error == 0) @@ -8155,6 +8163,11 @@ int Rows_log_event::do_apply_event(Relay break; } // row processing loop + /* + Restore the sql_mode after the rows event is processed. + */ + thd->variables.sql_mode= saved_sql_mode; + {/** The following failure injecion works in cooperation with tests setting @@global.debug= 'd,stop_slave_middle_group'. @@ -9124,16 +9137,11 @@ Rows_log_event::write_row(const Relay_lo int UNINIT_VAR(keynum); auto_afree_ptr key(NULL); - /* fill table->record[0] with default values */ - bool abort_on_warnings= (rli->info_thd->variables.sql_mode & - (MODE_STRICT_TRANS_TABLES | MODE_STRICT_ALL_TABLES)); - if ((error= prepare_record(table, &m_cols, - table->file->ht->db_type != DB_TYPE_NDBCLUSTER, - abort_on_warnings, m_curr_row == m_rows_buf))) - DBUG_RETURN(error); - + prepare_record(table, &m_cols, + table->file->ht->db_type != DB_TYPE_NDBCLUSTER); + /* unpack row into table->record[0] */ - if ((error= unpack_current_row(rli, &m_cols, abort_on_warnings))) + if ((error= unpack_current_row(rli, &m_cols))) DBUG_RETURN(error); // Temporary fix to find out why it fails [/Matz] @@ -10255,11 +10263,9 @@ Update_rows_log_event::do_exec_row(const store_record(m_table,record[1]); - bool abort_on_warnings= (rli->info_thd->variables.sql_mode & - (MODE_STRICT_TRANS_TABLES | MODE_STRICT_ALL_TABLES)); m_curr_row= m_curr_row_end; /* this also updates m_curr_row_end */ - if ((error= unpack_current_row(rli, &m_cols_ai, abort_on_warnings))) + if ((error= unpack_current_row(rli, &m_cols_ai))) return error; /* === modified file 'sql/log_event.h' --- a/sql/log_event.h 2010-12-05 22:51:49 +0000 +++ b/sql/log_event.h 2010-12-21 10:39:20 +0000 @@ -3694,16 +3694,13 @@ protected: // Unpack the current row into m_table->record[0] int unpack_current_row(const Relay_log_info *const rli, - MY_BITMAP const *cols, - const bool abort_on_warning= TRUE) + MY_BITMAP const *cols) { DBUG_ASSERT(m_table); - bool first_row= (m_curr_row == m_rows_buf); ASSERT_OR_RETURN_ERROR(m_curr_row <= m_rows_end, HA_ERR_CORRUPT_EVENT); int const result= ::unpack_row(rli, m_table, m_width, m_curr_row, cols, - &m_curr_row_end, &m_master_reclength, - abort_on_warning, first_row); + &m_curr_row_end, &m_master_reclength); if (m_curr_row_end > m_rows_end) my_error(ER_SLAVE_CORRUPT_EVENT, MYF(0)); ASSERT_OR_RETURN_ERROR(m_curr_row_end <= m_rows_end, HA_ERR_CORRUPT_EVENT); === modified file 'sql/rpl_record.cc' --- a/sql/rpl_record.cc 2010-11-07 23:44:51 +0000 +++ b/sql/rpl_record.cc 2010-12-21 10:39:20 +0000 @@ -196,8 +196,7 @@ int unpack_row(Relay_log_info const *rli, TABLE *table, uint const colcnt, uchar const *const row_data, MY_BITMAP const *cols, - uchar const **const row_end, ulong *const master_reclength, - const bool abort_on_warning, const bool first_row) + uchar const **const row_end, ulong *const master_reclength) { DBUG_ENTER("unpack_row"); DBUG_ASSERT(row_data); @@ -313,22 +312,9 @@ unpack_row(Relay_log_info const *rli, } else { - MYSQL_ERROR::enum_warning_level error_type= - MYSQL_ERROR::WARN_LEVEL_NOTE; - if (abort_on_warning && (table->file->has_transactions() || - first_row)) - { - error = HA_ERR_ROWS_EVENT_APPLY; - error_type= MYSQL_ERROR::WARN_LEVEL_ERROR; - } - else - { - f->set_default(); - error_type= MYSQL_ERROR::WARN_LEVEL_WARN; - } - push_warning_printf(current_thd, error_type, - ER_BAD_NULL_ERROR, - ER(ER_BAD_NULL_ERROR), + f->set_default(); + push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_BAD_NULL_ERROR, ER(ER_BAD_NULL_ERROR), f->field_name); } } @@ -458,19 +444,13 @@ unpack_row(Relay_log_info const *rli, @param table Table whose record[0] buffer is prepared. @param check Specifies if lack of default error needs checking. - @param abort_on_warning - Controls how to react on lack of a field's default. - The parameter mimics the master side one for - @c check_that_all_fields_are_given_values. - + @returns 0 on success or a handler level error code */ -int prepare_record(TABLE *const table, const MY_BITMAP *cols, const bool check, - const bool abort_on_warning, const bool first_row) +int prepare_record(TABLE *const table, const MY_BITMAP *cols, const bool check) { DBUG_ENTER("prepare_record"); - int error= 0; restore_record(table, s->default_values); if (!check) @@ -493,28 +473,17 @@ int prepare_record(TABLE *const table, c if ((f->flags & NO_DEFAULT_VALUE_FLAG) && (f->real_type() != MYSQL_TYPE_ENUM)) { - MYSQL_ERROR::enum_warning_level error_type= - MYSQL_ERROR::WARN_LEVEL_NOTE; - if (abort_on_warning && (table->file->has_transactions() || - first_row)) - { - error= HA_ERR_ROWS_EVENT_APPLY; - error_type= MYSQL_ERROR::WARN_LEVEL_ERROR; - } - else - { - DBUG_PRINT("debug", ("Set default; field: %s", f->field_name)); - f->set_default(); - error_type= MYSQL_ERROR::WARN_LEVEL_WARN; - } - push_warning_printf(current_thd, error_type, + f->set_default(); + push_warning_printf(current_thd, + MYSQL_ERROR::WARN_LEVEL_WARN, ER_NO_DEFAULT_FOR_FIELD, ER(ER_NO_DEFAULT_FOR_FIELD), f->field_name); } } } - DBUG_RETURN(error); + + DBUG_RETURN(0); } #endif // HAVE_REPLICATION === modified file 'sql/rpl_record.h' --- a/sql/rpl_record.h 2010-09-04 00:46:58 +0000 +++ b/sql/rpl_record.h 2010-12-21 10:39:20 +0000 @@ -32,14 +32,10 @@ size_t pack_row(TABLE* table, MY_BITMAP int unpack_row(Relay_log_info const *rli, TABLE *table, uint const colcnt, uchar const *const row_data, MY_BITMAP const *cols, - uchar const **const row_end, ulong *const master_reclength, - const bool abort_on_warning= TRUE, const bool first_row= TRUE); + uchar const **const row_end, ulong *const master_reclength); // Fill table's record[0] with default values. -int prepare_record(TABLE *const table, const MY_BITMAP *cols, - const bool check, - const bool abort_on_warning= TRUE, - const bool first_row= TRUE); +int prepare_record(TABLE *const table, const MY_BITMAP *cols, const bool check); #endif #endif --===============1694926186== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/andrei.elkin@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: andrei.elkin@stripped # target_branch: file:///home/andrei/MySQL/BZR/2a-23May/mysql-trunk-\ # bugfixing/ # testament_sha1: 148f17bd365ebfbc1583c1eec35fbf65b6452757 # timestamp: 2010-12-21 12:55:20 +0200 # source_branch: file:///home/andrei/MySQL/BZR/2a-23May/mysql-trunk/ # base_revision_id: andrei.elkin@stripped\ # 2aq93spul5i5crqs # # Begin bundle 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 --===============1694926186==--