On 28/07/2025 10:41, jian he wrote:
select oid, castsource::regtype, casttarget::regtype, castfunc::regproc, castcontext, castmethod from pg_cast where casttarget::regtype::text in ('text') or castsource::regtype::text in ('text'); As you can see from the query output, cast from other type to text or cast from text to other type is not in the pg_cast catalog entry. there are in type input/output functions. it will be represented as a CoerceViaIO node. see function find_coercion_pathway (src/backend/parser/parse_coerce.c line:3577).
This is the same issue I came across when I tried to implement it several years ago.
adding these pg_cast entries seems tricky. for example: (assume castsource as numeric, casttarget as text) will (castsource as numeric, casttarget as text, castfunc as numeric_out, castformatfunc as numeric_to_char) ever work? but numeric_out' result type is cstring.
I had been imagining another castcontext that would only specify the castfunc when the FORMAT claused is used, otherwise the current method of passing through IO would be used.
so I tend to think adding castformatfunc to pg_cast will not work.
Perhaps not, but we need to find a way to make this generic so that custom types can define formatting rules for themselves.
-- Vik Fearing