A que tipo de dados esta mensagem de erro se refere?
ERROR: numeric field overflow DETAIL: A field with precision 1, scale 0 must round to an absolute value less than 10^1.
Estou recebendo o erro listado acima, está vindo de um gatilho de inserção. Como nenhum dos meus tipos de dados é definido explicitamente como NUMERIC(1,0)
e como o valor máximo é 10 à potência de 1 (ou seja, 10), estou supondo que esse erro está realmente se referindo a um BOOLEAN
campo. No entanto, não consigo encontrar confirmação disso.
ATUALIZAÇÃO
Resolvido. Meu gatilho está tentando analisar algumas strings em números. O erro listado é retornado quando to_number()
não obtém uma string no formato esperado.
Isso retorna 1,4 (correto) -
select to_number('1.4','9D9');
Isso retorna o erro mencionado
select to_number('1d4','9D9');
Ainda não tenho certeza por que está reclamando, NUMERIC(1,0)
mas pelo menos sei por que há um erro.
Isso porque
to_number()
descarta qualquer coisa, menos caracteres de dados da string de entrada. Os caracteres de dados são: dígitos, sinal, ponto decimal e vírgula. Os caracteres de ruído não são insignificantes, pois ainda contam no comprimento do padrão de formato. Então:é efetivamente o mesmo que:
Ambos falham porque o padrão
'9D9'
permite apenas um único dígito antes da vírgula.Mas esta expressão válida:
não é o mesmo que:
Muito ruído trunca a entrada.
db<>fique aqui
E, sim,
D
é um especificador de formato para um ponto decimal (independente da localidade) na string padrão (2º argumento da função), mas não na string de entrada (1º argumento da função). Você mesmo já descobriu isso.Para abordar a questão no título - Postgres tem uma definição no manual:
Dito isso, vejo dois problemas do Postgres aqui:
1. Documentação ausente
Não está documentado no manual que
to_number()
ignora caracteres não-dados na entrada. Nem que aqueles ainda contam contra o comprimento total do padrão.2. Erro na mensagem de erro
Parece haver um erro no DETAIL da mensagem de erro. O observado:
Deve ser realmente:
O efeito é o mesmo, então o comportamento é coerente. Mas a informação é enganosa.