19 février 2025 – Alerte : les requêtes SQL renvoient des résultats erronés
InterSystems a corrigé deux problèmes pouvant entraîner le renvoi de résultats erronés par un petit nombre de requêtes SQL. De plus, InterSystems a corrigé une incohérence dans la gestion des types de données date/heure qui peut entraîner des résultats différents, inattendus, mais corrects, pour les applications existantes qui s'appuient sur le comportement antérieur et incohérent.
DP-436825 : les requêtes SQL avec jointure latérale peuvent renvoyer des résultats erronés
Le premier problème (DP-436825) affecte uniquement les requêtes SQL qui utilisent une jointure latérale, implicitement ou explicitement, sur une instance configurée avec une limite de mémoire par processus non par défaut (paramètre « bbsiz » dans le fichier .cpf). Une nouvelle installation d'InterSystems IRIS a une valeur bbsiz par défaut de -1 (il n'y a donc pas de limite de mémoire), tandis qu'une mise à niveau à partir d'une version plus ancienne conserverait le paramètre précédent. Lorsqu'une telle requête utilise l'exécution parallélisée au moment de l'exécution, y compris les cas où le système utilise l'exécution parallélisée, la requête peut renvoyer des résultats incorrects. Ce problème affecte les versions 2023.3, 2024.1.0, 2024.1.1, 2024.1.2, 2024.2 et 2024.3 des produits suivants :
- Plateforme de données InterSystems IRIS®
- InterSystems IRIS® for Health
- HealthShare® Health Connect
Le problème affecte également d'autres produits InterSystems basés sur les produits ci-dessus, notamment HealthShare® Unified Care Record et Suite : Version 2024.2 Bien que le dossier de soins unifié et la suite n'utilisent pas de requêtes SQL qui utilisent une jointure latérale dans le code du produit, les clients HealthShare qui effectuent une mise à niveau vers HealthShare 2024.2 avec une limite de mémoire par processus non par défaut qui écrivent également leurs propres requêtes SQL qui utilisent une jointure latérale peuvent être affectés.
Pour éviter ce problème, utilisez l'une des trois options suivantes :
- Supprimez la limite de mémoire par processus en définissant le paramètre bbsiz sur -1.
- Utilisez le mot clé %NOPARALLEL dans les requêtes qui incluent une jointure latérale.
- Désactivez temporairement le mode adaptatif pour l'instance, ce qui évite le traitement parallèle automatique des requêtes éligibles.
Tout cela garantit que la requête renvoie des résultats corrects. La correction de ce défaut est identifiée comme DP-436825 et sera incluse dans toutes les futures versions du produit à partir de 2024.1.3 et 2025.1.0. Elle est également disponible via une distribution ad hoc.
DP-436998 : requêtes SQL avec tri inversé par %ID entrant dans une boucle sans fin
Le deuxième problème (DP-436998) affecte les requêtes SQL qui classent par ID de ligne décroissant et dans lesquelles l'ID de ligne est un entier positif (compatible bitmap) et en particulier, les circonstances spécifiques aux données. Dans ces conditions, la requête peut entrer dans une boucle sans fin et continuer à renvoyer le même ensemble de résultats jusqu'à ce qu'elle soit abandonnée. Ce problème affecte les versions 2022.2, 2022.3, 2023.x et 2024.x des produits suivants :
- Plateforme de données InterSystems IRIS®
- InterSystems IRIS® for Health
- HealthShare® Health Connect
Il affecte également d'autres produits InterSystems basés sur les produits ci-dessus, notamment HealthShare® Unified Care Record and Suite : Version 2024.1 et version 2024.2. Bien que le dossier de soins unifié et la suite n'utilisent pas de requêtes SQL avec tri inversé par %ID dans le code produit, les clients HealthShare 2024.1 et HealthShare 2024.2 qui écrivent leurs propres requêtes SQL avec tri inversé par %ID peuvent être concernés. La correction de ce défaut est identifiée comme DP-436998. Elle sera incluse dans toutes les futures versions de produits à partir de 2023.1.6, 2024.1.3 et 2025.1.0. Elle est également disponible via une distribution ad hoc.
DP-436633 : Requêtes SQL comparant les valeurs DATE et TIMESTAMP
InterSystems a récemment corrigé une incohérence dans la manière dont les valeurs DATE et TIMESTAMP sont comparées à l'aide des opérateurs <=, > et BETWEEN. Cette correction modifie les résultats de comparaisons de date et d'heure particulières. Le comportement mis à jour a été introduit dans la version 2023.3 de :
- Plateforme de données InterSystems IRIS®
- InterSystems IRIS® for Health
- HealthShare® Health Connect
Elle affecte également d'autres produits InterSystems basés sur les produits ci-dessus, notamment HealthShare® Unified Care Record and Suite : Version 2024.2.
Elle s'applique à toutes les versions ultérieures.
Avec le comportement mis à jour, les valeurs DATE sont converties en une valeur TIMESTAMP avant la comparaison. Cela est conforme à la norme SQL qui consiste à convertir le type de données le moins précis en type de données le plus précis.
Par exemple, avec le nouveau comportement (conforme à la norme), un prédicat de requête « MyTimeStamp > MyDate » est évalué à FAUX lorsque les valeurs de ces champs correspondent à la même date de calendrier, sauf lorsque MyTimestamp correspond exactement à minuit. Auparavant, le comportement n'était entièrement conforme à la norme que lorsque le champ MyTimeStamp était défini avec le format %PosixTime et renvoyait des résultats non conformes dans certains cas lors de l'utilisation de %Timestamp ou de certaines combinaisons de fonctions et variables spéciales.
Pour garantir des comparaisons prévisibles, InterSystems recommande d'utiliser des fonctions CAST explicites, en particulier lors de l'utilisation d'instructions CASE ou de fonctions SQL telles que GETDATE(), NVL() et IFNULL(), où le type résultant peut ne pas être évident.
Pour aider à évaluer les instructions affectées par le changement de comportement, InterSystems a introduit un avertissement dans le plan de requête et un indicateur système facultatif pour que ces instructions génèrent une erreur lors de l'exécution. L'activation de l'indicateur peut être utile lors des tests de régression du code d'application et peut offrir un filet de sécurité supplémentaire pour les requêtes utilisateur lors de l'exécution. Cette fonctionnalité d'information est identifiée comme DP-436633 et sera incluse dans toutes les futures versions du produit à partir de 2024.1.4 et 2025.1.0.
Informations complémentaires
Si vous subissez l'impact de ce défaut, contactez le Worldwide Response Center (WRC) pour obtenir de l'aide.