On Thursday 10. May 2007 19:23, Tom Lane wrote:

>"Leif B. Kristensen" <[EMAIL PROTECTED]> writes:

>> CREATE OR REPLACE VIEW tmg_persons AS
>> SELECT
>>     person_id,
>>     get_parent(person_id,1) AS father_id,
>>     get_parent(person_id,2) AS mother_id,
>>     last_edit,
>>     get_pbdate(person_id) AS pb_date,
>>     get_pddate(person_id) AS pd_date,
>>     gender AS s,
>>     living AS l,
>>     is_public AS p
>> FROM persons;
>
>Are get_parent() and/or get_pbdate() marked volatile by any chance?
>8.2 is more conservative about optimizing sub-selects involving
> volatile functions than previous releases were, because we got
> complaints about surprising behavior when a volatile function is
> executed more or fewer times than the text of the query would
> suggest.  If they are really stable or immutable, marking them so
> would probably help here.  (If they fetch from another table, stable
> is the right marking.)

Tom,
I haven't pondered the subtleties of 'stable', 'immutable' or 'volatile' 
yet, but rather reckoned that the default would do. Here are the 
function definitions:

CREATE OR REPLACE FUNCTION get_parent(INTEGER,INTEGER) RETURNS INTEGER 
AS $$
DECLARE
    person ALIAS FOR $1;    -- person ID
    rel_type ALIAS FOR $2;  -- gender code (1=male, 2=female)
    par INTEGER;            -- person ID of parent, returned by func
BEGIN
    SELECT parent_fk INTO par FROM relations
        WHERE child_fk = person AND relation_type = rel_type;
    RETURN COALESCE(par,0); -- will return parent ID if it exists, 0 
otherwise
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION get_pbdate(INTEGER) RETURNS TEXT AS $$
DECLARE
    pb_date TEXT;
BEGIN
    SELECT event_date INTO pb_date FROM events, participants
    WHERE events.event_id = participants.event_fk
        AND participants.person_fk = $1
        AND events.tag_fk IN (2,62,1035)
        AND participants.is_principal IS TRUE;
    RETURN COALESCE(pb_date,'000000003000000001');
END;
$$ LANGUAGE plpgsql;

'relations', 'events', and 'participants' are actual tables. So, what do 
you recommend?
-- 
Leif Biberg Kristensen | Registered Linux User #338009
http://solumslekt.org/ | Cruising with Gentoo/KDE
My Jazz Jukebox: http://www.last.fm/user/leifbk/

---------------------------(end of broadcast)---------------------------
TIP 1: if posting/reading through Usenet, please send an appropriate
       subscribe-nomail command to [EMAIL PROTECTED] so that your
       message can get through to the mailing list cleanly

Reply via email to