2200M — invalid_xml_document
2200M
速览
该目录成员表示 XML 文档无效。PostgreSQL 18.6 的核心 xml_parse 文档分支会报告 invalid XML document,而 contrib/xml2 的 XSLT 路径在源文档或样式表解析失败时也使用同一 SQLSTATE。这些发出点不同于 2200L 的文档选项包装器。
| 字段 | 值 |
|---|---|
| SQLSTATE | 2200M |
| 条件名 | invalid_xml_document |
| 状态 | 有效 |
| 已知存在于 | 8.3.0 |
| 锁定快照 | 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_INVALID_XML_DOCUMENT |
| 别名 | — |
含义
本成员来自具体的文档解析 guard,表示 XML 文档无效。在核心 xml_parse 中,xmlCtxtReadDoc 解析失败且原始 XML 选项为 DOCUMENT 时报告 2200M;原始选项为 CONTENT 时,同一解析失败报告 2200N。独立的 contrib/xml2 函数在把输入文档或样式表作为 XML 解析失败时使用 2200M。核心 xml_errsave 会把这些结果交给 errsave:传入 ErrorSaveContext 时保存错误并正常返回,普通上下文则抛出错误;这条软错误路径不同于 contrib/xml2 直接抛出 ERROR 的分支。
报文
核心分支以 ERROR 报告 primary:invalid XML document。contrib/xml2 分支以 ERROR 报告 primary:error parsing XML document 或 error parsing stylesheet as XML document。引用分支没有固定 DETAIL 或 HINT 模板;libxml2 上下文可能动态附加。不要把这些报文替换成 2200L 的 not an XML document。
诊断
结合实际 SQLSTATE、message、detail 和 context,区分文档级失败与内容(2200N)、注释(2200S)或处理指令(2200T)错误。检查产生报文的是核心 xml_parse 还是 contrib/xml2,再修正报文指向的文档或样式表。本页已确认这些源码发出路径,但未运行自然案例。
处理
根据实际报文和解析器上下文修正无效文档;未确认实际 SQLSTATE 前不要套用 2200L 的处理。
该分支抛出 ERROR 时,显式事务应先用 ROLLBACK 恢复,或对语句前已建立的保存点执行 ROLLBACK TO SAVEPOINT,再重试;自动提交下只在失败语句结束后重试修正后的动作。事务边界规则见事务与重试指南。
版本
锁定目录从 8.3.0 起记录该条件;固定源码覆盖 PostgreSQL 18.6。
相关
来源
核心固定源码:src/backend/utils/adt/xml.c#L1780-1862。独立的 contrib/xml2/xslt_proc.c#L84-100 路径解析 XML 文档和样式表。共享的 xml_errsave/errsave helper定义软错误与普通抛错的行为。结构化证据记录保留两个发出点、报文角色和范围边界。核心路径依赖 USE_LIBXML;本页未运行自然 XML 案例。