Обсуждение: Bug #633: CASE statement evaluation does not short-circut

Поиск
Список
Период
Сортировка

Bug #633: CASE statement evaluation does not short-circut

От
pgsql-bugs@postgresql.org
Дата:
James Cole (colejatmsu.edu) reports a bug with a severity of 2
The lower the number the more severe it is.

Short Description
CASE statement evaluation does not short-circut

Long Description
In 7.2.1, Both the WHEN and THEN clauses of a CASE statement are evaluated, even if the WHEN clause evaluates to
FALSE.

(I'm not sure if this behavior is allowed by the '92 spec, but  it's different than under 7.1.x)

Platform info:
joel2=# select version();
                             version                              
------------------------------------------------------------------
 PostgreSQL 7.2.1 on sparc-sun-solaris2.6, compiled by GCC 2.95.2
(1 row)


Sample Code
joel2=# 
SELECT
    CASE
        WHEN 1 = 2 THEN 1 / 0
        WHEN 1 = 1 THEN 1.0
    END;
ERROR:  floating point exception! The last floating point operation either exceeded legal ranges or was a divide by
zero


No file was uploaded with this report

Re: Bug #633: CASE statement evaluation does not short-circut

От
Tom Lane
Дата:
pgsql-bugs@postgresql.org writes:
> In 7.2.1, Both the WHEN and THEN clauses of a CASE statement are evaluated, even if the WHEN clause evaluates to
FALSE.

Not in the normal case.

> SELECT
>     CASE
>         WHEN 1 = 2 THEN 1 / 0
>         WHEN 1 = 1 THEN 1.0
>     END;
> ERROR:  floating point exception! The last floating point operation either exceeded legal ranges or was a divide by
zero

Hmm.  The reason for this is that the constant-expression simplifier
reduces all the subexpressions of the CASE before it tries to discard
the ones with constant-FALSE preconditions.  This particular example
could be fixed by rearranging the order of the simplification operations,
but you'd still see a failure with, say,
SELECT CASE WHEN boolCol THEN 1 / 0 END FROM table;

since 1/0 will be const-folded at planning time whether the table
contains any TRUE entries or not.

I don't really consider this a bug; at least, fixing it would imply not
const-simplifying the result expressions of CASEs, which is a cure far
worse than the disease IMHO.  Does anyone think we *should* allow CASE
to defeat const-simplification?  Are there any real-world cases (as
opposed to made-up examples) where this is necessary?
        regards, tom lane


Re: Bug #633: CASE statement evaluation does not short-circut

От
Thomas Lockhart
Дата:
...
> I don't really consider this a bug; at least, fixing it would imply not
> const-simplifying the result expressions of CASEs, which is a cure far
> worse than the disease IMHO.  Does anyone think we *should* allow CASE
> to defeat const-simplification?

No. Constant-folding during parsing should *always* be allowed.
                  - Thomas