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

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

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

42P13 invalid_function_definition

无效函数定义

ERROR 源码确认 参考 未实测

条件名
invalid_function_definition
宏名称
ERRCODE_INVALID_FUNCTION_DEFINITION
启用版本
7.4
状态
活跃

版本覆盖

速览

42P13invalid_function_definition)函数、聚合和触发器声明可能在执行前校验失败。

含义

函数定义校验在声明不兼容时使用此条件。选定的核心路径包括无法确定多态聚合转换类型(DETAIL 由调用方动态生成)、最终语句不是兼容的 SELECT 或 DML RETURNING 而导致返回类型不匹配,以及触发器函数声明参数。

诊断

修改函数前先按消息分类:聚合转换类型推断及其动态 DETAIL、最终语句/RETURNING 结果与声明返回类型不一致,或触发器函数声明参数。把已存签名、返回类型与函数体和触发器约定逐项比较;不返回行的 DML 或 utility 命令与标量强制转换失败属于不同的最终语句路径。

处理

修正消息指出的声明或函数体:为聚合提供可确定的转换类型,让函数最后语句返回声明类型;触发器参数应通过 TG_NARGS/TG_ARGV 读取,不能在声明中列出。检查依赖调用者后再重建或替换。如果 ERROR 发生在显式事务中,执行下一条 DDL 前先 ROLLBACK,或回滚到错误前的保存点。

消息

固定源码中的代表性消息包括:message: cannot determine transition data type; errdetail_internal: %s;message: return type mismatch in function declared to return %s; DETAIL: Function's final statement must be SELECT or INSERT/UPDATE/DELETE/MERGE RETURNING.;message: trigger functions cannot have declared arguments; HINT: The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV instead.。占位符由实际对象、列或参数填充。

报文模板

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

主消息 cannot determine transition data type
DETAIL %s
主消息 · errdetail_internal %s

来源:src/backend/catalog/pg_aggregate.c(lines 142-145) @ REL_18_6

适用范围:Placeholders remain dynamic source fields; no concrete runtime value is claimed.

主消息 return type mismatch in function declared to return %s
DETAIL Function's final statement must be SELECT or INSERT/UPDATE/DELETE/MERGE RETURNING.
主消息 · errdetail Function's final statement must be SELECT or INSERT/UPDATE/DELETE/MERGE RETURNING.

来源:src/backend/executor/functions.c(lines 2222-2226) @ REL_18_6

适用范围:Placeholders remain dynamic source fields; no concrete runtime value is claimed.

主消息 trigger functions cannot have declared arguments
HINT The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV instead.
主消息 · errhint The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV instead.

来源:src/pl/plpgsql/src/pl_comp.c(lines 493-496) @ REL_18_6

适用范围:Placeholders remain dynamic source fields; no concrete runtime value is claimed.

版本

锁定目录显示该条件最早见于 PostgreSQL 7.4;行为说明固定在 PostgreSQL 18.6 源码,目录存在范围不等于每条消息或功能都从该版本开始。

来源

证据

断言

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

同类错误代码

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