| Bug #21354 | (COUNT(*) = 1) not working in SELECT inside prepared statement | ||
|---|---|---|---|
| Submitted: | 30 Jul 2006 23:14 | Modified: | 13 Nov 2006 19:30 |
| Reporter: | Nicolai Bloch | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Stored Routines | Severity: | S3 (Non-critical) |
| Version: | 4.1.22, 5.0.25-BK, 5.0.22 | OS: | Any (ALL) |
| Assigned to: | Tomash Brechko | CPU Architecture: | Any |
[30 Jul 2006 23:14]
Nicolai Bloch
[30 Jul 2006 23:24]
Michael Rose
I was one of the ones from FreeNode's #mysql who tested it and received 1, 0 as the last result. Here's version numbers: GNU/Linux: 2.6.15-26-386 (x86) MySQL: 5.0.22-Debian_0ubuntu6.06-log
[31 Jul 2006 14:40]
Valeriy Kravchuk
Thank you for a bug report. Verified just as described with 5.0.25-BK on Linux:
openxs@suse:~/dbs/5.0> bin/mysql -uroot test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2 to server version: 5.0.25
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> delimiter |
mysql> DROP TABLE IF EXISTS testTbl|
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS testTbl (
-> a INT UNSIGNED NOT NULL PRIMARY KEY
-> ) ENGINE = MyISAM|
|Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO testTbl (a) VALUES (1), (2), (3)|
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> DROP PROCEDURE IF EXISTS testProc|
CREATE PROCEDURE testProc (
Query OK, 0 rows affected (0.09 sec)
mysql> CREATE PROCEDURE testProc (
-> i_a INT UNSIGNED
-> )
-> BEGIN
-> SELECT (COUNT(*) = 1), COUNT(*) FROM testTbl WHERE a = i_a;
-> END|
Query OK, 0 rows affected (0.01 sec)
mysql> call testProc(22)|
+----------------+----------+
| (COUNT(*) = 1) | COUNT(*) |
+----------------+----------+
| 0 | 0 |
+----------------+----------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> call testProc(2)|
+----------------+----------+
| (COUNT(*) = 1) | COUNT(*) |
+----------------+----------+
| 1 | 1 |
+----------------+----------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> call testProc(33)|
+----------------+----------+
| (COUNT(*) = 1) | COUNT(*) |
+----------------+----------+
| 1 | 0 |
+----------------+----------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
[14 Aug 2006 22:05]
Konstantin Osipov
Tomash, this is likely also a 4.1 bug. Please check it there too.
[31 Aug 2006 13:23]
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/11162 ChangeSet@1.2538, 2006-08-31 17:22:42+04:00, kroki@moonlight.intranet +5 -0 BUG#21354: (COUNT(*) = 1) not working in SELECT inside prepared statement. The problem was that during statement re-execution if the result was empty the old result could be returned for group functions. The solution is to implement proper cleanup() method in group functions.
[22 Sep 2006 12:50]
Konstantin Osipov
Approved by email with a few comments.
[10 Oct 2006 13:10]
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/13393 ChangeSet@1.2538, 2006-10-10 17:08:47+04:00, kroki@moonlight.intranet +5 -0 BUG#21354: (COUNT(*) = 1) not working in SELECT inside prepared statement. The problem was that during statement re-execution if the result was empty the old result could be returned for group functions. The solution is to implement proper cleanup() method in group functions.
[10 Oct 2006 18:35]
Tomash Brechko
Queued to 4.1-runtime, 5.0-runtime, 5.1-runtime.
[18 Oct 2006 11:22]
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/13855 ChangeSet@1.2286, 2006-10-18 15:20:34+04:00, kroki@moonlight.intranet +2 -0 Fix for valgrind warning introduced by the fix for bug#21354: (COUNT(*) = 1) not working in SELECT inside prepared statement. Note: the warning was introduced in 5.0 and 5.1, 4.1 is OK with the original fix. The problem was that in 5.0 and 5.1 clear() for group functions may access hybrid_type member, and this member is initialized in fix_fields(). So we should not call clear() from item cleanup() methods, as cleanup() may be called for unfixed items.
[13 Nov 2006 19:30]
Paul DuBois
Noted in 4.1.22, 5.0.30 (not 5.0.29), 5.1.13 changelogs. Within a prepared statement, SELECT (COUNT(*) = 1) (or similar use of other aggregate functions) did not return the correct result for statement re-execution.
