diff options
author | Satya B <satya.bn@sun.com> | 2009-06-25 15:20:26 +0530 |
---|---|---|
committer | Satya B <satya.bn@sun.com> | 2009-06-25 15:20:26 +0530 |
commit | faaa9e0855ceaee0ba3611e21b4e7ee69659a9ae (patch) | |
tree | 7438949577fe62c1788f2b5a62b9d36dbef7eb96 | |
parent | 0158cafab9275dcba4f718be1c92bbeb923ca26d (diff) | |
download | mariadb-git-faaa9e0855ceaee0ba3611e21b4e7ee69659a9ae.tar.gz |
Applying InnoDB snashot 5.0-ss5406, part 2. Fixes BUG#40565
BUG#40565 - Update Query Results in "1 Row Affected" But Should Be "Zero Rows"
Detailed revision comments:
r5232 | marko | 2009-06-03 14:31:04 +0300 (Wed, 03 Jun 2009) | 21 lines
branches/5.0: Merge r3590 from branches/5.1 in order to fix Bug #40565
(Update Query Results in "1 Row Affected" But Should Be "Zero Rows").
Also, add a test case for Bug #40565.
rb://128 approved by Heikki Tuuri
------------------------------------------------------------------------
r3590 | marko | 2008-12-18 15:33:36 +0200 (Thu, 18 Dec 2008) | 11 lines
branches/5.1: When converting a record to MySQL format, copy the default
column values for columns that are SQL NULL. This addresses failures in
row-based replication (Bug #39648).
row_prebuilt_t: Add default_rec, for the default values of the columns in
MySQL format.
row_sel_store_mysql_rec(): Use prebuilt->default_rec instead of
padding columns.
rb://64 approved by Heikki Tuuri
------------------------------------------------------------------------
-rw-r--r-- | innobase/include/row0mysql.h | 2 | ||||
-rw-r--r-- | innobase/row/row0mysql.c | 2 | ||||
-rw-r--r-- | innobase/row/row0sel.c | 57 | ||||
-rw-r--r-- | mysql-test/r/innodb_bug40565.result | 9 | ||||
-rw-r--r-- | mysql-test/t/innodb_bug40565.test | 10 | ||||
-rw-r--r-- | sql/ha_innodb.cc | 3 |
6 files changed, 33 insertions, 50 deletions
diff --git a/innobase/include/row0mysql.h b/innobase/include/row0mysql.h index 9e28fabe491..2349539eafd 100644 --- a/innobase/include/row0mysql.h +++ b/innobase/include/row0mysql.h @@ -581,6 +581,8 @@ struct row_prebuilt_struct { byte* ins_upd_rec_buff;/* buffer for storing data converted to the Innobase format from the MySQL format */ + const void* default_rec; /* the default values of all columns + (a "default row") in MySQL format */ ulint hint_need_to_fetch_extra_cols; /* normally this is set to 0; if this is set to ROW_RETRIEVE_PRIMARY_KEY, diff --git a/innobase/row/row0mysql.c b/innobase/row/row0mysql.c index cab6a9ce272..75c54cec4b3 100644 --- a/innobase/row/row0mysql.c +++ b/innobase/row/row0mysql.c @@ -626,6 +626,8 @@ row_create_prebuilt( prebuilt->ins_upd_rec_buff = NULL; + prebuilt->default_rec = NULL; + prebuilt->hint_need_to_fetch_extra_cols = 0; prebuilt->upd_node = NULL; diff --git a/innobase/row/row0sel.c b/innobase/row/row0sel.c index c956492900d..973d8fad2e7 100644 --- a/innobase/row/row0sel.c +++ b/innobase/row/row0sel.c @@ -2423,8 +2423,9 @@ row_sel_store_mysql_rec( byte* data; ulint len; ulint i; - + ut_ad(prebuilt->mysql_template); + ut_ad(prebuilt->default_rec); ut_ad(rec_offs_validate(rec, NULL, offsets)); if (UNIV_LIKELY_NULL(prebuilt->blob_heap)) { @@ -2520,58 +2521,14 @@ row_sel_store_mysql_rec( ~(byte) (templ->mysql_null_bit_mask); } } else { - /* MySQL seems to assume the field for an SQL NULL - value is set to zero or space. Not taking this into - account caused seg faults with NULL BLOB fields, and - bug number 154 in the MySQL bug database: GROUP BY - and DISTINCT could treat NULL values inequal. */ - int pad_char; + /* MySQL assumes that the field for an SQL + NULL value is set to the default value. */ mysql_rec[templ->mysql_null_byte_offset] |= (byte) (templ->mysql_null_bit_mask); - switch (templ->type) { - case DATA_VARCHAR: - case DATA_BINARY: - case DATA_VARMYSQL: - if (templ->mysql_type - == DATA_MYSQL_TRUE_VARCHAR) { - /* This is a >= 5.0.3 type - true VARCHAR. Zero the field. */ - pad_char = 0x00; - break; - } - /* Fall through */ - case DATA_CHAR: - case DATA_FIXBINARY: - case DATA_MYSQL: - /* MySQL pads all string types (except - BLOB, TEXT and true VARCHAR) with space. */ - if (UNIV_UNLIKELY(templ->mbminlen == 2)) { - /* Treat UCS2 as a special case. */ - data = mysql_rec - + templ->mysql_col_offset; - len = templ->mysql_col_len; - /* There are two UCS2 bytes per char, - so the length has to be even. */ - ut_a(!(len & 1)); - /* Pad with 0x0020. */ - while (len) { - *data++ = 0x00; - *data++ = 0x20; - len -= 2; - } - continue; - } - pad_char = 0x20; - break; - default: - pad_char = 0x00; - break; - } - - ut_ad(!pad_char || templ->mbminlen == 1); - memset(mysql_rec + templ->mysql_col_offset, - pad_char, templ->mysql_col_len); + memcpy(mysql_rec + templ->mysql_col_offset, + prebuilt->default_rec + templ->mysql_col_offset, + templ->mysql_col_len); } } diff --git a/mysql-test/r/innodb_bug40565.result b/mysql-test/r/innodb_bug40565.result new file mode 100644 index 00000000000..21e923d9336 --- /dev/null +++ b/mysql-test/r/innodb_bug40565.result @@ -0,0 +1,9 @@ +create table bug40565(value decimal(4,2)) engine=innodb; +insert into bug40565 values (1), (null); +update bug40565 set value=NULL; +affected rows: 1 +info: Rows matched: 2 Changed: 1 Warnings: 0 +update bug40565 set value=NULL; +affected rows: 0 +info: Rows matched: 2 Changed: 0 Warnings: 0 +drop table bug40565; diff --git a/mysql-test/t/innodb_bug40565.test b/mysql-test/t/innodb_bug40565.test new file mode 100644 index 00000000000..d7aa0fd514a --- /dev/null +++ b/mysql-test/t/innodb_bug40565.test @@ -0,0 +1,10 @@ +# Bug #40565 Update Query Results in "1 Row Affected" But Should Be "Zero Rows" +-- source include/have_innodb.inc + +create table bug40565(value decimal(4,2)) engine=innodb; +insert into bug40565 values (1), (null); +--enable_info +update bug40565 set value=NULL; +update bug40565 set value=NULL; +--disable_info +drop table bug40565; diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index f71e891e88d..7eb6ef05d9c 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -2253,6 +2253,9 @@ ha_innobase::open( ((row_prebuilt_t*)innobase_prebuilt)->mysql_row_len = table->s->reclength; + ((row_prebuilt_t*)innobase_prebuilt)->default_rec + = table->s->default_values; + ut_ad(table->s->default_values); /* Looks like MySQL-3.23 sometimes has primary key number != 0 */ |