# 0A000 — 不支持的功能（feature_not_supported）

> PostgreSQL SQLSTATE 0A000（不支持的功能，feature_not_supported）的源码证据、诊断与处理参考。
---

# 0A000 — 不支持的功能

## 速览 {#at-a-glance}

SQLSTATE `0A000` 是 Class `0A` 中的 **feature_not_supported**。`0A000` 表示服务器识别了功能或选项，但当前上下文不支持。选定 hash 索引路径请求 `id ASC`，得到 `access method "hash" does not support ASC/DESC options`，去掉排序后同一索引成功。这是访问方法能力判断，不是 42501 权限不足或 42601 解析失败。

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

| 字段 | 值 |
| --- | --- |
| SQLSTATE | `0A000` |
| 条件名 | `feature_not_supported` |
| 状态 | `有效` |
| 已知存在于 | `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_FEATURE_NOT_SUPPORTED` |
| 别名 | `—` |

<!-- source facts: data/errcodes/0A000.json -->
<!-- END SQLSTATE FACTS -->

## 含义 {#meaning}

选定的 `ComputeIndexAttrs` 路径拒绝 hash 访问方法的排序选项，尽管索引请求本身语法有效。关键区别是能力限制与语法错误：`id ASC` 能到达访问方法检查并产生确切 ERROR，而去掉排序后的同一键可以接受。

这是所选访问方法的属性，不是列类型或表内容的属性。命令解析器已经接受索引定义，随后 `ComputeIndexAttrs` 检查该访问方法能否满足排序要求；本路径中的 hash 索引不支持这个选项，而 btree 等访问方法可以有不同能力。其他 `0A000` producer 可能拒绝不同功能，因此必须结合完整主报文和命令上下文判断。

## 诊断 {#diagnosis}

记录完整主报文，确认访问方法、选项、命令上下文和版本。错误语句后自动提交会话保持 `IDLE`；通过 `pg_index.indisvalid` 确认修复索引有效。其他 0A000 路径可能有不同对象和恢复行为。

先核对对象名称再解释结果。案例中前面的表和索引都未限定 schema，依赖 `search_path`；最后 `regclass` 查询中的 `feature_schema.hash_index` 只是实际索引的 schema-qualified 占位值。确认这些名称指向刚创建的对象，再把访问方法和选项与其能力进行比较。权限错误（`42501`）或解析错误（`42601`）应走不同诊断分支。

## 处理 {#response}

只移除或替换不支持的选项，或选择支持该选项的访问方法，并核对最终对象语义。不要把所有 0A000 都当成升级要求，也不要静默丢弃用户请求的功能。

选定自动提交案例中的 `ERROR` 后，可以在同一会话继续执行修正后的 `CREATE INDEX`。显式事务中应先用 `ROLLBACK` 或有意建立的保存点恢复本地事务，再执行无关 DDL；恢复后要用满足原始语义要求的访问方法和选项重建索引。不要假定替代索引仍然提供被拒绝定义所要求的排序保证。

## 实测诊断 {#messages}

固定的索引命令路径以 `ERROR` 发出主报文 `access method "%s" does not support ASC/DESC options`，其中访问方法名称是动态值。这是选定的 hash 索引变体；其他不支持的功能可能使用不同 0A000 报文和恢复边界。

选定分支中的动态值为 `hash`，服务器没有固定 DETAIL 或 HINT。运行在自动提交会话中观察到错误后状态为 `IDLE`；这不是所有 `0A000` producer 的通用属性，也不能推广到同一命令位于显式事务中的情形。

## 代表案例 {#case}

<!-- BEGIN SQLSTATE SNIPPET: hash_index_feature -->

此 SQL 块创建表，尝试不支持排序选项的 hash 索引，创建修复后的索引，并检查 `pg_index.indisvalid`。

最后 `regclass` 查询中的 `feature_schema.hash_index` 是占位写法，应替换为前面实际创建的、带 schema 的关系。前面三条语句使用未限定的 `feature_table` 和 `hash_index`，依赖当前 `search_path`；手工执行时应有意设置该路径，或把表和索引创建在验证查询所写的 schema 中并使用一致的限定名。

```sql
CREATE TABLE feature_table (id integer NOT NULL, payload text);
CREATE INDEX hash_index ON feature_table USING hash (id ASC);
CREATE INDEX hash_index ON feature_table USING hash (id);
SELECT indisvalid FROM pg_index WHERE indexrelid = 'feature_schema.hash_index'::regclass;
```

<!-- END SQLSTATE SNIPPET -->

18.6 运行记录 SQLSTATE 为 `0A000`，主报文 `access method "hash" does not support ASC/DESC options`；断言的错误后状态为 `IDLE`，随后探针/修复成功。18.6 与 10.21 的断言和清理均通过。

可下载的案例与证据投影分别是 [`0A000 案例 JSON`](../../data/cases/0a000.json) 和 [`作者证据`](../../data/evidence/0a000.json)。运行器清单为 `verify/cases/0A000/cases.json`；发布前会将页面 SQL 与共享注册表比对。

## 版本 {#versions}

上面的生成事实表记录锁定的目录快照和最早观察到的定义。本页自然运行范围是 PostgreSQL 18.6 与 10.21，不能据此推断所有中间版本的行为。

## 相关 {#related}

- [`0LP01` — invalid_grant_operation](../0lp01/)
- [`25006` — 相关条件](../25006/)

## 来源 {#sources}

- `src.indexcmds-asc-desc.18.6` — `src/backend/commands/indexcmds.c` at `REL_18_6` commit `724edf9bde9d356724ad384a2e196edc3c9f80f7`; fixed blob SHA-256 `0bdae365f207ab82865806c5983cac94c5c062e7a61ab7c883ccb7e2015fad36` ([source](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/commands/indexcmds.c#L2244-L2247)).
- `src.indexcmds-asc-desc.10.23` — `src/backend/commands/indexcmds.c` at `REL_10_23` commit `02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4`; fixed blob SHA-256 `97766ba385fea1ba642e5b077fd5ce7cbb9f9faff177bcece0de2fc3e2904b23` ([source](https://github.com/postgres/postgres/blob/02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4/src/backend/commands/indexcmds.c#L1403-L1406)).
- `src.calls.REL_18_6` / `src.calls.REL_10_23` — fixed local call scans, SHA-256 `9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf` / `00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c`; these scans preserve the resolved call context used by the claims.
