文档 / SQL 状态码 / Class 57 操作员干预
57014 query_canceled
查询已取消
ERROR 已实测 详解 实测通过
- 条件名
query_canceled- 宏名称
ERRCODE_QUERY_CANCELED- 启用版本
- 7.4
- 状态
- 活跃
版本覆盖
速览
57014 是 PostgreSQL 类别 57 operator_intervention 中的 query_canceled 条件。它表示服务器中断了某条语句。多个取消来源共用这个 SQLSTATE,因此必须结合主报文和服务器上下文,区分 statement timeout、客户端取消、恢复冲突或其他管理路径。
代表性案例在专用自动提交连接上设置 statement_timeout 为 100 ms,再执行 pg_sleep(1)。PostgreSQL 返回 canceling statement due to statement timeout;连接保持 IDLE,后续 SELECT 1 返回 1。这只证明本案例的超时路径及连接可用性,不能推断所有取消命令都没有副作用或拥有相同事务状态。
运行 57014-registry-final-20260909 在 PostgreSQL 18.6 和隔离的 PostgreSQL 10.21 上均通过。逐目标断言和结构化观察见公开证据 JSON。
含义与触发路径
statement_timeout 为每条语句启动计时器,预算到期后请求 backend 处理中断。在固定源码路径中,ProcessInterrupts 使用 ERRCODE_QUERY_CANCELED 和 canceling statement due to statement timeout 报告错误。客户端取消使用相同 SQLSTATE 但主报文是 canceling statement due to user request;锁超时和某些恢复路径使用自己的报文或 detail。
取消会在可处理中断的点停止当前语句。它不等于所有关联请求的工作都已经停止,也不保证外部副作用已经撤销,更不保证无需回滚就能继续使用事务。必须结合事务边界、语句类型和取消来源确定清理方式。
报文与诊断
代表性操作是在专用自动提交连接上设置 100 ms 超时:
SET statement_timeout = '100ms';
SELECT pg_sleep(1);
SELECT 1;
PostgreSQL 18.6 返回:
SQLSTATE: 57014
severity: ERROR
message_primary: canceling statement due to statement timeout
source: postgres.c / ProcessInterrupts / line 3446
PG10 返回相同的主报文,对应源码行号为 3018。57014 没有统一的 detail 模板;如果客户端提供,应保存 message_detail、message_hint、上下文及被中断的语句。
报文模板
源码里的格式串,不是某一次运行的输出。%s 之类是占位符,实际报文会填入对象名与取值。适用范围一栏是核验时留下的原始英文记录,未经翻译。
canceling statement due to statement timeout
来源:src/backend/tcop/postgres.c(lines 3441-3446) @ REL_18_6
适用范围:This template identifies the statement_timeout path; other query-canceled paths have their own messages.
诊断
记录 SQLSTATE、严重级别、主报文、detail、hint、上下文、backend PID、语句文本、超时设置和取消来源。区分 statement timeout、lock timeout、客户端取消、管理员请求以及备用机恢复冲突。客户端诊断不完整时,可使用 SQLSTATE 和 backend PID 检查服务器日志。
检查错误后的事务状态。本案例的自动提交超时后为 IDLE,并成功执行 SELECT 1;显式事务中的错误可能让事务进入 INERROR,需要回滚。如果语句在出错前已改变行,应检查数据库实际状态,不要假定数据库之外的整个请求都能自动回滚。
处理与修复
根据原因调整操作和预算:
- 优化或拆分过长查询,设置符合服务预算的超时。
- 将客户端或管理员取消视为控制决策,再判断应用是否应重试。
- 如果报文指向 lock timeout,应独立解决锁竞争;提高 statement timeout 不会修复锁队列。
- 显式事务中止后先回滚,再发送无关命令;对生命周期不受 PostgreSQL 控制的外部工作进行验证。
代表性后续查询返回 1,连接状态为 IDLE。这是自动提交 sleep 案例的修复断言,不保证被取消的写入、游标或事务都能原地继续。
可复现案例
在一次性实例上执行过的场景。其中 1 个附有可执行 SQL,正文相应小节里给出。
statement_timeout_cancel PG 10 / 18 有 SQL
前置条件
- A dedicated connection
- statement_timeout set to 100 ms
触发
Run pg_sleep(1) and let the server cancel the statement at the configured timeout.
断言
- SQLSTATE is 57014
- The message identifies statement timeout
- The autocommit connection is usable for a subsequent query
处置
Classify timeout by operation and budget; tune the timeout or query, and do not treat cancellation as proof that all server work has stopped without checking the operation.
清理
Drop the case schema with an owner connection.
版本与边界
目录在 PostgreSQL 7.4 的锁定定义中已观察到 57014,并持续到 8.4.22 的 pre-9.0 定义;随后在列出的所有正式快照直到 PostgreSQL 18.6 以及 PostgreSQL 19 Beta 3 预览中存在。这是 definition_only 的存在边界,不是确切实现引入版本或运行时使用断言。扫描范围内没有记录该条件的定义变化。
statement timeout 案例在 PostgreSQL 18.6 和 10.21 上均通过。该 SQLSTATE 还用于其他取消机制,而它们的报文和事务影响不同;本证据范围限定为自动提交连接上的服务器 statement timeout。
来源
- 核验材料 verify/cases/57014/cases.json
- 核验材料 doc/src/sgml/config.sgml
- 核验材料 doc/src/sgml/protocol.sgml
- 核验材料 sources/manifest.lock.json
- 核验材料 verify/cases/57014/snippets.json
- 核验材料 src/backend/utils/errcodes.txt
- 核验材料 src/backend/tcop/postgres.c 第 3441–3446 行
证据
断言
每条断言都写明了是怎么核实的,以及它不覆盖什么。这一层是核验时留下的原始英文记录,照原样呈现,未经翻译。
-
57014 is the query_canceled condition in Class 57 operator_intervention.
-
The statement-timeout interrupt path reports ERRCODE_QUERY_CANCELED with canceling statement due to statement timeout.
-
A 100 ms statement_timeout canceled pg_sleep(1) with SQLSTATE 57014 and left the autocommit connection IDLE; SELECT 1 then returned 1 on both targets.
-
The locked catalogue records 57014 in every listed formal snapshot from 9.0.23 through 18.6 and in 19beta3; pre-9.0 history is not scanned.
运行记录
| 目标 | 服务器版本 | 结果 | 覆盖案例 |
|---|---|---|---|
| latest | 18.6 (Homebrew) | passed | statement_timeout_cancel |
| pg10 | 10.21 (Debian 10.21-1.pgdg90+1) | passed | statement_timeout_cancel |
同类 SQL 状态码
| 状态码 | 条件名 | 宏名称 | 严重等级 | 版本 |
|---|---|---|---|---|
| 57000 | operator_intervention | ERRCODE_OPERATOR_INTERVENTION |
ERROR | 7.4 |
| 运维干预类别的通用条件,核心未见直接调用。 | 活跃 | |||
| 57014 | query_canceled | ERRCODE_QUERY_CANCELED |
ERROR | 7.4 |
| 语句被取消,含 statement_timeout 到期。 | 活跃 | |||
| 57P01 | admin_shutdown | ERRCODE_ADMIN_SHUTDOWN |
ERROR | 7.4 |
| 管理员关闭服务器或终止后端,会话被断开。 | 活跃 | |||
| 57P02 | crash_shutdown | ERRCODE_CRASH_SHUTDOWN |
ERROR | 7.4 |
| postmaster 因崩溃重启而令后端回滚退出。 | 活跃 | |||
| 57P03 | cannot_connect_now | ERRCODE_CANNOT_CONNECT_NOW |
ERROR | 7.4 |
| 服务器处于启动或恢复中,暂不接受连接。 | 活跃 | |||
| 57P04 | database_dropped | ERRCODE_DATABASE_DROPPED |
ERROR | 9.0 |
| 所连数据库被删除,恢复冲突终止了会话。 | 活跃 | |||
| 57P05 | idle_session_timeout | ERRCODE_IDLE_SESSION_TIMEOUT |
ERROR | 14 |
| 空闲会话超过 idle_session_timeout 被终止。 | 活跃 | |||