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

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

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

42723 duplicate_function

重复函数

ERROR 已实测 参考 实测通过

条件名
duplicate_function
宏名称
ERRCODE_DUPLICATE_FUNCTION
启用版本
7.4
状态
活跃

版本覆盖

速览

42723duplicate_function(重复函数):函数定义重复了同一模式、名称和输入参数类型,返回类型不会形成新重载。

含义

固定目录路径报告 function "%s" already exists with same argument types。检查 pg_procpg_get_function_identity_arguments 和返回契约。它是定义冲突,不同于调用阶段候选歧义 42725;自动提交错误后为 IDLE

诊断

在 pg_proc 中用 pg_get_function_identity_arguments 检查,并明确模式。先判断迁移是要新增输入签名,还是替换自己拥有的函数;返回类型不能改变函数身份。

处理

真正不同的 API 使用新的输入签名。只有在有意替换自己拥有的函数且返回契约兼容时才用 CREATE OR REPLACE FUNCTION;显式事务中的重复定义会使事务进入 INERROR,应先回滚或回到合适的 savepoint 再重试;本案例的自动提交路径回到 IDLE

可复现案例

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

duplicate_function_signature PG 10 / 18 有 SQL

前置条件

  • A runner-owned disposable target is provisioned.

触发

Create a function and repeat the same name and integer argument signature.

断言

  • SQLSTATE is 42723 with the same-argument-types message
  • The failed autocommit session remains IDLE
  • CREATE OR REPLACE with the intentional same signature returns the repaired value

处置

Choose a new signature or use CREATE OR REPLACE only when replacing the owned function is intentional.

清理

Drop the runner schema and its functions.

实测诊断

pg_proc.c 报文组明确是 ERROR,使用固定主模板,没有 DETAIL/HINT。

报文模板

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

主消息 function "%s" already exists with same argument types

来源:src/backend/catalog/pg_proc.c @ REL_18_6 · src/backend/catalog/pg_proc.c @ REL_10_23

代表案例

运行器创建 duplicate_function(integer),重复签名,再有意 CREATE OR REPLACE 并验证返回 2

CREATE FUNCTION syntax_schema.duplicate_function(integer) RETURNS integer LANGUAGE SQL AS 'SELECT $1';
CREATE FUNCTION syntax_schema.duplicate_function(integer) RETURNS integer LANGUAGE SQL AS 'SELECT $1';
CREATE OR REPLACE FUNCTION syntax_schema.duplicate_function(integer) RETURNS integer LANGUAGE SQL AS 'SELECT $1 + 1';
SELECT syntax_schema.duplicate_function(1);

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

版本

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

来源

证据

断言

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

  • 42723 is the duplicate_function 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 duplicate_function_signature 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/catalog/pg_proc.c · src/backend/catalog/pg_proc.c

  • The selected duplicate_function_signature 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/42723/cases.json · verify/cases/42723/snippets.json

  • The locked catalogue records 42723 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 duplicate_function_signature
pg10 10.21 (Debian 10.21-1.pgdg90+1) passed duplicate_function_signature

同类错误代码

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