# 3B000 — savepoint_exception

> Source-backed reference for PostgreSQL SQLSTATE 3B000, with explicit mechanism boundaries.
---

# 3B000 — savepoint_exception

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

`3B000` is the savepoint-exception class definition. The fixed core call scan resolves the more specific `3B001` missing-savepoint path rather than a separate generic `3B000` throw site. Use the concrete server SQLSTATE when diagnosing a savepoint failure; this entry does not invent a class-level RAISE case.

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

| Field | Value |
| --- | --- |
| SQLSTATE | `3B000` |
| Condition | `savepoint_exception` |
| Status | `active` |
| Known present by | `8.0.0` |
| 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_SAVEPOINT_EXCEPTION` |
| Aliases | `—` |

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

## Meaning {#meaning}

`3B000` is the Class 3B savepoint exception condition. The fixed scan resolves the concrete missing-savepoint code `3B001`, but no separate generic core throw site for the class code. A savepoint name that cannot be found should therefore be diagnosed as the concrete `3B001` path when the server provides it.

## Diagnosis {#diagnosis}

Record the requested savepoint name, whether an explicit transaction exists, and whether the marker was released or belongs to another nested level. Check the server's concrete SQLSTATE before using the class label: `ROLLBACK TO SAVEPOINT` outside a transaction is `25P01`, while a missing marker in an explicit block is represented by `3B001` in the selected sources. This page has no natural runtime case of its own.

## Response {#response}

Use the concrete error to choose the boundary: begin a transaction before creating a savepoint, or roll back the failed explicit block before establishing a new marker. Do not invent a class-level `3B000` retry or use `CASCADE`; keep `3B000` as the definition boundary and follow the [3B001](../3b001/) source-backed path for a missing name.

## Versions {#versions}

The locked facts table records catalogue presence across the project snapshot range. The fixed source evidence is limited to the path stated below; no exact behavioral introduction or broader runtime coverage is inferred from the definition alone.

## Related {#related}

See [3B001 invalid savepoint specification](../3b001/) for the concrete missing-savepoint path.

## 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` fixed call scan (SHA-256 `9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf`)
