InterSystems公式
· 2025年2月21日

警告:SQLクエリが間違った結果を返す

2025 年 2 月 15 日 – 警告:SQLクエリが間違った結果を返す

インターシステムズは、SQL クエリが不正な結果を返す原因となる 2 つの問題を修正しました。さらに、日付/時刻データ型の処理における不整合を修正しました。この日付/時刻データ型の処理の修正により以前の不整合な動作に依存していた既存のアプリケーションでは、異なる予期しない(正しい)結果が返される可能性があります。

DP-436825: ラテラル結合を使用したSQLクエリが間違った結果を返すことがある

最初の問題 (DP-436825) は、プロセスあたりの最大メモリ (.cpf ファイルの「bbsiz」パラメータ) を既定値以外で構成されたインスタンスで、暗黙的または明示的にラテラル結を使用する SQL クエリにのみ影響します。InterSystems IRIS を新規にインストールすると、bbsiz は既定値の -1 (つまり、メモリ制限はありません) に設定されます。一方、古いバージョンからのアップグレードでは、以前の設定が維持されます。この設定でクエリが実行時に並列処理を使用する場合 (システムが並列処理を使用する場合を含む)、クエリが正しくない結果を返すことがあります。この問題は、以下の製品のバージョン 2023.3、2024.1.0、2024.1.1、2024.1.2、2024.2、および 2024.3 に影響します:

  • InterSystems IRIS® data platform
  • InterSystems IRIS® for Health
  • HealthShare® Health Connect

この問題は、HealthShare® Unified Care Record および関連製品にも影響します:バージョン 2024.2 の HealthShare Unified Care Record および関連製品では、製品コードでラテラル結合を使用する SQL クエリは使用されません。しかしプロセスあたりの最大メモリが既定値以外かつ HealthShare 2024.2 にアップグレードした場合は、ユーザがラテラル結合を使用する独自の SQL クエリを記述している際には影響を受ける可能性があります。 この問題を回避するには、以下の3つのいずれかを実施します :

  • bbsizパラメータを -1 に設定
  • ラテラル結合を含むクエリで %NOPARALLEL キーワードの使用
  • インスタンスのアダプティブ・モードを一時的に無効して、クエリの自動並列処理を回避

これらの回避方法によって、クエリが正しい結果を返すことを確認しています。この問題の修正は DP-436825 として修正され、2024.1.3、2025.1.0 以降の製品リリースに含まれます。 また、Adhoc形式での配布も可能です。

DP-436998: %ID による逆ソートの SQL クエリが無限ループになる

2つ目の問題 (DP-436998) は、行 ID の降順で並べ替えを行うSQLクエリで、行 ID が正の(ビットマップ互換の) 整数で、かつ、特定のデータ状況において発生します。これらの条件下では、クエリが無限ループに入り、中断されるまで同じ結果セットを返し続ける可能性があります。この問題は、以下の製品のバージョン2022.2、2022.3、2023.x、2024.xに影響します :

  • InterSystems IRIS® data platform
  • InterSystems IRIS® for Health
  • HealthShare® Health Connect

また、HealthShare® Unified Care Record および関連製品にも影響します: バージョン 2024.1 およびバージョン 2024.2 の HealthShare® Unified Care Record および関連製品では、製品コードで %ID による逆ソートを含む SQL クエリを使用していませんが、%ID による逆ソートを含む独自のSQL クエリを記述しているユーザは影響を受ける可能性があります。この問題の修正は DP-436998 として修正され、2023.1.6、2024.1.3、2025.1.0 以降の製品リリースに含まれます。 また、Adhoc形式での配布も可能です。

DP-436633: DATE 値とTIMESTAMP 値を比較するSQLクエリ

インターシステムズは、<= 演算子、> 演算子、および BETWEEN 演算子を使用した DATE 値と TIMESTAMP 値の比較方法の不一致を修正しました。この修正により、特定の日付と時刻の比較結果が変更されました。この修正は、以下の製品のバージョン 2023.3 以降で導入されました。

  • InterSystems IRIS® data platform
  • InterSystems IRIS® for Health
  • HealthShare® Health Connect

また、HealthShare® Unified Care Record および関連製品にも影響します: バージョン 2024.2 以降

更新された動作では、DATE 値は比較の前に TIMESTAMP 値に強制されます。これは、精度の低いデータ型を最も精度の高いデータ型に強制変換するというSQLの標準に準拠しています。

例えば、新しい動作 (これは標準に準拠しています) では MyTimestamp が正確に午前零時と一致する場合を除き、これらのフィールドの値が同じ日付に対応する場合、「MyTimeStamp > MyDate」 というクエリ述語は FALSE と評価されます。以前は、この動作は、MyTimeStamp フィールドが %PosixTime 形式で定義されている場合にのみ完全に標準に準拠し、%Timestamp または特定の特殊関数と変数の組み合わせを使用すると、特定のケースで標準に準拠しない結果を返していました。

予測可能な比較を確実に行うために、InterSystems では、明示的な CAST 関数を使用することをお勧めします。特に、結果の型が明らかでない可能性がある GETDATE()、NVL()、IFNULL() などの CASE 文や SQL 関数を使用する場合は、明示的な CAST 関数を使用することをお勧めします。

どの文が動作の変更の影響を受けるかを評価しやすくするため、クエリプランに警告を表示します。また、そのような文が実行時にエラーを発生するようにするオプションのシステム・フラグを導入しました。このフラグを有効にすると、アプリケーション・コードのリグレッション・テストの際に役立ち、実行時のユーザ・クエリに対する追加のセーフティ・ネットを提供することができます。この情報提供機能は DP-436633として識別され、2024.1.4 および2025.1.0 以降のすべての製品リリースに含まれる予定です。

この警告について質問がある場合は、カスタマーサポートセンターにご連絡下さい。

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください