Unikalne indeksy są oceniane na wiersz, a nie na instrukcję (co np. różni się od implementacji Oracle)
Rozwiązaniem tego problemu jest użycie unikalnego ograniczenia które można odroczyć, a tym samym jest oceniane na koniec transakcji.
Więc zamiast unikalnego indeksu, zdefiniuj ograniczenie:
alter table test add constraint test_idx_pos unique (pos)
deferrable initially deferred;