[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