↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

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

百科 / SQL 状态码 / Class 39 外部例程调用异常

39P02 srf_protocol_violated

ERROR 源码确认 参考 未实测

类别
Class 39 外部例程调用异常
严重等级
ERROR
条件名
srf_protocol_violated
宏名称
ERRCODE_E_R_I_E_SRF_PROTOCOL_VIOLATED
最早已知存在
7.4
状态
有效

版本覆盖

版本条依据已采样构建显示;灰色版本可能尚未采样,悬停可查看。手册链接随版本选择,源码和运行证据保持原核验构建。

速览

39P02 是 srf_protocol_violated。固定 executor 源码确认它检查 set-returning function 的 value-per-call、materialize 以及 returnMode 契约。

含义

SQL 执行器收到的 ReturnSetInfo 状态与函数声明/实现不一致时,会报告此条件:报文可能是 table-function protocol for value-per-call mode was not followed、table-function protocol for materialize mode was not followed 或 unrecognized table-function returnMode: %d。它描述 SRF 协议,不是普通 SELECT 的行数结果。

报文模板

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

主消息 table-function protocol for value-per-call mode was not followed

来源: 来源:src/backend/executor/execSRF.c @ REL_18_6

主消息 table-function protocol for materialize mode was not followed

来源: 来源:src/backend/executor/execSRF.c @ REL_18_6

主消息 unrecognized table-function returnMode: %d

来源: 来源:src/backend/executor/execSRF.c @ REL_18_6

诊断

从完整消息判断是哪一类模式,再检查扩展或 C 函数如何设置 rsinfo.returnMode、isDone、returnSet 以及结果存储。优先定位提供该 set-returning function 的函数体和部署版本;不要把客户端收到的空结果误判成 39P02。

处置

修正 SRF 实现以遵守所选 value-per-call 或 materialize 协议,并重新验证其 ReturnSetInfo 字段与返回声明。修复函数契约后再重试调用;仅改变 SQL 的 LIMIT、事务或客户端重试策略不能修复该 executor 协议错误。

版本

锁定目录从 7.4 记录该条件,并在正式快照及 19beta3 中出现;固定报告该码的路径 为 PostgreSQL 18.6 execSRF.c。

来源

证据

断言

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

同类 SQL 状态码

状态码 条件名 宏名称 严重等级 版本
Class 39 外部例程调用异常 External Routine Invocation Exception 6 个 ↗
39000 external_routine_invocation_exception ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION ERROR 7.4 起已知
外部例程调用异常,如 pgcrypto 的库失败。 有效
39001 invalid_sqlstate_returned ERRCODE_E_R_I_E_INVALID_SQLSTATE_RETURNED ERROR 7.4 起已知
外部例程返回了无效的 SQLSTATE。 有效
39004 null_value_not_allowed ERRCODE_E_R_I_E_NULL_VALUE_NOT_ALLOWED ERROR 7.4 起已知
外部例程调用中不允许出现 NULL 值。 有效
39P01 trigger_protocol_violated ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED ERROR 7.4 起已知
触发器违反了返回值或调用协议。 有效
39P02 srf_protocol_violated ERRCODE_E_R_I_E_SRF_PROTOCOL_VIOLATED ERROR 7.4 起已知
集合返回函数违反了 SRF 调用协议。 有效
39P03 event_trigger_protocol_violated ERRCODE_E_R_I_E_EVENT_TRIGGER_PROTOCOL_VIOLATED ERROR 9.5.0 起已知
事件触发器辅助函数在错误的事件上下文调用。 有效