Bug #102151 | select result is mismatch when use COALESCE and not. | ||
---|---|---|---|
Submitted: | 5 Jan 2021 13:28 | Modified: | 16 Aug 2021 18:54 |
Reporter: | tong gao | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server: DML | Severity: | S3 (Non-critical) |
Version: | 8.0 | OS: | Linux |
Assigned to: | CPU Architecture: | Any |
[5 Jan 2021 13:28]
tong gao
[5 Jan 2021 15:20]
MySQL Verification Team
Thank you for the bug report. Please see below error on the test case? Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 20 Server version: 8.0.22 MySQL Community Server - GPL Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> CREATE DATABASE database195; Query OK, 1 row affected (0.03 sec) mysql> USE database195; Database changed mysql> CREATE TABLE t0(c0 DECIMAL ZEROFILL STORAGE MEMORY ) ; Query OK, 0 rows affected, 1 warning (0.10 sec) mysql> ALTER TABLE t0 RENAME t0; Query OK, 0 rows affected (0.02 sec) mysql> CHECK TABLE t0 FOR UPGRADE FAST EXTENDED CHANGED QUICK MEDIUM; +----------------+-------+----------+----------+ | Table | Op | Msg_type | Msg_text | +----------------+-------+----------+----------+ | database195.t0 | check | status | OK | +----------------+-------+----------+----------+ 1 row in set (0.01 sec) mysql> INSERT IGNORE INTO t0(c0) VALUES('r105169326'), (1.250308188E9); Query OK, 2 rows affected, 1 warning (0.01 sec) Records: 2 Duplicates: 0 Warnings: 1 mysql> ALTER TABLE t0 STATS_AUTO_RECALC DEFAULT, ROW_FORMAT COMPACT, STATS_PERSISTENT 1, PACK_KEYS DEFAULT, CHECKSUM 0, DELAY_KEY_WRITE 1, RENAME t1, ALGORITHM INSTANT, COMPRESSION 'ZLIB', DISABLE KEYS; ERROR 1845 (0A000): ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=COPY. mysql>
[5 Jan 2021 15:47]
tong gao
Ignore the error and continue the remaining SQL statements. Eventually, you'll see this: mysql> SELECT t2.c0 FROM t2 WHERE "M" = t2.c0; +------------+ | c0 | +------------+ | 0000000000 | | 0000000000 | | 0000000000 | | 0000000000 | | 0000000000 | +------------+ 5 rows in set, 1 warning (0.00 sec) mysql> mysql> mysql> SELECT t2.c0 FROM t2 WHERE (((COALESCE(NULL, "M", "b", "W", -1775599917)) = (t2.c0))); Empty set, 3 warnings (0.00 sec) mysql> mysql> mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.22 | +-----------+ 1 row in set (0.00 sec) mysql>
[5 Jan 2021 17:30]
MySQL Verification Team
Below the result ignoring errors. Please provide a clean and repeatable test case. Thanks. miguel@uxenial:~$ mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 9 Server version: 8.0.22 MySQL Community Server - GPL Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> CREATE DATABASE database195; ALTER TABLE t0 RENAME t0; Query OK, 1 row affected (0.02 sec) mysql> USE database195; CHECK TABLE t0 FOR UPGRADE FAST EXTENDED CHANGED QUICK MEDIUM; Database changed mysql> CREATE TABLE t0(c0 DECIMAL ZEROFILL STORAGE MEMORY ) ; Query OK, 0 rows affected, 1 warning (0.02 sec) mysql> ALTER TABLE t0 RENAME t0; INSERT IGNORE INTO t0(c0) VALUES('r105169326'), (1.250308188E9); ALTER TABLE t0 STATS_AUTO_RECALC DEFAULT, ROW_FORMAT COMPACT, STATS_PERSISTENT 1, PACK_KEYS DEFAULT, CHECKSUM 0, DELAY_KEY_WRITE 1, RENAME t1, ALGORITHM INSTANT, COMPRESSION 'ZLIB', DISABLE KEYS; ALTER TABLE t0 FORCE, STATS_AUTO_RECALC 1, RENAME AS t2, STATS_PERSISTENT 1, PACK_KEYS 1, DELAY_KEY_WRITE 1, COMPRESSION 'ZLIB', ROW_FORMAT COMPRESSED, ENABLE KEYS, ALGORITHM COPY; Query OK, 0 rows affected (0.00 sec) mysql> CHECK TABLE t0 FOR UPGRADE FAST EXTENDED CHANGED QUICK MEDIUM; +----------------+-------+----------+----------+ | Table | Op | Msg_type | Msg_text | +----------------+-------+----------+----------+ | database195.t0 | check | status | OK | +----------------+-------+----------+----------+ 1 row in set (0.01 sec) mysql> INSERT IGNORE INTO t0(c0) VALUES('r105169326'), (1.250308188E9); SET SESSION max_sort_length = 7531760; CHECKSUM TABLE t2 EXTENDED; Query OK, 2 rows affected, 1 warning (0.01 sec) Records: 2 Duplicates: 0 Warnings: 1 mysql> ALTER TABLE t0 STATS_AUTO_RECALC DEFAULT, ROW_FORMAT COMPACT, STATS_PERSISTENT 1, PACK_KEYS DEFAULT, CHECKSUM 0, DELAY_KEY_WRITE 1, RENAME t1, ALGORITHM INSTANT, COMPRESSION 'ZLIB', DISABLE KEYS; ERROR 1845 (0A000): ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=COPY. mysql> ALTER TABLE t0 FORCE, STATS_AUTO_RECALC 1, RENAME AS t2, STATS_PERSISTENT 1, PACK_KEYS 1, DELAY_KEY_WRITE 1, COMPRESSION 'ZLIB', ROW_FORMAT COMPRESSED, ENABLE KEYS, ALGORITHM COPY; ERROR 1031 (HY000): Table storage engine for '#sql-355_9' doesn't have this option mysql> SET SESSION max_sort_length = 7531760; Query OK, 0 rows affected (0.00 sec) mysql> CHECKSUM TABLE t2 EXTENDED; +----------------+----------+ | Table | Checksum | +----------------+----------+ | database195.t2 | NULL | +----------------+----------+ 1 row in set, 1 warning (0.00 sec) mysql> DELETE IGNORE FROM t2; ERROR 1146 (42S02): Table 'database195.t2' doesn't exist mysql> DELETE LOW_PRIORITY QUICK IGNORE FROM t2; ERROR 1146 (42S02): Table 'database195.t2' doesn't exist mysql> TRUNCATE TABLE t2; ERROR 1146 (42S02): Table 'database195.t2' doesn't exist mysql> CREATE INDEX i0 ON t2(c0 ASC); ERROR 1146 (42S02): Table 'database195.t2' doesn't exist mysql> INSERT IGNORE INTO t2(c0) VALUES(NULL); ERROR 1146 (42S02): Table 'database195.t2' doesn't exist mysql> INSERT IGNORE INTO t2(c0) VALUES('+'); ERROR 1146 (42S02): Table 'database195.t2' doesn't exist mysql> REPLACE DELAYED INTO t2(c0) VALUES(NULL); ERROR 1146 (42S02): Table 'database195.t2' doesn't exist mysql> INSERT IGNORE INTO t2(c0) VALUES("Fc|X4"); ERROR 1146 (42S02): Table 'database195.t2' doesn't exist mysql> INSERT DELAYED IGNORE INTO t2(c0) VALUES(NULL), (NULL), (-1884484723), ("O'8㿮 ~)"), ("#k)rKf"); ERROR 1146 (42S02): Table 'database195.t2' doesn't exist mysql> ALTER TABLE t2 FORCE; ERROR 1146 (42S02): Table 'database195.t2' doesn't exist mysql> INSERT LOW_PRIORITY IGNORE INTO t2(c0) VALUES(NULL); ERROR 1146 (42S02): Table 'database195.t2' doesn't exist mysql> ANALYZE LOCAL TABLE t2; +----------------+---------+----------+--------------------------------------+ | Table | Op | Msg_type | Msg_text | +----------------+---------+----------+--------------------------------------+ | database195.t2 | analyze | Error | Table 'database195.t2' doesn't exist | | database195.t2 | analyze | status | Operation failed | +----------------+---------+----------+--------------------------------------+ 2 rows in set (0.00 sec) mysql> SELECT t2.c0 FROM t2 WHERE "M" = t2.c0; ERROR 1146 (42S02): Table 'database195.t2' doesn't exist mysql> SELECT t2.c0 FROM t2 WHERE (((COALESCE(NULL, "M", "b", "W", -1775599917)) = (t2.c0))); ERROR 1146 (42S02): Table 'database195.t2' doesn't exist mysql>
[5 Jan 2021 18:05]
MySQL Verification Team
TESTCASE -------------- set sql_mode=default; drop table if exists t; create table t (a decimal(10,0),key(a)) engine=innodb; insert into t values (null),(0); select a from t force index(a) where 'm'=a; select a from t force index(a) where coalesce(null, 'm', 'b', 'w')=a; select a from t ignore index(a) where 'm'=a; select a from t ignore index(a) where coalesce(null, 'm', 'b', 'w')=a; select version(),@@sql_mode;
[5 Jan 2021 19:17]
MySQL Verification Team
Verified with Shane's test case.
[6 Jan 2021 1:32]
tong gao
Shane's test case: $ /opt/gaotong/mysql/mysql-8.0.22/bin/mysql -uroot -pTaurus_123 -h127.0.0.1 -P8022 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.22 Source distribution Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> set sql_mode=default; Query OK, 0 rows affected (0.00 sec) mysql> drop table if exists t; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> create table t (a decimal(10,0),key(a)) engine=innodb; Query OK, 0 rows affected (0.01 sec) mysql> insert into t values (null),(0); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select a from t force index(a) where 'm'=a; +------+ | a | +------+ | 0 | +------+ 1 row in set, 1 warning (0.00 sec) mysql> select a from t force index(a) where coalesce(null, 'm', 'b', 'w')=a; Empty set, 3 warnings (0.00 sec) mysql> select a from t ignore index(a) where 'm'=a; +------+ | a | +------+ | 0 | +------+ 1 row in set, 1 warning (0.00 sec) mysql> select a from t ignore index(a) where coalesce(null, 'm', 'b', 'w')=a; +------+ | a | +------+ | 0 | +------+ 1 row in set, 1 warning (0.00 sec) mysql> select version(),@@sql_mode; +-----------+-----------------------------------------------------------------------------------------------------------------------+ | version() | @@sql_mode | +-----------+-----------------------------------------------------------------------------------------------------------------------+ | 8.0.22 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | +-----------+-----------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> =========================================================== my test case: DROP DATABASE IF EXISTS database195; CREATE DATABASE database195; USE database195; CREATE TABLE t0(c0 DECIMAL ZEROFILL STORAGE MEMORY ) ; CHECK TABLE t0 FOR UPGRADE FAST EXTENDED CHANGED QUICK MEDIUM; INSERT IGNORE INTO t0(c0) VALUES('105169326'), (1.250308188E9); ALTER TABLE t0 FORCE, STATS_AUTO_RECALC 1, RENAME AS t2, STATS_PERSISTENT 1, PACK_KEYS 1, DELAY_KEY_WRITE 1, COMPRESSION 'ZLIB', ROW_FORMAT COMPRESSED, ENABLE KEYS, ALGORITHM COPY; DELETE LOW_PRIORITY QUICK IGNORE FROM t2; TRUNCATE TABLE t2; CREATE INDEX i0 ON t2(c0 ASC); INSERT IGNORE INTO t2(c0) VALUES(NULL); INSERT IGNORE INTO t2(c0) VALUES('+'); REPLACE DELAYED INTO t2(c0) VALUES(NULL); INSERT IGNORE INTO t2(c0) VALUES("Fc|X4"); INSERT DELAYED IGNORE INTO t2(c0) VALUES(NULL), (NULL), (-1884484723), ("O'8㿮 ~)"), ("#k)rKf"); INSERT LOW_PRIORITY IGNORE INTO t2(c0) VALUES(NULL); ANALYZE LOCAL TABLE t2; SELECT t2.c0 FROM t2 WHERE "M" = t2.c0; SELECT t2.c0 FROM t2 WHERE (((COALESCE(NULL, "M", "b", "W", -1775599917)) = (t2.c0))); result: $ /opt/gaotong/mysql/mysql-8.0.22/bin/mysql -uroot -pTaurus_123 -h127.0.0.1 -P8022 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.22 Source distribution Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> DROP DATABASE IF EXISTS database195; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> CREATE DATABASE database195; Query OK, 1 row affected (0.00 sec) mysql> USE database195; Database changed mysql> CREATE TABLE t0(c0 DECIMAL ZEROFILL STORAGE MEMORY ) ; Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> CHECK TABLE t0 FOR UPGRADE FAST EXTENDED CHANGED QUICK MEDIUM; +----------------+-------+----------+----------+ | Table | Op | Msg_type | Msg_text | +----------------+-------+----------+----------+ | database195.t0 | check | status | OK | +----------------+-------+----------+----------+ 1 row in set (0.00 sec) mysql> INSERT IGNORE INTO t0(c0) VALUES('105169326'), (1.250308188E9); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> ALTER TABLE t0 FORCE, STATS_AUTO_RECALC 1, RENAME AS t2, STATS_PERSISTENT 1, PACK_KEYS 1, DELAY_KEY_WRITE 1, COMPRESSION 'ZLIB', ROW_FORMAT COMPRESSED, ENABLE KEYS, ALGORITHM COPY; Query OK, 2 rows affected, 2 warnings (0.01 sec) Records: 2 Duplicates: 0 Warnings: 2 mysql> DELETE LOW_PRIORITY QUICK IGNORE FROM t2; Query OK, 2 rows affected (0.00 sec) mysql> TRUNCATE TABLE t2; Query OK, 0 rows affected (0.01 sec) mysql> CREATE INDEX i0 ON t2(c0 ASC); Query OK, 0 rows affected, 1 warning (0.01 sec) Records: 0 Duplicates: 0 Warnings: 1 mysql> INSERT IGNORE INTO t2(c0) VALUES(NULL); Query OK, 1 row affected (0.00 sec) mysql> INSERT IGNORE INTO t2(c0) VALUES('+'); Query OK, 1 row affected, 1 warning (0.00 sec) mysql> REPLACE DELAYED INTO t2(c0) VALUES(NULL); Query OK, 1 row affected, 1 warning (0.00 sec) mysql> INSERT IGNORE INTO t2(c0) VALUES("Fc|X4"); Query OK, 1 row affected, 1 warning (0.00 sec) mysql> INSERT DELAYED IGNORE INTO t2(c0) VALUES(NULL), (NULL), (-1884484723), ("O'8㿮 ~)"), ("#k)rKf"); Query OK, 5 rows affected, 4 warnings (0.00 sec) Records: 5 Duplicates: 0 Warnings: 4 mysql> INSERT LOW_PRIORITY IGNORE INTO t2(c0) VALUES(NULL); Query OK, 1 row affected (0.00 sec) mysql> ANALYZE LOCAL TABLE t2; +----------------+---------+----------+----------+ | Table | Op | Msg_type | Msg_text | +----------------+---------+----------+----------+ | database195.t2 | analyze | status | OK | +----------------+---------+----------+----------+ 1 row in set (0.00 sec) mysql> mysql> mysql> SELECT t2.c0 FROM t2 WHERE "M" = t2.c0; +------------+ | c0 | +------------+ | 0000000000 | | 0000000000 | | 0000000000 | | 0000000000 | | 0000000000 | +------------+ 5 rows in set, 1 warning (0.00 sec) mysql> SELECT t2.c0 FROM t2 WHERE (((COALESCE(NULL, "M", "b", "W", -1775599917)) = (t2.c0))); Empty set, 3 warnings (0.00 sec) mysql> mysql> select version(),@@sql_mode; +-----------+-----------------------------------------------------------------------------------------------------------------------+ | version() | @@sql_mode | +-----------+-----------------------------------------------------------------------------------------------------------------------+ | 8.0.22 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | +-----------+-----------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql>
[7 Feb 2021 6:42]
tong gao
Hi: Is there anything about this issue?
[16 Aug 2021 18:54]
Christine Cole
Posted by developer: Fixed as of the upcoming MySQL 8.0.27 release, and here's the proposed changelog entry from the documentation team: Inconsistencies in how certain comparison predicates were evaluated (for example, when part of a WHERE clause) could return different results if a function was used instead of a string literal. Thank you for the bug report.
[11 Apr 2022 9:07]
Erlend Dahl
Bug#101269 using different index may produce different results was marked as a duplicate.