# 2201B — invalid_regular_expression

> PostgreSQL SQLSTATE 2201B 的来源与诊断参考。
---

## 速览 {#at-a-glance}
SQL 正则编译和执行有不同的 `2201B` 路径，HBA/ident 配置处理则复用本码并按日志级别报告。必须按归属分别读取固定报文和严重级别，不能合并成一个笼统的正则失败。

<!-- BEGIN SQLSTATE FACTS: generated by scripts/generate.py; do not edit -->

| 字段 | 值 |
| --- | --- |
| SQLSTATE | `2201B` |
| 条件名 | `invalid_regular_expression` |
| 状态 | `有效` |
| 已知存在于 | `7.4` |
| 锁定快照 | `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_REGULAR_EXPRESSION` |
| 别名 | `—` |

<!-- source facts: data/errcodes/2201B.json -->
<!-- END SQLSTATE FACTS -->

## 含义 {#meaning}
在 `regexp.c` 中，无法编译的模式以 `ERROR` 报告 `invalid regular expression: %s`；已经编译的模式若执行返回正则引擎错误，则以 `ERROR` 报告 `regular expression failed: %s`。`REG_NOMATCH` 是正常的不匹配结果，不是本 SQLSTATE。在 `hba.c` 中，配置正则编译使用 `invalid regular expression "%s": %s`，严重级别由调用方提供（正常的 `load_hba` 路径传入 `LOG`）；ident 映射的匹配或反向引用失败也有各自的日志 primary。这些配置报文不是 SQL 表达式的 `ERROR` 路径。

## 诊断 {#diagnosis}
结合完整 primary、严重级别和上下文确认归属。对 SQL 正则函数，检查模式和 flags，区分编译错误与执行错误。对 HBA 或 ident 配置，检查报文指出的文件、行号、token 的前导斜杠标记及其后交给编译器的正则文本，以及重载/启动上下文；重载时记录的配置失败可能保留旧的 HBA 配置。不要把正常的 `REG_NOMATCH` 当作语法无效。

## 处理 {#response}
按所属语法修正模式或 flags，并在同一子系统中验证。SQL 正则 `ERROR` 会中止当前语句，因此显式事务需先 `ROLLBACK` 或回到已有保存点再重试，自动提交只重试修正后的语句。配置 `LOG`/debug 报文需要修正 HBA 或 ident 文件并按该子系统重载或重启，不是回滚事务。

## 报文 {#messages}
- SQL 正则编译，`ERROR`：`invalid regular expression: %s`。
- SQL 正则执行错误，`ERROR`：`regular expression failed: %s`。
- HBA 正则编译，调用方选择的级别（正常 `load_hba` 路径使用 `LOG`）：`invalid regular expression "%s": %s`；源码还附加配置文件行上下文。
- HBA ident 映射执行，`LOG`：`regular expression match for "%s" failed: %s`。
- HBA ident 反向引用没有捕获子表达式，`LOG`：`regular expression "%s" has no subexpressions as requested by backreference in "%s"`。

## 版本 {#versions}
锁定目录从 7.4 起记录该条件；固定源码覆盖 PostgreSQL 18.6。引用的 SQL 正则和 HBA/ident 路径属于不同归属；扩展或其他子系统的报文不在本次有限审阅范围内。

## 相关 {#related}
[`2200C`](../2200c/)、[`2200D`](../2200d/)

## 来源 {#sources}
- [`src/backend/utils/adt/regexp.c#L204-L224`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/regexp.c#L204-L224) 包含 SQL 正则编译 `ERROR`；[`#L285-L305`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/regexp.c#L285-L305) 和 [`#L2050-L2070`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/regexp.c#L2050-L2070) 包含执行错误变体。
- [`src/backend/libpq/hba.c#L298-L340`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/libpq/hba.c#L298-L340) 包含调用方选择 `elevel` 的 HBA 正则编译；[`#L2635-L2683`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/libpq/hba.c#L2635-L2683) 展示 `load_hba` 传入 `LOG`；[`#L2835-L2864`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/libpq/hba.c#L2835-L2864) 和 [`#L2880-L2887`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/libpq/hba.c#L2880-L2887) 包含 ident 映射的独立 `LOG` 报文。

运行核验为 `not_run`；本页不宣称正则运行观察。结构化[证据记录](../../data/evidence/2201b.json)保留按归属区分的报文、严重级别和源码限制。
