InterSystems Oficial
Pete Greskoff · Jul. 26

Alerta: Resultados Incorretos em Consultas Não Padrão ‘GROUP BY’

21 de Julho de 2021 – Alerta: Resultados Incorretos em Consultas Não Padrão ‘GROUP BY’
 
A InterSystems corrigiu um defeito que pode causar resultados incorretos em consultas SQL. Este defeito afeta:
  • Todas as versões completas e de manutenção das plataformas InterSystems IRIS e InterSystems IRIS for Health, a partir da 2019.1.0

Um bloco de consulta pode apresentar o defeito apenas se apresentar todas as condições abaixo:

  • O bloco de consulta contém uma cláusula GROUP BY porém não inclui nenhum agregador como COUNT(*).
  • A cláusula SELECT inclui um campo que não está presente na cláusula GROUP BY*, e o bloco de consulta contém uma condição WHERE com este campo.
  • Os resultados do bloco de consulta podem ser determinados inteiramente a partir de um único índice, e este índice inicia com o campo presente na cláusula GROUP BY do bloco de consulta.

*: notem que este uso específico de campos não agrupados na cláusula SELECT é uma Extensão do SQL InterSystems e não faz parte do padrão SQL.

Alguns exemplos de consultas afetadas e não afetadas são mostrados ao final deste documento.

O resultado apresentado pelo defeito é que a condição WHERE condition na lista acima não é corretamente aplicada aos resultados da consulta, por isso a consulta pode retornar linhas que não atendam às condições da consulta.

A correção deste defeito é identificada por AK1043 e será incluída em todas as versões futuras, incluindo as versões 2020.1.2 e 2021.1.1 das plataformas InterSystems IRIS e InterSystems IRIS for Health. Ela também está disponível através de distribuição Ad hoc no Worldwide Response Center InterSystems (WRC).

Nota para Clientes HealthShare

A InterSystems revisou esta questão nos produtos da família HealthShare e verificou que eles não contém consultas que se enquadrem nos critérios acima. Clientes HealthShare utilizando funcionalidades da plataforma de dados InterSystems IRIS de forma independente de suas instalações dos produtos da família HealthShare precisarão revisar sua lógica e qualquer customização para determinar se elas podem ser impactadas por este defeito. 

Se você tiver qualquer dúvida referente a este alerta, por favor entre em contato com o Worldwide Response Center.

Exemplos

Para ilustrar o defeito, abaixo colocamos um exemplo de uma tabela (test.TestTable) com três propriedades do tipo %Integer e um índice a partir de duas destas propriedades:

Property Int1 As %Integer;

Property Int2 As %Integer;

Property Int3 As %Integer;

Index GroupBy On (Int1, Int2);

Exemplos de consultas afetadas pelo defeito:

SELECT Int1, Int2 FROM test.TestTable WHERE Int2 > 1 GROUP BY Int1

  • Esta consulta possui todas as condições apresentadas acima. Como resultado do defeito, esta consulta também retorna linhas onde Int2 <= 1.

SELECT Int1, ID FROM test.TestTable WHERE Int2 <= 1 GROUP BY Int1

  • Esta consulta também é afetada pois o campo ID está incluído em todos os índices, resultando no fato desta consulta retornar linhas onde Int2 > 1.

Alguns exemplos de consultas não afetadas:

SELECT Int1, Int2 FROM test.TestTable WHERE Int2 > 1

  • Esta consulta não inclui uma cláusula GROUP BY, então não é afetada.

SELECT Int1, Int2, COUNT(*) FROM test.TestTable WHERE Int2 > 1 GROUP BY Int1

  • Esta consulta contém um agregador na lista SELECT, então não é afetada.

SELECT Int1, Int2 FROM test.TestTable WHERE Int1 > 1 GROUP BY Int1

SELECT Int1, Int2 FROM test.TestTable GROUP BY Int1

  • Nenhuma das consultas contém uma condição WHERE sobre o campo que NÃO está na cláusula GROUP BY, então não são afetadas.

SELECT Int1, Int2 FROM test.TestTable WHERE Int1 > 1 GROUP BY Int2

  • O índice composto da tabela não inicia com o campo da cláusula GROUP BY, então esta consulta não é afetada.

SELECT Int1, Int2 FROM test.TestTable WHERE Int2 > 1 AND Int3 > 1 GROUP BY Int1

SELECT Int1, Int3 FROM test.TestTable WHERE Int2 > 1 GROUP BY Int 1

  • Ambas as consultas acima utilizam o valor de Int3, que não é armazenado no índice. Como elas não podem ser resolvidas utilizando apenas o índice, elas não são afetadas.
10
2 0 0 13
Log in or sign up to continue