# 2201E — invalid_argument_for_logarithm

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

# 2201E

## 速览 {#at-a-glance}
对数函数会在定义域守卫处拒绝零值和负值。固定浮点路径报告 `cannot take logarithm of zero` 或 `cannot take logarithm of a negative number`；numeric 的 `ln` 和给定底数的对数路径也使用该 SQLSTATE，但会分别处理 NaN 与无穷值。

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

| 字段 | 值 |
| --- | --- |
| SQLSTATE | `2201E` |
| 条件名 | `invalid_argument_for_logarithm` |
| 状态 | `有效` |
| 已知存在于 | `8.0.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_ARGUMENT_FOR_LOG` |
| 别名 | `—` |

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

## 含义 {#meaning}
2201E 是对数定义域错误，不是一般数值溢出。`float.c` 中 `ln()` 与 `log()` 先拒绝等于零的参数，再拒绝小于零的参数。numeric 的 `ln` 拒绝负无穷但原样返回 numeric NaN 或正无穷；numeric 的给定底数对数拒绝负值或零值输入，而某些正的特殊值组合有定义结果。

## 诊断 {#diagnosis}
先读函数签名和实际数值类型，再定位参数。按首要报文区分零值守卫与负值守卫。浮点 NaN 不满足这两个比较，因此不会进入这条具体守卫；后续浮点溢出或下溢属于其他条件。检查对数定义域是否符合业务意图，不要只为转换而转换。

## 处理 {#response}
提供符合目标对数函数定义域的值，或明确改变业务规则。如果 ERROR 发生在显式事务中，应先 ROLLBACK 或回滚到既有保存点再重试；自动提交客户端可直接重试修正后的语句。单纯 cast 不能使未定义运算变得有定义。

## 版本 {#versions}
锁定目录从 8.0.0 起记录该条件；本页固定源码路径为 PostgreSQL 18.6。未声称本页有自然运行观察。

## 相关 {#related}
[`22003`](../22003/)、[`22012`](../22012/)

## 来源 {#sources}
固定路径包括 [`src/backend/utils/adt/float.c#L1687-1747`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/float.c#L1687) 和 [`src/backend/utils/adt/numeric.c#L3935-4020`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/numeric.c#L3935) 以及 [`#L11156-11168`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/numeric.c#L11156)，绑定零值/负值守卫及特殊值分支。结构化[证据记录](../../data/evidence/2201e.json)保留确切报文角色和范围；本页未运行自然案例。
