跳转到主要内容

39P02 — srf_protocol_violated

PostgreSQL SQLSTATE 39P02 的源码与诊断参考。

39P02

速览

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

字段
SQLSTATE 39P02
条件名 srf_protocol_violated
状态 有效
已知存在于 7.4
锁定快照 9.0.23, 9.1.24, 9.2.24, 9.3.25, 9.4.26, 9.5.25, 9.6.24, 10.23, 11.22, 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_E_R_I_E_SRF_PROTOCOL_VIOLATED
别名

含义

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

诊断

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

处置

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

版本

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

39P01, 39P03, 2F002

来源

可直接阅读固定的 execSRF.c 以及 materialize 路径(665-686 行);完整范围见结构化证据记录