From: | Markus Neumann <markus(dot)neumann(at)math(dot)uzh(dot)ch> |
---|---|
To: | pgsql-novice(at)postgresql(dot)org |
Subject: | Re: I probably don't understand aggregates. |
Date: | 2014-06-11 21:43:06 |
Message-ID: | 5398CD6A.308@math.uzh.ch |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-novice |
Sorry for the PM David. (as I said thats my first mailing list...)
I checked for conflicts, there are none.
Thanks a lot for your time.
This is the smallest setup I could come up with, that reproduces the same
behaviour...
CREATE OR REPLACE FUNCTION myAggrStep(state INTEGER, sumup INTEGER)
RETURNS INTEGER AS
$$
DECLARE outval INTEGER;
BEGIN
IF state IS NULL THEN
outval := sumup;
ELSE
outval := state + sumup;
END IF;
RETURN outval;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION myAggrFinal(finalstate INTEGER)
RETURNS INTEGER AS
$$
DECLARE outval INTEGER;
BEGIN
outval := 1/finalstate;
RETURN outval;
END;
$$ LANGUAGE plpgsql;
CREATE AGGREGATE myAggr(INTEGER)(
SFUNC = myAggrStep,
STYPE = INTEGER,
FINALFUNC = myAggrFinal
);
CREATE OR REPLACE FUNCTION myWrapperFunc(x INTEGER)
RETURNS INTEGER AS
$$
DECLARE outval INTEGER;
BEGIN
outval := myAggr(x);
RETURN outval;
END;
$$ LANGUAGE plpgsql;
CREATE TABLE test(x integer);
INSERT INTO test VALUES(0);
INSERT INTO test VALUES(0);
INSERT INTO test VALUES(1);
After all this:
SELECT myAggr(x) FROM test;
works.
SELECT myWrapperFunc(x) FROM test;
Division by zero!
Hope I didn't put any copy/paste errors...
On 11.06.2014 22:41, David G Johnston wrote:
> Markus Neumann wrote
>> I'm new to postgres, sql and mailing lists, so I think I'm in the right
>> place here.
>>
>> I have a pl/pgsql function, that calls a selfwritten aggregate function
>> (consisting of stepfunction and finalfunction) and afterwards processes
>> the results.
>>
>> The Problem:
>>
>> if I call
>> SELECT myAggrFunction(x) FROM table;
>> I get the correct and expected output.
>>
>> but when myAggrFunction gets called inside the "wrapper"-function, the
>> finalfunction gets executed before all rows are processed and hence I
>> get a "Division by zero" error.
>>
>> E.g.
>> SELECT myWrapperFunction(x) FROM table;
>> ERROR: division by zero
>>
>>
>> myWrapperFunction would look something like:
>>
>> BEGIN
>> M := myAggrFunction(x);
>> --do some more stuff
>> RETURN M;
>> END;
>>
>> I hope the description is somehow understandable.
>>
>> Any feedback will be highly appreciated.
>>
>> Markus
> Is there a reason you cannot provide a self-contained example?
>
> David J.
>
>
>
>
> --
> View this message in context: http://postgresql.1045698.n5.nabble.com/I-probably-don-t-understand-aggregates-tp5806879p5806885.html
> Sent from the PostgreSQL - novice mailing list archive at Nabble.com.
>
>
From | Date | Subject | |
---|---|---|---|
Next Message | ssharma | 2014-06-11 21:45:32 | Re: Need help with this Function. I'm getting an error |
Previous Message | David G Johnston | 2014-06-11 20:48:53 | Re: Need help with this Function. I'm getting an error |