List:Commits« Previous MessageNext Message »
From:Satya B Date:June 25 2009 9:50am
Subject:bzr commit into mysql-5.0-bugteam branch (satya.bn:2785) Bug#40565
View as plain text  
#At file:///home/satya/WORK/mysql/mysql-5.0-bugteam/ based on revid:satya.bn@stripped

 2785 Satya B	2009-06-25
      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
        ------------------------------------------------------------------------
      added:
        mysql-test/r/innodb_bug40565.result
        mysql-test/t/innodb_bug40565.test
      modified:
        innobase/include/row0mysql.h
        innobase/row/row0mysql.c
        innobase/row/row0sel.c
        sql/ha_innodb.cc

=== modified file 'innobase/include/row0mysql.h'
--- a/innobase/include/row0mysql.h	2006-12-19 23:57:51 +0000
+++ b/innobase/include/row0mysql.h	2009-06-25 09:50:26 +0000
@@ -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,

=== modified file 'innobase/row/row0mysql.c'
--- a/innobase/row/row0mysql.c	2009-06-25 09:36:12 +0000
+++ b/innobase/row/row0mysql.c	2009-06-25 09:50:26 +0000
@@ -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;

=== modified file 'innobase/row/row0sel.c'
--- a/innobase/row/row0sel.c	2007-07-10 14:16:51 +0000
+++ b/innobase/row/row0sel.c	2009-06-25 09:50:26 +0000
@@ -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);
 		}
 	} 
 

=== added file 'mysql-test/r/innodb_bug40565.result'
--- a/mysql-test/r/innodb_bug40565.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/r/innodb_bug40565.result	2009-06-25 09:50:26 +0000
@@ -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;

=== added file 'mysql-test/t/innodb_bug40565.test'
--- a/mysql-test/t/innodb_bug40565.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/t/innodb_bug40565.test	2009-06-25 09:50:26 +0000
@@ -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;

=== modified file 'sql/ha_innodb.cc'
--- a/sql/ha_innodb.cc	2009-03-19 13:44:58 +0000
+++ b/sql/ha_innodb.cc	2009-06-25 09:50:26 +0000
@@ -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 */
 

Thread
bzr commit into mysql-5.0-bugteam branch (satya.bn:2785) Bug#40565Satya B25 Jun