Incident brief
Duplicate prepared statement
Preparing a statement with a name that is already prepared in the session raises this error; prepared-statement names must be unique per session.
What lands in your log
ERROR: prepared statement "dup_ps" already exists
In 10 seconds
- What triggers it
- PREPARE a statement under a given name.
- Fix
- Use a unique name, or DEALLOCATE the existing statement before re-preparing it.
- Proof
- Reproduced on PostgreSQL 18.4 → The reproduction prepares a name, then prepares it again: the second PREPARE raises SQLSTATE 42P05.
Fix
What to do right now
Application-level steps for this error.
- Use a unique name, or DEALLOCATE the existing statement before re-preparing it.
- In drivers and pools, let the driver manage prepared-statement names or DEALLOCATE ALL on connection reset.
-- Prepare each statement name once per session.
PREPARE dup_ps AS SELECT 1;For this error
See this error live on the server
Run these against the affected instance to confirm the diagnosis before you act.
Duplicate prepared statement is session-local. Inspect pg_prepared_statements on the same pool connection and fix statement lifecycle/name reuse.
Prepared statements in this session
List name, parameter types, origin, and SQL text.
SELECT name, parameter_types, from_sql, prepare_time, statement
FROM pg_prepared_statements
ORDER BY prepare_time;Why it happens
What PostgreSQL is telling you
The mechanism behind the error, grounded in the official manual, not paraphrased.
PostgreSQL 18 Documentation, Appendix A. PostgreSQL Error Codes (Table A.1, Class 42, Syntax Error or Access Rule Violation)
42P05 → duplicate_prepared_statementRead the full section on postgresql.org →
Preparing a name that already exists
The name 'dup_ps' was already prepared in this session, so the second PREPARE raises 'prepared statement dup_ps already exists'.The session continues normally
PREPARE failed as a standalone statement, so session B's next query runs normally with no ROLLBACK needed.Reproduce & verify
A real, single-session PostgreSQL reproduction
A literal transcript of SQL run against a live PostgreSQL instance in an isolated lab. The commands below are exactly what was executed.
- 1PREPARE a statement under a given name.
- 2PREPARE another statement under the same name in the same session.
- 3The second PREPARE aborts with SQLSTATE 42P05: 'prepared statement already exists'.
A pooled connection re-prepared the same named statement it had prepared earlier and collided on the name.
-- The error is self-contained in one statement; no schema is required.
SELECT 'no schema needed' AS setup_note;PREPARE dup_ps AS SELECT 1;
PREPARE dup_ps AS SELECT 2;SELECT 'ok' AS session_after_error;What PostgreSQL actually returned
setup_note
------------------
no schema needed
(1 row)PREPARE
ERROR: prepared statement "dup_ps" already exists session_after_error
---------------------
ok
(1 row)A single PREPARE of the name succeeds without collision.
Without this
Before: re-preparing the name collides
With this, tested
After: one PREPARE succeeds
- A second operational test: exact SQL, raw output, measured result, and engineer notes
Card required. Cancel before day 7 and you are not charged.
Runbook to fix this
The runbook for this incident
Full step-by-step fixes for the condition behind this error: the diagnosis, the exact SQL, and output captured in the lab.
Connected
Everything this error touches
Every page this SQLSTATE connects to: the concept that explains it, the runbooks that fix it, the parameters you tune to prevent it, and the sibling errors it travels with. All real cross-references. Jump straight in, or open the full interactive map.
Fix it — runbooks
Related errors
Verification
- Last verified
- 2026-07-24 (isolated lab, PostgreSQL 18.4)
- Verification scope
- Verified against PostgreSQL 18.4 in an isolated lab environment
- Audit status
- reviewed
Went further?
Pro unlocks the second lab proof
Free page stops the bleeding. Pro adds the operational test, SQLSTATE audit, and deeper evidence, same error, more certainty.