From: Sergey Glukhov Date: March 30 2011 7:42am Subject: bzr push into mysql-5.1 branch (sergey.glukhov:3641 to 3643) Bug#11766124 List-Archive: http://lists.mysql.com/commits/134214 X-Bug: 11766124 Message-Id: <201103300744.p2U7iTpa002247@acsmt357.oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 3643 Sergey Glukhov 2011-03-30 Bug#11766124 59164: VALGRIND: UNINITIALIZED VALUE IN NUMBER_TO_DATETIME Valgrind warning happens due to missing NULL value check in Item::get_date. The fix is to add this check. @ mysql-test/r/func_time.result test case @ mysql-test/t/func_time.test test case @ sql/item.cc added check for NULL value modified: mysql-test/r/func_time.result mysql-test/t/func_time.test sql/item.cc 3642 Sergey Glukhov 2011-03-30 Bug#11766126 59166: ANOTHER DATETIME VALGRIND UNINITIALIZED WARNING Valgrind warning happens because null values check happens too late in Item_func_month::val_str(after result string calculation).The fix is to check null value before result string calculation. @ mysql-test/r/func_time.result test case @ mysql-test/t/func_time.test test case @ sql/item_timefunc.h check null value before result string calculation. modified: mysql-test/r/func_time.result mysql-test/t/func_time.test sql/item_timefunc.h 3641 Jon Olav Hauglid 2011-03-29 Bug# 11763784 (former 56541) ASSERTION TABLE->DB_STAT FAILED IN SQL_BASE.CC::OPEN_TABLE() DURING I_S Q This assert could be triggered if a statement requiring a name lock on a table (e.g. DROP TRIGGER) executed concurrently with an I_S query which also used the table. One connection first started an I_S query that opened a given table. Then another connection started a statement requiring a name lock on the same table. This statement was blocked since the table was in use by the I_S query. When the I_S query resumed and tried to open the table again as part of get_all_tables(), it would encounter a table instance with an old version number representing the pending name lock. Since I_S queries ignore version checks and thus pending name locks, it would try to continue. This caused it to encounter the assert. The assert checked that the TABLE instance found with a different version, was a real, open table. However, since this TABLE instance instead represented a pending name lock, the check would fail and trigger the assert. This patch fixes the problem by removing the assert. It is ok for TABLE::db_stat to be 0 in this case since the TABLE instance can represent a pending name lock. Test case added to lock_sync.test. modified: mysql-test/r/lock_sync.result mysql-test/t/lock_sync.test sql/sql_base.cc === modified file 'mysql-test/r/func_time.result' --- a/mysql-test/r/func_time.result 2011-03-28 13:27:44 +0000 +++ b/mysql-test/r/func_time.result 2011-03-30 07:08:35 +0000 @@ -1393,4 +1393,16 @@ SET GLOBAL SQL_MODE=DEFAULT; SELECT FORMAT(YEAR(STR_TO_DATE('',GET_FORMAT(TIME,''))),1); FORMAT(YEAR(STR_TO_DATE('',GET_FORMAT(TIME,''))),1) NULL +# +# Bug#11766126 59166: ANOTHER DATETIME VALGRIND UNINITIALIZED WARNING +# +SELECT CAST((MONTH(FROM_UNIXTIME(@@GLOBAL.SQL_MODE))) AS BINARY(1025)); +CAST((MONTH(FROM_UNIXTIME(@@GLOBAL.SQL_MODE))) AS BINARY(1025)) +NULL +# +# Bug#11766124 59164: VALGRIND: UNINITIALIZED VALUE IN NUMBER_TO_DATETIME +# +SELECT ADDDATE(MONTH(FROM_UNIXTIME(NULL)),INTERVAL 1 HOUR); +ADDDATE(MONTH(FROM_UNIXTIME(NULL)),INTERVAL 1 HOUR) +NULL End of 5.1 tests === modified file 'mysql-test/t/func_time.test' --- a/mysql-test/t/func_time.test 2011-03-28 13:27:44 +0000 +++ b/mysql-test/t/func_time.test 2011-03-30 07:08:35 +0000 @@ -901,4 +901,16 @@ SET GLOBAL SQL_MODE=DEFAULT; SELECT FORMAT(YEAR(STR_TO_DATE('',GET_FORMAT(TIME,''))),1); +--echo # +--echo # Bug#11766126 59166: ANOTHER DATETIME VALGRIND UNINITIALIZED WARNING +--echo # + +SELECT CAST((MONTH(FROM_UNIXTIME(@@GLOBAL.SQL_MODE))) AS BINARY(1025)); + +--echo # +--echo # Bug#11766124 59164: VALGRIND: UNINITIALIZED VALUE IN NUMBER_TO_DATETIME +--echo # + +SELECT ADDDATE(MONTH(FROM_UNIXTIME(NULL)),INTERVAL 1 HOUR); + --echo End of 5.1 tests === modified file 'sql/item.cc' --- a/sql/item.cc 2011-03-15 11:36:12 +0000 +++ b/sql/item.cc 2011-03-30 07:08:35 +0000 @@ -926,8 +926,12 @@ bool Item::get_date(MYSQL_TIME *ltime,ui } else { - longlong value= val_int(); int was_cut; + longlong value= val_int(); + + if (null_value) + goto err; + if (number_to_datetime(value, ltime, fuzzydate, &was_cut) == LL(-1)) { char buff[22], *end; === modified file 'sql/item_timefunc.h' --- a/sql/item_timefunc.h 2011-02-22 21:03:32 +0000 +++ b/sql/item_timefunc.h 2011-03-30 07:00:41 +0000 @@ -106,8 +106,11 @@ public: { DBUG_ASSERT(fixed == 1); return (double) Item_func_month::val_int(); } String *val_str(String *str) { - str->set(val_int(), &my_charset_bin); - return null_value ? 0 : str; + longlong nr= val_int(); + if (null_value) + return 0; + str->set(nr, &my_charset_bin); + return str; } const char *func_name() const { return "month"; } enum Item_result result_type () const { return INT_RESULT; } No bundle (reason: useless for push emails).