Skip to content

Commit

Permalink
MDEV-18968 Both (WHERE 0.1) and (WHERE NOT 0.1) return empty set
Browse files Browse the repository at this point in the history
  • Loading branch information
abarkov committed Mar 26, 2019
1 parent ed643f4 commit 6fbbb08
Show file tree
Hide file tree
Showing 8 changed files with 55 additions and 20 deletions.
8 changes: 4 additions & 4 deletions mysql-test/r/func_group.result
Original file line number Diff line number Diff line change
Expand Up @@ -1979,8 +1979,8 @@ FROM t2);
MIN(t2.pk)
NULL
Warnings:
Warning 1292 Truncated incorrect INTEGER value: 'j'
Warning 1292 Truncated incorrect INTEGER value: 'j'
Warning 1292 Truncated incorrect DOUBLE value: 'j'
Warning 1292 Truncated incorrect DOUBLE value: 'j'

EXPLAIN
SELECT MIN(t2.pk)
Expand All @@ -1993,8 +1993,8 @@ id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
2 MATERIALIZED t2 ALL NULL NULL NULL NULL 2
Warnings:
Warning 1292 Truncated incorrect INTEGER value: 'j'
Warning 1292 Truncated incorrect INTEGER value: 'j'
Warning 1292 Truncated incorrect DOUBLE value: 'j'
Warning 1292 Truncated incorrect DOUBLE value: 'j'

#
# 2) Test that subquery materialization is setup for query with
Expand Down
20 changes: 20 additions & 0 deletions mysql-test/r/type_decimal.result
Original file line number Diff line number Diff line change
Expand Up @@ -1019,3 +1019,23 @@ cast('-0.0' as decimal(5,1)) < 0
#
# End of 5.5 tests
#
#
# Start of 10.1 tests
#
#
# MDEV-18968 Both (WHERE 0.1) and (WHERE NOT 0.1) return empty set
#
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (10);
SELECT CASE WHEN 0.1 THEN 'TRUE' ELSE 'FALSE' END FROM t1;
CASE WHEN 0.1 THEN 'TRUE' ELSE 'FALSE' END
TRUE
SELECT * FROM t1 WHERE 0.1;
a
10
SELECT * FROM t1 WHERE NOT 0.1;
a
DROP TABLE t1;
#
# End of 10.1 tests
#
21 changes: 21 additions & 0 deletions mysql-test/t/type_decimal.test
Original file line number Diff line number Diff line change
Expand Up @@ -612,3 +612,24 @@ select cast('-0.0' as decimal(5,1)) < 0;
--echo #
--echo # End of 5.5 tests
--echo #


--echo #
--echo # Start of 10.1 tests
--echo #

--echo #
--echo # MDEV-18968 Both (WHERE 0.1) and (WHERE NOT 0.1) return empty set
--echo #

CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (10);
SELECT CASE WHEN 0.1 THEN 'TRUE' ELSE 'FALSE' END FROM t1;
SELECT * FROM t1 WHERE 0.1;
SELECT * FROM t1 WHERE NOT 0.1;
DROP TABLE t1;


--echo #
--echo # End of 10.1 tests
--echo #
7 changes: 7 additions & 0 deletions sql/item.h
Original file line number Diff line number Diff line change
Expand Up @@ -1000,6 +1000,13 @@ class Item: public Value_source,
virtual bool val_bool();
virtual String *val_nodeset(String*) { return 0; }

bool eval_const_cond()
{
DBUG_ASSERT(const_item());
DBUG_ASSERT(!is_expensive());
return val_bool();
}

/*
save_val() is method of val_* family which stores value in the given
field.
Expand Down
2 changes: 1 addition & 1 deletion sql/item_cmpfunc.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4667,7 +4667,7 @@ Item_cond::fix_fields(THD *thd, Item **ref)
if (item->const_item() && !item->with_param &&
!item->is_expensive() && !cond_has_datetime_is_null(item))
{
if (item->val_int() == is_and_cond && top_level())
if (item->eval_const_cond() == is_and_cond && top_level())
{
/*
a. This is "... AND true_cond AND ..."
Expand Down
12 changes: 0 additions & 12 deletions sql/item_func.cc
Original file line number Diff line number Diff line change
Expand Up @@ -68,18 +68,6 @@ bool check_reserved_words(LEX_STRING *name)
}


/**
@return
TRUE if item is a constant
*/

bool
eval_const_cond(COND *cond)
{
return ((Item_func*) cond)->val_int() ? TRUE : FALSE;
}


/**
Test if the sum of arguments overflows the ulonglong range.
*/
Expand Down
1 change: 0 additions & 1 deletion sql/item_func.h
Original file line number Diff line number Diff line change
Expand Up @@ -2279,7 +2279,6 @@ extern enum_field_types agg_field_type(Item **items, uint nitems,
Item *find_date_time_item(Item **args, uint nargs, uint col);
double my_double_round(double value, longlong dec, bool dec_unsigned,
bool truncate);
bool eval_const_cond(COND *cond);

extern bool volatile mqh_used;

Expand Down
4 changes: 2 additions & 2 deletions sql/sql_select.cc
Original file line number Diff line number Diff line change
Expand Up @@ -15644,7 +15644,7 @@ Item::remove_eq_conds(THD *thd, Item::cond_result *cond_value, bool top_level_ar
{
if (const_item() && !is_expensive())
{
*cond_value= eval_const_cond(this) ? Item::COND_TRUE : Item::COND_FALSE;
*cond_value= eval_const_cond() ? Item::COND_TRUE : Item::COND_FALSE;
return (COND*) 0;
}
*cond_value= Item::COND_OK;
Expand All @@ -15658,7 +15658,7 @@ Item_bool_func2::remove_eq_conds(THD *thd, Item::cond_result *cond_value,
{
if (const_item() && !is_expensive())
{
*cond_value= eval_const_cond(this) ? Item::COND_TRUE : Item::COND_FALSE;
*cond_value= eval_const_cond() ? Item::COND_TRUE : Item::COND_FALSE;
return (COND*) 0;
}
if ((*cond_value= eq_cmp_result()) != Item::COND_OK)
Expand Down

0 comments on commit 6fbbb08

Please sign in to comment.