Eu tenho a seguinte consulta.
WITH d_rows AS (DELETE FROM t_a RETURNING * ) INSERT INTO t_b SELECT * FROM d_rows;
O que acontecerá se eu cancelar esta consulta (Ctrl+c no psql)? A exclusão será executada? Já está rodando? Funciona em lotes? Vejo que o t_b está crescendo enquanto a consulta está em execução. Isso é importante saber, pois se trata de muitos dados.
Uma CTE não é diferente de qualquer outra instrução a esse respeito - ela é executada em uma transação . Se nenhuma transação já estiver aberta, uma será aberta para a instrução e confirmada apenas na conclusão bem-sucedida de toda a instrução .
Assim, se você interromper o CTE, todos os efeitos serão revertidos e nada acontecerá 1 . Se você interrompê-lo apenas no momento em que ele está sendo confirmado, ele pode ser confirmado e todos entrarão em vigor, mas todos ou nenhum CTE entrará em vigor. Subtermos CTE individuais não podem entrar em vigor por si mesmos.
Então... a exclusão pode ser executada, mas se for, seus efeitos não serão confirmados e serão revertidos quando a consulta for cancelada. Exatamente como é executado não importa. O PostgreSQL pode optar por loteá-lo, executá-lo linha por linha ou executar todo o DELETE e inserir todos os seus resultados no INSERT. Não importa, porque os efeitos serão os mesmos.
1 Bem, estritamente, um monte de tabela inchada poderia ser criado, mas não há efeitos logicamente visíveis para outras transações .