--
-- group_contains_p/3
--
create or replace function group_contains_p(
integer,
integer,
integer
) returns bool as $$
declare
group_contains_p__group_id alias for $1;
group_contains_p__component_id alias for $2;
group_contains_p__rel_id alias for $3;
map record;
begin
if group_contains_p__group_id = group_contains_p__component_id then
return 't';
else
if group_contains_p__rel_id is null then
for map in select *
from group_component_map
where component_id = group_contains_p__component_id
and group_id = container_id
LOOP
if group_contains_p(group_contains_p__group_id, map.group_id, null) = 't' then
return 't';
end if;
end loop;
else
for map in select *
from group_component_map
where component_id = group_contains_p__component_id
and rel_id = group_contains_p__rel_id
and group_id = container_id
LOOP
if group_contains_p(group_contains_p__group_id, map.group_id, null) = 't' then
return 't';
end if;
end loop;
end if;
return 'f';
end if;
end;$$ language plpgsql;