From: Jorgen Loland Date: January 31 2011 1:39pm Subject: bzr commit into mysql-trunk branch (jorgen.loland:3578) Bug#59405 List-Archive: http://lists.mysql.com/commits/130043 X-Bug: 59405 Message-Id: <20110131133918.18B871FB@atum21.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============4130339395146925803==" --===============4130339395146925803== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///export/home/jl208045/mysql/mysql-trunk-59405/ based on revid:sandeep.doddaballapur@stripped 3578 Jorgen Loland 2011-01-31 BUG#59405: FIND_IN_SET won't work normaly after upgrade from 5.1 to 5.5 In this bug, args[0] in an Item_func_find_in_set stored an Item_func_weekday that was constant. In Item_func_find_in_set::fix_length_and_dec(), args[0]->val_str() was called. Later, when Item_func_find_in_set::val_int() was called, args[0]->null_value was checked. However, the Item_func_weekday in args[0] had now been replaced with an Item_cache. No val_*() calls had been made to this Item_cache, thus null_value was incorrectly 'true', resulting in missing rows in the result set. The implemented fix is to remember args[0]->null_value as it was right after calling it's val_str() in fix_length_and_dec(). Note: this only applies if args[0] is constant. An alternative fix would be to call args[0]->val_int() inside Item_func_find_in_set::val_int(), but that would have to be done for every record this const value is checked against. @ mysql-test/r/func_set.result Add test for BUG#59405 @ mysql-test/t/func_set.test Add test for BUG#59405 @ sql/item_func.cc Add variable Item_func_find_in_set::args_0_null_value @ sql/item_func.h Add variable Item_func_find_in_set::args_0_null_value modified: mysql-test/r/func_set.result mysql-test/t/func_set.test sql/item_func.cc sql/item_func.h === modified file 'mysql-test/r/func_set.result' --- a/mysql-test/r/func_set.result 2009-06-16 14:36:15 +0000 +++ b/mysql-test/r/func_set.result 2011-01-31 13:39:14 +0000 @@ -159,3 +159,15 @@ SELECT CONVERT( a USING latin1 ) FROM t2 CONVERT( a USING latin1 ) DROP TABLE t1, t2; +# +# BUG#59405: FIND_IN_SET won't work normaly after upgrade from 5.1 to 5.5 +# +CREATE TABLE t1(days set('1','2','3','4','5','6','7')); +INSERT INTO t1 VALUES('1,2,3,4,5,6,7'), ('1,2,3,4,5,6,7'); + +SELECT * FROM t1 WHERE FIND_IN_SET(DAYOFWEEK(CURRENT_DATE()),days); +days +1,2,3,4,5,6,7 +1,2,3,4,5,6,7 + +DROP TABLE t1; === modified file 'mysql-test/t/func_set.test' --- a/mysql-test/t/func_set.test 2009-06-16 14:36:15 +0000 +++ b/mysql-test/t/func_set.test 2011-01-31 13:39:14 +0000 @@ -97,3 +97,16 @@ SELECT CONVERT( a USING latin1 ) FROM t1 SELECT CONVERT( a USING latin1 ) FROM t2; DROP TABLE t1, t2; + +--echo # +--echo # BUG#59405: FIND_IN_SET won't work normaly after upgrade from 5.1 to 5.5 +--echo # + +CREATE TABLE t1(days set('1','2','3','4','5','6','7')); +INSERT INTO t1 VALUES('1,2,3,4,5,6,7'), ('1,2,3,4,5,6,7'); + +--echo +SELECT * FROM t1 WHERE FIND_IN_SET(DAYOFWEEK(CURRENT_DATE()),days); + +--echo +DROP TABLE t1; === modified file 'sql/item_func.cc' --- a/sql/item_func.cc 2011-01-14 15:36:19 +0000 +++ b/sql/item_func.cc 2011-01-31 13:39:14 +0000 @@ -3019,6 +3019,12 @@ void Item_func_find_in_set::fix_length_a if (field->real_type() == MYSQL_TYPE_SET) { String *find=args[0]->val_str(&value); + /* + Because it is constant, args[0] may be replaced by an Item_cache. + Store null_value here to avoid args[0]->val_int() before checking + the null_value in Item_func_find_in_set::val_int(). + */ + args_0_null_value= args[0]->null_value; if (find) { enum_value= find_type(((Field_enum*) field)->typelib,find->ptr(), @@ -3039,8 +3045,12 @@ longlong Item_func_find_in_set::val_int( DBUG_ASSERT(fixed == 1); if (enum_value) { + // enum_value is set iff args[0]->const_item() in fix_length_and_dec(). + DBUG_ASSERT(args[0]->const_item()); + ulonglong tmp=(ulonglong) args[1]->val_int(); - if (!(null_value=args[1]->null_value || args[0]->null_value)) + null_value= args[1]->null_value; + if (!null_value && !args_0_null_value) { if (tmp & enum_bit) return enum_value; === modified file 'sql/item_func.h' --- a/sql/item_func.h 2011-01-28 13:49:59 +0000 +++ b/sql/item_func.h 2011-01-31 13:39:14 +0000 @@ -1025,9 +1025,11 @@ class Item_func_find_in_set :public Item String value,value2; uint enum_value; ulonglong enum_bit; + bool args_0_null_value; /* Cache args[0]->null_value iff args[0] is const */ DTCollation cmp_collation; public: - Item_func_find_in_set(Item *a,Item *b) :Item_int_func(a,b),enum_value(0) {} + Item_func_find_in_set(Item *a,Item *b) + : Item_int_func(a,b), enum_value(0), args_0_null_value(false) {} longlong val_int(); const char *func_name() const { return "find_in_set"; } void fix_length_and_dec(); --===============4130339395146925803== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/jorgen.loland@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jorgen.loland@stripped\ # 14zh54njbld1jj12 # target_branch: file:///export/home/jl208045/mysql/mysql-trunk-59405/ # testament_sha1: 12a732586307855928de67efd081544f2c14b4f3 # timestamp: 2011-01-31 14:39:17 +0100 # base_revision_id: sandeep.doddaballapur@stripped\ # m0e3g3oxm7xtq70c # # Begin bundle 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 RThQkLuZgDY= --===============4130339395146925803==--