BUG #19084: dump/restore table doesn't work with GENARETED column and custom type and cast in function

From: PG Bug reporting form <noreply(at)postgresql(dot)org>
To: pgsql-bugs(at)lists(dot)postgresql(dot)org
Cc: turon(dot)david(at)seznam(dot)cz
Subject: BUG #19084: dump/restore table doesn't work with GENARETED column and custom type and cast in function
Date: 2025-10-13 13:32:33
Message-ID: 19084-c3dd88cd54fff87a@postgresql.org
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

The following bug has been logged on the website:

Bug reference: 19084
Logged by: David Turoň
Email address: turon(dot)david(at)seznam(dot)cz
PostgreSQL version: 17.6
Operating system: AlmaLinux release 9.0
Description:

Good morning,

i have issue with dump/restore custom type used as GENERATED column, here is
example:

--test table with GENEREATED column CUSTOM TYPE WITH IMMUTABLE FUNCTION

psql postgres postgres
psql (17.6)

CREATE DATABASE test;
\c test

--custom shell type storing data as bigint, but in json cast as text
-- SELECT jsonb_build_object('test',1::test_type);
-- jsonb_build_object
-- ------------------
-- {"test": "1"}

CREATE TYPE public.test_type;

CREATE OR REPLACE FUNCTION public.test_type_in(cstring)
RETURNS public.test_type
LANGUAGE internal
IMMUTABLE
PARALLEL SAFE
STRICT AS $function$int8in$function$;

CREATE OR REPLACE FUNCTION public.test_type_out(public.test_type)
RETURNS cstring
LANGUAGE internal
IMMUTABLE PARALLEL SAFE
STRICT AS $function$int8out$function$;

CREATE TYPE public.test_type(INPUT=test_type_in, OUTPUT=test_type_out,
LIKE=bigint);

CREATE CAST (bigint AS public.test_type) WITHOUT FUNCTION AS IMPLICIT;
CREATE CAST (public.test_type AS bigint) WITHOUT FUNCTION AS IMPLICIT;

CREATE OR REPLACE FUNCTION public.test_type_int_to_test_type(int)
RETURNS public.test_type
LANGUAGE SQL
IMMUTABLE PARALLEL SAFE
STRICT AS $function$
SELECT $1::bigint::test_type;
$function$;

CREATE CAST (int AS public.test_type) WITH FUNCTION
public.test_type_int_to_test_type(int) AS IMPLICIT;

-- custom immutable function used in GENERATED column with custom type and
custom cast
CREATE FUNCTION f(data jsonb) RETURNS test_type[] AS $$ SELECT
array_agg((e->>'item')::test_type) FROM jsonb_array_elements(data->'test')
AS e $$ LANGUAGE SQL IMMUTABLE;

-- table with custom type, using custom function above - transfer json data
to array of custom type
CREATE TABLE test(data jsonb, numbers public.test_type[] GENERATED ALWAYS AS
(f(data)) STORED);

INSERT INTO test(data) VALUES ('{"test": [{"item": "1"}, {"item": "2"},
{"item": "3"}]}');

TABLE test;
data | numbers
---------------------------------------------------------+---------
{"test": [{"item": "1"}, {"item": "2"}, {"item": "3"}]} | {1,2,3}

--dump works well
pg_dump -U postgres -Fc test > /home/test.pg_dump

--but restore doesn't work
pg_restore -U postgres -Fc -d test /home/test.pg_dump
pg_restore: while PROCESSING TOC:
pg_restore: from TOC entry 209; 1259 16488 TABLE test postgres
pg_restore: error: could not execute query: ERROR: type "test_type" does
not exist
LINE 1: SELECT array_agg((e->>'item')::test_type) FROM jsonb_array_...
^
QUERY: SELECT array_agg((e->>'item')::test_type) FROM
jsonb_array_elements(data->'test') AS e
CONTEXT: SQL function "f" during inlining
Command was: CREATE TABLE public.test (
data jsonb,
numbers public.test_type[] GENERATED ALWAYS AS (public.f(data)) STORED
);

pg_restore: error: could not execute query: ERROR: relation "public.test"
does not exist
Command was: ALTER TABLE public.test OWNER TO postgres;

pg_restore: from TOC entry 4046; 0 16488 TABLE DATA test postgres
pg_restore: error: could not execute query: ERROR: relation "public.test"
does not exist
Command was: COPY public.test (data) FROM stdin;
pg_restore: warning: errors ignored on restore: 3

Hotfix is now cast inside function to bigint instead of custom test_type
type. Also upgrade postgres 14->17 fails and is maybe hard to detect this
usage somewhere in database. Thanks for help.

David Turoň

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message David G. Johnston 2025-10-13 15:19:46 Re: BUG #19084: dump/restore table doesn't work with GENARETED column and custom type and cast in function
Previous Message PG Bug reporting form 2025-10-13 12:18:21 BUG #19083: Foreign inner join is the case for char() keys but not for varchar()