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();