| Bug #79131 | Get negative FOUND_ROWS() for UNION stmt | ||
|---|---|---|---|
| Submitted: | 5 Nov 2015 5:34 | Modified: | 17 Nov 2015 16:03 |
| Reporter: | Su Dylan | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: DML | Severity: | S3 (Non-critical) |
| Version: | 5.7.8, 5.7.9 | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
[5 Nov 2015 6:39]
Peter Laursen
On MySQL 5.6.13 I get:
found_rows()
--------------
341
[5 Nov 2015 7:27]
MySQL Verification Team
Hello Su Dylan, Thank you for the report. Thanks, Umesh
[17 Nov 2015 16:03]
Paul DuBois
Noted in 5.7.11, 5.8.0 changelogs. FOUND_ROWS() could return a negative value if the preceding query was a UNION involving SQL_CALC_FOUND_ROWS and LIMIT ... OFFSET.

Description: Output: ======= mysql> DROP TABLE IF EXISTS t1; Query OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE t1 ( c1 int) ; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO t1 VALUES (1),(2),(3),(4); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> ( SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE false LIMIT 8 , 1 ) UNION ALL ( SELECT * FROM t1 LIMIT 4, 4 ); Empty set (0.00 sec) mysql> select found_rows(); +--------------+ | found_rows() | +--------------+ | -8 | +--------------+ 1 row in set (0.00 sec) mysql> mysql> select version() -> ; +-----------+ | version() | +-----------+ | 5.7.8-rc | +-----------+ 1 row in set (0.00 sec) Problem: ======== In the manual, when UNION is executed, it is very complex. However, negative should never be returned after a successful SELECT execution. How to repeat: DROP TABLE IF EXISTS t1; CREATE TABLE t1 ( c1 int) ; INSERT INTO t1 VALUES (1),(2),(3),(4); ( SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE false LIMIT 8 , 1 ) UNION ALL ( SELECT * FROM t1 LIMIT 4, 4 ); select found_rows(); Suggested fix: The return value for FOUND_ROWS() is >= 0