InterSystems Official
Mario Sanchez Macias · Jul 22

Alerta: Resultados Incorrectos en las Consultas ‘GROUP BY’ No Estándar

InterSystems ha corregido un defecto que puede ocasionar resultados incorrectos en consultas SQL. Este defecto afecta a:

  • Todas las versiones principales y versiones de mantenimiento de InterSystems IRIS e InterSystems IRIS for Health, desde 2019.1.0

Un bloque de SQL puede encontrarse con el defecto sólo si se cumplen las siguientes condiciones:

  • El bloque contiene una condición GROUP BY pero no incluye ningún agregado, como COUNT(*).
  • La condición SELECT incluye un campo que no está en la condición GROUP BY*, y el bloque contiene una condición WHERE en ese campo.
  • Los resultados del bloque de SQL se pueden determinar totalmente desde un índice único, y ese índice empieza con el campo en la condición GROUP BY del bloque.

*: tened en cuenta que este uso específico de campos no agrupados en la condición SELECT es una Extensión SQL de InterSystems y no forma parte del estándar SQL.

Al final de este artículo se muestran algunos ejemplos de consultas afectadas y no afectadas.

Como resultado del defecto, la condición WHERE en el listado anterior no se aplica correctamente a los resultados de las consultas. Y, por tanto, la consulta puede devolver filas que no cumplen las condiciones de la consulta.

La correción a este defecto se ha identificado como AK1043 y se incluirá en todas las futuras versiones de los productos, incluyendo InterSystems IRIS e InterSystems IRIS for Health 2020.1.2 y 2021.1.1. También está disponible a través de distribución ad hoc desde el Centro de Soporte Internacional (WRC).

Nota a los clientes de HealthShare

InterSystems ha revisado el problema en la familia de productos HealthShare y no ha encontrado ninguna consulta que cumpla los criterios anteriores. Los clientes de HealthShare que utilizan las funcionalidades de InterSystems IRIS de forma independiente a su instalación de HealthShare, tendrán que revisar su lógica y sus personalizaciones para saber si pueden estar sufriendo este defecto.

Para cualquier pregunta sobre esta alerta, contacta con el Centro de Soporte Internacional (WRC).

Ejemplos

A modo de ejemplo, mostramos el ejemplo de una tabla (test.TestTable) con tres propiedades Integer y un índice en dos de esas propiedades:

Property Int1 As %Integer;

Property Int2 As %Integer;

Property Int3 As %Integer;

Index GroupBy On (Int1, Int2);

Algunos ejemplos de consultas afectadas:

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

  • Esta consulta cumple todas las condiciones señaladas anteriormente. Como resultado del defecto, la consulta también devuelve filas con Int2 <= 1.

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

  • Esta consulta también estaría afectada por el defecto porque el campo ID está incluido en cada índice, por lo que la consulta devolvería filas con Int2 > 1.

Algunos ejemplos de consultas no afectadas:

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

  • Esta consulta no incluye una claúsula GROUP BY , por tanto, no está afectada.

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

  • Esta consulta contiene un agregado en la lista de SELECT, por tanto tampoco estaría afectada.

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

SELECT Int1, Int2 FROM test.TestTable GROUP BY Int1

  • Ninguna de estas consultas contiene una condición WHERE sobre un campo que NO está en la claúsula GROUP BY, así que no estarían afectadas.

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

  • El índice compuesto de la tabla no comienza con el campo en la claúsula GROUP BY, así que no está afectada.

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

  • Estas consultas usan el valor Int3, que no está guardado en el índice. Como no pueden ser resueltas usando sólo el índice, no estarían afectadas.
10
2 0 0 30
Log in or sign up to continue