Re: IMMUTABLE function to cast enum to/from text?

From: Joe Conway <mail(at)joeconway(dot)com>
To: Philip Semanchuk <philip(at)americanefficient(dot)com>, PostgreSQL General <pgsql-general(at)lists(dot)postgresql(dot)org>
Subject: Re: IMMUTABLE function to cast enum to/from text?
Date: 2022-11-10 20:18:19
Message-ID: 219ec605-315d-fe5f-c0b1-80ece0801946@joeconway.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On 11/10/22 14:52, Philip Semanchuk wrote:
> Hi all,
> I know that Postgres' enum_in()/enum_out() functions have a
> volatility class of STABLE, and STABLE is required because enum
> elements can be renamed. We have an enum in our database used in a
> number of custom functions, all of which require casting the enum
> to/from text. Since enum_in() and enum_out() are STABLE, that means
> our functions that rely on those casts must also be STABLE, and as a
> result we can't use them in generated columns.
>
> I have seen conversations that suggest creating a custom IMMUTABLE
> function to perform the cast, but I can't figure out how to do that
> except with a CASE statement that enumerates every possible value. Is
> there a more elegant approach?

When asking for help here, it always helps us to help you if you provide
a self-contained set of SQL that illustrates what you are looking for.

That said, I think you are looking for something like this:

CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
CREATE TABLE person (name text, current_mood mood);
INSERT INTO person VALUES ('Moe', 'happy');
CREATE OR REPLACE FUNCTION mood2text(mood)
RETURNS text AS
$$
select $1
$$ STRICT IMMUTABLE LANGUAGE sql;

SELECT name, mood2text(current_mood) FROM person;
name | mood2text
------+-----------
Moe | happy
(1 row)

HTH,

--
Joe Conway
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Tom Lane 2022-11-10 20:39:08 Re: IMMUTABLE function to cast enum to/from text?
Previous Message Philip Semanchuk 2022-11-10 19:52:24 IMMUTABLE function to cast enum to/from text?