summaryrefslogtreecommitdiff
path: root/mysql-test/t/range.test
diff options
context:
space:
mode:
authorSergei Petrunia <psergey@askmonty.org>2016-07-27 00:38:51 +0300
committerSergei Petrunia <psergey@askmonty.org>2016-07-27 00:38:51 +0300
commit15ef38d2ea97575c71b83db6669ee20000c23a6b (patch)
treeff0994f2974e0c2ef6999714169a1a68034a2ef3 /mysql-test/t/range.test
parent1b5da2ca49f69605ccfe4d98e9207e7b8551e21f (diff)
downloadmariadb-git-15ef38d2ea97575c71b83db6669ee20000c23a6b.tar.gz
MDEV-10228: Delete missing rows with OR conditions
Fix get_quick_keys(): When building range tree from a condition in form keypart1=const AND (keypart2 < 0 OR keypart2>=0) the SEL_ARG for keypart2 represents an interval (-inf, +inf). However, the logic that sets UNIQUE_RANGE flag fails to recognize this, and sets UNIQUE_RANGE flag if (keypart1, keypart2) covered a unique key. As a result, range access executor assumes the interval can have at most one row and only reads the first row from it.
Diffstat (limited to 'mysql-test/t/range.test')
-rw-r--r--mysql-test/t/range.test29
1 files changed, 29 insertions, 0 deletions
diff --git a/mysql-test/t/range.test b/mysql-test/t/range.test
index b73b09dffd5..393ca68e945 100644
--- a/mysql-test/t/range.test
+++ b/mysql-test/t/range.test
@@ -1689,3 +1689,32 @@ insert into t2 values (0, 0, 0, 0), (1, 1, 1, 1);
analyze table t2;
select a, b from t2 where (a, b) in ((0, 0), (1, 1));
drop table t2;
+
+--echo #
+--echo # MDEV-10228: Delete missing rows with OR conditions
+--echo # (The example uses UPDATE, because UPDATE allows to use index hints
+--echo # and so it's possible to make an example that works with any storage
+--echo # engine)
+--echo #
+
+CREATE TABLE t1 (
+ key1varchar varchar(14) NOT NULL,
+ key2int int(11) NOT NULL DEFAULT '0',
+ col1 int,
+ PRIMARY KEY (key1varchar,key2int),
+ KEY key1varchar (key1varchar),
+ KEY key2int (key2int)
+) DEFAULT CHARSET=utf8;
+
+insert into t1 values
+ ('value1',0, 0),
+ ('value1',1, 0),
+ ('value1',1000685, 0),
+ ('value1',1003560, 0),
+ ('value1',1004807, 0);
+
+update t1 force index (PRIMARY) set col1=12345
+where (key1varchar='value1' AND (key2int <=1 OR key2int > 1));
+--echo # The following must show col1=12345 for all rows:
+select * from t1;
+drop table t1;