选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / 错误代码 / Class 42 语法错误或访问规则冲突

42846 cannot_coerce

无法强制转换

ERROR 已实测 参考 实测通过

条件名
cannot_coerce
宏名称
ERRCODE_CANNOT_COERCE
启用版本
7.4
状态
活跃

版本覆盖

速览

42846cannot_coerce(无法强制转换):源类型与目标类型之间没有适用 cast。本案例要求把 integer 转成 date。

含义

固定主报文为 cannot cast type %s to %s。它不同于合法 cast 的值解析失败 22P02 和目标上下文表达式类型不匹配 42804。检查 pg_cast 与表达式上下文;自动提交模式下本例转换失败后连接回到 IDLE

诊断

读取诊断中的源类型和目标类型,并检查 pg_cast 与表达式上下文;确认应用真正需要类型字面量还是有文档支持的转换函数。

处理

按目标类型构造值,或使用文档支持的转换函数。案例用 DATE '2026-01-01',没有猜测 integer 到 date 的业务映射,也没有用 NULLIF 掩盖错误。显式事务中失败的 cast 会使事务进入 INERROR,应先回滚或回到合适的 savepoint 再重试;本案例的自动提交路径回到 IDLE

可复现案例

在一次性实例上执行过的场景。其中 1 个附有可执行 SQL,正文相应小节里给出。

impossible_cast PG 10 / 18 有 SQL

前置条件

  • A runner-owned disposable target is provisioned.

触发

Explicitly cast an integer expression to date.

断言

  • SQLSTATE is 42846 with cannot cast type integer to date
  • The failed autocommit session remains IDLE
  • A date-typed literal returns the intended date

处置

Use a source type with a documented cast or construct a value in the target type; changing an input string is not the same as making an impossible type cast valid.

清理

Close the runner connection; no persistent objects are created.

实测诊断

固定 parse_expr.c 组是 ERROR,主模板为 cannot cast type %s to %s,没有 DETAIL/HINT。

报文模板

源码里的格式串,不是某一次运行的输出。%s 之类是占位符,实际报文会填入对象名与取值。适用范围一栏是核验时留下的原始英文记录,未经翻译。

代表案例

注册表执行 SELECT 1::integer::date,再执行日期字面量并断言确切日期。

SELECT 1::integer::date;
SELECT DATE '2026-01-01';

选定的 18.6 与 10.21 运行均通过 SQLSTATE、严重级别、状态/恢复、修复、清理和一次性实例停止断言。详见 案例 JSON作者证据;私有清单和注册表哈希也记录在其中。

版本

锁定目录从 7.4 存在边界起包含该条件并列出相关快照。选定自然案例已在 PostgreSQL 18.6 与 10.21 通过;这是有界观察,不能推断所有中间版本或所有源码分支。

来源

证据

断言

每条断言都写明了是怎么核实的,以及它不覆盖什么。这一层是核验时留下的原始英文记录,照原样呈现,未经翻译。

  • 42846 is the cannot_coerce condition in Class 42.

    核实方式Read fixed errcodes.txt and locked catalogue metadata.

    不覆盖Identity does not identify every backend call that can reuse this SQLSTATE.

    来源src/backend/utils/errcodes.txt

  • The selected impossible_cast follows a resolved PostgreSQL source-call group; other branches can use different dynamic fields.

    核实方式Trace the REL_18_6 and REL_10_23 source-call records at the locked commits.

    不覆盖This is one mechanism boundary, not an exhaustive inventory of the code.

    来源src/backend/parser/parse_expr.c · src/backend/parser/parse_expr.c

  • The selected impossible_cast passed on isolated PostgreSQL 18.6 and 10.21 targets.

    核实方式Run the shared SQL registry and inspect SQLSTATE, severity, state, repair, cleanup, and target stop.

    不覆盖Scope is limited to these statements, psycopg, and two versions.

    来源verify/cases/42846/cases.json · verify/cases/42846/snippets.json

  • The locked catalogue records 42846 from the 7.4 presence bound through the listed snapshots; runtime scope is 18.6 and 10.21.

    核实方式Read generated facts, fixed calls, and selected summaries.

    不覆盖Definition presence is not an exact behavioral introduction; two runtime versions do not prove every intermediate behavior.

    来源src/backend/utils/errcodes.txt · raw/calls/REL_18_6.jsonl · raw/calls/REL_10_23.jsonl

运行记录

目标服务器版本结果覆盖案例
latest 18.6 (Homebrew) passed impossible_cast
pg10 10.21 (Debian 10.21-1.pgdg90+1) passed impossible_cast

同类错误代码

Class 42 语法错误或访问规则冲突 下的其他成员。