PostgreSQL Error 01P01: Deprecated Feature — What You Need to Know
PostgreSQL warning code 01P01 (deprecated_feature) is a SQLSTATE warning issued when your SQL code uses functionality that still works today but is scheduled for removal or behavioral change in a future major version. Unlike hard errors, this warning does not abort your query — but ignoring it is a ticking time bomb for any production system planning a version upgrade.
Top 3 Causes
1. Using WITH OIDS or Other Legacy DDL Syntax
The WITH OIDS table option was officially deprecated in PostgreSQL 12 and fully removed in PostgreSQL 16. Applications ported from older versions often carry this syntax silently.
-- ❌ Deprecated (removed in PG16)
CREATE TABLE old_style (
id SERIAL,
data TEXT
) WITH OIDS;
-- ✅ Modern replacement
CREATE TABLE new_style (
id SERIAL PRIMARY KEY,
data TEXT
);
-- If you need OID-like behavior, add it explicitly
ALTER TABLE new_style ADD COLUMN legacy_oid OID;
2. Calling Deprecated Built-in Functions or Operators
PostgreSQL periodically removes or replaces internal functions. Types like abstime and reltime were deprecated and removed; non-standard casting syntax also triggers this warning.
-- ❌ Deprecated type usage
-- SELECT 'now'::abstime; -- removed in PG12
-- ✅ Use standard timestamp types
SELECT now()::TIMESTAMP AS current_ts;
SELECT CURRENT_TIMESTAMP AS current_ts;
-- ❌ Deprecated epoch arithmetic shorthand
-- SELECT DATETIME 'epoch' + 1234567890 * INTERVAL '1 second';
-- ✅ Standard approach
SELECT to_timestamp(1234567890) AS converted_ts;
3. Setting Deprecated GUC (Configuration) Parameters
Using configuration parameters that are no longer recommended — such as turning off standard_conforming_strings — triggers 01P01 at the session or system level.
-- ❌ Deprecated configuration combination
SET standard_conforming_strings = off;
SET escape_string_warning = off;
-- ✅ Recommended settings (these are already defaults in modern PG)
SET standard_conforming_strings = on;
-- Use explicit escape syntax when needed
SELECT E'line1\nline2' AS escaped_text; -- explicit E'' prefix
SELECT 'normal string' AS plain_text;
-- Apply system-wide via ALTER SYSTEM
ALTER SYSTEM SET standard_conforming_strings = on;
SELECT pg_reload_conf();
Quick Fix Solutions
-
Check your server logs with
log_min_messages = 'WARNING'to capture all01P01occurrences. -
Search your codebase for known deprecated patterns (
WITH OIDS,abstime,reltime, backslash escapes). -
Run
pg_upgrade --checkbefore any major version upgrade to surface compatibility issues early.
-- Find potentially problematic queries in pg_stat_statements
SELECT query, calls, total_exec_time
FROM pg_stat_statements
WHERE query ILIKE '%with oids%'
OR query ILIKE '%abstime%'
OR query ILIKE '%reltime%'
ORDER BY calls DESC
LIMIT 20;
-- Verify current warning-related settings
SELECT name, setting, short_desc
FROM pg_settings
WHERE name IN (
'standard_conforming_strings',
'escape_string_warning',
'log_min_messages',
'client_min_messages'
);
Prevention Tips
Review PostgreSQL Release Notes before every upgrade.
The official PostgreSQL Release Notes explicitly list deprecated features for each major version. Make it a team ritual to read the "Migration" and "Deprecated" sections before upgrading. Enable log_min_messages = 'WARNING' in your staging environment during regression testing to catch 01P01 before it hits production.
Integrate automated compatibility checks into your CI/CD pipeline.
Tools like pgupgradecheck, pg_upgrade --check, and log analyzers such as pgBadger can automatically flag deprecated feature usage. Adding these checks as a required pipeline gate ensures that no deprecated SQL pattern slips into production unnoticed.
Related Error Codes
| Code | Name | Relationship |
|---|---|---|
01000 |
warning |
Parent class of 01P01; general warnings |
42P16 |
invalid_table_definition |
What WITH OIDS becomes after full removal |
0A000 |
feature_not_supported |
The hard error after a deprecated feature is fully removed |
Key takeaway:
01P01is PostgreSQL giving you advance notice. Treat every occurrence as a P1 tech-debt ticket — because after the next major version upgrade, that warning becomes a breaking error.
Top comments (0)