Search Postgresql Archives

CASE Statement - Order of expression processing

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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)

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."

Did I miss anything? Or is this really a bug?

Thanks,
 Andrea Lombardoni

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux