Bug #96537 | Differing error for MAX_EXECUTION_TIME depending on query stage at termination | ||
---|---|---|---|
Submitted: | 14 Aug 2019 17:14 | Modified: | 22 Oct 2019 22:11 |
Reporter: | Jeremy Cole (Basic Quality Contributor) (OCA) | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server: Optimizer | Severity: | S3 (Non-critical) |
Version: | 5.7, 5.7.27, 8.0.17 | OS: | Any |
Assigned to: | CPU Architecture: | Any | |
Tags: | 1028, 3024, error, max_execution_time |
[14 Aug 2019 17:14]
Jeremy Cole
[14 Aug 2019 17:25]
Jeremy Cole
Note this was noted originally in Rails: https://github.com/rails/rails/pull/36932
[15 Aug 2019 7:51]
MySQL Verification Team
Hello Jeremy, Thank you for the report and test case. Observed this with 5.7.27 build. regards, Umesh
[15 Aug 2019 7:51]
MySQL Verification Team
- 5.7.27 DROP TABLE if exists t; CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `k` int(11) NOT NULL DEFAULT '0', `c` char(120) NOT NULL DEFAULT '', `pad` char(60) NOT NULL DEFAULT '', PRIMARY KEY (`id`), KEY `k_1` (`k`) ) ENGINE=InnoDB; set @id:=0; insert into `t` values(@id:=@id+1,@id:=@id+1,repeat('A',120),repeat('A',60)), (@id:=@id+1,@id:=@id+1,repeat('A',120),repeat('A',60)), (@id:=@id+1,@id:=@id+1,repeat('A',120),repeat('A',60)), (@id:=@id+1,@id:=@id+1,repeat('A',120),repeat('A',60)); insert into `t`(`id`,`k`,`c`,`pad`) select @id:=@id+1,@id:=@id+1,repeat('A',120),repeat('A',60) from `t` k1, `t` k2, `t` k3, `t` k4,`t` k5,`t` k6, `t` k7, `t` k8, `t` k9,`t` k0,`t` ka, `t` kb, `t` kc, `t` kd limit 500; -- 5.7.27 mysql> mysql> insert into `t`(`id`,`k`,`c`,`pad`) select @id:=@id+1,@id:=@id+1,repeat('A',120),repeat('A',60) from `t` k1, `t` k2, `t` k3, `t` k4,`t` k5,`t` k6, `t` k7, `t` k8, `t` k9,`t` k0,`t` ka, `t` kb, `t` kc, `t` kd limit 500; Query OK, 500 rows affected (0.07 sec) Records: 500 Duplicates: 0 Warnings: 0 mysql> select /*+ max_execution_time(50) */ * from t a, t b order by a.pad asc, b.pad desc limit 1; ERROR 3024 (HY000): Query execution was interrupted, maximum statement execution time exceeded mysql> mysql> select /*+ max_execution_time(300) */ * from t a, t b order by a.pad asc, b.pad desc limit 1; ERROR 1028 (HY000): Sort aborted: Query execution was interrupted, maximum statement execution time exceeded mysql> mysql> show variables like '%version%'; +-------------------------+------------------------------+ | Variable_name | Value | +-------------------------+------------------------------+ | innodb_version | 5.7.27 | | protocol_version | 10 | | slave_type_conversions | | | tls_version | TLSv1,TLSv1.1 | | version | 5.7.27 | | version_comment | MySQL Community Server (GPL) | | version_compile_machine | x86_64 | | version_compile_os | linux-glibc2.12 | +-------------------------+------------------------------+ 8 rows in set (0.00 sec) cat /etc/*release Oracle Linux Server release 7.1 NAME="Oracle Linux Server" VERSION="7.1" ID="ol" VERSION_ID="7.1" PRETTY_NAME="Oracle Linux Server 7.1" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:oracle:linux:7:1" HOME_URL="https://linux.oracle.com/" BUG_REPORT_URL="https://bugzilla.oracle.com/" ORACLE_BUGZILLA_PRODUCT="Oracle Linux 7" ORACLE_BUGZILLA_PRODUCT_VERSION=7.1 ORACLE_SUPPORT_PRODUCT="Oracle Linux" ORACLE_SUPPORT_PRODUCT_VERSION=7.1 Red Hat Enterprise Linux Server release 7.1 (Maipo) Oracle Linux Server release 7.1
[15 Aug 2019 7:54]
MySQL Verification Team
- 8.0.17 bin/mysql -uroot -S /tmp/mysql_ushastry.sock Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 7 Server version: 8.0.17 MySQL Community Server - GPL Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> create database test; Query OK, 1 row affected (0.00 sec) mysql> use test Database changed mysql> DROP TABLE if exists t; CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `k` int(11) NOT NULL DEFAULT '0', `c` char(120) NOT NULL DEFAULT '', `pad` char(60) NOT NULL DEFAULT '', PRIMARY KEY (`id`), KEY `k_1` (`k`) ) ENGINE=InnoDB; set @id:=0; insert into `t` values(@id:=@id+1,@id:=@id+1,repeat('A',120),repeat('A',60)), (@id:=@id+1,@id:=@id+1,repeat('A',120),repeat('A',60)), (@id:=@id+1,@id:=@id+1,repeat('A',120),repeat('A',60)), (@id:=@id+1,@id:=@id+1,repeat('A',120),repeat('A',60)); insert into `t`(`id`,`k`,`c`,`pad`) select @id:=@id+1,@id:=@id+1,repeat('A',120),repeat('A',60) from `t` k1, `t` k2, `t` k3, `t` k4,`t` k5,`t` k6, `t` k7, `t` k8, `t` k9,`t` k0,`t` ka, `t` kb, `t` kc, `t` kd limit 500; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> CREATE TABLE `t` ( -> `id` int(11) NOT NULL AUTO_INCREMENT, -> `k` int(11) NOT NULL DEFAULT '0', -> `c` char(120) NOT NULL DEFAULT '', -> `pad` char(60) NOT NULL DEFAULT '', -> PRIMARY KEY (`id`), -> KEY `k_1` (`k`) -> ) ENGINE=InnoDB; Query OK, 0 rows affected, 2 warnings (0.01 sec) mysql> mysql> set @id:=0; Query OK, 0 rows affected (0.00 sec) mysql> insert into `t` values(@id:=@id+1,@id:=@id+1,repeat('A',120),repeat('A',60)), (@id:=@id+1,@id:=@id+1,repeat('A',120),repeat('A',60)), (@id:=@id+1,@id:=@id+1,repeat('A',120),repeat('A',60)), (@id:=@id+1,@id:=@id+1,repeat('A',120),repeat('A',60)); Query OK, 4 rows affected, 8 warnings (0.01 sec) Records: 4 Duplicates: 0 Warnings: 8 mysql> insert into `t`(`id`,`k`,`c`,`pad`) select @id:=@id+1,@id:=@id+1,repeat('A',120),repeat('A',60) from `t` k1, `t` k2, `t` k3, `t` k4,`t` k5,`t` k6, `t` k7, `t` k8, `t` k9,`t` k0,`t` ka, `t` kb, `t` kc, `t` kd limit 500; Query OK, 500 rows affected, 2 warnings (0.06 sec) Records: 500 Duplicates: 0 Warnings: 2 mysql> show warnings; +---------+------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Warning | 1287 | Setting user variables within expressions is deprecated and will be removed in a future release. Consider alternatives: 'SET variable=expression, ...', or 'SELECT expression(s) INTO variables(s)'. | | Warning | 1287 | Setting user variables within expressions is deprecated and will be removed in a future release. Consider alternatives: 'SET variable=expression, ...', or 'SELECT expression(s) INTO variables(s)'. | +---------+------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec) mysql> select /*+ max_execution_time(50) */ * from t a, t b order by a.pad asc, b.pad desc limit 1; ERROR 3024 (HY000): Query execution was interrupted, maximum statement execution time exceeded mysql> mysql> select /*+ max_execution_time(300) */ * from t a, t b order by a.pad asc, b.pad desc limit 1; ERROR 1028 (HY000): Sort aborted: Query execution was interrupted, maximum statement execution time exceeded
[22 Oct 2019 22:11]
Jon Stephens
DOcumented fix in the MySQL 8.0.19 changelog as follows: When a query terminated due to exceeding the time specified using the MAX_EXECUTION_TIME hint, the error produced differed depending on the stage of the query. In particular, if the query terminated during a filesort, the error raised was ER_FILSORT_ABORT, even though in such cases the query should always exit with ER_QUERY_TIMEOUT. This made it unnecessarily difficult to trap such errors and to handle them correctly. This fix removes the error codes ER_FILSORT_ABORT and ER_FILESORT_TERMINATED. Closed.