Jedinečné indexy se vyhodnocují na řádek, nikoli na příkaz (což se například liší od implementace Oracle)
Řešením tohoto problému je použití jedinečného omezení které lze odložit, a tak se vyhodnotí na konci transakce.
Takže místo jedinečného indexu definujte omezení:
alter table test add constraint test_idx_pos unique (pos)
deferrable initially deferred;