create function trig_ip_overlap_i() returns trigger as $$
declare r int4;
begin
select into r count(*)
from ip_alloc a
where (a.ip_addr << new.ip_addr or a.ip_addr >> new.ip_addr or a.ip_addr = new.ip_addr)
if r>0 then
raise exception 'Block will overlap';
end if;
return new;
end;
$$ language 'plpgsql';
create function trig_ip_overlap_u() returns trigger as $$
declare r int4;
begin
select into r count(*)
from ip_alloc a
where (a.ip_addr << new.ip_addr or a.ip_addr >> new.ip_addr or a.ip_addr = new.ip_addr)
and a.ip_addr <> old.ip_addr;
if r>0 then
raise exception 'Block will overlap';
end if;
return new;
end;
$$ language 'plpgsql';
drop trigger trig_ip_overlap_aiu on ip_alloc;
drop trigger trig_ip_overlap_ai on ip_alloc;
drop trigger trig_ip_overlap_au on ip_alloc;
create trigger trig_ip_overlap_ai before insert on ip_alloc
for each row execute procedure trig_ip_overlay_i();
create trigger trig_ip_overlap_au before insert on ip_alloc
for each row execute procedure trig_ip_overlay_u();