--
-- tree_ancestor_key/2
--
create or replace function tree_ancestor_key(
bit varying,
integer
) returns varbit as $$
-- Returns a key for the ancestor at the given level. The root is level
-- one.
declare
p_tree_key alias for $1;
p_level alias for $2;
v_level integer default 0;
v_pos integer default 1;
begin
if tree_level(p_tree_key) < p_level then
raise exception 'tree_ancestor_key: key is at a level less than %', p_level;
end if;
while v_level < p_level loop
v_level := v_level + 1;
if substring(p_tree_key, v_pos, 1) = '1' then
v_pos := v_pos + 32;
else
v_pos := v_pos + 8;
end if;
end loop;
return substring(p_tree_key, 1, v_pos - 1);
end;$$ language plpgsql;