# 25003 — inappropriate_access_mode_for_branch_transaction

> PostgreSQL SQLSTATE 25003: the branch-transaction access-mode condition, with a conservative source boundary.
---

# 25003 — inappropriate_access_mode_for_branch_transaction

## At a glance {#at-a-glance}

`25003` is the SQLSTATE name for an inappropriate access mode in a branch transaction. The fixed PostgreSQL 18.6 core scan resolves no direct report site, so this entry documents the definition boundary without inventing an ordinary SQL trigger.

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

| Field | Value |
| --- | --- |
| SQLSTATE | `25003` |
| Condition | `inappropriate_access_mode_for_branch_transaction` |
| Status | `active` |
| Known present by | `7.4` |
| Locked snapshots | `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` |
| Macros | `ERRCODE_INAPPROPRIATE_ACCESS_MODE_FOR_BRANCH_TRANSACTION` |
| Aliases | `—` |

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

## Meaning {#meaning}

The condition name belongs to Class 25 and describes branch-transaction management. It should not be used as a synonym for `25006` read-only SQL transactions, `25P01` missing transaction blocks, or an application-defined exception.

## Diagnosis {#diagnosis}

When this code is reported by a branch-transaction API, retain the exact SQLSTATE, API operation, access mode, and transaction context. The current fixed core evidence does not provide a server message template or a safe SQL reproduction.

## Response {#response}

Inspect the branch-transaction API contract and correct its access-mode choice before retrying. Do not replace the missing path with `RAISE`, and do not retry a regular read-only statement under this code.

## Source message and runtime boundary {#messages}

The fixed `errcodes.txt` row defines the condition and macro; the resolved call scan in `raw/calls/REL_18_6.jsonl` contains no direct report group, so this batch publishes no message template and constructs no natural SQL trigger.

## Applicability boundary and case {#case}

The selected runner cases on PostgreSQL 18.6 and 10.21 are `not_applicable`; they record the source boundary and contain no copyable SQL trigger. [Structured evidence](../data/evidence/25003.json) · [case export](../data/cases/25003.json)

## Versions and limits {#versions}

The locked catalogue records the condition by the generated `known present by` boundary and in the listed snapshots. Runtime status is deliberately not applicable: both selected runner targets record the source-only boundary, not a passed natural trigger.

## Related {#related}

[25004 branch transaction isolation mode](../25004/), [25006 read-only SQL transaction](../25006/), [25P01 no active SQL transaction](../25p01/).

## Sources {#sources}

- [`src.errcodes.18.6`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/errcodes.txt) (SHA-256 `6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba`)
- `src.calls.REL_18_6` — `raw/calls/REL_18_6.jsonl` (SHA-256 `9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf`)
