psql
13.2 executa o buffer de consulta não importa o que aconteça ao sair do editor, mesmo depois de sair - nesse caso, o buffer pode conter a consulta SQL executada mais recentemente agora.
Reproduzir:
- Inicie o editor (
vim
no meu caso) com\e
ou\e filename
a partir dopsql
console. - Digite algo ou não, não faz diferença.
- Cancele a edição com
:q
(ou:q!
para forçar)
Comportamento esperado: volte ao estado antes de iniciar o editor. (Cancelei a edição!)
Comportamento observado: execute novamente a última consulta SQL executada.
O que parece acontecer com \e
:
ele executa (o equivalente a)
\p
, portanto, o buffer de consulta atual contém o comando anterior quando estava vazio. (O que não é visível para o usuário ao editar um arquivo!) O manual sobre\p
:\p
ou\print
Imprima o buffer de consulta atual na saída padrão. Se o buffer de consulta atual estiver vazio, a consulta executada mais recentemente será impressa.
Inicie o editor. Se um nome de arquivo foi fornecido, carregue o arquivo, caso contrário, carregue o buffer de consulta.
Se o editor terminar com uma gravação, copie o resultado para o buffer de consulta.
Se a edição for cancelada (:q
no vim), não sobrescreva o buffer de consulta. (Ele mantém o comando anterior agora!)Execute o buffer de consulta. Ou, para ser mais preciso, faça assim:
O comportamento parece bom para \p
(basta copiar o buffer de consulta, sem danos), mas não para \e
, que pode executar um comando que eu nem consegui ver.
É um bug?
De qualquer forma, gostaria de pelo menos desabilitar a execução automática ao sair do editor. Mas isso não parece ser possível. Ou eu estou esquecendo de alguma coisa?
Isso foi corrigido na v14 como uma reação a essa pergunta. O restante da resposta se refere ao comportamento anterior à v14:
Isso está (mais ou menos) documentado :
Se você sair do editor sem salvar, é o buffer de consulta atual ou a consulta executada mais recentemente que é executada.
Concordo com você que isso é irritante, e você não é a primeira pessoa que ouço reclamar.
Ao editar um script, o comportamento claramente viola o “princípio do menor espanto”: