Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-7219

SQL_CALC_FOUND_ROWS yields wrong result

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 10.0.12, 10.0.15
    • Fix Version/s: 10.0.16
    • Component/s: Optimizer
    • Labels:
      None
    • Environment:
      CentOS 6.6 x64

      Description

      SQL_CALC_FOUND_ROWS returns various results depending on table definition, KEY and ORDER BY.

        Gliffy Diagrams

          Attachments

            Issue Links

              Activity

              Hide
              elenst Elena Stepanova added a comment -

              The problem (re-?)appeared on the 10.0 tree with this revision:

              revno: 4226
              revision-id: sergii@pisem.net-20140605135941-ytyt69i971b3syle
              parent: sergii@pisem.net-20140605135935-vlj5qhr4yr8lp2fn
              committer: Sergei Golubchik <sergii@pisem.net>
              branch nick: 10.0
              timestamp: Thu 2014-06-05 15:59:41 +0200
              message:
                revert the fix for MDEV-5898, restore the fix for MDEV-5549.
                simplify test case for MDEV-5898
              

              Test case (exactly the same as in the attachment, just made it MTR-like). For all SELECT FOUND_ROWS() queries the expected result is 75.

              DROP DATABASE IF EXISTS bugtest;
              CREATE DATABASE bugtest;
              USE bugtest;
              
              --delimiter //
              
                CREATE PROCEDURE fill_bugtable (len INT)
                BEGIN
                  DECLARE i INT DEFAULT 1;
                  WHILE i <= len DO
                    INSERT INTO bugtable (bugtable_varchar, bugtable_int) VALUES ("foo", i%2);
                    SET i = i + 1;
                  END WHILE;
                END //
              
              --delimiter ;
              
              --echo # Tests to reproduce Bug #1 ------------------------------------------------
              
              CREATE TABLE `bugtable` (
                `bugtable_int` int,
                `bugtable_varchar` varchar(64),
                KEY (`bugtable_int`)
              ) ENGINE=MyISAM CHARSET=latin1 COLLATE=latin1_general_ci;
              
              CALL fill_bugtable(150);
              
              SELECT SQL_CALC_FOUND_ROWS * FROM bugtable WHERE `bugtable_int` = 0 ORDER BY bugtable_varchar LIMIT 59,2;
              SELECT FOUND_ROWS();
              
              SELECT SQL_CALC_FOUND_ROWS * FROM bugtable WHERE `bugtable_int` = 0 ORDER BY bugtable_varchar LIMIT 60,2;
              SELECT FOUND_ROWS();
              
              --echo # Tests to reproduce Bug #2 ------------------------------------------------
              
              ALTER TABLE `bugtable` DROP INDEX `bugtable_int`;
              
              SELECT SQL_CALC_FOUND_ROWS * FROM bugtable WHERE `bugtable_int` = 0 ORDER BY bugtable_varchar LIMIT 59,2;
              SELECT FOUND_ROWS();
              
              SELECT SQL_CALC_FOUND_ROWS * FROM bugtable WHERE `bugtable_int` = 0 ORDER BY bugtable_varchar LIMIT 60,2;
              SELECT FOUND_ROWS();
              
              --echo # Tests to reproduce Bug #3 ------------------------------------------------
              
              DROP TABLE `bugtable`;
              CREATE TABLE `bugtable` (
                `bugtable_int` int,
                `bugtable_varchar` varchar(64),
                KEY (`bugtable_int`)
              ) ENGINE=MyISAM CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
              
              CALL fill_bugtable(150);
              
              SELECT SQL_CALC_FOUND_ROWS * FROM bugtable WHERE `bugtable_int` = 0 ORDER BY bugtable_varchar LIMIT 59,2;
              SELECT FOUND_ROWS();
              
              SELECT SQL_CALC_FOUND_ROWS * FROM bugtable WHERE `bugtable_int` = 0 ORDER BY bugtable_varchar LIMIT 60,2;
              SELECT FOUND_ROWS();
              
              --echo # Tests to reproduce Bug #4 ------------------------------------------------
              
              ALTER TABLE `bugtable` DROP INDEX `bugtable_int`;
              
              SELECT SQL_CALC_FOUND_ROWS * FROM bugtable WHERE `bugtable_int` = 0 ORDER BY bugtable_varchar LIMIT 59,2;
              SELECT FOUND_ROWS();
              
              SELECT SQL_CALC_FOUND_ROWS * FROM bugtable WHERE `bugtable_int` = 0 ORDER BY bugtable_varchar LIMIT 60,2;
              SELECT FOUND_ROWS();
              
              drop database bugtest;
              
              Show
              elenst Elena Stepanova added a comment - The problem (re-?)appeared on the 10.0 tree with this revision: revno: 4226 revision-id: sergii@pisem.net-20140605135941-ytyt69i971b3syle parent: sergii@pisem.net-20140605135935-vlj5qhr4yr8lp2fn committer: Sergei Golubchik <sergii@pisem.net> branch nick: 10.0 timestamp: Thu 2014-06-05 15:59:41 +0200 message: revert the fix for MDEV-5898, restore the fix for MDEV-5549. simplify test case for MDEV-5898 Test case (exactly the same as in the attachment, just made it MTR-like). For all SELECT FOUND_ROWS() queries the expected result is 75 . DROP DATABASE IF EXISTS bugtest; CREATE DATABASE bugtest; USE bugtest; --delimiter // CREATE PROCEDURE fill_bugtable (len INT) BEGIN DECLARE i INT DEFAULT 1; WHILE i <= len DO INSERT INTO bugtable (bugtable_varchar, bugtable_int) VALUES ( "foo" , i%2); SET i = i + 1; END WHILE; END // --delimiter ; --echo # Tests to reproduce Bug #1 ------------------------------------------------ CREATE TABLE `bugtable` ( `bugtable_int` int, `bugtable_varchar` varchar(64), KEY (`bugtable_int`) ) ENGINE=MyISAM CHARSET=latin1 COLLATE=latin1_general_ci; CALL fill_bugtable(150); SELECT SQL_CALC_FOUND_ROWS * FROM bugtable WHERE `bugtable_int` = 0 ORDER BY bugtable_varchar LIMIT 59,2; SELECT FOUND_ROWS(); SELECT SQL_CALC_FOUND_ROWS * FROM bugtable WHERE `bugtable_int` = 0 ORDER BY bugtable_varchar LIMIT 60,2; SELECT FOUND_ROWS(); --echo # Tests to reproduce Bug #2 ------------------------------------------------ ALTER TABLE `bugtable` DROP INDEX `bugtable_int`; SELECT SQL_CALC_FOUND_ROWS * FROM bugtable WHERE `bugtable_int` = 0 ORDER BY bugtable_varchar LIMIT 59,2; SELECT FOUND_ROWS(); SELECT SQL_CALC_FOUND_ROWS * FROM bugtable WHERE `bugtable_int` = 0 ORDER BY bugtable_varchar LIMIT 60,2; SELECT FOUND_ROWS(); --echo # Tests to reproduce Bug #3 ------------------------------------------------ DROP TABLE `bugtable`; CREATE TABLE `bugtable` ( `bugtable_int` int, `bugtable_varchar` varchar(64), KEY (`bugtable_int`) ) ENGINE=MyISAM CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CALL fill_bugtable(150); SELECT SQL_CALC_FOUND_ROWS * FROM bugtable WHERE `bugtable_int` = 0 ORDER BY bugtable_varchar LIMIT 59,2; SELECT FOUND_ROWS(); SELECT SQL_CALC_FOUND_ROWS * FROM bugtable WHERE `bugtable_int` = 0 ORDER BY bugtable_varchar LIMIT 60,2; SELECT FOUND_ROWS(); --echo # Tests to reproduce Bug #4 ------------------------------------------------ ALTER TABLE `bugtable` DROP INDEX `bugtable_int`; SELECT SQL_CALC_FOUND_ROWS * FROM bugtable WHERE `bugtable_int` = 0 ORDER BY bugtable_varchar LIMIT 59,2; SELECT FOUND_ROWS(); SELECT SQL_CALC_FOUND_ROWS * FROM bugtable WHERE `bugtable_int` = 0 ORDER BY bugtable_varchar LIMIT 60,2; SELECT FOUND_ROWS(); drop database bugtest;

                People

                • Assignee:
                  serg Sergei Golubchik
                  Reporter:
                  lovette Lance
                • Votes:
                  0 Vote for this issue
                  Watchers:
                  3 Start watching this issue

                  Dates

                  • Created:
                    Updated:
                    Resolved:

                    Time Tracking

                    Estimated:
                    Original Estimate - Not Specified
                    Not Specified
                    Remaining:
                    Remaining Estimate - 0 minutes
                    0m
                    Logged:
                    Time Spent - 6 hours
                    6h