Bug #29918 | Assigning a variable in some SELECT queries yields invalid resuls | ||
---|---|---|---|
Submitted: | 19 Jul 2007 22:24 | Modified: | 19 Jul 2007 23:37 |
Reporter: | Paweł Stradomski | Email Updates: | |
Status: | Not a Bug | Impact on me: | |
Category: | MySQL Server: General | Severity: | S3 (Non-critical) |
Version: | 5.0.44 | OS: | Linux (Gentoo) |
Assigned to: | CPU Architecture: | Any | |
Tags: | COUNT DISTINCT, GROUP BY, join, user variables |
[19 Jul 2007 22:24]
Paweł Stradomski
[19 Jul 2007 22:44]
Paul DuBois
http://dev.mysql.com/doc/refman/5.0/en/user-variables.html says: "The order of evaluation for user variables is undefined and may change based on the elements contained within a given query. In SELECT @a, @a := @a+1 ..., you might think that MySQL will evaluate @a first and then do an assignment second, but changing the query (for example, by adding a GROUP BY, HAVING, or ORDER BY clause) may change the order of evaluation."
[19 Jul 2007 23:37]
MySQL Verification Team
Thank you for the bug report. Please Paul's comment. [miguel@light 5.0]$ bin/mysql -uroot Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.0.48-debug Source distribution Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> use test Database changed mysql> CREATE TABLE `products` ( -> `name` VARCHAR( 10 ) NOT NULL , -> `price` INT NOT NULL , -> PRIMARY KEY ( `name` ) -> ); Query OK, 0 rows affected (0.00 sec) mysql> mysql> mysql> INSERT INTO products VALUES ('tea', 7), ('coffie', 14), ('sugar', 3); Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> mysql> mysql> CREATE TABLE `p2` ( -> `name` VARCHAR( 10 ) NOT NULL , -> `price` INT NOT NULL , -> PRIMARY KEY ( `name` ) -> ); Query OK, 0 rows affected (0.00 sec) mysql> mysql> mysql> INSERT INTO p2 VALUES ('tea', 7), ('coffie', 14), ('sugar', 3); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> mysql> mysql> mysql> SELECT -> @a := CASE -> WHEN products.price BETWEEN 0 AND 9 THEN '0-9' -> WHEN products.price BETWEEN 10 AND 19 THEN '10-19' -> END -> AS priceInterval, -> COUNT(DISTINCT products.name) AS productCount, -> CAST(SUBSTRING_INDEX(@a, '-', 1) AS SIGNED) AS priceIntervalStart -> FROM -> products LEFT JOIN p2 ON products.name = p2.name -> GROUP BY priceInterval -> ; +---------------+--------------+--------------------+ | priceInterval | productCount | priceIntervalStart | +---------------+--------------+--------------------+ | 0-9 | 2 | 0 | | 10-19 | 1 | 10 | +---------------+--------------+--------------------+ 2 rows in set (0.04 sec) mysql>
[27 Jul 2007 13:10]
Piotr Czachur
It is a bug, I have already filled it (http://bugs.mysql.com/bug.php?id=28494), and it was fixed, so i guess it appeared again. Manual says that values returned by variable can be unpredictable, but result rows count shouldn't change because some value was assigned to a variable.