Bug #26124 BETWEEN in views returns incorrect results
| Submitted: | 6 Feb 2007 20:41 | Modified: | 21 Feb 2007 3:22 |
|---|---|---|---|
| Reporter: | James Dunn | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Views | Severity: | S2 (Serious) |
| Version: | 5.0.27/5.0/5.1BK | OS: | Windows (XP/Linux) |
| Assigned to: | Igor Babaev | CPU Architecture: | Any |
[6 Feb 2007 22:15]
MySQL Verification Team
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.0.36-debug Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> CREATE TABLE tbl_blah (mydate DATETIME);
Query OK, 0 rows affected (0.02 sec)
mysql> CREATE VIEW vw_blah as SELECT mydate from tbl_blah;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO tbl_blah (mydate) VALUES ('2007-01-01');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO tbl_blah (mydate) VALUES ('2007-01-02');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO tbl_blah (mydate) VALUES ('2007-01-30');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO tbl_blah (mydate) VALUES ('2007-01-31');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM vw_blah WHERE mydate BETWEEN '2007-01-01' AND '2007-01-31';
+---------------------+
| mydate |
+---------------------+
| 2007-01-01 00:00:00 |
| 2007-01-02 00:00:00 |
| 2007-01-30 00:00:00 |
+---------------------+
3 rows in set (0.01 sec)
mysql> SELECT * FROM tbl_blah WHERE mydate BETWEEN '2007-01-01' AND '2007-01-31';
+---------------------+
| mydate |
+---------------------+
| 2007-01-01 00:00:00 |
| 2007-01-02 00:00:00 |
| 2007-01-30 00:00:00 |
| 2007-01-31 00:00:00 |
+---------------------+
4 rows in set (0.00 sec)
mysql>
[6 Feb 2007 22:19]
MySQL Verification Team
Thank you for the bug report. Verified as described. mysql> SELECT * FROM vw_blah WHERE mydate BETWEEN '2007-01-01' AND '2007-01-31'; +---------------------+ | mydate | +---------------------+ | 2007-01-01 00:00:00 | | 2007-01-02 00:00:00 | | 2007-01-30 00:00:00 | +---------------------+ 3 rows in set (0.00 sec) mysql> SELECT * FROM tbl_blah WHERE mydate BETWEEN '2007-01-01' AND '2007-01-31'; +---------------------+ | mydate | +---------------------+ | 2007-01-01 00:00:00 | | 2007-01-02 00:00:00 | | 2007-01-30 00:00:00 | | 2007-01-31 00:00:00 | +---------------------+ 4 rows in set (0.00 sec) mysql> select version(); +-------------------+ | version() | +-------------------+ | 5.1.16-beta-debug | +-------------------+ 1 row in set (0.00 sec) mysql>
[7 Feb 2007 8:16]
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/19461 ChangeSet@1.2404, 2007-02-07 00:18:36-08:00, igor@olga.mysql.com +3 -0 Fixed bug #26124: SELECT from a view wrapper over a table with a column of the DATETIME type could return a wrong result set if the WHERE clause included a BETWEEN condition on the column. Fixed the method Item_func_between::fix_length_and_dec where the aggregation type for BETWEEN predicates calculated incorrectly if the first argument was a view column of the DATETIME type.
[14 Feb 2007 10:33]
Igor Babaev
The fix has been pushed to 5.0.36 and 5.1.16-beta.
[21 Feb 2007 3:22]
Paul DuBois
Noted in 5.0.36, 5.1.16 changelogs. A WHERE clause that used BETWEEN for DATETIME values could be treated differently for a SELECT and a view defined as that SELECT.
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.040 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: SELECT * FROM vw_blah WHERE mydate BETWEEN '2007-01-01' AND '2007-01-31'; seems to get run as SELECT * FROM vw_blah WHERE mydate >= '2007-01-01' AND mydate < '2007-01-31'; rather than SELECT * FROM vw_blah WHERE mydate >= '2007-01-01' AND mydate <= '2007-01-31'; How to repeat: CREATE TABLE tbl_blah (mydate DATETIME); CREATE VIEW vw_blah as SELECT mydate from tbl_blah; INSERT INTO tbl_blah (mydate) VALUES ('2007-01-01'); INSERT INTO tbl_blah (mydate) VALUES ('2007-01-02'); INSERT INTO tbl_blah (mydate) VALUES ('2007-01-30'); INSERT INTO tbl_blah (mydate) VALUES ('2007-01-31'); SELECT * FROM vw_blah WHERE mydate BETWEEN '2007-01-01' AND '2007-01-31';