Re: ERROR: failed to find conversion function from unknown to text

jian he <jian.universality@gmail.com>

From: jian he <jian.universality@gmail.com>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: PostgreSQL-development <pgsql-hackers@postgresql.org>
Date: 2026-04-22T06:33:01Z
Lists: pgsql-hackers

Attachments

On Thu, Jan 29, 2026 at 11:53 AM jian he <jian.universality@gmail.com> wrote:
>
> To make it an error, meaning it's not possible to coerce to the unknown type.
> We can do it in the function find_coercion_pathway, just
> after the ``if (sourceTypeId == targetTypeId)`` check:
>
>     if (targetTypeId == UNKNOWNOID)
>         return COERCION_PATH_NONE;
>
> it's also doable in the function can_coerce_type,
> right after the ``if (inputTypeId == UNKNOWNOID)``:
>
>         if (targetTypeId == UNKNOWNOID)
>             return false;

I choose to disallow UNKNOWN target types in find_coercion_pathway.

do $$ declare a int;
begin a := '1'::text::unknown;
end$$;

This DO statement does not cause any error in the HEAD, because of
function find_coercion_pathway:
```
    /*
     * When parsing PL/pgSQL assignments, allow an I/O cast to be used
     * whenever no normal coercion is available.
     */
    if (result == COERCION_PATH_NONE &&
        ccontext == COERCION_PLPGSQL)
        result = COERCION_PATH_COERCEVIAIO;
```

but will result error with the attached V2:
ERROR:  cannot cast type text to unknown



--
jian
https://www.enterprisedb.com/