| Bug #59330 | HAVING applies "reverse boolean logic" to aggregate function with TIMESTAMP | ||
|---|---|---|---|
| Submitted: | 6 Jan 2011 11:06 | Modified: | 12 Jan 2011 18:04 |
| Reporter: | Alexander Keremidarski | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Optimizer | Severity: | S2 (Serious) |
| Version: | 5.5.7 and 5.5.8 | OS: | Any |
| Assigned to: | Evgeny Potemkin | CPU Architecture: | Any |
| Tags: | HAVING TIMESTAMP, regression | ||
[6 Jan 2011 11:06]
Alexander Keremidarski
[6 Jan 2011 11:10]
Valeriy Kravchuk
Indeed, this is what we have:
C:\Program Files\MySQL\MySQL Server 5.5\bin>mysql -uroot -proot -P3312 test
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.5.8 MySQL Community Server (GPL)
Copyright (c) 2000, 2010, 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 TABLE test (dt DATETIME, ts TIMESTAMP);
Query OK, 0 rows affected (0.17 sec)
mysql> INSERT INTO test VALUES('2011-01-06 12:34:30', '2011-01-06 12:34:30');
Query OK, 1 row affected (0.02 sec)
mysql> SELECT MAX(dt), MAX(ts) FROM test;
+---------------------+---------------------+
| MAX(dt) | MAX(ts) |
+---------------------+---------------------+
| 2011-01-06 12:34:30 | 2011-01-06 12:34:30 |
+---------------------+---------------------+
1 row in set (0.01 sec)
mysql> SELECT MAX(ts) FROM test HAVING MAX(ts) < '2010-01-01 00:00:00';
+---------------------+
| MAX(ts) |
+---------------------+
| 2011-01-06 12:34:30 |
+---------------------+
1 row in set (0.01 sec)
mysql> SELECT MAX(dt) FROM test HAVING MAX(dt) < '2010-01-01 00:00:00';
Empty set (0.00 sec)
mysql> SELECT MAX(ts) FROM test HAVING MAX(ts) > '2010-01-01 00:00:00';
Empty set (0.00 sec)
mysql> SELECT MAX(dt) FROM test HAVING MAX(dt) > '2010-01-01 00:00:00';
+---------------------+
| MAX(dt) |
+---------------------+
| 2011-01-06 12:34:30 |
+---------------------+
1 row in set (0.00 sec)
mysql> SELECT MAX(ts) FROM test HAVING MAX(ts) = '2011-01-06 12:34:30';
Empty set (0.00 sec)
mysql> SELECT MAX(dt) FROM test HAVING MAX(dt) = '2011-01-06 12:34:30';
+---------------------+
| MAX(dt) |
+---------------------+
| 2011-01-06 12:34:30 |
+---------------------+
1 row in set (0.00 sec)
I see correct results with 5.1.54, so this is a regression bug.
[7 Jan 2011 12:50]
Sergei Golubchik
a possible fix: add MYSQL_TYPE_TIMESTAMP to the case STRING_RESULT in Item_cache::get_cache().
[11 Jan 2011 15:08]
Grégory Duchatelet
Sergei> I can confirm that it fix it. Patch: $ diff sql/item.cc ../mysql-5.5.8/sql/item.cc 7380d7379 < item->field_type() == MYSQL_TYPE_TIMESTAMP ||
[12 Jan 2011 13:01]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/128507 3229 Evgeny Potemkin 2011-01-12 Bug#59330: Incorrect result when comparing an aggregate function with TIMESTAMP. Item_cache::get_cache wasn't treating TIMESTAMP as a DATETIME value thus returning string cache for items with TIMESTAMP type. This led to incorrect TIMESTAMP -> INT conversion and to a wrong query result. Fixed by using Item::is_datetime function to check for DATETIME type group. @ mysql-test/r/type_timestamp.result Added a test case for the bug#59330. @ mysql-test/t/type_timestamp.test Added a test case for the bug#59330. @ sql/item.cc Bug#59330: Incorrect result when comparing an aggregate function with TIMESTAMP. Item_cache::get_cache now uses is_datetime member function to detect DATETIME type group.
[12 Jan 2011 17:22]
Bugs System
Pushed into mysql-5.5 5.5.9 (revid:epotemkin@mysql.com-20110112164700-a78e0yweznp0zkzy) (version source revid:epotemkin@mysql.com-20110112125847-zrw7jg2ge1e0p8fz) (merge vers: 5.5.9) (pib:24)
[12 Jan 2011 17:30]
Bugs System
Pushed into mysql-trunk 5.6.2 (revid:epotemkin@mysql.com-20110112172453-d202wpy4h3s11dys) (version source revid:epotemkin@mysql.com-20110112172453-d202wpy4h3s11dys) (merge vers: 5.6.2) (pib:24)
[12 Jan 2011 18:04]
Paul DuBois
Noted in 5.5.9, 5.6.2 changelogs. Comparisons of aggregate values with TIMESTAMP values were incorrect.
