Adrian Klaver <adrian.klaver@xxxxxxxxx> writes: > test=> create function f(t) returns m as $$ select case when true then > $1.c end $$ language sql; > ERROR: return type mismatch in function declared to return m > DETAIL: Actual return type is numeric. pg_typeof is somewhat helpful here: regression=# select pg_typeof(t.c) from t; pg_typeof ----------- m (1 row) regression=# select pg_typeof(case when true then t.c end) from t; pg_typeof ----------- numeric (1 row) The reason for this is that CASE uses select_common_type() to infer the output type, and select_common_type intentionally discriminates against domain types. The comment therein says: * If all input types are valid and exactly the same, just pick that type. * This is the only way that we will resolve the result as being a domain * type; otherwise domains are smashed to their base types for comparison. So the way to get a CASE to return a domain type is to be sure you provide an ELSE with the same result type: regression=# select pg_typeof(case when true then t.c else null::m end) from t; pg_typeof ----------- m (1 row) regards, tom lane -- Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-general