diff --git a/mysql-test/r/bug_120535.result b/mysql-test/r/bug_120535.result new file mode 100644 index 000000000000..5031536d1a73 --- /dev/null +++ b/mysql-test/r/bug_120535.result @@ -0,0 +1,465 @@ +# +# Bug#120535 Regression coverage +# +SET @save_optimizer_switch=@@optimizer_switch; +SET @save_sql_mode=@@sql_mode; +SET @save_default_storage_engine=@@default_storage_engine; +SET @save_character_set_client=@@character_set_client; +SET @save_character_set_results=@@character_set_results; +SET @save_character_set_connection=@@character_set_connection; +SET @save_collation_connection=@@collation_connection; +CREATE DATABASE bug_120535 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; +USE bug_120535; +SET sql_mode=DEFAULT; +SET optimizer_switch=DEFAULT; +SET default_storage_engine=InnoDB; +SET NAMES utf8mb4 COLLATE utf8mb4_general_ci; +SET SESSION sql_mode=''; +CREATE TABLE t0 (c0 smallint STORAGE DISK DEFAULT NULL COMMENT 'asdf',KEY i0(c0) USING BTREE); +INSERT INTO t0(c0) VALUES (1); +SELECT ALL t0.c0 AS ref0 FROM t0 WHERE (t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)); +ref0 +PREPARE regression_stmt FROM 'SELECT ALL t0.c0 AS ref0 FROM t0 WHERE (t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'''',NULL));'; +EXECUTE regression_stmt; +ref0 +EXECUTE regression_stmt; +ref0 +DEALLOCATE PREPARE regression_stmt; +SELECT ALL t0.c0 AS ref0 FROM t0 WHERE NOT (NOT ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)))); +ref0 +SELECT ALL t0.c0 AS ref0 FROM t0 FORCE INDEX (i0) WHERE (t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)); +ref0 +SELECT ALL d.c0 AS ref0 FROM (SELECT t0.c0 AS c0 FROM t0) AS d WHERE (d.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)); +ref0 +SELECT ALL d.c0 AS ref0 FROM (SELECT t0.c0 AS c0, (t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)) AS pred FROM t0) AS d WHERE d.pred; +ref0 +SELECT ALL t0.c0 AS ref0 FROM t0 WHERE ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)) AND t0.c0 = 1) UNION ALL SELECT ALL t0.c0 AS ref0 FROM t0 WHERE ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)) AND NOT (t0.c0 = 1)) UNION ALL SELECT ALL t0.c0 AS ref0 FROM t0 WHERE ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)) AND (t0.c0 = 1) IS NULL); +ref0 +SELECT ALL t0.c0 AS ref0 FROM t0 WHERE CASE WHEN (t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)) THEN (t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)) ELSE (t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)) END; +ref0 +SELECT ALL t0.c0 AS ref0 FROM t0 IGNORE INDEX (i0) WHERE (t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)); +ref0 +SELECT ALL t0.c0 AS ref0 FROM t0 WHERE NOT NOT ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))); +ref0 +WITH q AS (SELECT t0.c0 AS c0 FROM t0) SELECT ALL q.c0 AS ref0 FROM q WHERE (q.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)); +ref0 +SELECT ALL d.c0 AS ref0 FROM (SELECT t0.c0 AS c0, (t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)) AS keep_row FROM t0) AS d WHERE d.keep_row; +ref0 +SELECT ALL t0.c0 AS ref0 FROM t0 WHERE ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) AND (t0.c0 = 1) UNION ALL SELECT ALL t0.c0 AS ref0 FROM t0 WHERE ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) AND NOT (t0.c0 = 1) UNION ALL SELECT ALL t0.c0 AS ref0 FROM t0 WHERE ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) AND ((t0.c0 = 1) IS NULL); +ref0 +SELECT ALL t0.c0 AS ref0 FROM t0 WHERE CASE WHEN ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) THEN ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) ELSE ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) END; +ref0 +SELECT ALL t0.c0 AS ref0 FROM t0 WHERE ((((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) OR NOT ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) OR (((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) IS NULL)) AND ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)))); +ref0 +SELECT ALL t0.c0 AS ref0 FROM t0 WHERE ((((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) AND NOT ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) AND (((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) IS NOT NULL)) OR ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)))); +ref0 +USE test; +DROP DATABASE bug_120535; +CREATE DATABASE bug_120535 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; +USE bug_120535; +SET sql_mode=DEFAULT; +SET optimizer_switch=DEFAULT; +SET default_storage_engine=InnoDB; +SET NAMES utf8mb4 COLLATE utf8mb4_general_ci; +CREATE TABLE t (id INT PRIMARY KEY, i INT, KEY k (i)); +INSERT INTO t VALUES (1,1),(2,2),(3,3),(4,4),(5,5),(6,0),(7,-2); +SELECT id FROM t FORCE INDEX (k) WHERE i = CAST(1.5 AS DOUBLE); +id +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX (k) WHERE i = CAST(1.5 AS DOUBLE);'; +EXECUTE regression_stmt; +id +EXECUTE regression_stmt; +id +DEALLOCATE PREPARE regression_stmt; +SELECT id FROM t WHERE i = CAST(1.5 AS DOUBLE); +id +SELECT id FROM t FORCE INDEX (k) WHERE i = 1.5e0; +id +SELECT id FROM t FORCE INDEX (k) WHERE NOT NOT (i = CAST(1.5 AS DOUBLE)); +id +SELECT q.id FROM (SELECT id, i = CAST(1.5 AS DOUBLE) AS matches_value FROM t FORCE INDEX (k)) AS q WHERE q.matches_value; +id +SELECT id FROM t USE INDEX (k) WHERE i = CAST(1.5 AS DOUBLE); +id +SELECT id FROM t FORCE INDEX (k) WHERE CASE WHEN i = CAST(1.5 AS DOUBLE) THEN i = CAST(1.5 AS DOUBLE) ELSE i = CAST(1.5 AS DOUBLE) END; +id +SELECT id FROM t IGNORE INDEX (k) WHERE i = CAST(1.5 AS DOUBLE); +id +SELECT id FROM t FORCE INDEX (PRIMARY) WHERE i = CAST(1.5 AS DOUBLE); +id +SELECT id FROM t FORCE INDEX (k) WHERE i = 1.5E0; +id +SELECT d.id FROM (SELECT id, i = CAST(1.5 AS DOUBLE) AS p FROM t FORCE INDEX (k)) AS d WHERE d.p; +id +SELECT id FROM t FORCE INDEX (k) WHERE ((i = CAST(1.5 AS DOUBLE) OR NOT (i = CAST(1.5 AS DOUBLE))) OR (i = CAST(1.5 AS DOUBLE)) IS NULL) AND (i = CAST(1.5 AS DOUBLE)); +id +SELECT id FROM t FORCE INDEX (k) WHERE (((i = CAST(1.5 AS DOUBLE)) AND NOT (i = CAST(1.5 AS DOUBLE))) AND (i = CAST(1.5 AS DOUBLE)) IS NOT NULL) OR (i = CAST(1.5 AS DOUBLE)); +id +USE test; +DROP DATABASE bug_120535; +CREATE DATABASE bug_120535 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; +USE bug_120535; +SET sql_mode=DEFAULT; +SET optimizer_switch=DEFAULT; +SET default_storage_engine=InnoDB; +SET NAMES utf8mb4 COLLATE utf8mb4_general_ci; +CREATE TABLE t (id INT PRIMARY KEY,i TINYINT,KEY k(i)); +INSERT INTO t VALUES (1,-2),(2,-1),(3,0),(4,1),(5,2),(6,NULL); +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.5 AS DOUBLE); +id +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.5 AS DOUBLE);'; +EXECUTE regression_stmt; +id +EXECUTE regression_stmt; +id +DEALLOCATE PREPARE regression_stmt; +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.0 AS DOUBLE); +id +2 +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.0 AS DOUBLE);'; +EXECUTE regression_stmt; +id +2 +EXECUTE regression_stmt; +id +2 +DEALLOCATE PREPARE regression_stmt; +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(0.0 AS DOUBLE); +id +3 +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(0.0 AS DOUBLE);'; +EXECUTE regression_stmt; +id +3 +EXECUTE regression_stmt; +id +3 +DEALLOCATE PREPARE regression_stmt; +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(1.5 AS DOUBLE); +id +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(1.5 AS DOUBLE);'; +EXECUTE regression_stmt; +id +EXECUTE regression_stmt; +id +DEALLOCATE PREPARE regression_stmt; +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(2.0 AS DOUBLE); +id +5 +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(2.0 AS DOUBLE);'; +EXECUTE regression_stmt; +id +5 +EXECUTE regression_stmt; +id +5 +DEALLOCATE PREPARE regression_stmt; +USE test; +DROP DATABASE bug_120535; +CREATE DATABASE bug_120535 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; +USE bug_120535; +SET sql_mode=DEFAULT; +SET optimizer_switch=DEFAULT; +SET default_storage_engine=InnoDB; +SET NAMES utf8mb4 COLLATE utf8mb4_general_ci; +CREATE TABLE t (id INT PRIMARY KEY,i SMALLINT,KEY k(i)); +INSERT INTO t VALUES (1,-2),(2,-1),(3,0),(4,1),(5,2),(6,NULL); +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.5 AS DOUBLE); +id +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.5 AS DOUBLE);'; +EXECUTE regression_stmt; +id +EXECUTE regression_stmt; +id +DEALLOCATE PREPARE regression_stmt; +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.0 AS DOUBLE); +id +2 +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.0 AS DOUBLE);'; +EXECUTE regression_stmt; +id +2 +EXECUTE regression_stmt; +id +2 +DEALLOCATE PREPARE regression_stmt; +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(0.0 AS DOUBLE); +id +3 +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(0.0 AS DOUBLE);'; +EXECUTE regression_stmt; +id +3 +EXECUTE regression_stmt; +id +3 +DEALLOCATE PREPARE regression_stmt; +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(1.5 AS DOUBLE); +id +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(1.5 AS DOUBLE);'; +EXECUTE regression_stmt; +id +EXECUTE regression_stmt; +id +DEALLOCATE PREPARE regression_stmt; +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(2.0 AS DOUBLE); +id +5 +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(2.0 AS DOUBLE);'; +EXECUTE regression_stmt; +id +5 +EXECUTE regression_stmt; +id +5 +DEALLOCATE PREPARE regression_stmt; +USE test; +DROP DATABASE bug_120535; +CREATE DATABASE bug_120535 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; +USE bug_120535; +SET sql_mode=DEFAULT; +SET optimizer_switch=DEFAULT; +SET default_storage_engine=InnoDB; +SET NAMES utf8mb4 COLLATE utf8mb4_general_ci; +CREATE TABLE t (id INT PRIMARY KEY,i INT,KEY k(i)); +INSERT INTO t VALUES (1,-2),(2,-1),(3,0),(4,1),(5,2),(6,NULL); +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.5 AS DOUBLE); +id +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.5 AS DOUBLE);'; +EXECUTE regression_stmt; +id +EXECUTE regression_stmt; +id +DEALLOCATE PREPARE regression_stmt; +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.0 AS DOUBLE); +id +2 +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.0 AS DOUBLE);'; +EXECUTE regression_stmt; +id +2 +EXECUTE regression_stmt; +id +2 +DEALLOCATE PREPARE regression_stmt; +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(0.0 AS DOUBLE); +id +3 +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(0.0 AS DOUBLE);'; +EXECUTE regression_stmt; +id +3 +EXECUTE regression_stmt; +id +3 +DEALLOCATE PREPARE regression_stmt; +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(1.5 AS DOUBLE); +id +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(1.5 AS DOUBLE);'; +EXECUTE regression_stmt; +id +EXECUTE regression_stmt; +id +DEALLOCATE PREPARE regression_stmt; +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(2.0 AS DOUBLE); +id +5 +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(2.0 AS DOUBLE);'; +EXECUTE regression_stmt; +id +5 +EXECUTE regression_stmt; +id +5 +DEALLOCATE PREPARE regression_stmt; +USE test; +DROP DATABASE bug_120535; +CREATE DATABASE bug_120535 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; +USE bug_120535; +SET sql_mode=DEFAULT; +SET optimizer_switch=DEFAULT; +SET default_storage_engine=InnoDB; +SET NAMES utf8mb4 COLLATE utf8mb4_general_ci; +CREATE TABLE t (id INT PRIMARY KEY,i BIGINT,KEY k(i)); +INSERT INTO t VALUES (1,-2),(2,-1),(3,0),(4,1),(5,2),(6,NULL); +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.5 AS DOUBLE); +id +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.5 AS DOUBLE);'; +EXECUTE regression_stmt; +id +EXECUTE regression_stmt; +id +DEALLOCATE PREPARE regression_stmt; +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.0 AS DOUBLE); +id +2 +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.0 AS DOUBLE);'; +EXECUTE regression_stmt; +id +2 +EXECUTE regression_stmt; +id +2 +DEALLOCATE PREPARE regression_stmt; +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(0.0 AS DOUBLE); +id +3 +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(0.0 AS DOUBLE);'; +EXECUTE regression_stmt; +id +3 +EXECUTE regression_stmt; +id +3 +DEALLOCATE PREPARE regression_stmt; +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(1.5 AS DOUBLE); +id +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(1.5 AS DOUBLE);'; +EXECUTE regression_stmt; +id +EXECUTE regression_stmt; +id +DEALLOCATE PREPARE regression_stmt; +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(2.0 AS DOUBLE); +id +5 +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(2.0 AS DOUBLE);'; +EXECUTE regression_stmt; +id +5 +EXECUTE regression_stmt; +id +5 +DEALLOCATE PREPARE regression_stmt; +USE test; +DROP DATABASE bug_120535; +CREATE DATABASE bug_120535 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; +USE bug_120535; +SET sql_mode=DEFAULT; +SET optimizer_switch=DEFAULT; +SET default_storage_engine=InnoDB; +SET NAMES utf8mb4 COLLATE utf8mb4_general_ci; +CREATE TABLE source (vp_rowid BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO source VALUES (); +CREATE TABLE l (vp_rowid BIGINT NOT NULL PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE r (vp_rowid BIGINT NOT NULL PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO l SELECT vp_rowid FROM source; +INSERT INTO r SELECT vp_rowid FROM source; +SELECT MAX(DISTINCT source.vp_rowid) AS ref0 FROM source WHERE LEAST('Uk]6T',0.8087354366787728) IN (source.vp_rowid); +ref0 +NULL +PREPARE regression_stmt FROM 'SELECT MAX(DISTINCT source.vp_rowid) AS ref0 FROM source WHERE LEAST(''Uk]6T'',0.8087354366787728) IN (source.vp_rowid);'; +EXECUTE regression_stmt; +ref0 +NULL +EXECUTE regression_stmt; +ref0 +NULL +DEALLOCATE PREPARE regression_stmt; +SELECT MAX(DISTINCT l.vp_rowid) AS ref0 FROM l WHERE LEAST('Uk]6T',0.8087354366787728) IN (l.vp_rowid); +ref0 +NULL +SELECT MAX(source.vp_rowid) AS ref0 FROM source WHERE LEAST('Uk]6T',0.8087354366787728) IN (source.vp_rowid); +ref0 +NULL +SELECT MAX(DISTINCT source.vp_rowid) AS ref0 FROM source WHERE LEAST('Uk]6T',0.8087354366787728) = source.vp_rowid; +ref0 +NULL +SELECT MAX(DISTINCT source.vp_rowid) AS ref0 FROM source WHERE NOT (NOT (LEAST('Uk]6T',0.8087354366787728) IN (source.vp_rowid))); +ref0 +NULL +SELECT MAX(DISTINCT s.vp_rowid) AS ref0 FROM (SELECT vp_rowid FROM source) AS s WHERE LEAST('Uk]6T',0.8087354366787728) IN (s.vp_rowid); +ref0 +NULL +SELECT MAX(DISTINCT source.vp_rowid) AS ref0 FROM source FORCE INDEX (PRIMARY) WHERE LEAST('Uk]6T',0.8087354366787728) IN (source.vp_rowid); +ref0 +NULL +SELECT MAX(DISTINCT source.vp_rowid) AS ref0 FROM source JOIN l ON l.vp_rowid = source.vp_rowid WHERE LEAST('Uk]6T',0.8087354366787728) IN (source.vp_rowid); +ref0 +NULL +SELECT MAX(DISTINCT s.vp_rowid) AS ref0 FROM (SELECT vp_rowid, LEAST('Uk]6T',0.8087354366787728) IN (vp_rowid) AS keep_row FROM source) AS s WHERE s.keep_row; +ref0 +NULL +SELECT MAX(DISTINCT source.vp_rowid) AS ref0 FROM source WHERE CASE WHEN LEAST('Uk]6T',0.8087354366787728) IN (source.vp_rowid) THEN LEAST('Uk]6T',0.8087354366787728) IN (source.vp_rowid) ELSE LEAST('Uk]6T',0.8087354366787728) IN (source.vp_rowid) END; +ref0 +NULL +SELECT MAX(DISTINCT source.vp_rowid) AS ref0 FROM l AS source WHERE LEAST('Uk]6T',0.8087354366787728) IN (source.vp_rowid); +ref0 +NULL +SELECT MAX(DISTINCT source.vp_rowid) AS ref0 FROM source INNER JOIN l ON l.vp_rowid = source.vp_rowid WHERE LEAST('Uk]6T',0.8087354366787728) IN (source.vp_rowid); +ref0 +NULL +USE test; +DROP DATABASE bug_120535; +CREATE DATABASE bug_120535 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; +USE bug_120535; +SET sql_mode=DEFAULT; +SET optimizer_switch=DEFAULT; +SET default_storage_engine=InnoDB; +SET NAMES utf8mb4 COLLATE utf8mb4_general_ci; +CREATE TABLE boundary_values (x BIGINT,KEY k(x)) ENGINE=InnoDB; +INSERT INTO boundary_values VALUES (-2),(-1),(0),(1),(2),(NULL); +SELECT MIN(x),MAX(x) FROM boundary_values FORCE INDEX(k) WHERE x=CAST(-1.5 AS DOUBLE); +MIN(x) MAX(x) +NULL NULL +PREPARE regression_stmt FROM 'SELECT MIN(x),MAX(x) FROM boundary_values FORCE INDEX(k) WHERE x=CAST(-1.5 AS DOUBLE);'; +EXECUTE regression_stmt; +MIN(x) MAX(x) +NULL NULL +EXECUTE regression_stmt; +MIN(x) MAX(x) +NULL NULL +DEALLOCATE PREPARE regression_stmt; +SELECT MIN(x),MAX(x) FROM boundary_values FORCE INDEX(k) WHERE x=CAST(-1.0 AS DOUBLE); +MIN(x) MAX(x) +-1 -1 +PREPARE regression_stmt FROM 'SELECT MIN(x),MAX(x) FROM boundary_values FORCE INDEX(k) WHERE x=CAST(-1.0 AS DOUBLE);'; +EXECUTE regression_stmt; +MIN(x) MAX(x) +-1 -1 +EXECUTE regression_stmt; +MIN(x) MAX(x) +-1 -1 +DEALLOCATE PREPARE regression_stmt; +SELECT MIN(x),MAX(x) FROM boundary_values FORCE INDEX(k) WHERE x=CAST(0.0 AS DOUBLE); +MIN(x) MAX(x) +0 0 +PREPARE regression_stmt FROM 'SELECT MIN(x),MAX(x) FROM boundary_values FORCE INDEX(k) WHERE x=CAST(0.0 AS DOUBLE);'; +EXECUTE regression_stmt; +MIN(x) MAX(x) +0 0 +EXECUTE regression_stmt; +MIN(x) MAX(x) +0 0 +DEALLOCATE PREPARE regression_stmt; +SELECT MIN(x),MAX(x) FROM boundary_values FORCE INDEX(k) WHERE x=CAST(1.5 AS DOUBLE); +MIN(x) MAX(x) +NULL NULL +PREPARE regression_stmt FROM 'SELECT MIN(x),MAX(x) FROM boundary_values FORCE INDEX(k) WHERE x=CAST(1.5 AS DOUBLE);'; +EXECUTE regression_stmt; +MIN(x) MAX(x) +NULL NULL +EXECUTE regression_stmt; +MIN(x) MAX(x) +NULL NULL +DEALLOCATE PREPARE regression_stmt; +SELECT MIN(x),MAX(x) FROM boundary_values FORCE INDEX(k) WHERE x=CAST(2.0 AS DOUBLE); +MIN(x) MAX(x) +2 2 +PREPARE regression_stmt FROM 'SELECT MIN(x),MAX(x) FROM boundary_values FORCE INDEX(k) WHERE x=CAST(2.0 AS DOUBLE);'; +EXECUTE regression_stmt; +MIN(x) MAX(x) +2 2 +EXECUTE regression_stmt; +MIN(x) MAX(x) +2 2 +DEALLOCATE PREPARE regression_stmt; +USE test; +DROP DATABASE bug_120535; +SET optimizer_switch=@save_optimizer_switch; +SET sql_mode=@save_sql_mode; +SET default_storage_engine=@save_default_storage_engine; +SET character_set_client=@save_character_set_client; +SET character_set_results=@save_character_set_results; +SET character_set_connection=@save_character_set_connection; +SET collation_connection=@save_collation_connection; diff --git a/mysql-test/t/bug_120535.test b/mysql-test/t/bug_120535.test new file mode 100644 index 000000000000..a1f6e4aec86d --- /dev/null +++ b/mysql-test/t/bug_120535.test @@ -0,0 +1,400 @@ +--echo # +--echo # Bug#120535 Regression coverage +--echo # +SET @save_optimizer_switch=@@optimizer_switch; +SET @save_sql_mode=@@sql_mode; +SET @save_default_storage_engine=@@default_storage_engine; +SET @save_character_set_client=@@character_set_client; +SET @save_character_set_results=@@character_set_results; +SET @save_character_set_connection=@@character_set_connection; +SET @save_collation_connection=@@collation_connection; +CREATE DATABASE bug_120535 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; +USE bug_120535; +SET sql_mode=DEFAULT; +SET optimizer_switch=DEFAULT; +SET default_storage_engine=InnoDB; +SET NAMES utf8mb4 COLLATE utf8mb4_general_ci; +SET SESSION sql_mode=''; +CREATE TABLE t0 (c0 smallint STORAGE DISK DEFAULT NULL COMMENT 'asdf',KEY i0(c0) USING BTREE); +INSERT INTO t0(c0) VALUES (1); +--sorted_result +SELECT ALL t0.c0 AS ref0 FROM t0 WHERE (t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)); +PREPARE regression_stmt FROM 'SELECT ALL t0.c0 AS ref0 FROM t0 WHERE (t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'''',NULL));'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +--sorted_result +SELECT ALL t0.c0 AS ref0 FROM t0 WHERE NOT (NOT ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)))); +--sorted_result +SELECT ALL t0.c0 AS ref0 FROM t0 FORCE INDEX (i0) WHERE (t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)); +--sorted_result +SELECT ALL d.c0 AS ref0 FROM (SELECT t0.c0 AS c0 FROM t0) AS d WHERE (d.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)); +--sorted_result +SELECT ALL d.c0 AS ref0 FROM (SELECT t0.c0 AS c0, (t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)) AS pred FROM t0) AS d WHERE d.pred; +--sorted_result +SELECT ALL t0.c0 AS ref0 FROM t0 WHERE ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)) AND t0.c0 = 1) UNION ALL SELECT ALL t0.c0 AS ref0 FROM t0 WHERE ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)) AND NOT (t0.c0 = 1)) UNION ALL SELECT ALL t0.c0 AS ref0 FROM t0 WHERE ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)) AND (t0.c0 = 1) IS NULL); +--sorted_result +SELECT ALL t0.c0 AS ref0 FROM t0 WHERE CASE WHEN (t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)) THEN (t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)) ELSE (t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)) END; +--sorted_result +SELECT ALL t0.c0 AS ref0 FROM t0 IGNORE INDEX (i0) WHERE (t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)); +--sorted_result +SELECT ALL t0.c0 AS ref0 FROM t0 WHERE NOT NOT ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))); +--sorted_result +WITH q AS (SELECT t0.c0 AS c0 FROM t0) SELECT ALL q.c0 AS ref0 FROM q WHERE (q.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)); +--sorted_result +SELECT ALL d.c0 AS ref0 FROM (SELECT t0.c0 AS c0, (t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)) AS keep_row FROM t0) AS d WHERE d.keep_row; +--sorted_result +SELECT ALL t0.c0 AS ref0 FROM t0 WHERE ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) AND (t0.c0 = 1) UNION ALL SELECT ALL t0.c0 AS ref0 FROM t0 WHERE ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) AND NOT (t0.c0 = 1) UNION ALL SELECT ALL t0.c0 AS ref0 FROM t0 WHERE ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) AND ((t0.c0 = 1) IS NULL); +--sorted_result +SELECT ALL t0.c0 AS ref0 FROM t0 WHERE CASE WHEN ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) THEN ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) ELSE ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) END; +--sorted_result +SELECT ALL t0.c0 AS ref0 FROM t0 WHERE ((((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) OR NOT ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) OR (((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) IS NULL)) AND ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)))); +--sorted_result +SELECT ALL t0.c0 AS ref0 FROM t0 WHERE ((((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) AND NOT ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) AND (((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL))) IS NOT NULL)) OR ((t0.c0) IN (COALESCE(0.5995035972593574,"yo?x&I",'',NULL)))); +USE test; +DROP DATABASE bug_120535; +CREATE DATABASE bug_120535 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; +USE bug_120535; +SET sql_mode=DEFAULT; +SET optimizer_switch=DEFAULT; +SET default_storage_engine=InnoDB; +SET NAMES utf8mb4 COLLATE utf8mb4_general_ci; +CREATE TABLE t (id INT PRIMARY KEY, i INT, KEY k (i)); +INSERT INTO t VALUES (1,1),(2,2),(3,3),(4,4),(5,5),(6,0),(7,-2); +--sorted_result +SELECT id FROM t FORCE INDEX (k) WHERE i = CAST(1.5 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX (k) WHERE i = CAST(1.5 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +--sorted_result +SELECT id FROM t WHERE i = CAST(1.5 AS DOUBLE); +--sorted_result +SELECT id FROM t FORCE INDEX (k) WHERE i = 1.5e0; +--sorted_result +SELECT id FROM t FORCE INDEX (k) WHERE NOT NOT (i = CAST(1.5 AS DOUBLE)); +--sorted_result +SELECT q.id FROM (SELECT id, i = CAST(1.5 AS DOUBLE) AS matches_value FROM t FORCE INDEX (k)) AS q WHERE q.matches_value; +--sorted_result +SELECT id FROM t USE INDEX (k) WHERE i = CAST(1.5 AS DOUBLE); +--sorted_result +SELECT id FROM t FORCE INDEX (k) WHERE CASE WHEN i = CAST(1.5 AS DOUBLE) THEN i = CAST(1.5 AS DOUBLE) ELSE i = CAST(1.5 AS DOUBLE) END; +--sorted_result +SELECT id FROM t IGNORE INDEX (k) WHERE i = CAST(1.5 AS DOUBLE); +--sorted_result +SELECT id FROM t FORCE INDEX (PRIMARY) WHERE i = CAST(1.5 AS DOUBLE); +--sorted_result +SELECT id FROM t FORCE INDEX (k) WHERE i = 1.5E0; +--sorted_result +SELECT d.id FROM (SELECT id, i = CAST(1.5 AS DOUBLE) AS p FROM t FORCE INDEX (k)) AS d WHERE d.p; +--sorted_result +SELECT id FROM t FORCE INDEX (k) WHERE ((i = CAST(1.5 AS DOUBLE) OR NOT (i = CAST(1.5 AS DOUBLE))) OR (i = CAST(1.5 AS DOUBLE)) IS NULL) AND (i = CAST(1.5 AS DOUBLE)); +--sorted_result +SELECT id FROM t FORCE INDEX (k) WHERE (((i = CAST(1.5 AS DOUBLE)) AND NOT (i = CAST(1.5 AS DOUBLE))) AND (i = CAST(1.5 AS DOUBLE)) IS NOT NULL) OR (i = CAST(1.5 AS DOUBLE)); +USE test; +DROP DATABASE bug_120535; +CREATE DATABASE bug_120535 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; +USE bug_120535; +SET sql_mode=DEFAULT; +SET optimizer_switch=DEFAULT; +SET default_storage_engine=InnoDB; +SET NAMES utf8mb4 COLLATE utf8mb4_general_ci; +CREATE TABLE t (id INT PRIMARY KEY,i TINYINT,KEY k(i)); +INSERT INTO t VALUES (1,-2),(2,-1),(3,0),(4,1),(5,2),(6,NULL); +--sorted_result +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.5 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.5 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +--sorted_result +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.0 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.0 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +--sorted_result +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(0.0 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(0.0 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +--sorted_result +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(1.5 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(1.5 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +--sorted_result +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(2.0 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(2.0 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +USE test; +DROP DATABASE bug_120535; +CREATE DATABASE bug_120535 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; +USE bug_120535; +SET sql_mode=DEFAULT; +SET optimizer_switch=DEFAULT; +SET default_storage_engine=InnoDB; +SET NAMES utf8mb4 COLLATE utf8mb4_general_ci; +CREATE TABLE t (id INT PRIMARY KEY,i SMALLINT,KEY k(i)); +INSERT INTO t VALUES (1,-2),(2,-1),(3,0),(4,1),(5,2),(6,NULL); +--sorted_result +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.5 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.5 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +--sorted_result +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.0 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.0 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +--sorted_result +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(0.0 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(0.0 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +--sorted_result +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(1.5 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(1.5 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +--sorted_result +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(2.0 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(2.0 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +USE test; +DROP DATABASE bug_120535; +CREATE DATABASE bug_120535 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; +USE bug_120535; +SET sql_mode=DEFAULT; +SET optimizer_switch=DEFAULT; +SET default_storage_engine=InnoDB; +SET NAMES utf8mb4 COLLATE utf8mb4_general_ci; +CREATE TABLE t (id INT PRIMARY KEY,i INT,KEY k(i)); +INSERT INTO t VALUES (1,-2),(2,-1),(3,0),(4,1),(5,2),(6,NULL); +--sorted_result +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.5 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.5 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +--sorted_result +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.0 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.0 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +--sorted_result +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(0.0 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(0.0 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +--sorted_result +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(1.5 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(1.5 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +--sorted_result +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(2.0 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(2.0 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +USE test; +DROP DATABASE bug_120535; +CREATE DATABASE bug_120535 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; +USE bug_120535; +SET sql_mode=DEFAULT; +SET optimizer_switch=DEFAULT; +SET default_storage_engine=InnoDB; +SET NAMES utf8mb4 COLLATE utf8mb4_general_ci; +CREATE TABLE t (id INT PRIMARY KEY,i BIGINT,KEY k(i)); +INSERT INTO t VALUES (1,-2),(2,-1),(3,0),(4,1),(5,2),(6,NULL); +--sorted_result +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.5 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.5 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +--sorted_result +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.0 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(-1.0 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +--sorted_result +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(0.0 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(0.0 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +--sorted_result +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(1.5 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(1.5 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +--sorted_result +SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(2.0 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT id FROM t FORCE INDEX(k) WHERE i=CAST(2.0 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +USE test; +DROP DATABASE bug_120535; +CREATE DATABASE bug_120535 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; +USE bug_120535; +SET sql_mode=DEFAULT; +SET optimizer_switch=DEFAULT; +SET default_storage_engine=InnoDB; +SET NAMES utf8mb4 COLLATE utf8mb4_general_ci; +CREATE TABLE source (vp_rowid BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO source VALUES (); +CREATE TABLE l (vp_rowid BIGINT NOT NULL PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE r (vp_rowid BIGINT NOT NULL PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO l SELECT vp_rowid FROM source; +INSERT INTO r SELECT vp_rowid FROM source; +--sorted_result +SELECT MAX(DISTINCT source.vp_rowid) AS ref0 FROM source WHERE LEAST('Uk]6T',0.8087354366787728) IN (source.vp_rowid); +PREPARE regression_stmt FROM 'SELECT MAX(DISTINCT source.vp_rowid) AS ref0 FROM source WHERE LEAST(''Uk]6T'',0.8087354366787728) IN (source.vp_rowid);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +--sorted_result +SELECT MAX(DISTINCT l.vp_rowid) AS ref0 FROM l WHERE LEAST('Uk]6T',0.8087354366787728) IN (l.vp_rowid); +--sorted_result +SELECT MAX(source.vp_rowid) AS ref0 FROM source WHERE LEAST('Uk]6T',0.8087354366787728) IN (source.vp_rowid); +--sorted_result +SELECT MAX(DISTINCT source.vp_rowid) AS ref0 FROM source WHERE LEAST('Uk]6T',0.8087354366787728) = source.vp_rowid; +--sorted_result +SELECT MAX(DISTINCT source.vp_rowid) AS ref0 FROM source WHERE NOT (NOT (LEAST('Uk]6T',0.8087354366787728) IN (source.vp_rowid))); +--sorted_result +SELECT MAX(DISTINCT s.vp_rowid) AS ref0 FROM (SELECT vp_rowid FROM source) AS s WHERE LEAST('Uk]6T',0.8087354366787728) IN (s.vp_rowid); +--sorted_result +SELECT MAX(DISTINCT source.vp_rowid) AS ref0 FROM source FORCE INDEX (PRIMARY) WHERE LEAST('Uk]6T',0.8087354366787728) IN (source.vp_rowid); +--sorted_result +SELECT MAX(DISTINCT source.vp_rowid) AS ref0 FROM source JOIN l ON l.vp_rowid = source.vp_rowid WHERE LEAST('Uk]6T',0.8087354366787728) IN (source.vp_rowid); +--sorted_result +SELECT MAX(DISTINCT s.vp_rowid) AS ref0 FROM (SELECT vp_rowid, LEAST('Uk]6T',0.8087354366787728) IN (vp_rowid) AS keep_row FROM source) AS s WHERE s.keep_row; +--sorted_result +SELECT MAX(DISTINCT source.vp_rowid) AS ref0 FROM source WHERE CASE WHEN LEAST('Uk]6T',0.8087354366787728) IN (source.vp_rowid) THEN LEAST('Uk]6T',0.8087354366787728) IN (source.vp_rowid) ELSE LEAST('Uk]6T',0.8087354366787728) IN (source.vp_rowid) END; +--sorted_result +SELECT MAX(DISTINCT source.vp_rowid) AS ref0 FROM l AS source WHERE LEAST('Uk]6T',0.8087354366787728) IN (source.vp_rowid); +--sorted_result +SELECT MAX(DISTINCT source.vp_rowid) AS ref0 FROM source INNER JOIN l ON l.vp_rowid = source.vp_rowid WHERE LEAST('Uk]6T',0.8087354366787728) IN (source.vp_rowid); +USE test; +DROP DATABASE bug_120535; +CREATE DATABASE bug_120535 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; +USE bug_120535; +SET sql_mode=DEFAULT; +SET optimizer_switch=DEFAULT; +SET default_storage_engine=InnoDB; +SET NAMES utf8mb4 COLLATE utf8mb4_general_ci; +CREATE TABLE boundary_values (x BIGINT,KEY k(x)) ENGINE=InnoDB; +INSERT INTO boundary_values VALUES (-2),(-1),(0),(1),(2),(NULL); +--sorted_result +SELECT MIN(x),MAX(x) FROM boundary_values FORCE INDEX(k) WHERE x=CAST(-1.5 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT MIN(x),MAX(x) FROM boundary_values FORCE INDEX(k) WHERE x=CAST(-1.5 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +--sorted_result +SELECT MIN(x),MAX(x) FROM boundary_values FORCE INDEX(k) WHERE x=CAST(-1.0 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT MIN(x),MAX(x) FROM boundary_values FORCE INDEX(k) WHERE x=CAST(-1.0 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +--sorted_result +SELECT MIN(x),MAX(x) FROM boundary_values FORCE INDEX(k) WHERE x=CAST(0.0 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT MIN(x),MAX(x) FROM boundary_values FORCE INDEX(k) WHERE x=CAST(0.0 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +--sorted_result +SELECT MIN(x),MAX(x) FROM boundary_values FORCE INDEX(k) WHERE x=CAST(1.5 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT MIN(x),MAX(x) FROM boundary_values FORCE INDEX(k) WHERE x=CAST(1.5 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +--sorted_result +SELECT MIN(x),MAX(x) FROM boundary_values FORCE INDEX(k) WHERE x=CAST(2.0 AS DOUBLE); +PREPARE regression_stmt FROM 'SELECT MIN(x),MAX(x) FROM boundary_values FORCE INDEX(k) WHERE x=CAST(2.0 AS DOUBLE);'; +--sorted_result +EXECUTE regression_stmt; +--sorted_result +EXECUTE regression_stmt; +DEALLOCATE PREPARE regression_stmt; +USE test; +DROP DATABASE bug_120535; +SET optimizer_switch=@save_optimizer_switch; +SET sql_mode=@save_sql_mode; +SET default_storage_engine=@save_default_storage_engine; +SET character_set_client=@save_character_set_client; +SET character_set_results=@save_character_set_results; +SET character_set_connection=@save_character_set_connection; +SET collation_connection=@save_collation_connection; diff --git a/sql/opt_sum.cc b/sql/opt_sum.cc index c432fb00ee78..fd1addce2ddc 100644 --- a/sql/opt_sum.cc +++ b/sql/opt_sum.cc @@ -961,6 +961,13 @@ static bool matching_cond(bool max_fl, Index_lookup *ref, KEY *keyinfo, return false; } + // Storing a nonintegral value in BIGINT can round it without reporting + // truncation. An equality lookup must use the value of the predicate. + if (eq_type && part->field->type() == MYSQL_TYPE_LONGLONG && + stored_field_cmp_to_item(part->field->table->in_use, part->field, + value) != 0) + return false; + if (part->null_bit) *key_ptr++ = (uchar)(part->field->is_null()); part->field->get_key_image(key_ptr, part->length, Field::itRAW); } diff --git a/sql/sql_optimizer.cc b/sql/sql_optimizer.cc index 17f7d7a79255..4cc3258f6802 100644 --- a/sql/sql_optimizer.cc +++ b/sql/sql_optimizer.cc @@ -9086,12 +9086,12 @@ static Item *part_of_refkey(TABLE *table, Index_lookup *ref, /** Store item value into field and check whether the value survived the - round-trip without truncation. Field_num::store_decimal() silently - drops fractional digits when storing a decimal value into an integer - field and returns TYPE_OK, so the caller cannot rely on the return - status alone. This helper re-reads the stored value and compares it - with the original to detect such silent truncation. + round-trip without truncation. Integer fields can silently round or + truncate decimal and real values while returning TYPE_OK, so the caller + cannot rely on the return status alone. This helper re-reads the stored + value and compares it with the original to detect such conversion. + @param thd Current session. @param item The item whose value is stored. @param field The target field. @@ -9099,7 +9099,8 @@ static Item *part_of_refkey(TABLE *table, Index_lookup *ref, TYPE_NOTE_TRUNCATED if the stored value differs from the original. */ -static type_conversion_status save_in_field_check_truncation(Item *item, +static type_conversion_status save_in_field_check_truncation(THD *thd, + Item *item, Field *field) { type_conversion_status res = item->save_in_field_no_warnings(field, true); if (res != TYPE_OK) return res; @@ -9109,6 +9110,13 @@ static type_conversion_status save_in_field_check_truncation(Item *item, my_decimal *orig = item->val_decimal(&orig_buf); field->val_decimal(&stored_buf); if (my_decimal_cmp(orig, &stored_buf) != 0) return TYPE_NOTE_TRUNCATED; + } else if (is_integer_type(field->type()) && + (item->result_type() == REAL_RESULT || + item->result_type() == STRING_RESULT)) { + // Integer fields can silently round a real value, even with TYPE_OK. + // Compare in the same numeric domain as the original equality. + if (stored_field_cmp_to_item(thd, field, item) != 0) + return TYPE_NOTE_TRUNCATED; } return TYPE_OK; } @@ -9171,7 +9179,8 @@ bool ref_lookup_subsumes_comparison(THD *thd, Field *field, Item *right_item, field->binary()) && !(field->type() == MYSQL_TYPE_FLOAT && field->decimals() > 0)) // 2 { - *subsumes = save_in_field_check_truncation(right_item, field) == TYPE_OK; + *subsumes = + save_in_field_check_truncation(thd, right_item, field) == TYPE_OK; if (thd->is_error()) return true; } }