Browse Source

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

pull/1254/head
Alexander Barkov 7 years ago
parent
commit
6fbbb0853e
  1. 8
      mysql-test/r/func_group.result
  2. 20
      mysql-test/r/type_decimal.result
  3. 21
      mysql-test/t/type_decimal.test
  4. 7
      sql/item.h
  5. 2
      sql/item_cmpfunc.cc
  6. 12
      sql/item_func.cc
  7. 1
      sql/item_func.h
  8. 4
      sql/sql_select.cc

8
mysql-test/r/func_group.result

@ -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)
@ -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

20
mysql-test/r/type_decimal.result

@ -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
mysql-test/t/type_decimal.test

@ -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
sql/item.h

@ -1000,6 +1000,13 @@ public:
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.

2
sql/item_cmpfunc.cc

@ -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 ..."

12
sql/item_func.cc

@ -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.
*/

1
sql/item_func.h

@ -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;

4
sql/sql_select.cc

@ -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;
@ -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)

Loading…
Cancel
Save