Re: domains, case statements, functions: bug?
От | Tom Lane |
---|---|
Тема | Re: domains, case statements, functions: bug? |
Дата | |
Msg-id | 12597.1373335094@sss.pgh.pa.us обсуждение исходный текст |
Ответ на | Re: domains, case statements, functions: bug? (Adrian Klaver <adrian.klaver@gmail.com>) |
Ответы |
Re: domains, case statements, functions: bug?
|
Список | pgsql-general |
Adrian Klaver <adrian.klaver@gmail.com> 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
В списке pgsql-general по дате отправления: