Incident brief
Function does not exist
A function was called with an argument type it doesn't accept. PostgreSQL's overload resolution found no match, rather than silently coercing to something close.
In 10 seconds
- What
- Function does not exist
- What triggers it
- Call a real function using an argument type it doesn't accept.
- The fix
- Cast the argument to a type the function actually accepts.
- Proof
- Reproduced on PostgreSQL 16.14 → Calling length() with an integer argument was rejected with SQLSTATE 42883 and a HINT about explicit casts. The session was unaffected afterward.
The fix
What to do right now
The immediate, application-level response to this error.
- Cast the argument to a type the function actually accepts.
- Check the function's documented signature rather than assuming every type is interchangeable.
- Don't assume a cast like ::text is a universal fix — see the premium test for why the same cast can still fail on a different function.
SELECT length(123::text);Diagnose
See it live on the server
Run these against the affected instance to confirm the diagnosis before you act.
Standard triage — not specific to this error
These are canonical PostgreSQL system-catalog queries, shown as SQL to run. No sample output is attached because this is general triage, not a captured lab transcript.This SQLSTATE does not have an error-specific live snapshot yet. These are the canonical system-catalog queries you run against the affected server to see the problem in real time — standard triage, not a reproduced transcript.
What is running right now
Active backends, how long each has been running, and what it is waiting on.
SELECT pid,
state,
wait_event_type,
wait_event,
now() - query_start AS running_for,
left(query, 80) AS query
FROM pg_stat_activity
WHERE state <> 'idle'
AND pid <> pg_backend_pid()
ORDER BY running_for DESC NULLS LAST;Who is blocking whom
Turn raw blocking PIDs into the actual queries on both sides of the wait.
SELECT blocked.pid AS blocked_pid,
blocked.query AS blocked_query,
blocking.pid AS blocking_pid,
blocking.query AS blocking_query
FROM pg_stat_activity AS blocked
JOIN LATERAL unnest(pg_blocking_pids(blocked.pid)) AS b(pid) ON true
JOIN pg_stat_activity AS blocking ON blocking.pid = b.pid
WHERE cardinality(pg_blocking_pids(blocked.pid)) > 0;Locks that are still waiting
Every lock a backend has requested but not yet been granted.
SELECT l.pid,
l.locktype,
l.mode,
l.granted,
COALESCE(c.relname, l.transactionid::text) AS object
FROM pg_locks l
LEFT JOIN pg_class c ON c.oid = l.relation
WHERE NOT l.granted
ORDER BY l.pid;Why it happens
What PostgreSQL is telling you
The mechanism behind the error, grounded in the official manual — not paraphrased.
PostgreSQL 16 Documentation — §10.1 Overview (Type Conversion)
Since PostgreSQL permits function overloading, the function name alone does not uniquely identify the function to be called; the parser must select the right function based on the data types of the supplied arguments.Read the full section on postgresql.org →
The mismatched function call
length() has no overload accepting integer. PostgreSQL's function resolution found no candidate, per the manual, and reported the exact call it couldn't match.Confirming the session still works
The failed call didn't affect the session — the next statement ran normally.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.
- 1Call a real function using an argument type it doesn't accept.
- 2PostgreSQL's function overload resolution finds no candidate that matches.
- 3SQLSTATE 42883 is reported, naming the exact call signature it looked for, with a HINT about explicit casts.
One client: call a real function (length) with an argument type it doesn't accept.
-- No table needed: the failure is function-overload resolution against a plain literal.
SELECT 'no schema required' AS setup_note;SELECT length(123);SELECT 1 AS session_still_alive;What PostgreSQL actually returned
setup_note
--------------------
no schema required
(1 row)ERROR: function length(integer) does not exist
LINE 1: SELECT length(123);
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. session_still_alive
----------------------
1
(1 row)The HINT's suggested fix — add an explicit type cast — was tested directly against the same call.
Cast the integer argument to text, the type length() actually accepts.
Without this
Above: length(123) has no matching overload.
With this, tested
Below: length(123::text) casts the argument to a type length() actually accepts.
What Pro unlocks here
- The exact prevention SQL — copy-paste ready
- Raw psql output captured from the Docker lab
- A senior-DBA action list to take it further
- Live monitoring queries to catch it in production
- The deeper audit: fix-that-fails counterexample, GUC before/after, server-log evidence
Related & next steps
Follow the thread
Everything this error touches — jump straight to the sibling error, term, runbook, or parameter.
Related errors
Verification
- Last verified
- 2026-07-15 (Docker lab, PostgreSQL 16.14)
- Reviewed by
- Verified against PostgreSQL 16.14 in an isolated lab environment
- Audit status
- reviewed