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

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

百科 / 错误代码 / Class 22 数据异常

2200C invalid_use_of_escape_character

ERROR 源码确认 参考 未实测

类别
Class 22 数据异常
严重等级
ERROR
条件名
invalid_use_of_escape_character
宏名称
ERRCODE_INVALID_USE_OF_ESCAPE_CHARACTER
启用版本
7.4
状态
活跃

版本覆盖

速览

检查完整报文和实际 SQL SIMILAR TO 模式;18.6 的 regexp.c 路径会在翻译阶段报告 SQL regular expression may not contain more than two escape-double-quote separators。这里针对的是 SQL 到 POSIX 正则的翻译语法,不是一般 POSIX 反斜杠转义。

含义

本条件属于数据异常族,表示 PostgreSQL 将 SQL SIMILAR TO 模式翻译为 POSIX 正则形式时拒绝了转义结构。similar_escape_internal 在方括号表达式之外把带转义的双引号视为 SQL SUBSTRING 三段之间的分隔符;第三个分隔符会被拒绝。同一 helper 也服务于 SIMILAR TO 翻译,在普通匹配中这些分隔符不改变匹配行为。

报文

已确认的 guard 以 ERROR 严重性报告 primary:SQL regular expression may not contain more than two escape-double-quote separators;该分支没有独立 DETAIL 或 HINT。无效 ESCAPE 字符串属于其他 SQLSTATE 路径,应保留实际报文和代码。

报文模板

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

主消息 SQL regular expression may not contain more than two escape-double-quote separators

来源:src/backend/utils/adt/regexp.c @ REL_18_6

诊断

这是解析器和输入的问题,应分别检查 SQL 字符串层、SIMILAR TO 模式和 ESCAPE 字符。统计方括号表达式之外的转义双引号分隔符,并确认操作是 SIMILAR TO 还是 SUBSTRING ... SIMILAR;不能把正则中的每个反斜杠都诊断为 2200C。

处理

按预期的 SIMILAR TO/SUBSTRING 语义修正 SQL 模式或 ESCAPE 表示,确认分隔符数量后再执行;不要无条件增删 POSIX 反斜杠。

该分支抛出 ERROR 时,显式事务应先用 ROLLBACK 恢复,或对语句前已建立的保存点执行 ROLLBACK TO SAVEPOINT,再重试;自动提交下只在失败语句结束后重试修正后的动作。事务边界规则见事务与重试指南。

版本

锁定目录从 7.4 起记录该条件;固定源码覆盖 PostgreSQL 18.6。

来源

证据

断言

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

  • 2200C is invalid_use_of_escape_character in SQLSTATE Class 22.

    核实方式Read fixed definition.

    来源src/backend/utils/errcodes.txt

  • The SQL SIMILAR TO translation helper similar_escape_internal treats an escaped double quote outside a bracket as a separator for the SQL SUBSTRING pattern parts; the third such separator raises 2200C. This is not a generic POSIX regular-expression backslash rule.

    核实方式Read the afterescape/nquotes guard and surrounding parser context.

    不覆盖The rule concerns this escape-double-quote syntax, not every backslash in a regex.

    来源src/backend/utils/adt/regexp.c

  • The locked catalogue records 2200C from 7.4 without proving an exact implementation introduction date.

    核实方式Use catalogue boundary.

    来源src/backend/utils/errcodes.txt

同类错误代码

Class 22 数据异常 下的其他成员。