# 25005 — no_active_sql_transaction_for_branch_transaction

> PostgreSQL SQLSTATE 25005: the branch-transaction no-active-transaction condition and its source-only boundary.
---

# 25005 — no_active_sql_transaction_for_branch_transaction

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

`25005` is the branch-transaction form of a no-active-SQL-transaction condition. It is distinct from `25P01`, and the fixed PostgreSQL 18.6 core scan does not resolve a natural server call site.

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

| Field | Value |
| --- | --- |
| SQLSTATE | `25005` |
| Condition | `no_active_sql_transaction_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_NO_ACTIVE_SQL_TRANSACTION_FOR_BRANCH_TRANSACTION` |
| Aliases | `—` |

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

## Meaning {#meaning}

The code belongs to the branch-transaction family. A normal `SAVEPOINT` outside `BEGIN` is the `25P01` path demonstrated elsewhere; it must not be relabeled as `25005`.

## Diagnosis {#diagnosis}

Capture the branch API operation and whether it had an active branch transaction. With no resolved core message in the fixed scan, the exact server text must come from the reporting implementation that actually emitted the code.

## Response {#response}

End or start the branch transaction according to that API’s contract. Do not send a generic rollback recipe based on the name alone, and do not fabricate a PL/pgSQL reproduction.

## 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/25005.json) · [case export](../data/cases/25005.json)

## Versions and limits {#versions}

The locked catalogue contains the generated historical membership facts. The selected latest and PG10 cases are both explicit source-only boundaries and are not natural runtime passes.

## Related {#related}

[25P01 no active SQL transaction](../25p01/), [25003 branch transaction access mode](../25003/), [25P02 failed SQL transaction](../25p02/).

## 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`)
