Los índices únicos se evalúan por fila, no por declaración (que es, por ejemplo, diferente a la implementación de Oracle)
La solución a este problema es usar una restricción única que puede ser diferido y por lo tanto se evalúa al final de la transacción.
Así que en su lugar del índice único, defina una restricción:
alter table test add constraint test_idx_pos unique (pos)
deferrable initially deferred;