Re: aggregate function for median calculation - Mailing list pgsql-general

From Thalis A. Kalfigopoulos
Subject Re: aggregate function for median calculation
Date
Msg-id Pine.LNX.4.21.0106211151280.24987-100000@aluminum.cs.pitt.edu
Whole thread Raw
In response to Re: aggregate function for median calculation  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: aggregate function for median calculation  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-general
On Thu, 21 Jun 2001, Tom Lane wrote:

> "Thalis A. Kalfigopoulos" <thalis@cs.pitt.edu> writes:
> > I'm still a bit confused about how to declare the type of the transition state.
> > I have a structure that will hold the current state:
> > struct state {
> >     int elem_count; //how many numbers have been assigned so far
> >     int *elem_area; //ptr to area holding these integers whose median I'll later calculate
> > }
>
> > My question is: how do I declare this in Pg?
>
> Since you haven't made this a full-fledged Postgres type, you don't.
>
> There's no real *need* to make it a full-fledged type, actually, since
> nobody except your two aggregate functions will ever manipulate the
> value.  So I'd suggest cheating.  Make it a legal "varlena" value by
> having the first word of the struct contain the total length in bytes
> of the object (including itself).  Then pretend in the SQL transition
> function declaration and aggregate declaration that the transition
> datatype is any old varlena type --- text or bytea would do fine.
> Nothing except your code will look at anything except the varlena
> length, so the fact that the body of the value means something unusual
> won't matter.
>
> Or, if you want to be rigidly correct, you could make the transition
> value be a legitimate int4 array (_int4), which is only a field or
> three more overhead.  But I don't see any value in it, except possibly
> for manual testing of your transition functions.
>
>             regards, tom lane
>

I worked on it so the struct state now has 3 fields: int length, int elem_count, int *elements. Now the issue is that
thetransition function, which I declare as strict, has a different input and state type (int4 and text respectively),
soit requires an INITCOND. What should that be? It has to be the text representation of what the state struct is
initially.The state initially has elem_count=0, elements=NULL and length=sizeof(struct state) which is 3*sizeof(int)
(the2 integer fields and a pointer i.e. another integer). How do I explain that? 

I tried some scenarios for INITCOD like '\0' and 0 but they all crashed :-/

Any ideas?

tia,
thalis


pgsql-general by date:

Previous
From: Stephan Szabo
Date:
Subject: Re: Foreign Keys to Non-primary keys?
Next
From: Tom Lane
Date:
Subject: Re: aggregate function for median calculation