Re: BUG #12273: CASE Expression BUG

Поиск
Список
Период
Сортировка
От David G Johnston
Тема Re: BUG #12273: CASE Expression BUG
Дата
Msg-id 1418921627518-5831325.post@n5.nabble.com
обсуждение исходный текст
Ответ на Re: BUG #12273: CASE Expression BUG  (Tom Lane <tgl@sss.pgh.pa.us>)
Ответы Re: BUG #12273: CASE Expression BUG
Список pgsql-bugs
Tom Lane-2 wrote
> jaksits.tibor@

>  writes:
>> CREATE OR REPLACE FUNCTION __is_numeric_test_does_not_work(a_text_param
>> text)
>>   RETURNS double precision AS
>> $BODY$DECLARE
>>   ret double precision;
>> BEGIN
>>   SELECT __is_numeric_test
>>     INTO ret
>>     FROM __is_numeric_test((CASE WHEN is_numeric(a_text_param) THEN
>> a_text_param::double precision ELSE 0.0::double precision END));
>>   RETURN ret;
>> END;$BODY$
>>   LANGUAGE plpgsql VOLATILE;
>
>> But the query "SELECT * FROM __is_numeric_test_does_not_work('')" I get
>> an
>> error message:
>> invalid input syntax for type double precision: ""
>
> You didn't show us what is_numeric() is, so it's impossible to reproduce
> this example, but I imagine what is happening is that the value of
> a_text_param is being substituted into the SELECT as a text constant, and
> then constant-folding leads to attempting to simplify a_text_param::double
> precision immediately.
>
> We're unlikely to change this, because it would cripple optimization
> attempts.  The fact that const-simplification doesn't happen in the other
> way you wrote the function is not more-correct behavior, it's just an
> implementation artifact that you shouldn't rely on.  What you need to do
> is code this as an if-then-else sequence, not CASE, so that you don't
> attempt to evaluate any expressions with undefined constant
> subexpressions.

Note that this is documented here:

http://www.postgresql.org/docs/9.4/interactive/functions-conditional.html#FUNCTIONS-CASE

Specifically, the "Note" at the end of 9.17.1

Maybe an example would make this got-cha more memorable but it is noted in
the docs right next to the spot where it is described that CASE evaluation
does short-circuit during execution - just not always during planning.

David J.




--
View this message in context: http://postgresql.nabble.com/BUG-12273-CASE-Expression-BUG-tp5831307p5831325.html
Sent from the PostgreSQL - bugs mailing list archive at Nabble.com.

В списке pgsql-bugs по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: BUG #12273: CASE Expression BUG
Следующее
От: Tom Lane
Дата:
Сообщение: Re: BUG #12273: CASE Expression BUG