summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <sergefp@mysql.com>2005-04-17 02:06:17 +0400
committerunknown <sergefp@mysql.com>2005-04-17 02:06:17 +0400
commit3c112262b51280ecbf1a625d2f39d8fc41355e01 (patch)
tree6fd36edbe5ea19d489d1a930379d1204161d34f8
parentec280d6ffb908535cc5bf5dd279fc926a37301d9 (diff)
parent6b00231421ad954d207dd9a48518234145eb71a3 (diff)
downloadmariadb-git-3c112262b51280ecbf1a625d2f39d8fc41355e01.tar.gz
Merge spetrunia@bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.com:/home/psergey/mysql-4.1-look-range
-rw-r--r--mysql-test/r/range.result19
-rw-r--r--mysql-test/t/range.test21
-rw-r--r--sql/opt_range.cc1
3 files changed, 41 insertions, 0 deletions
diff --git a/mysql-test/r/range.result b/mysql-test/r/range.result
index fc2b4a78469..afd91ce5fe9 100644
--- a/mysql-test/r/range.result
+++ b/mysql-test/r/range.result
@@ -577,3 +577,22 @@ id select_type table type possible_keys key key_len ref rows Extra
explain select * from t1 where a='aaa' collate latin1_german1_ci;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL a NULL NULL NULL 9 Using where
+drop table t1;
+CREATE TABLE t1 (
+`CLIENT` char(3) character set latin1 collate latin1_bin NOT NULL default '000',
+`ARG1` char(3) character set latin1 collate latin1_bin NOT NULL default '',
+`ARG2` char(3) character set latin1 collate latin1_bin NOT NULL default '',
+`FUNCTION` varchar(10) character set latin1 collate latin1_bin NOT NULL default '',
+`FUNCTINT` int(11) NOT NULL default '0',
+KEY `VERI_CLNT~2` (`ARG1`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+INSERT INTO t1 VALUES ('000',' 0',' 0','Text 001',0), ('000',' 0',' 1','Text 002',0),
+('000',' 1',' 2','Text 003',0), ('000',' 2',' 3','Text 004',0),
+('001',' 3',' 0','Text 017',0);
+SELECT count(*) FROM t1 WHERE CLIENT='000' AND (ARG1 != ' 1' OR ARG1 != ' 2');
+count(*)
+4
+SELECT count(*) FROM t1 WHERE CLIENT='000' AND (ARG1 != ' 2' OR ARG1 != ' 1');
+count(*)
+4
+drop table t1;
diff --git a/mysql-test/t/range.test b/mysql-test/t/range.test
index 44f55da5722..3d3d4748fe3 100644
--- a/mysql-test/t/range.test
+++ b/mysql-test/t/range.test
@@ -445,3 +445,24 @@ explain select * from t1 where a=binary 'aaa';
explain select * from t1 where a='aaa' collate latin1_bin;
# this one cannot:
explain select * from t1 where a='aaa' collate latin1_german1_ci;
+drop table t1;
+
+# Test for BUG#9348 "result for WHERE A AND (B OR C) differs from WHERE a AND (C OR B)"
+CREATE TABLE t1 (
+ `CLIENT` char(3) character set latin1 collate latin1_bin NOT NULL default '000',
+ `ARG1` char(3) character set latin1 collate latin1_bin NOT NULL default '',
+ `ARG2` char(3) character set latin1 collate latin1_bin NOT NULL default '',
+ `FUNCTION` varchar(10) character set latin1 collate latin1_bin NOT NULL default '',
+ `FUNCTINT` int(11) NOT NULL default '0',
+ KEY `VERI_CLNT~2` (`ARG1`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+INSERT INTO t1 VALUES ('000',' 0',' 0','Text 001',0), ('000',' 0',' 1','Text 002',0),
+ ('000',' 1',' 2','Text 003',0), ('000',' 2',' 3','Text 004',0),
+ ('001',' 3',' 0','Text 017',0);
+
+SELECT count(*) FROM t1 WHERE CLIENT='000' AND (ARG1 != ' 1' OR ARG1 != ' 2');
+
+SELECT count(*) FROM t1 WHERE CLIENT='000' AND (ARG1 != ' 2' OR ARG1 != ' 1');
+drop table t1;
+
diff --git a/sql/opt_range.cc b/sql/opt_range.cc
index d25901e56b1..e2cae0598a0 100644
--- a/sql/opt_range.cc
+++ b/sql/opt_range.cc
@@ -1683,6 +1683,7 @@ key_or(SEL_ARG *key1,SEL_ARG *key2)
last=last->next;
key1=key1->tree_delete(save);
}
+ last->copy_min(tmp);
if (last->copy_min(key2) || last->copy_max(key2))
{ // Full range
key1->free_tree();