From: Alexander Nozdrin Date: May 9 2011 8:29am Subject: bzr commit into mysql-5.5 branch (alexander.nozdrin:3499) Bug#12362125 List-Archive: http://lists.mysql.com/commits/136915 X-Bug: 12362125 Message-Id: <201105090829.p498TUvg026357@acsmt356.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============8587093778177810298==" --===============8587093778177810298== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/alik/MySQL/bzr/00/bug12362125/mysql-5.5-bug12362125/ based on revid:alexander.nozdrin@stripped 3499 Alexander Nozdrin 2011-05-09 Patch for Bug#12362125 (SP INOUT HANDLING IS BROKEN FOR TEXT TYPE). Attempts to assign value to a table column from trigger by using NEW.column_name pseudo-variable might result in garbled data. That happened when: - the column had a BLOB-based type (e.g. TEXT) and - the value being assigned was retrieved from stored routine variable of the same type. The problem was that BLOB values were not copied correctly in this case. Instead of doing a copy of a real value, the value's representation in record buffer was copied. This representation is essentially a pointer to a buffer associated with the virtual table for routine variables where the real value is stored. Since this buffer got freed once trigger was left or could have changed its contents when new value was assigned to corresponding routine variable such a shallow copying resulted in garbled data in NEW.colum_name column. It worked in 5.1 due to a subtle bug in create_virtual_tmp_table(): - in 5.1 create_virtual_tmp_table() returned a table which had db_low_byte_first == false. - in 5.5 and up create_virtual_tmp_table() returns a table which has db_low_byte_first == true. Actually, db_low_byte_first == false only for ISAM storage engine, which was deprecated and removed in 5.0. Having db_low_byte_first == false led to getting false in the complex condition for the 2nd "if" in field_conv(), which in turn led to copy-blob-behavior as a fall-back strategy: - to->table->s->db_low_byte_first was true (correct value) - from->table->s->db_low_byte_first was false (incorrect value) In 5.5 and up that condition is true, which means blob-values are not copied. modified: mysql-test/r/trigger.result mysql-test/t/trigger.test sql/item.cc === modified file 'mysql-test/r/trigger.result' --- a/mysql-test/r/trigger.result 2011-03-10 08:07:57 +0000 +++ b/mysql-test/r/trigger.result 2011-05-09 08:29:23 +0000 @@ -2208,4 +2208,22 @@ trigger_name # Clean-up. drop temporary table t1; drop table t1; -End of 6.0 tests. + +# +# Bug #12362125: SP INOUT HANDLING IS BROKEN FOR TEXT TYPE. +# +DROP TABLE IF EXISTS t1; +CREATE TABLE t1(c TEXT); +CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW +BEGIN +DECLARE v TEXT; +SET v = 'aaa'; +SET NEW.c = v; +END| +INSERT INTO t1 VALUES('qazwsxedc'); +SELECT c FROM t1; +c +aaa +DROP TABLE t1; + +End of 5.5 tests. === modified file 'mysql-test/t/trigger.test' --- a/mysql-test/t/trigger.test 2011-03-10 08:07:57 +0000 +++ b/mysql-test/t/trigger.test 2011-05-09 08:29:23 +0000 @@ -2583,4 +2583,32 @@ select trigger_name from information_sch drop temporary table t1; drop table t1; ---echo End of 6.0 tests. + +--echo +--echo # +--echo # Bug #12362125: SP INOUT HANDLING IS BROKEN FOR TEXT TYPE. +--echo # + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +CREATE TABLE t1(c TEXT); + +delimiter |; +CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW +BEGIN + DECLARE v TEXT; + SET v = 'aaa'; + SET NEW.c = v; +END| +delimiter ;| + +INSERT INTO t1 VALUES('qazwsxedc'); + +SELECT c FROM t1; + +DROP TABLE t1; + +--echo +--echo End of 5.5 tests. === modified file 'sql/item.cc' --- a/sql/item.cc 2011-05-06 11:41:24 +0000 +++ b/sql/item.cc 2011-05-09 08:29:23 +0000 @@ -7134,8 +7134,26 @@ bool Item_trigger_field::set_value(THD * { Item *item= sp_prepare_func_item(thd, it); - return (!item || (!fixed && fix_fields(thd, 0)) || - (item->save_in_field(field, 0) < 0)); + if (!item) + return true; + + if (!fixed) + { + if (fix_fields(thd, NULL)) + return true; + } + + // NOTE: field->table->copy_blobs should be false here, but let's + // remember the value at runtime to avoid subtle bugs. + bool copy_blobs_saved= field->table->copy_blobs; + + field->table->copy_blobs= true; + + int err_code= item->save_in_field(field, 0); + + field->table->copy_blobs= copy_blobs_saved; + + return err_code < 0; } --===============8587093778177810298== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/alexander.nozdrin@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: alexander.nozdrin@stripped\ # g6qk184o794de45f # target_branch: file:///home/alik/MySQL/bzr/00/bug12362125/mysql-5.5-\ # bug12362125/ # testament_sha1: 92fd3b40b7dd6087bb8a2e7ddf4c66a5d2836292 # timestamp: 2011-05-09 12:29:26 +0400 # base_revision_id: alexander.nozdrin@stripped\ # oplt3dt161br6z5r # # Begin bundle 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 --===============8587093778177810298==--