diff options
author | Alexander Barkov <bar@mariadb.com> | 2019-03-26 11:37:18 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.com> | 2019-03-26 11:37:18 +0400 |
commit | 6fbbb0853e7e58621f73f0afc600cd95995413ed (patch) | |
tree | 5206eecee6f4a398db8a24f7273c08f7d1e7afaa | |
parent | ed643f4bb31d8e5a9c0bc161583b8c9b2a08c26b (diff) | |
download | mariadb-git-6fbbb0853e7e58621f73f0afc600cd95995413ed.tar.gz |
MDEV-18968 Both (WHERE 0.1) and (WHERE NOT 0.1) return empty set
-rw-r--r-- | mysql-test/r/func_group.result | 8 | ||||
-rw-r--r-- | mysql-test/r/type_decimal.result | 20 | ||||
-rw-r--r-- | mysql-test/t/type_decimal.test | 21 | ||||
-rw-r--r-- | sql/item.h | 7 | ||||
-rw-r--r-- | sql/item_cmpfunc.cc | 2 | ||||
-rw-r--r-- | sql/item_func.cc | 12 | ||||
-rw-r--r-- | sql/item_func.h | 1 | ||||
-rw-r--r-- | sql/sql_select.cc | 4 |
8 files changed, 55 insertions, 20 deletions
diff --git a/mysql-test/r/func_group.result b/mysql-test/r/func_group.result index e0e870d1573..b9875faacb6 100644 --- a/mysql-test/r/func_group.result +++ b/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 diff --git a/mysql-test/r/type_decimal.result b/mysql-test/r/type_decimal.result index e515326e851..c9adf6a4f88 100644 --- a/mysql-test/r/type_decimal.result +++ b/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 +# diff --git a/mysql-test/t/type_decimal.test b/mysql-test/t/type_decimal.test index 834fd0c5327..4a4b3d52884 100644 --- a/mysql-test/t/type_decimal.test +++ b/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 # diff --git a/sql/item.h b/sql/item.h index 79cde008946..75ebcdb624c 100644 --- a/sql/item.h +++ b/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. diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 2c1320f82b3..28e94275c85 100644 --- a/sql/item_cmpfunc.cc +++ b/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 ..." diff --git a/sql/item_func.cc b/sql/item_func.cc index 169eb76d802..e995903b940 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -69,18 +69,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. */ static inline bool test_if_sum_overflows_ull(ulonglong arg1, ulonglong arg2) diff --git a/sql/item_func.h b/sql/item_func.h index e3eab02f213..c387c56f3b4 100644 --- a/sql/item_func.h +++ b/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; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 280de2b2ef1..62365f48404 100644 --- a/sql/sql_select.cc +++ b/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) |