PostgreSQL Error HV005: fdw_column_name_not_found
PostgreSQL error HV005 (fdw_column_name_not_found) occurs when the Foreign Data Wrapper (FDW) layer cannot locate a specific column name while trying to map between a local Foreign Table definition and the actual remote data source. This typically surfaces when the remote schema has changed without a corresponding update to the local Foreign Table, causing a mismatch between what PostgreSQL expects and what the remote server provides.
Top 3 Causes
1. Remote Column Renamed or Dropped
The most common cause is a schema change on the remote server — a column was renamed or deleted — while the local Foreign Table definition was left unchanged.
-- Original Foreign Table created with old column name
CREATE FOREIGN TABLE public.foreign_customers (
id BIGINT,
customer_name VARCHAR(100), -- remote column was renamed to cust_name
email VARCHAR(200)
)
SERVER remote_pg_server
OPTIONS (schema_name 'public', table_name 'customers');
-- Fix: Drop and recreate with correct column name
DROP FOREIGN TABLE IF EXISTS public.foreign_customers;
CREATE FOREIGN TABLE public.foreign_customers (
id BIGINT,
cust_name VARCHAR(100), -- updated to match remote schema
email VARCHAR(200)
)
SERVER remote_pg_server
OPTIONS (schema_name 'public', table_name 'customers');
-- Verify
SELECT * FROM public.foreign_customers LIMIT 3;
2. Incorrect column_name Option in Foreign Table Definition
FDW extensions like postgres_fdw support column-level OPTIONS (column_name '...') to map local column names to different remote column names. A typo or invalid remote column name in this option will trigger HV005.
-- Incorrect option: remote column name doesn't exist
ALTER FOREIGN TABLE public.foreign_orders
ALTER COLUMN local_id
OPTIONS (ADD column_name 'wrong_column_name'); -- HV005 triggered here
-- Fix: Remove wrong option and set the correct one
ALTER FOREIGN TABLE public.foreign_orders
ALTER COLUMN local_id
OPTIONS (DROP column_name);
ALTER FOREIGN TABLE public.foreign_orders
ALTER COLUMN local_id
OPTIONS (ADD column_name 'order_id'); -- correct remote column name
-- Check current column options
SELECT attname, ftoptions
FROM pg_attribute a
JOIN pg_class c ON c.oid = a.attrelid
WHERE c.relname = 'foreign_orders'
AND a.attnum > 0;
3. Stale FDW Metadata Cache After Upgrade or Network Failure
After upgrading a FDW extension or recovering from a network failure, the internal metadata cache may become stale, causing the FDW to reference column metadata that no longer matches the remote server.
-- Check installed FDW extension version
SELECT name, default_version, installed_version
FROM pg_available_extensions
WHERE name = 'postgres_fdw';
-- Upgrade FDW extension if outdated
ALTER EXTENSION postgres_fdw UPDATE;
-- Force schema re-sync using IMPORT FOREIGN SCHEMA
BEGIN;
DROP FOREIGN TABLE IF EXISTS public.foreign_customers;
IMPORT FOREIGN SCHEMA public
LIMIT TO (customers)
FROM SERVER remote_pg_server
INTO public;
COMMIT;
-- Confirm the imported column definitions
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name = 'customers'
AND table_schema = 'public'
ORDER BY ordinal_position;
Quick Fix Summary
| Cause | Quick Fix |
|---|---|
| Remote column renamed/dropped | Recreate Foreign Table with updated columns |
Wrong column_name option |
ALTER FOREIGN TABLE ... ALTER COLUMN ... OPTIONS |
| Stale cache / version mismatch |
ALTER EXTENSION postgres_fdw UPDATE + IMPORT FOREIGN SCHEMA
|
Prevention Tips
1. Use IMPORT FOREIGN SCHEMA in your deployment pipeline.
Instead of manually managing Foreign Table definitions, integrate IMPORT FOREIGN SCHEMA into your CI/CD process. This automatically syncs your local Foreign Tables with the current remote schema on every deployment, eliminating manual drift.
-- Safe schema refresh pattern (staging swap)
BEGIN;
DROP FOREIGN TABLE IF EXISTS public.customers;
IMPORT FOREIGN SCHEMA public
LIMIT TO (customers)
FROM SERVER remote_pg_server
INTO public;
COMMIT;
2. Schedule periodic schema drift checks.
Set up a scheduled job using pg_cron or an external scheduler to compare local Foreign Table column definitions against the remote schema. Alert your team immediately when a mismatch is detected — before it causes runtime errors in production.
-- Example: detect local columns missing from remote
SELECT local.column_name AS missing_in_remote
FROM information_schema.columns AS local
WHERE local.table_schema = 'public'
AND local.table_name = 'foreign_customers'
AND local.column_name NOT IN (
SELECT column_name
FROM information_schema.columns
WHERE table_schema = 'fdw_staging'
AND table_name = 'customers'
);
Related Errors
- HV000 – Generic FDW error, parent category of HV005
-
HV002 –
fdw_dynamic_parameter_value_needed: missing dynamic parameter -
42703 –
undefined_column: similar symptom but occurs outside FDW layer
📖 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)