Обсуждение: Evaluation of if conditions

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

Evaluation of if conditions

От
Daniel CAUNE
Дата:
Hi,

How does the IF statement evaluate conditions?  Does it evaluate conditions
following their declaration order from left to right?  In case of
or-conditions, does the IF statement stop evaluating conditions whenever a
first or-condition is true?

The following snippet seems to be invalid, which let me think that PL/PGSQL
evaluates all the conditions:
 IF (TG_OP = 'INSERT') OR    (OLD.bar = ...) THEN   statement END IF;

Should be rewritten as (for example):
 IF (TG_OP = 'INSERT') THEN   statement ELSIF (OLD.bar = ...) THEN   statement END IF;


Regards,

--
Daniel



Re: Evaluation of if conditions

От
Oisin Glynn
Дата:
Daniel CAUNE wrote:
> Hi,
>
> How does the IF statement evaluate conditions?  Does it evaluate conditions
> following their declaration order from left to right?  In case of
> or-conditions, does the IF statement stop evaluating conditions whenever a
> first or-condition is true?
>
> The following snippet seems to be invalid, which let me think that PL/PGSQL
> evaluates all the conditions:
>
>   IF (TG_OP = 'INSERT') OR
>      (OLD.bar = ...) THEN
>     statement
>   END IF;
>
> Should be rewritten as (for example):
>
>   IF (TG_OP = 'INSERT') THEN
>     statement
>   ELSIF (OLD.bar = ...) THEN
>     statement
>   END IF;
>
>
> Regards,
>
> --
> Daniel
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 9: In versions below 8.0, the planner will ignore your desire to
>        choose an index scan if your joining column's datatypes do not
>        match
>   
The following is working fine for me on 8.1.x on Windows. I am not sure 
what order it is evaluating the if statement in but it is working correctly.
Oisin


CREATE OR REPLACE FUNCTION zfunc_testor(bool, bool) RETURNS "varchar" AS
$BODY$DECLARE


v_1 boolean;
v_2 boolean;

BEGIN

v_1 :=$1;
v_2 := $2;

if (v_1 = TRUE) OR (v_2 = TRUE) then  return 'At least 1 true';
else   return 'neither true';
end if;

END;$BODY$ LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION zfunc_testor(bool, bool) OWNER TO postgres;


Re: Evaluation of if conditions

От
"Gregory S. Williamson"
Дата:
Daniel,

AFAIK there is no short-circuiting of evaluations in postgres and I don't think you can depend on the order they appear
into determine the order in which they are checked, although more knowledgable people may have better info than I ...
sothe rewritten form is the way to go. 

Greg Williamson
DBA
GlobeXplorer LLC

-----Original Message-----
From:    pgsql-sql-owner@postgresql.org on behalf of Daniel CAUNE
Sent:    Wed 9/6/2006 3:32 PM
To:    pgsql-sql@postgresql.org
Cc:
Subject:    [SQL] Evaluation of if conditions

Hi,

How does the IF statement evaluate conditions?  Does it evaluate conditions
following their declaration order from left to right?  In case of
or-conditions, does the IF statement stop evaluating conditions whenever a
first or-condition is true?

The following snippet seems to be invalid, which let me think that PL/PGSQL
evaluates all the conditions:
 IF (TG_OP = 'INSERT') OR    (OLD.bar = ...) THEN   statement END IF;

Should be rewritten as (for example):
 IF (TG_OP = 'INSERT') THEN   statement ELSIF (OLD.bar = ...) THEN   statement END IF;


Regards,

--
Daniel


---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to      choose an index scan if your joining column's
datatypesdo not      match 


-------------------------------------------------------
Click link below if it is SPAM gsw@globexplorer.com

"https://mailscanner.globexplorer.com/dspam/dspam.cgi?signatureID=44ff5167171391789821027&user=gsw@globexplorer.com&retrain=spam&template=history&history_page=1"
!DSPAM:44ff5167171391789821027!
-------------------------------------------------------







Re: Evaluation of if conditions

От
Joe
Дата:
Daniel CAUNE wrote:
> Hi,
>
> How does the IF statement evaluate conditions?  Does it evaluate conditions
> following their declaration order from left to right?  In case of
> or-conditions, does the IF statement stop evaluating conditions whenever a
> first or-condition is true?
>   
Please see 4.2.12. Expression Evaluation Rules of the manual:

The order of evaluation of subexpressions is not defined. In particular, 
the inputs of an operator or function are not necessarily evaluated 
left-to-right or in any other fixed order.

There's more examples there too.

Joe


Re: Evaluation of if conditions

От
Tom Lane
Дата:
Daniel CAUNE <d.caune@free.fr> writes:
> How does the IF statement evaluate conditions?  Does it evaluate conditions
> following their declaration order from left to right?  In case of
> or-conditions, does the IF statement stop evaluating conditions whenever a
> first or-condition is true?

> The following snippet seems to be invalid, which let me think that PL/PGSQL
> evaluates all the conditions:

>   IF (TG_OP = 'INSERT') OR
>      (OLD.bar = ...) THEN

It's not that all the conditions get evaluated by an OR, it's that
plpgsql needs to send all the parameter values that the IF-expression
needs down to the core SQL engine.  So it fails on "OLD.bar" not being
defined, long before the expression evaluator gets to think about
whether TG_OP = 'INSERT' or not.

So, yeah, you want to rewrite it as two separate IF-tests.
        regards, tom lane