Hi Andrei!
Patch looks good. Patch OK to push.
Just my few cents,
Mats Kindahl
Andrei Elkin wrote:
> Below is the list of changes that have just been committed into a local
> 5.0 repository of elkin. When elkin does a push these changes will
> be propagated to the main repository and, within 24 hours after the
> push, to the public repository.
> For information on how to access the public repository
> see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
>
> ChangeSet@stripped, 2007-09-14 17:01:53+03:00, aelkin@stripped +3 -0
> Bug #26199 Replication Failure on Slave when using stored procs with bit-type
> parameters.
>
> The value of the actual argument of BIT-type-arg stored procedure was binlogged as
> non-espaped sequence of
> bytes corresponding to internal representation of the bit value.
>
> The patch enforces binlogging of the bit-argument as a valid literal: prefixing the
> quoted bytes sequence with
> _binary.
> Note, that behaviour of Item_field::var_str for field_type() of MYSQL_TYPE_BIT is
> exceptional in that
> the returned string contains the binary representation even though result_type() of
> the item is INT_RESULT.
>
> mysql-test/r/rpl_sp_effects.result@stripped, 2007-09-14 17:01:43+03:00,
> aelkin@stripped +32 -1
> testing stored function and procedure called with BIT-arg.
>
> mysql-test/t/rpl_sp_effects.test@stripped, 2007-09-14 17:01:43+03:00,
> aelkin@stripped +36 -1
> results changed
>
> sql/sp_head.cc@stripped, 2007-09-14 17:01:43+03:00, aelkin@stripped +3 -2
> Treating BIT field type specially to for its value to be prefixed and quoted.
>
> diff -Nrup a/mysql-test/r/rpl_sp_effects.result b/mysql-test/r/rpl_sp_effects.result
> --- a/mysql-test/r/rpl_sp_effects.result 2005-09-07 18:39:41 +03:00
> +++ b/mysql-test/r/rpl_sp_effects.result 2007-09-14 17:01:43 +03:00
> @@ -209,7 +209,38 @@ slave 30
> slave 31
> slave 101
> slave 102
> -drop table t1;
> +create table t2 (b BIT(7));
> +create procedure sp_bug26199(bitvalue BIT(7))
> +begin
> +insert into t2 set b = bitvalue;
> +end //
> +create function sf_bug26199(b BIT(7)) returns int
> +begin
> +insert into t2 values(b);
> +return 0;
> +end//
> +call sp_bug26199(b'1110');
> +select sf_bug26199(b'1111111');
> +sf_bug26199(b'1111111')
> +0
> +select sf_bug26199(b'101111111');
> +sf_bug26199(b'101111111')
> +0
> +Warnings:
> +Warning 1264 Out of range value adjusted for column 'b' at row 1
> +select hex(b) from t2;
> +hex(b)
> +E
> +7F
> +7F
> +select hex(b) from t2;
> +hex(b)
> +E
> +7F
> +7F
> +drop table t1,t2;
> drop function f1;
> drop function f2;
> drop procedure p1;
> +drop procedure sp_bug26199;
> +drop function sf_bug26199;
> diff -Nrup a/mysql-test/t/rpl_sp_effects.test b/mysql-test/t/rpl_sp_effects.test
> --- a/mysql-test/t/rpl_sp_effects.test 2005-09-07 18:39:41 +03:00
> +++ b/mysql-test/t/rpl_sp_effects.test 2007-09-14 17:01:43 +03:00
> @@ -195,9 +195,44 @@ sync_slave_with_master;
> connection slave;
> select 'slave', a from t1;
>
> +# bug#26199 Replication Failure on Slave when using stored procs with bit-type
> parameters
> +
> connection master;
> -drop table t1;
> +
> +create table t2 (b BIT(7));
> +delimiter //;
> +create procedure sp_bug26199(bitvalue BIT(7))
> +begin
> + insert into t2 set b = bitvalue;
> +end //
> +
> +create function sf_bug26199(b BIT(7)) returns int
> +begin
> + insert into t2 values(b);
> + return 0;
> +end//
> +
> +DELIMITER ;//
> +
> +
> +
> +call sp_bug26199(b'1110');
> +select sf_bug26199(b'1111111');
> +select sf_bug26199(b'101111111');
> +select hex(b) from t2;
> +
> +sync_slave_with_master;
> +#connection slave;
> +select hex(b) from t2;
> +
> +
> +
> +
> +connection master;
> +drop table t1,t2;
> drop function f1;
> drop function f2;
> drop procedure p1;
> +drop procedure sp_bug26199;
> +drop function sf_bug26199;
> sync_slave_with_master;
> diff -Nrup a/sql/sp_head.cc b/sql/sp_head.cc
> --- a/sql/sp_head.cc 2007-07-31 15:23:23 +03:00
> +++ b/sql/sp_head.cc 2007-09-14 17:01:43 +03:00
> @@ -100,8 +100,9 @@ sp_get_item_value(THD *thd, Item *item,
> case REAL_RESULT:
> case INT_RESULT:
> case DECIMAL_RESULT:
> - return item->val_str(str);
> -
> + if (item->field_type() != MYSQL_TYPE_BIT)
> + return item->val_str(str);
> + else {/* Bit type is handled as binary string */}
> case STRING_RESULT:
> {
> String *result= item->val_str(str);
>
>
--
Mats Kindahl
Lead Software Developer
Replication Team
MySQL AB, www.mysql.com