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

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

百科 / 错误代码 / Class 58 系统错误

58P03 file_name_too_long

ERROR 源码确认 详解 未实测

类别
Class 58 系统错误
严重等级
ERROR
条件名
file_name_too_long
宏名称
ERRCODE_FILE_NAME_TOO_LONG
启用版本
18
状态
活跃

版本覆盖

  1. 18
  2. 17
  3. 16
  4. 15
  5. 14
  1. 13
  2. 12
  3. 11
  4. 10
  1. 19 beta
  2. 20 dev

速览

58P03 由 PostgreSQL 文件访问 errno 辅助函数在保存的 OS errno 为 ENAMETOOLONG 时选择。它不是固定的 file name too long 主消息;调用者提供带 %m 的消息,辅助函数提供 SQLSTATE。

含义

errcode_for_file_access()ENAMETOOLONG 映射为 ERRCODE_FILE_NAME_TOO_LONG。同一完整 switch 还把 ENOENT 映射为 58P01EEXIST 映射为 58P02ENOSPC 映射为 53100EIO 映射为 58030,其他 errno 可能落到别的代码。辅助函数明确要求调用者的主消息保留 %m,所以 OS 文本和 locale(区域设置)是诊断的一部分。

18.6 固定后端调用者包括 base backup 的 could not access directory "%s": %m 和表空间的 could not set permissions on directory "%s": %m;两者先以 ERROR 发出,再由辅助函数选择代码。这说明实际操作上下文很重要:同一 SQLSTATE 可以来自不同文件操作,其他调用者的文件名过长也可能使用不同主消息模板。

消息

  • ERROR,base backup 代表主消息:could not access directory "%s": %m
  • ERROR,表空间代表主消息:could not set permissions on directory "%s": %m
  • %m 展开为保存的 OS 错误文本;若 errno 是 ENAMETOOLONGerrcode_for_file_access() 提供 SQLSTATE 58P03

本次核验没有找到脱离调用者的固定 58P03 主消息。不要把 %m 换成臆造的英文句子,也不要仅凭条件名推断扩展报文。

报文模板

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

主消息 could not access directory "%s": %m

来源:src/backend/backup/basebackup_server.c @ REL_18_6

主消息 could not set permissions on directory "%s": %m

来源:src/backend/commands/tablespace.c @ REL_18_6

诊断

保留完整主消息/详细信息/上下文、操作和组件、完整路径、OS errno、文件系统限制、编码及 PostgreSQL 对象名映射。区分文件系统组件长度限制与 PostgreSQL 标识符限制,也要区分辅助函数的 ENAMETOOLONG 分支和 ENOENTEEXIST、磁盘满、I/O 分支。固定源码确认的是辅助函数与代表调用者,不声称在特定主机自然复现。

处理

使用组件和文件系统接受的路径/名称,或移动目标并保留持久映射。客户端 ERROR 若发生在显式事务中,继续执行前必须 ROLLBACK 或回到已有保存点;修正路径后重试受影响操作,不要继续发送无关语句。启动/后台调用可能没有客户端事务;后端已终止时使用新连接。上报时保留原始 OS 详细信息。

版本

锁定目录从 18.0 记录 58P03;固定辅助函数与调用者来自 PostgreSQL 18.6。本页仅源码复核,没有自然运行声明。

来源

证据

断言

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

同类错误代码

Class 58 系统错误 下的其他成员。