PostgreSQL Error 42883: Undefined Function
PostgreSQL error code 42883 (undefined_function) occurs when the database engine cannot find a function matching the name and argument data types provided in your query. This happens not only when the function simply doesn't exist, but also when the function exists under a different schema or with a different argument type signature than what was called.
Top 3 Causes and Fixes
1. Argument Data Type Mismatch
PostgreSQL supports function overloading, meaning my_func(integer) and my_func(text) are treated as completely different functions. If you call a function with the wrong argument type, PostgreSQL raises 42883 even if a function with that name exists.
-- This causes ERROR 42883 if my_function only accepts INTEGER
SELECT my_function('123');
-- Fix: explicitly cast the argument
SELECT my_function('123'::INTEGER);
SELECT my_function(CAST('123' AS INTEGER));
-- Check existing function signatures
SELECT
proname AS function_name,
pg_get_function_arguments(oid) AS arguments,
pg_get_function_result(oid) AS return_type
FROM pg_proc
WHERE proname = 'my_function';
2. Function Exists in a Different Schema / search_path Issue
If a function is defined in a schema not included in your search_path, PostgreSQL will not find it and will throw 42883. This is a common issue after deployments where functions are created in custom schemas like util or app.
-- Check current search_path
SHOW search_path;
-- Add the schema to search_path for the session
SET search_path TO public, util, app;
-- Or call the function with explicit schema prefix
SELECT util.my_function(123);
-- Make the change permanent at the database level
ALTER DATABASE mydb SET search_path TO public, util, app;
-- Find which schema contains your function
SELECT n.nspname AS schema, p.proname AS function_name
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE p.proname = 'my_function';
3. Missing Extension or Typo in Function Name
Many commonly used functions such as uuid_generate_v4(), trigram functions, or PostGIS functions require a specific extension to be installed. Calling them without the extension installed will trigger 42883. Simple typos in function names produce the exact same error.
-- Check installed extensions
SELECT name, installed_version
FROM pg_available_extensions
WHERE installed_version IS NOT NULL;
-- Install the uuid-ossp extension before using uuid functions
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
SELECT uuid_generate_v4(); -- Now works
-- Install pg_trgm for similarity search functions
CREATE EXTENSION IF NOT EXISTS pg_trgm;
-- Search for similarly named functions to catch typos
SELECT proname
FROM pg_proc
WHERE proname ILIKE '%substr%'
ORDER BY proname;
Quick Fix Checklist
-
Verify the function exists using
\df function_namein psql or querypg_proc. - Check argument types — make sure you pass the exact types the function signature expects.
-
Use explicit casting with
::typeorCAST()to avoid implicit type resolution failures. -
Inspect your
search_pathand confirm the function's schema is included. - Install required extensions before calling extension-provided functions.
Prevention Tips
- Standardize explicit type casting in your codebase as a team convention. Never rely on implicit casting when calling functions — this prevents hard-to-debug 42883 errors after schema or version changes.
- Add function validation to your CI/CD pipeline. Before deploying, run a pre-flight SQL check to confirm all required functions exist with the correct signatures in the target database.
-- Pre-deployment validation example
SELECT
func_name,
EXISTS (
SELECT 1 FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE p.proname = func_name
AND n.nspname = 'public'
) AS is_present
FROM (VALUES ('calculate_tax'), ('get_user_data'), ('send_notification'))
AS t(func_name);
Related Errors
- 42P01 (undefined_table) — Referenced table does not exist; same class of missing-object errors.
- 42703 (undefined_column) — Column referenced in a query does not exist.
- 42725 (ambiguous_function) — The opposite of 42883: multiple functions match the call, and PostgreSQL cannot decide which one to use. Resolve with explicit casting.
📖 Want a more detailed guide?
Check out the full in-depth version (Korean) on oraerror.com — includes detailed analysis, additional SQL examples, and prevention tips.
Top comments (0)