Hi.
CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green',
'blue', 'purple');
select enum_in('rec', -1);
ERROR: cache lookup failed for type 4294967295
With the attached patch:
ERROR: invalid input value for enum ???: "rec"
We could make this bulletproof by calling SearchSysCache1(ENUMOID) followed by
SearchSysCache2(ENUMTYPOIDNAME), but the overhead of making two calls probably
isn't worth it.
--
jian
https://www.enterprisedb.com/
From e86aceb385acbe41e7fd4e517693bf8b438a9d73 Mon Sep 17 00:00:00 2001
From: jian he <[email protected]>
Date: Mon, 22 Jun 2026 16:26:18 +0800
Subject: [PATCH v1 1/1] fix enum_in cache lookup failed ERROR
discussion: https://postgr.es/m/
---
src/backend/utils/adt/enum.c | 4 ++--
src/test/regress/expected/enum.out | 8 ++++++++
src/test/regress/sql/enum.sql | 2 ++
3 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/src/backend/utils/adt/enum.c b/src/backend/utils/adt/enum.c
index 286d4311ed5..c662faf079a 100644
--- a/src/backend/utils/adt/enum.c
+++ b/src/backend/utils/adt/enum.c
@@ -119,7 +119,7 @@ enum_in(PG_FUNCTION_ARGS)
ereturn(escontext, (Datum) 0,
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
errmsg("invalid input value for enum %s: \"%s\"",
- format_type_be(enumtypoid),
+ format_type_extended(enumtypoid, -1, FORMAT_TYPE_ALLOW_INVALID),
name)));
tup = SearchSysCache2(ENUMTYPOIDNAME,
@@ -129,7 +129,7 @@ enum_in(PG_FUNCTION_ARGS)
ereturn(escontext, (Datum) 0,
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
errmsg("invalid input value for enum %s: \"%s\"",
- format_type_be(enumtypoid),
+ format_type_extended(enumtypoid, -1, FORMAT_TYPE_ALLOW_INVALID),
name)));
/*
diff --git a/src/test/regress/expected/enum.out b/src/test/regress/expected/enum.out
index 990ce66c7bb..0801afebdc0 100644
--- a/src/test/regress/expected/enum.out
+++ b/src/test/regress/expected/enum.out
@@ -24,6 +24,14 @@ SELECT 'mauve'::rainbow;
ERROR: invalid input value for enum rainbow: "mauve"
LINE 1: SELECT 'mauve'::rainbow;
^
+SELECT enum_in('red', -1); -- error
+ERROR: invalid input value for enum ???: "red"
+SELECT enum_in('red', 'rainbow'::regtype);
+ enum_in
+---------
+ red
+(1 row)
+
-- Also try it with non-error-throwing API
SELECT pg_input_is_valid('red', 'rainbow');
pg_input_is_valid
diff --git a/src/test/regress/sql/enum.sql b/src/test/regress/sql/enum.sql
index 803ccad6a6b..f6fe2c1a35a 100644
--- a/src/test/regress/sql/enum.sql
+++ b/src/test/regress/sql/enum.sql
@@ -14,6 +14,8 @@ SELECT COUNT(*) FROM pg_enum WHERE enumtypid = 'rainbow'::regtype;
--
SELECT 'red'::rainbow;
SELECT 'mauve'::rainbow;
+SELECT enum_in('red', -1); -- error
+SELECT enum_in('red', 'rainbow'::regtype);
-- Also try it with non-error-throwing API
SELECT pg_input_is_valid('red', 'rainbow');
--
2.34.1