1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

MDEV-36235 Incorrect result for BETWEEN over unique blob prefix

Disallow range optimization for BETWEEN when casting one of the arguments
from STRING to a numeric type would be required to construct a range for
the query.

Adds a new method on Item_func_between called can_optimize_range_const
which allows range optimization when the types of the arguments to BETWEEN
would permit it.
This commit is contained in:
Dave Gosselin
2025-04-09 13:57:09 -04:00
committed by Dave Gosselin
parent 07b442aa68
commit 15fd232da4
10 changed files with 450 additions and 25 deletions

View File

@@ -2407,3 +2407,26 @@ f::f
DROP TABLE t1;
SET max_sort_length=DEFAULT;
# End of 10.8 tests
#
# MDEV-36235 Incorrect result for BETWEEN over unique blob prefix
#
CREATE OR REPLACE TABLE t1 (c1 BINARY(16), UNIQUE (c1));
INSERT INTO t1 (c1) VALUES (0x00000000000000000000000000000001);
INSERT INTO t1 (c1) VALUES (0x00000000000000000000000000000002);
SELECT CAST(c1 AS INET6) FROM t1 WHERE '::1' BETWEEN CAST('::1' AS INET6) AND c1;
CAST(c1 AS INET6)
::1
::2
SELECT CAST(c1 AS INET6) FROM t1 IGNORE KEY(c1) WHERE '::1' BETWEEN CAST('::1' AS INET6) AND c1;
CAST(c1 AS INET6)
::1
::2
SELECT CAST(c1 AS INET6) FROM t1 WHERE '::2' BETWEEN c1 AND CAST('::2' AS INET6);
CAST(c1 AS INET6)
::1
::2
SELECT CAST(c1 AS INET6) FROM t1 IGNORE KEY(c1) WHERE '::2' BETWEEN c1 AND CAST('::2' AS INET6);
CAST(c1 AS INET6)
::1
::2
DROP TABLE t1;

View File

@@ -1741,3 +1741,15 @@ DROP TABLE t1;
SET max_sort_length=DEFAULT;
--echo # End of 10.8 tests
--echo #
--echo # MDEV-36235 Incorrect result for BETWEEN over unique blob prefix
--echo #
CREATE OR REPLACE TABLE t1 (c1 BINARY(16), UNIQUE (c1));
INSERT INTO t1 (c1) VALUES (0x00000000000000000000000000000001);
INSERT INTO t1 (c1) VALUES (0x00000000000000000000000000000002);
SELECT CAST(c1 AS INET6) FROM t1 WHERE '::1' BETWEEN CAST('::1' AS INET6) AND c1;
SELECT CAST(c1 AS INET6) FROM t1 IGNORE KEY(c1) WHERE '::1' BETWEEN CAST('::1' AS INET6) AND c1;
SELECT CAST(c1 AS INET6) FROM t1 WHERE '::2' BETWEEN c1 AND CAST('::2' AS INET6);
SELECT CAST(c1 AS INET6) FROM t1 IGNORE KEY(c1) WHERE '::2' BETWEEN c1 AND CAST('::2' AS INET6);
DROP TABLE t1;