summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2021-03-20 13:34:38 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2021-03-20 13:34:38 +0200
commit8570a6a0938055b36aabde3f440cae2c5584441b (patch)
tree1168645d76a69f5af9abe8006d6e0dd24a97b0df
parent1bacab8ab9a0bff3b7e43920610b03d5a98b3282 (diff)
parentd8dc8537e4f6cfb3b0c63123a8d9df5c1101970d (diff)
downloadmariadb-git-8570a6a0938055b36aabde3f440cae2c5584441b.tar.gz
Merge 10.4 into 10.5
-rw-r--r--mysql-test/main/func_group.result36
-rw-r--r--mysql-test/main/func_group.test32
-rw-r--r--mysql-test/suite/engines/funcs/r/rpl_sp,myisam,mix.rdiff2
-rw-r--r--mysys/my_seek.c2
-rw-r--r--sql/opt_sum.cc3
5 files changed, 72 insertions, 3 deletions
diff --git a/mysql-test/main/func_group.result b/mysql-test/main/func_group.result
index 1fc92ba90cc..0f09aedc22a 100644
--- a/mysql-test/main/func_group.result
+++ b/mysql-test/main/func_group.result
@@ -2460,7 +2460,38 @@ count(*)+sleep(0)
2
drop table t1;
#
-# Start of 10.3 tests
+# MDEV-25112: MIN/MAX optimization for query containing BETWEEN in WHERE
+#
+create table t1 (a int) engine=myisam;
+insert into t1 values (267), (273), (287), (303), (308);
+select max(a) from t1 where a < 303 and (a between 267 AND 287);
+max(a)
+287
+explain select max(a) from t1 where a < 303 and (a between 267 AND 287);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 5 Using where
+select min(a) from t1 where a > 267 and (a between 273 AND 303);
+min(a)
+273
+explain select min(a) from t1 where a > 267 and (a between 273 AND 303);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 5 Using where
+create index idx on t1(a);
+select max(a) from t1 where a < 303 and (a between 267 AND 287);
+max(a)
+287
+explain select max(a) from t1 where a < 303 and (a between 267 AND 287);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
+select min(a) from t1 where a > 267 and (a between 273 AND 303);
+min(a)
+273
+explain select min(a) from t1 where a > 267 and (a between 273 AND 303);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
+drop table t1;
+#
+# End of 10.2 tests
#
#
# MDEV-9408 CREATE TABLE SELECT MAX(int_column) creates different columns for table vs view
@@ -2492,3 +2523,6 @@ t2 CREATE TABLE `t2` (
DROP TABLE t2;
DROP VIEW v1;
DROP TABLE t1;
+#
+# End of 10.3 tests
+#
diff --git a/mysql-test/main/func_group.test b/mysql-test/main/func_group.test
index bc2d6e9047d..10b92cbadca 100644
--- a/mysql-test/main/func_group.test
+++ b/mysql-test/main/func_group.test
@@ -1705,7 +1705,33 @@ select count(*)+sleep(0) from t1;
drop table t1;
--echo #
---echo # Start of 10.3 tests
+--echo # MDEV-25112: MIN/MAX optimization for query containing BETWEEN in WHERE
+--echo #
+
+create table t1 (a int) engine=myisam;
+insert into t1 values (267), (273), (287), (303), (308);
+
+let $q1=
+select max(a) from t1 where a < 303 and (a between 267 AND 287);
+let $q2=
+select min(a) from t1 where a > 267 and (a between 273 AND 303);
+
+eval $q1;
+eval explain $q1;
+eval $q2;
+eval explain $q2;
+
+create index idx on t1(a);
+
+eval $q1;
+eval explain $q1;
+eval $q2;
+eval explain $q2;
+
+drop table t1;
+
+--echo #
+--echo # End of 10.2 tests
--echo #
--echo #
@@ -1730,3 +1756,7 @@ DROP TABLE t2;
DROP VIEW v1;
DROP TABLE t1;
+
+--echo #
+--echo # End of 10.3 tests
+--echo #
diff --git a/mysql-test/suite/engines/funcs/r/rpl_sp,myisam,mix.rdiff b/mysql-test/suite/engines/funcs/r/rpl_sp,myisam,mix.rdiff
index 47901f63a51..da41283e42f 100644
--- a/mysql-test/suite/engines/funcs/r/rpl_sp,myisam,mix.rdiff
+++ b/mysql-test/suite/engines/funcs/r/rpl_sp,myisam,mix.rdiff
@@ -1,3 +1,5 @@
+--- /home/alice/git/10.3/mysql-test/suite/engines/funcs/r/rpl_sp,myisam,mix.result~ 2021-03-19 17:27:12.935559866 +0100
++++ /home/alice/git/10.3/mysql-test/suite/engines/funcs/r/rpl_sp,myisam,mix.reject 2021-03-19 17:27:14.071534938 +0100
@@ -126,12 +126,15 @@
show warnings;
Level Code Message
diff --git a/mysys/my_seek.c b/mysys/my_seek.c
index 6a370b0ad43..db364ccddda 100644
--- a/mysys/my_seek.c
+++ b/mysys/my_seek.c
@@ -86,7 +86,7 @@ my_off_t my_tell(File fd, myf MyFlags)
DBUG_ENTER("my_tell");
DBUG_PRINT("my",("fd: %d MyFlags: %lu",fd, MyFlags));
DBUG_ASSERT(fd >= 0);
-#if defined (HAVE_TELL) && !defined (_WIN32)
+#if defined (HAVE_TELL) && !defined (_WIN32) && !defined(_AIX)
pos= tell(fd);
#else
pos= my_seek(fd, 0L, MY_SEEK_CUR,0);
diff --git a/sql/opt_sum.cc b/sql/opt_sum.cc
index af2d9ddc2e7..27360d4a10c 100644
--- a/sql/opt_sum.cc
+++ b/sql/opt_sum.cc
@@ -842,7 +842,10 @@ static bool matching_cond(bool max_fl, TABLE_REF *ref, KEY *keyinfo,
if (is_field_part)
{
if (between || eq_type)
+ {
*range_fl&= ~(NO_MAX_RANGE | NO_MIN_RANGE);
+ *range_fl&= ~(max_fl ? NEAR_MAX : NEAR_MIN);
+ }
else
{
*range_fl&= ~(max_fl ? NO_MAX_RANGE : NO_MIN_RANGE);