[MDEV-8695] Wrong result for SELECT..WHERE varchar_column='a' AND CRC32(varchar_column)=3904355907 Created: 2015-08-28  Updated: 2015-09-02  Resolved: 2015-09-01

Status: Closed
Project: MariaDB Server
Component/s: Optimizer
Affects Version/s: 5.5, 10.0, 10.1
Fix Version/s: 10.1.7

Type: Bug Priority: Major
Reporter: Alexander Barkov Assignee: Alexander Barkov
Resolution: Fixed Votes: 0
Labels: None

Issue Links:
Blocks
blocks MDEV-8728 Fix a number of problems in equal fie... Closed
Relates
relates to MDEV-8723 Wrong result for SELECT..WHERE COLLAT... Closed

 Description   

This script:

DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (a VARCHAR(10) COLLATE latin1_bin);
INSERT INTO t1 VALUES ('a'),('a ');
SELECT a, LENGTH(a), CRC32(a) FROM t1 WHERE CRC32(a)=3904355907; 

returns one row:

+------+-----------+------------+
| a    | LENGTH(a) | CRC32(a)   |
+------+-----------+------------+
| a    |         1 | 3904355907 |
+------+-----------+------------+

If I make the condition even stricter:

SELECT a, LENGTH(a), CRC32(a) FROM t1 WHERE a='a' AND CRC32(a)=3904355907;

it erroneously returns two rows:

+------+-----------+------------+
| a    | LENGTH(a) | CRC32(a)   |
+------+-----------+------------+
| a    |         1 | 3904355907 |
| a    |         2 |  105998545 |
+------+-----------+------------+

This script demonstrates the same problem:

SET NAMES latin1;
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (a VARCHAR(10) COLLATE latin1_bin);
INSERT INTO t1 VALUES ('a'),('a ');
SELECT a, HEX(a) FROM t1 WHERE HEX(a)='61';

It returns one row:

+------+--------+
| a    | HEX(a) |
+------+--------+
| a    | 61     |
+------+--------+

Now if I make the condition even stricter:

SELECT *,HEX(a) FROM t1 WHERE a='a' AND HEX(a)='61';

It returns two rows:

+------+--------+
| a    | HEX(a) |
+------+--------+
| a    | 61     |
| a    | 6120   |
+------+--------+

A similar problem with trailing spaces:

DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (a VARCHAR(10) COLLATE latin1_bin);
INSERT INTO t1 VALUES ('a ');
SELECT * FROM t1 WHERE a='a';
SELECT * FROM t1 WHERE LENGTH(a)=2;
SELECT * FROM t1 WHERE a='a' AND LENGTH(a)=2;

The first and the second query correctly return one row. The third query erroneously returns no rows.


Generated at Thu Feb 08 07:29:05 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.