↑↓ select↵ open⌫ change scopeOpen full search

PG.CENTER connects PostgreSQL documentation, reference, and ecosystem knowledge. Maintained by Pigsty.

Wiki / SQLSTATE

25008 — held_cursor_requires_same_isolation_level

25008 is reserved for a held cursor whose transaction isolation level is not compatible with the required operation. The fixed PostgreSQL 18.6 core scan has no direct report group for it.

English manual coverage begins with PostgreSQL 8.1. Source history and runtime observations have their own recorded version boundaries.

Reading PG 18·Select a recorded version

aliases
Unknown
class name
Invalid Transaction State
condition name
held_cursor_requires_same_isolation_level
lang
en
sqlstate
25008

Definition PG 18

25008 — held_cursor_requires_same_isolation_level

At a glance {#at-a-glance}

25008 is reserved for a held cursor whose transaction isolation level is not compatible with the required operation. The fixed PostgreSQL 18.6 core scan has no direct report group for it.

Meaning {#meaning}

This is narrower than 24000 invalid cursor state and unrelated to the general 40001 serialization retry path. A cursor being held across transactions does not by itself prove that 25008 was emitted.

Diagnosis {#diagnosis}

Capture the cursor declaration, holdability, isolation level of both transactions, and exact SQLSTATE from the actual reporting implementation. This fixed evidence provides no message template or copyable SQL trigger.

Response {#response}

Keep the cursor and consuming transaction at a compatible isolation level, or close and re-declare it according to the API contract. Do not substitute a 24000 repair or a generic rollback without the actual state.

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 · case export

Versions and limits {#versions}

The generated facts record the locked catalogue membership. The selected latest and PG10 cases intentionally remain source-only and not_applicable.

Related {#related}

24000 invalid cursor state, 25004 branch transaction isolation, 40001 serialization failure.

Sources {#sources}

  • src.errcodes.18.6 (SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba)
  • src.calls.REL_18_6 — raw/calls/REL_18_6.jsonl (SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf)

Compare versions

SQLSTATE evidence and recorded runtime versions

cases · held_cursor_isolation_boundary
{
  "assertions": [
    "No fabricated SQL trigger is included; the selected run records a definition/source boundary."
  ],
  "case_id": "held_cursor_isolation_boundary",
  "cleanup": "Drop the case schema with an owner connection.",
  "has_snippet": false,
  "position": 0,
  "preconditions": [
    "A runner-owned disposable target is provisioned."
  ],
  "repair": "Follow the explicit transaction or source boundary described by the case.",
  "trigger": "Source/definition evidence only; no natural SQL trigger is claimed.",
  "versions": [
    "10",
    "18"
  ]
}
claims · identity
{
  "claim_id": "identity",
  "limits": "The condition is about a held cursor and transaction isolation, not every cursor-state error.",
  "method": "Read the fixed condition row and macro.",
  "position": 0,
  "runtime": [],
  "sources": [
    "src.errcodes.18.6"
  ],
  "statement": "25008 is held_cursor_requires_same_isolation_level in Class 25."
}
claims · source-boundary
{
  "claim_id": "source-boundary",
  "limits": "Do not replace this boundary with 24000 or a fabricated cursor error.",
  "method": "Scan fixed source call records for SQLSTATE 25008.",
  "position": 1,
  "runtime": [],
  "sources": [
    "src.calls.REL_18_6"
  ],
  "statement": "The exhaustive resolved PostgreSQL 18.6 call scan contains no direct 25008 report group; no natural SQL reproduction or message template is claimed."
}
runtimes · runtime.25008-batch2-latest-20260909.latest · 18.6 (Homebrew) · not_applicable
{
  "cases": [
    "held_cursor_isolation_boundary"
  ],
  "limits": "",
  "position": 0,
  "raw": {
    "case_manifest": {
      "path": "verify/cases/25008/cases.json",
      "sha256": "623ed0ec9b97c61d9929e15882992efb4f1022f0a8efe344f5f478da23483101"
    },
    "case_status": "not_applicable",
    "cases": [
      "held_cursor_isolation_boundary"
    ],
    "id": "runtime.25008-batch2-latest-20260909.latest",
    "observed": {
      "case_status": "not_applicable"
    },
    "raw": "verify/results/25008-batch2-latest-20260909/latest/raw.jsonl",
    "raw_sha256": "0889c37455fdb5ff5ebd30e4e4e3125b07e927bff2cdf85ff042fa45993c6bc1",
    "run_id": "25008-batch2-latest-20260909",
    "server_version": "18.6 (Homebrew)",
    "server_version_num": 180006,
    "status": "not_applicable",
    "summary": "verify/results/25008-batch2-latest-20260909/latest/summary.json",
    "summary_sha256": "5414fdc3f348658002eb8f411bb9654983e2052d89611ab005702080615e37c7",
    "target": "latest",
    "target_status": "passed"
  },
  "run_id": "25008-batch2-latest-20260909",
  "runtime_id": "runtime.25008-batch2-latest-20260909.latest",
  "server_version": "18.6 (Homebrew)",
  "status": "not_applicable",
  "target": "latest"
}
runtimes · runtime.25008-batch2-pg10-20260909.pg10 · 10.21 (Debian 10.21-1.pgdg90+1) · not_applicable
{
  "cases": [
    "held_cursor_isolation_boundary"
  ],
  "limits": "",
  "position": 1,
  "raw": {
    "case_manifest": {
      "path": "verify/cases/25008/cases.json",
      "sha256": "623ed0ec9b97c61d9929e15882992efb4f1022f0a8efe344f5f478da23483101"
    },
    "case_status": "not_applicable",
    "cases": [
      "held_cursor_isolation_boundary"
    ],
    "id": "runtime.25008-batch2-pg10-20260909.pg10",
    "observed": {
      "case_status": "not_applicable"
    },
    "raw": "verify/results/25008-batch2-pg10-20260909/pg10/raw.jsonl",
    "raw_sha256": "9ec5edb1763265af64f67283d68eeaa0afff4023dda4686ecaf04dc3e5178726",
    "run_id": "25008-batch2-pg10-20260909",
    "server_version": "10.21 (Debian 10.21-1.pgdg90+1)",
    "server_version_num": 100021,
    "status": "not_applicable",
    "summary": "verify/results/25008-batch2-pg10-20260909/pg10/summary.json",
    "summary_sha256": "6bcfef17630470c294b892e305ffc58315f3e7653189d5bfdfc670e1e8988950",
    "target": "pg10",
    "target_status": "passed"
  },
  "run_id": "25008-batch2-pg10-20260909",
  "runtime_id": "runtime.25008-batch2-pg10-20260909.pg10",
  "server_version": "10.21 (Debian 10.21-1.pgdg90+1)",
  "status": "not_applicable",
  "target": "pg10"
}
sources · src.errcodes.18.6
{
  "commit": "724edf9bde9d356724ad384a2e196edc3c9f80f7",
  "docs_url": "",
  "kind": "upstream_source",
  "location": "",
  "path": "src/backend/utils/errcodes.txt",
  "position": 0,
  "sha256": "6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba",
  "source_id": "src.errcodes.18.6",
  "tag": "REL_18_6",
  "url": "https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/errcodes.txt"
}
sources · src.calls.REL_18_6
{
  "commit": "",
  "docs_url": "",
  "kind": "local_artifact",
  "location": "",
  "path": "raw/calls/REL_18_6.jsonl",
  "position": 1,
  "sha256": "9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf",
  "source_id": "src.calls.REL_18_6",
  "tag": "",
  "url": ""
}

Source references

Full definition and evidence JSON

Definition sources

center · PostgreSQL 18 · english-manuals:1bf583fc18764278da22f53f3be26fff40f092f973b68d83bf38cd80c1770b51

Text language: en · english-manuals:1bf583fc18764278da22f53f3be26fff40f092f973b68d83bf38cd80c1770b51