BUG #8237: CASE Expression - Order of expression processing

Поиск
Список
Период
Сортировка
От andrea@lombardoni.ch
Тема BUG #8237: CASE Expression - Order of expression processing
Дата
Msg-id E1Uovmc-0007FT-R4@wrigleys.postgresql.org
обсуждение исходный текст
Ответы Re: BUG #8237: CASE Expression - Order of expression processing  (Andres Freund <andres@2ndquadrant.com>)
Список pgsql-bugs
The following bug has been logged on the website:

Bug reference:      8237
Logged by:          Andrea Lombardoni
Email address:      andrea@lombardoni.ch
PostgreSQL version: 9.0.4
Operating system:   Linux
Description:

I observed the following behaviour (I tested the following statements in
9.0.4, 9.0.5 and 9.3beta1):


$ psql template1
template1=# SELECT CASE WHEN 0=0 THEN 0 ELSE 1/0 END;
 case
------
    0
(1 row)


template1=# SELECT CASE WHEN 1=0 THEN 0 ELSE 1/0 END;
ERROR:  division by zero


In this case the CASE behaves as expected.


But in the following expression:


template1=# SELECT CASE WHEN (SELECT 0)=0 THEN 0 ELSE 1/0 END;
ERROR:  division by zero


(Just to be sure, a "SELECT (SELECT 0)=0;" returns true)


What I expect:


template1=# SELECT CASE WHEN (SELECT 0)=0 THEN 0 ELSE 1/0 END;
0
template1=# SELECT CASE WHEN (SELECT 1)=0 THEN 0 ELSE 1/0 END;
ERROR: division by zero


It seems that when the "CASE WHEN expression" is a query, the evaluation
order changes.
According to the documentation, this behaviour is wrong.


http://www.postgresql.org/docs/9.0/static/sql-expressions.html (4.2.13.
Expression Evaluation Rules):
"When it is essential to force evaluation order, a CASE construct (see
Section 9.16) can be used. "


http://www.postgresql.org/docs/9.0/static/functions-conditional.html
(9.16.1. CASE):
"If the condition's result is true, the value of the CASE expression is the
result that follows the condition, and the remainder of the CASE expression
is not processed."
"A CASE expression does not evaluate any subexpressions that are not needed
to determine the result."


The discussion on postgresql-general (
http://www.postgresql.org/message-id/CAMQ5dGq4SuJPbhT2-9XLAPAsvKNUL2-bb0cPyci2Fp+pfSfc3g@mail.gmail.com
) also seems to indicate that this is a bug.


At least it is a discrepancy between documentation and behaviour.

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

Предыдущее
От: Вилен Тамбовцев
Дата:
Сообщение: Re: BUG #7971: Xml special symbols are not unescaped when gettting value of Xml via xpath
Следующее
От: Andres Freund
Дата:
Сообщение: Re: BUG #8237: CASE Expression - Order of expression processing