drop table if exists t1; SET SQL_WARNINGS=1; create table t1 (this int unsigned); insert into t1 values (1); insert ignore into t1 values (-1); Warnings: Warning 1264 Out of range value for column 'this' at row 1 insert ignore into t1 values ('5000000000'); Warnings: Warning 1264 Out of range value for column 'this' at row 1 select * from t1; this 1 0 4294967295 drop table t1; create table t1 (a bigint unsigned, b mediumint unsigned); insert t1 values (1,2),(0xffffffffffffffff,0xffffff); select coalesce(a,b), coalesce(b,a) from t1; coalesce(a,b) coalesce(b,a) 1 2 18446744073709551615 16777215 create table t2 as select a from t1 union select b from t1; show create table t2; Table Create Table t2 CREATE TABLE `t2` ( `a` bigint(20) unsigned DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci select * from t2; a 1 18446744073709551615 2 16777215 drop table t1, t2; # # Start of 10.0 tests # # # MDEV-6950 Bad results with joins comparing DATE and INT/ENUM/VARCHAR columns # CREATE TABLE t1 (a DATE PRIMARY KEY); INSERT INTO t1 VALUES ('1999-01-01'); CREATE TABLE t2 (a INT UNSIGNED); INSERT INTO t2 VALUES (19990101); INSERT INTO t2 VALUES (990101); SELECT t1.* FROM t1,t2 WHERE t1.a=t2.a; a 1999-01-01 1999-01-01 SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.a=t2.a; a 1999-01-01 1999-01-01 ALTER TABLE t2 ADD PRIMARY KEY(a); SELECT t1.* FROM t1,t2 WHERE t1.a=t2.a; a 1999-01-01 1999-01-01 SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.a=t2.a; a 1999-01-01 1999-01-01 # t2 should NOT be eliminated EXPLAIN SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.a=t2.a; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 system NULL NULL NULL NULL 1 1 SIMPLE t2 index PRIMARY PRIMARY 4 NULL 2 Using where; Using index Warnings: Note 1105 Cannot use key `PRIMARY` part[0] for lookup: `test`.`t2`.`a` of type `int unsigned` = "`t1`.`a`" of type `date` Note 1105 Cannot use key `PRIMARY` part[0] for lookup: `test`.`t2`.`a` of type `int unsigned` = "'1999-01-01'" of type `date` DROP TABLE t1,t2; # # End of 10.0 tests # # # MDEV-32203 Raise notes when an index cannot be used on data type mismatch # SET note_verbosity=unusable_keys; CREATE TABLE t1 (indexed_col INT UNSIGNED, KEY(indexed_col)); FOR i IN 1..31 DO INSERT INTO t1 VALUES (MAKEDATE(2023, i)); END FOR; $$ SELECT * FROM t1 WHERE indexed_col=20230101; indexed_col 20230101 SELECT * FROM t1 WHERE indexed_col=20230101102030; indexed_col SELECT * FROM t1 WHERE indexed_col=20230101102030.1; indexed_col SELECT * FROM t1 WHERE indexed_col=20230101102030.1e0; indexed_col SELECT * FROM t1 WHERE indexed_col='10:20:30'; indexed_col SELECT * FROM t1 WHERE indexed_col='2001-01-01'; indexed_col SELECT * FROM t1 WHERE indexed_col='2001-01-01 10:20:30'; indexed_col SELECT * FROM t1 WHERE indexed_col=DATE'2001-01-01'; indexed_col Warnings: Note 1105 Cannot use key `indexed_col` part[0] for lookup: `test`.`t1`.`indexed_col` of type `int unsigned` = "DATE'2001-01-01'" of type `date` SELECT * FROM t1 WHERE indexed_col=TIME'10:20:30'; indexed_col Warnings: Note 1105 Cannot use key `indexed_col` part[0] for lookup: `test`.`t1`.`indexed_col` of type `int unsigned` = "TIME'10:20:30'" of type `time` SELECT * FROM t1 WHERE indexed_col=TIMESTAMP'2001-01-01 10:20:30'; indexed_col Warnings: Note 1105 Cannot use key `indexed_col` part[0] for lookup: `test`.`t1`.`indexed_col` of type `int unsigned` = "TIMESTAMP'2001-01-01 10:20:30'" of type `datetime` SELECT * FROM t1 WHERE indexed_col=0x00; indexed_col SELECT * FROM t1 WHERE indexed_col=_utf8mb3'0' COLLATE utf8mb3_bin; indexed_col CREATE TABLE t2 (not_indexed_col INT); INSERT INTO t2 VALUES (20230101),(20230102); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col 20230101 20230101 20230102 20230102 DROP TABLE t2; CREATE TABLE t2 (not_indexed_col INT UNSIGNED); INSERT INTO t2 VALUES (20230101),(20230102); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col 20230101 20230101 20230102 20230102 DROP TABLE t2; CREATE TABLE t2 (not_indexed_col BIGINT); INSERT INTO t2 VALUES (20230101102030),(20230101102031); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col DROP TABLE t2; CREATE TABLE t2 (not_indexed_col BIGINT UNSIGNED); INSERT INTO t2 VALUES (20230101102030),(20230101102031); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col DROP TABLE t2; CREATE TABLE t2 (not_indexed_col DECIMAL(30,6)); INSERT INTO t2 VALUES (20230101102030),(20230101102031); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col DROP TABLE t2; CREATE TABLE t2 (not_indexed_col FLOAT); INSERT INTO t2 VALUES (20230101102030),(20230101102031); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col DROP TABLE t2; CREATE TABLE t2 (not_indexed_col DOUBLE); INSERT INTO t2 VALUES (20230101102030),(20230101102031); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col DROP TABLE t2; CREATE TABLE t2 (not_indexed_col DATE); INSERT INTO t2 VALUES ('2023-01-01'),('2023-01-02'); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col 20230101 2023-01-01 20230102 2023-01-02 Warnings: Note 1105 Cannot use key `indexed_col` part[0] for lookup: `test`.`t1`.`indexed_col` of type `int unsigned` = "`t2`.`not_indexed_col`" of type `date` DROP TABLE t2; CREATE TABLE t2 (not_indexed_col DATETIME); INSERT INTO t2 VALUES ('2023-01-01 00:00:00'),('2023-01-01 00:00:01'); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col 20230101 2023-01-01 00:00:00 Warnings: Note 1105 Cannot use key `indexed_col` part[0] for lookup: `test`.`t1`.`indexed_col` of type `int unsigned` = "`t2`.`not_indexed_col`" of type `datetime` DROP TABLE t2; CREATE TABLE t2 (not_indexed_col TIMESTAMP); INSERT INTO t2 VALUES ('2023-01-01 00:00:00'),('2023-01-01 00:00:01'); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col 20230101 2023-01-01 00:00:00 Warnings: Note 1105 Cannot use key `indexed_col` part[0] for lookup: `test`.`t1`.`indexed_col` of type `int unsigned` = "`t2`.`not_indexed_col`" of type `timestamp` DROP TABLE t2; CREATE TABLE t2 (not_indexed_col VARBINARY(32)); INSERT INTO t2 VALUES (0x30),(0x31); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col DROP TABLE t2; CREATE TABLE t2 (not_indexed_col VARCHAR(32)); INSERT INTO t2 VALUES ('2001-01-01'),('2001-01-02'); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col Warnings: Warning 1292 Truncated incorrect INTEGER value: '2001-01-01' Warning 1292 Truncated incorrect INTEGER value: '2001-01-02' DROP TABLE t2; CREATE TABLE t2 (not_indexed_col VARCHAR(32) CHARACTER SET utf8mb3); INSERT INTO t2 VALUES ('2001-01-01'),('2001-01-02'); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col Warnings: Warning 1292 Truncated incorrect INTEGER value: '2001-01-01' Warning 1292 Truncated incorrect INTEGER value: '2001-01-02' DROP TABLE t2; DROP TABLE t1; SET note_verbosity=DEFAULT; SET note_verbosity=unusable_keys; CREATE TABLE t1 (indexed_col BIGINT UNSIGNED, KEY(indexed_col)); FOR i IN 1..31 DO INSERT INTO t1 VALUES (MAKEDATE(2023, i)); END FOR; $$ SELECT * FROM t1 WHERE indexed_col=20230101; indexed_col 20230101 SELECT * FROM t1 WHERE indexed_col=20230101102030; indexed_col SELECT * FROM t1 WHERE indexed_col=20230101102030.1; indexed_col SELECT * FROM t1 WHERE indexed_col=20230101102030.1e0; indexed_col SELECT * FROM t1 WHERE indexed_col='10:20:30'; indexed_col Warnings: Warning 1292 Truncated incorrect DECIMAL value: '10:20:30' SELECT * FROM t1 WHERE indexed_col='2001-01-01'; indexed_col Warnings: Warning 1292 Truncated incorrect DECIMAL value: '2001-01-01' SELECT * FROM t1 WHERE indexed_col='2001-01-01 10:20:30'; indexed_col Warnings: Warning 1292 Truncated incorrect DECIMAL value: '2001-01-01 10:20:30' SELECT * FROM t1 WHERE indexed_col=DATE'2001-01-01'; indexed_col SELECT * FROM t1 WHERE indexed_col=TIME'10:20:30'; indexed_col SELECT * FROM t1 WHERE indexed_col=TIMESTAMP'2001-01-01 10:20:30'; indexed_col SELECT * FROM t1 WHERE indexed_col=0x00; indexed_col SELECT * FROM t1 WHERE indexed_col=_utf8mb3'0' COLLATE utf8mb3_bin; indexed_col CREATE TABLE t2 (not_indexed_col INT); INSERT INTO t2 VALUES (20230101),(20230102); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col 20230101 20230101 20230102 20230102 DROP TABLE t2; CREATE TABLE t2 (not_indexed_col INT UNSIGNED); INSERT INTO t2 VALUES (20230101),(20230102); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col 20230101 20230101 20230102 20230102 DROP TABLE t2; CREATE TABLE t2 (not_indexed_col BIGINT); INSERT INTO t2 VALUES (20230101102030),(20230101102031); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col DROP TABLE t2; CREATE TABLE t2 (not_indexed_col BIGINT UNSIGNED); INSERT INTO t2 VALUES (20230101102030),(20230101102031); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col DROP TABLE t2; CREATE TABLE t2 (not_indexed_col DECIMAL(30,6)); INSERT INTO t2 VALUES (20230101102030),(20230101102031); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col DROP TABLE t2; CREATE TABLE t2 (not_indexed_col FLOAT); INSERT INTO t2 VALUES (20230101102030),(20230101102031); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col DROP TABLE t2; CREATE TABLE t2 (not_indexed_col DOUBLE); INSERT INTO t2 VALUES (20230101102030),(20230101102031); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col DROP TABLE t2; CREATE TABLE t2 (not_indexed_col DATE); INSERT INTO t2 VALUES ('2023-01-01'),('2023-01-02'); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col 20230101 2023-01-01 20230102 2023-01-02 Warnings: Note 1105 Cannot use key `indexed_col` part[0] for lookup: `test`.`t1`.`indexed_col` of type `bigint unsigned` = "`t2`.`not_indexed_col`" of type `date` DROP TABLE t2; CREATE TABLE t2 (not_indexed_col DATETIME); INSERT INTO t2 VALUES ('2023-01-01 00:00:00'),('2023-01-01 00:00:01'); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col 20230101 2023-01-01 00:00:00 Warnings: Note 1105 Cannot use key `indexed_col` part[0] for lookup: `test`.`t1`.`indexed_col` of type `bigint unsigned` = "`t2`.`not_indexed_col`" of type `datetime` DROP TABLE t2; CREATE TABLE t2 (not_indexed_col TIMESTAMP); INSERT INTO t2 VALUES ('2023-01-01 00:00:00'),('2023-01-01 00:00:01'); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col 20230101 2023-01-01 00:00:00 Warnings: Note 1105 Cannot use key `indexed_col` part[0] for lookup: `test`.`t1`.`indexed_col` of type `bigint unsigned` = "`t2`.`not_indexed_col`" of type `timestamp` DROP TABLE t2; CREATE TABLE t2 (not_indexed_col VARBINARY(32)); INSERT INTO t2 VALUES (0x30),(0x31); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col DROP TABLE t2; CREATE TABLE t2 (not_indexed_col VARCHAR(32)); INSERT INTO t2 VALUES ('2001-01-01'),('2001-01-02'); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col Warnings: Warning 1292 Truncated incorrect INTEGER value: '2001-01-01' Warning 1292 Truncated incorrect INTEGER value: '2001-01-02' DROP TABLE t2; CREATE TABLE t2 (not_indexed_col VARCHAR(32) CHARACTER SET utf8mb3); INSERT INTO t2 VALUES ('2001-01-01'),('2001-01-02'); SELECT * FROM t1, t2 WHERE indexed_col=not_indexed_col; indexed_col not_indexed_col Warnings: Warning 1292 Truncated incorrect INTEGER value: '2001-01-01' Warning 1292 Truncated incorrect INTEGER value: '2001-01-02' DROP TABLE t2; DROP TABLE t1; SET note_verbosity=DEFAULT;