From: Jorgen Loland Date: March 4 2011 2:46pm Subject: bzr commit into mysql-5.5 branch (jorgen.loland:3371) Bug#11766317 List-Archive: http://lists.mysql.com/commits/132467 X-Bug: 11766317 Message-Id: <20110304144620.8B052C26@atum21.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============5760726802395137592==" --===============5760726802395137592== 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-5.5/ based on revid:build@stripped 3371 Jorgen Loland 2011-03-04 BUG#11766317: FIND_IN_SET won't work normaly after upgrade from 5.1 to 5.5 (Former 59405) 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. enum_value gets a value in fix_length_and_dec() iff args[0] is both constant and non-null. It is therefore unnecessary to check the null_value of args[0] in val_int(). An alternative fix would be to call args[0]->val_int() inside Item_func_find_in_set::val_int(). This would ensure args[0]->null_value was set correctly (always false in this case), 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 modified: mysql-test/r/func_set.result mysql-test/t/func_set.test sql/item_func.cc === 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-03-04 14:46:17 +0000 @@ -159,3 +159,45 @@ 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'), (NULL), ('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 +SELECT * FROM t1 WHERE FIND_IN_SET(DAYOFWEEK(CURRENT_DATE()), days) IS UNKNOWN; +days +NULL +SELECT * FROM t1 WHERE FIND_IN_SET(DAYOFWEEK(CURRENT_DATE()), NULL); +days +SELECT * FROM t1 WHERE FIND_IN_SET(DAYOFWEEK(CURRENT_DATE()), NULL) IS UNKNOWN; +days +1,2,3,4,5,6,7 +NULL +1,2,3,4,5,6,7 +SELECT * FROM t1 WHERE FIND_IN_SET(7, days); +days +1,2,3,4,5,6,7 +1,2,3,4,5,6,7 +SELECT * FROM t1 WHERE FIND_IN_SET(8, days); +days +SELECT * FROM t1 WHERE FIND_IN_SET(NULL, days); +days +SELECT * FROM t1 WHERE FIND_IN_SET(NULL, days) IS UNKNOWN; +days +1,2,3,4,5,6,7 +NULL +1,2,3,4,5,6,7 +SELECT * FROM t1 WHERE FIND_IN_SET(NULL, NULL); +days +SELECT * FROM t1 WHERE FIND_IN_SET(NULL, NULL) IS UNKNOWN; +days +1,2,3,4,5,6,7 +NULL +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-03-04 14:46:17 +0000 @@ -97,3 +97,25 @@ 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'), (NULL), ('1,2,3,4,5,6,7'); + +--echo +SELECT * FROM t1 WHERE FIND_IN_SET(DAYOFWEEK(CURRENT_DATE()), days); +SELECT * FROM t1 WHERE FIND_IN_SET(DAYOFWEEK(CURRENT_DATE()), days) IS UNKNOWN; +SELECT * FROM t1 WHERE FIND_IN_SET(DAYOFWEEK(CURRENT_DATE()), NULL); +SELECT * FROM t1 WHERE FIND_IN_SET(DAYOFWEEK(CURRENT_DATE()), NULL) IS UNKNOWN; +SELECT * FROM t1 WHERE FIND_IN_SET(7, days); +SELECT * FROM t1 WHERE FIND_IN_SET(8, days); +SELECT * FROM t1 WHERE FIND_IN_SET(NULL, days); +SELECT * FROM t1 WHERE FIND_IN_SET(NULL, days) IS UNKNOWN; +SELECT * FROM t1 WHERE FIND_IN_SET(NULL, NULL); +SELECT * FROM t1 WHERE FIND_IN_SET(NULL, NULL) IS UNKNOWN; + +--echo +DROP TABLE t1; === modified file 'sql/item_func.cc' --- a/sql/item_func.cc 2011-03-03 12:27:36 +0000 +++ b/sql/item_func.cc 2011-03-04 14:46:17 +0000 @@ -3003,6 +3003,8 @@ void Item_func_find_in_set::fix_length_a String *find=args[0]->val_str(&value); if (find) { + // find is not NULL pointer so args[0] is not a null-value + DBUG_ASSERT(!args[0]->null_value); enum_value= find_type(((Field_enum*) field)->typelib,find->ptr(), find->length(), 0); enum_bit=0; @@ -3021,11 +3023,22 @@ longlong Item_func_find_in_set::val_int( DBUG_ASSERT(fixed == 1); if (enum_value) { - ulonglong tmp=(ulonglong) args[1]->val_int(); - if (!(null_value=args[1]->null_value || args[0]->null_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(); + null_value= args[1]->null_value; + /* + No need to check args[0]->null_value since enum_value is set iff + args[0] is a non-null const item. Note: no DBUG_ASSERT on + args[0]->null_value here because args[0] may have been replaced + by an Item_cache on which val_int() has not been called. See + BUG#11766317 + */ + if (!null_value) { if (tmp & enum_bit) - return enum_value; + return enum_value; } return 0L; } --===============5760726802395137592== 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\ # jlybxl8ukw6uj8ib # target_branch: file:///export/home/jl208045/mysql/mysql-5.5/ # testament_sha1: 01d0e632e8745fa4673f905801d8a17e885529e5 # timestamp: 2011-03-04 15:46:20 +0100 # source_branch: file:///export/home/jl208045/mysql/mysql-trunk-55385/ # base_revision_id: build@stripped # # Begin bundle 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 --===============5760726802395137592==--