From 44a99777bfd98b5217fb8a90f318c03f8135bbc3 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Sat, 29 Aug 2015 23:08:15 +0400 Subject: [PATCH] MDEV-8698 Wrong result for SELECT..WHERE a BETWEEN 'a' AND 'c' COLLATE latin1_bin; --- mysql-test/r/ctype_latin1.result | 20 ++++++++++++++++++++ mysql-test/t/ctype_latin1.test | 11 +++++++++++ sql/item_cmpfunc.cc | 2 ++ 3 files changed, 33 insertions(+) diff --git a/mysql-test/r/ctype_latin1.result b/mysql-test/r/ctype_latin1.result index c0d3c970bc4..b1a1899fc95 100644 --- a/mysql-test/r/ctype_latin1.result +++ b/mysql-test/r/ctype_latin1.result @@ -8019,5 +8019,25 @@ Warnings: Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where ((`test`.`t1`.`a` = 'a') and (`test`.`t1`.`a` in ((('a' collate latin1_bin)),'b'))) DROP TABLE t1; # +# MDEV-8698 Wrong result for SELECT..WHERE a BETWEEN 'a' AND 'c' COLLATE latin1_bin; +# +SET NAMES latin1; +CREATE TABLE t1 (a VARCHAR(10)); +INSERT INTO t1 VALUES ('a'),('A'),('b'),('B'),('c'),('C'); +SELECT * FROM t1 WHERE a BETWEEN 'a' AND 'c' COLLATE latin1_bin; +a +a +b +c +SELECT * FROM t1 WHERE a BETWEEN 'a' AND 'c' COLLATE latin1_bin AND a='a'; +a +a +EXPLAIN EXTENDED SELECT * FROM t1 WHERE a BETWEEN 'a' AND 'c' COLLATE latin1_bin AND a='a'; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 6 100.00 Using where +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where ((`test`.`t1`.`a` = 'a') and (`test`.`t1`.`a` between 'a' and (('c' collate latin1_bin)))) +DROP TABLE t1; +# # End of 10.1 tests # diff --git a/mysql-test/t/ctype_latin1.test b/mysql-test/t/ctype_latin1.test index 98a08a1a7e3..4fada52030a 100644 --- a/mysql-test/t/ctype_latin1.test +++ b/mysql-test/t/ctype_latin1.test @@ -287,6 +287,17 @@ SELECT * FROM t1 WHERE a IN ('a' COLLATE latin1_bin,'b') AND a='a'; EXPLAIN EXTENDED SELECT * FROM t1 WHERE a IN ('a' COLLATE latin1_bin,'b') AND a='a'; DROP TABLE t1; +--echo # +--echo # MDEV-8698 Wrong result for SELECT..WHERE a BETWEEN 'a' AND 'c' COLLATE latin1_bin; +--echo # +SET NAMES latin1; +CREATE TABLE t1 (a VARCHAR(10)); +INSERT INTO t1 VALUES ('a'),('A'),('b'),('B'),('c'),('C'); +SELECT * FROM t1 WHERE a BETWEEN 'a' AND 'c' COLLATE latin1_bin; +SELECT * FROM t1 WHERE a BETWEEN 'a' AND 'c' COLLATE latin1_bin AND a='a'; +EXPLAIN EXTENDED SELECT * FROM t1 WHERE a BETWEEN 'a' AND 'c' COLLATE latin1_bin AND a='a'; +DROP TABLE t1; + --echo # --echo # End of 10.1 tests --echo # diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index dcb743cc9fc..c9f50379a67 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -2199,6 +2199,8 @@ void Item_func_between::fix_length_and_dec() return; if (agg_cmp_type(&m_compare_type, args, 3)) return; + args[0]->cmp_context= args[1]->cmp_context= args[2]->cmp_context= + m_compare_type; if (m_compare_type == STRING_RESULT && agg_arg_charsets_for_comparison(cmp_collation, args, 3)) return;