mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Fix bug MDEV-4895 Valgrind warnings (Conditional jump or move depends on uninitialised value) in Field_datetime::get_date on GREATEST(..) IS NULL
Analysis: The cause of the valgrind warning was an attempt to evaluate a Field that was not yet read. The reason was that on one hand Item_func_isnotnull was marked as constant by Item_func_isnotnull::update_used_tables, and this allowed eval_const_cond() to be called. On the other hand Item_func_isnotnull::val_int() evaluated its argument as if it was not constant. Solution: The fix make sure that Item_func_isnotnull::val_int() doesn't evaluate its argument when it is constant and cannot be NULL, because the result is known in this case.
This commit is contained in:
@ -343,3 +343,33 @@ Field Type Null Key Default Extra
|
|||||||
IFNULL(NULL, b) decimal(1,0) YES NULL
|
IFNULL(NULL, b) decimal(1,0) YES NULL
|
||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
# End of 5.0 tests
|
# End of 5.0 tests
|
||||||
|
#
|
||||||
|
# MDEV-4895 Valgrind warnings (Conditional jump or move depends on uninitialised value) in Field_datetime::get_date on GREATEST(..) IS NULL
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (dt DATETIME NOT NULL);
|
||||||
|
INSERT INTO t1 VALUES (NOW()),(NOW());
|
||||||
|
EXPLAIN
|
||||||
|
SELECT * FROM t1 WHERE concat( dt, '2012-12-21 12:12:12' ) IS NULL;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||||
|
SELECT * FROM t1 WHERE concat( dt, '2012-12-21 12:12:12' ) IS NULL;
|
||||||
|
dt
|
||||||
|
drop table t1;
|
||||||
|
CREATE TABLE t1 (dt INT NOT NULL);
|
||||||
|
INSERT INTO t1 VALUES (1),(2);
|
||||||
|
EXPLAIN
|
||||||
|
SELECT * FROM t1 WHERE concat( dt, '1' ) IS NULL;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||||
|
SELECT * FROM t1 WHERE concat( dt, '1' ) IS NULL;
|
||||||
|
dt
|
||||||
|
drop table t1;
|
||||||
|
CREATE TABLE t1 (dt INT NOT NULL);
|
||||||
|
INSERT INTO t1 VALUES (1),(2);
|
||||||
|
EXPLAIN
|
||||||
|
SELECT * FROM t1 WHERE NOT (concat( dt, '1' ) IS NOT NULL);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||||
|
SELECT * FROM t1 WHERE NOT (concat( dt, '1' ) IS NOT NULL);
|
||||||
|
dt
|
||||||
|
drop table t1;
|
||||||
|
@ -255,3 +255,31 @@ DESCRIBE t2;
|
|||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
--echo # End of 5.0 tests
|
--echo # End of 5.0 tests
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-4895 Valgrind warnings (Conditional jump or move depends on uninitialised value) in Field_datetime::get_date on GREATEST(..) IS NULL
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (dt DATETIME NOT NULL);
|
||||||
|
INSERT INTO t1 VALUES (NOW()),(NOW());
|
||||||
|
|
||||||
|
EXPLAIN
|
||||||
|
SELECT * FROM t1 WHERE concat( dt, '2012-12-21 12:12:12' ) IS NULL;
|
||||||
|
SELECT * FROM t1 WHERE concat( dt, '2012-12-21 12:12:12' ) IS NULL;
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (dt INT NOT NULL);
|
||||||
|
INSERT INTO t1 VALUES (1),(2);
|
||||||
|
EXPLAIN
|
||||||
|
SELECT * FROM t1 WHERE concat( dt, '1' ) IS NULL;
|
||||||
|
SELECT * FROM t1 WHERE concat( dt, '1' ) IS NULL;
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (dt INT NOT NULL);
|
||||||
|
INSERT INTO t1 VALUES (1),(2);
|
||||||
|
|
||||||
|
EXPLAIN
|
||||||
|
SELECT * FROM t1 WHERE NOT (concat( dt, '1' ) IS NOT NULL);
|
||||||
|
SELECT * FROM t1 WHERE NOT (concat( dt, '1' ) IS NOT NULL);
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -4621,6 +4621,8 @@ Item *and_expressions(Item *a, Item *b, Item **org_item)
|
|||||||
longlong Item_func_isnull::val_int()
|
longlong Item_func_isnull::val_int()
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(fixed == 1);
|
DBUG_ASSERT(fixed == 1);
|
||||||
|
if (const_item() && !args[0]->maybe_null)
|
||||||
|
return 0;
|
||||||
return args[0]->is_null() ? 1: 0;
|
return args[0]->is_null() ? 1: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4628,6 +4630,8 @@ longlong Item_is_not_null_test::val_int()
|
|||||||
{
|
{
|
||||||
DBUG_ASSERT(fixed == 1);
|
DBUG_ASSERT(fixed == 1);
|
||||||
DBUG_ENTER("Item_is_not_null_test::val_int");
|
DBUG_ENTER("Item_is_not_null_test::val_int");
|
||||||
|
if (const_item() && !args[0]->maybe_null)
|
||||||
|
DBUG_RETURN(1);
|
||||||
if (args[0]->is_null())
|
if (args[0]->is_null())
|
||||||
{
|
{
|
||||||
DBUG_PRINT("info", ("null"));
|
DBUG_PRINT("info", ("null"));
|
||||||
|
Reference in New Issue
Block a user