[firebase-br] SQL executando com inconsistência.
André Conrado
acf em andreconrado.net
Ter Jul 10 18:01:52 -03 2012
Saudações,
Criei uma consulta para verificar lacunas de códigos em uma tabela.
Independente da lógica usada, encontrei um inconsistência na execução
da mesma e gostaria da verificação dos senhores:
SELECT COUNT(0), MAX(ID), MIN(ID), MAX(ID) - MIN(ID) + 1 FROM TABELA
WHERE ID >= ?;
Em teoria este comando deveria retornar o total de registros, o maior
ID, O menor ID e a subtração do maior código pelo menor código.
Entretanto, em testes feitos em várias tabelas ocorrem a mesma
incoerência:
? = 5430 | COUNT = 4 , MAX = 5433, MIN = 5430, SUB = 4 | COUNT = SUB OK
? = 5425 | COUNT = 9 , MAX = 5433, MIN = 5425, SUB = 9 | COUNT = SUB OK
? = 5420 | COUNT = 14 , MAX = 5433, MIN = 5420, SUB = 1 | COUNT > SUB
Começa a incoerência. Na falta de registros, SUB deveria > COUNT.
? = 5400 | COUNT = 33 , MAX = 5433, MIN = 5400, SUB = 3 | COUNT > SUB
Começa a incoerência. Na falta de registros, SUB deveria > COUNT.
Como disse antes, testei em algumas tabelas e a incoerência é sempre a
mesma, acima de 9 registros a subtração retorna valores estranhos.
Poderiam testar em seus bancos e verificar se isso ocorre também!?
FB 2.5.1.26351 - WIN 7 32
Realizei os testes com o ISQL.
Testando com a mesma versão do FB num servidor LINUX percebi que o
tipo de dados envolvidos na soma influenciam o cálculo, isto é, no
servidor windows o tipo retornado pela subtração é inteiro e o cálculo
fica incorreto, já no linux a execução do mesmo comando retorna um
tipo numérico com duas casas decimais e o cálculo retorna correto.
Após esta comprovação, inclui casas decimais no cálculo executado no windows:
SELECT COUNT(0), MAX(ID), MIN(ID), MAX(ID) - MIN(ID) + 1.00 FROM
TABELA WHERE ID >= ?;
E assim funcionou corretamente.
Alguém sabe dizer se isso é um BUG ou estou cometendo algum ERRO?
Abraços,
André Conrado.
Mais detalhes sobre a lista de discussão lista