Обсуждение: PL/pgSQL evaluation order

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

PL/pgSQL evaluation order

От
Mark Volpe
Дата:
Hi,

I have trigger function with the statement:

IF TG_OP=''INSERT'' OR NEW.ip!=OLD.ip THEN

expecting the TG_OP=''INSERT'' to be evaluated
first, and if true, proceed with the body.
But it gets evaluated as the result of an INSERT
statement, I get a (rather strangly worded) error:

ERROR: record old is unassigned yet

which means that the second statement is still being
evaluated even though the first is true. Assuming
that this is the result of the parser/planner messing
with that statement, is there a way to force evaluation
order without having to go:

IF TG_OP=''INSERT'' THEN<body>
ELSEIF NEW.OP!=OLD.ip THEN    <repeat body>END IF;
END IF;

Thanks,
Mark


Re: PL/pgSQL evaluation order

От
Mark Volpe
Дата:
Doesn't seem like a bad idea. I did find a better workaround, though -

cond:=TG_OP=''INSERT'';
IF cond=FALSE THENcond:=NEW.ip!=OLD.ip;
END IF;
IF cond=TRUE ...

so it won't kill me. Anyway, I've been totally impressed with the 7.0 release.
I'm building the EPA IP address registration system on top of it. My favorite
feature is the support for REFERENCES (though I had to hack the code a bit to
get around a permissions problem).

Thanks,
Mark

Jan Wieck wrote:
> 
>     Maybe we should change the treatment  of  unassigned  rowtype
>     values that any reference to it holds the NULL value?
>