Re: BUG #8329: UPDATE x SET x.y = x.y + z does not work in PL/pgSQL - Mailing list pgsql-bugs

From Petr Chmelar
Subject Re: BUG #8329: UPDATE x SET x.y = x.y + z does not work in PL/pgSQL
Date
Msg-id 52075809.5020903@fit.vutbr.cz
Whole thread Raw
In response to Re: BUG #8329: UPDATE x SET x.y = x.y + z does not work in PL/pgSQL  (Petr Chmelar <chmelarp@fit.vutbr.cz>)
Responses Re: BUG #8329: UPDATE x SET x.y = x.y + z does not work in PL/pgSQL
List pgsql-bugs
Hi,

according to the previous thread, can you update the documentation, please:
http://www.postgresql.org/docs/current/static/functions-math.html
so there is clean what results do you get eg. on "NULL + 1" (and "1 +
NULL"), which gives you null and it is different from sum(x), where it
gives 1 where are NULL and 1 in column x. Probably you should introduce
coalesce() here.

Thank you,

Petr



On 29.7.2013 22:55, Petr Chmelar wrote:
> Dear Pavel and Andrew,
>
> avoiding the nulls solves the thing - thank you! I was considering
> NULL as 0... lame.
> I just wonder why it was working in the console, but it is not
> important - at the moment it works just fine.
>
> Cheers,
> Petr
>
> On 27.7.2013 22:59, Pavel Stehule wrote:
>> Hello
>>
>> 2013/7/27 Andrew Gierth <andrew@tao11.riddles.org.uk>:
>>> Seems clearly your mistake to me... you do realize that (null + z) is
>>> always going to be null, right? Maybe your totals columns should have
>>> been declared NOT NULL (and presumably DEFAULT 0) to avoid this
>>> problem?
>>>
>>> Adding some diagnostics to your function (and fixing all the syntax
>>> errors) and running it shows that you're frequently trying to add to
>>> nulls, e.g.:
>>>
>>> NOTICE:  sum_pkt_in_int = <NULL>
>>> NOTICE:  sum_orig_raw_pktcount = 4
>>> NOTICE:  sum_pkt_in_int = <NULL>
>>> NOTICE:  sum_orig_raw_pktcount = 599
>>>
>>> these diagnostics were obtained as follows:
>>>
>>> CREATE OR REPLACE FUNCTION statistics.notice(text, anyelement)
>>>   RETURNS anyelement
>>>   LANGUAGE plpgsql
>>> AS $function$ begin raise notice '% = %', $1, $2; return $2; end;
>>> $function$
>>>
>>> and changing your update to:
>>>
>>>    sum_pkt_in_int  = notice(''sum_pkt_in_int'',sum_pkt_in_int)
>>>                      +
>>> notice(''sum_orig_raw_pktcount'',sum_orig_raw_pktcount),
>>>         -- XXX THIS IS IT, does not work even when ... + 1000000 XXX
>>>
>>> (doing \set VERBOSITY terse in psql is a good idea for this case to
>>> avoid excessive CONTEXT output)
>>>
>>> --
>>> Andrew (irc:RhodiumToad)
>>>
>> it is strange. I didn't find any problem on tested data, although a
>> bugs was displeasing.
>>
>> If query works from console, then planner is clearly ok, and possible
>> issue can be somewhere in plpgsql. But it should be located more
>> preciously.
>>
>> You can use a debug function or debug trigger
>>
>> CREATE OR REPLACE FUNCTION statistics.foo()
>>   RETURNS trigger
>>   LANGUAGE plpgsql
>> AS $function$
>> begin
>>    if new.sum_pkt_in_int is null then
>>      raise notice 'attention, new is null';
>>    end if;
>>    return new;
>> end;
>> $function$
>>
>> create trigger xx before update on hosts1 for each row execute
>> procedure foo();
>>
>> Regards
>>
>> Pavel
>>
>> p.s. check if COALESCE helps, and then problem is somewhere in data
>> probably
>>
>> sum can return null if all values are null
>>
>> postgres=# select sum(a) is null from (values(null::integer)) x(a);
>>   ?column?
>> ----------
>>   t
>> (1 row)
>>
>>
>>
>>
>>> --
>>> Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
>>> To make changes to your subscription:
>>> http://www.postgresql.org/mailpref/pgsql-bugs
>

pgsql-bugs by date:

Previous
From: karsten.lenz@gmx.ch
Date:
Subject: BUG #8380: initdb ignore options
Next
From: John R Pierce
Date:
Subject: Re: BUG #8380: initdb ignore options