InterSystems 已纠正了两个可能导致少数 SQL 查询返回不正确结果的问题。 此外,InterSystems 还纠正了日期/时间数据类型处理中的不一致性,对于依赖于先前不一致性行为的现有应用程序来说,这种不一致性可能会导致不同的、意想不到的但正确的结果。
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
该问题也会影响基于上述产品的其他 InterSystems 产品,包括 HealthShare® Unified Care Record和套件:版本 2024.2。虽然Unified Care Record和套件在产品代码中不使用横向连接的 SQL 查询,但升级到 HealthShare 2024.2 的 HealthShare 客户如果具有非默认的每个进程内存限制,并且还编写了自己的使用横向连接的 SQL 查询,则可能会受到影响。
要避免该问题,请使用以下三个选项之一:
- 将 bbsiz 参数设置为-1,取消每个进程的内存限制。
- 在包含横向连接的查询中使用 %NOPARALLEL 关键字。
- 暂时禁用 自适应模式(Adaptive Mode)避免自动并行处理符合条件的查询
这些方法都能确保查询返回正确的结果。
该缺陷的修正被标识为 DP-436825,并将从 2024.1.3 和 2025.1.0 版本开始,包含在所有未来的产品发布中。 该修复也可以通过Ad-hoc分发。
DP-436998:按 %ID 反排序的 SQL 查询进入无尽循环
第二个问题(DP-436998)影响按行 ID 降序排序的 SQL 查询,其中行 ID 为正整数(与位图兼容),特别是在特定数据的情况下。 在这种情况下,查询可能会进入无尽循环,并不断返回相同的结果集,直至终止。
此问题影响以下产品的 2022.2、2022.3、2023.x 和 2024.x 版本:
- InterSystems IRIS® data platform
- InterSystems IRIS® for Health
- HealthShare®Health Connect
它还会影响基于上述产品的其他 InterSystems 产品,包括 HealthShare® Unified Care Record和套件:2024.1 版和 2024.2 版。 虽然Unified Care Record和套件在产品代码中不使用按 %ID 反向排序的 SQL 查询,但 HealthShare 2024.1 和 HealthShare 2024.2 客户自己编写的按 %ID 反向排序的 SQL 查询可能会受到影响。
,该缺陷的更正标识为 DP-436998。 从 2023.1.6、2024.1.3 和 2025.1.0 开始,今后的所有产品版本都将包含该功能。 该修复也可以通过Ad-hoc分发。
DP-436633: 比较 DATE 和 TIMESTAMP 值的 SQL 查询
InterSystems 最近纠正了使用 <=、> 和 BETWEEN 操作符比较 DATE 和 TIMESTAMP 值的不一致性。 此修正更改了特定日期和时间比较的结果。
这一更新后的行为是在以下(产品/系统)的 2023.3 版本中引入的
- InterSystems IRIS® data platform
- InterSystems IRIS® for Health
- HealthShare®Health Connect
它还会影响基于上述产品的其他 InterSystems 产品,包括 HealthShare® Unified Care Record和套件:Version 2024.2。
它适用于所有后续版本。
更新行为后,在比较之前会将日期值强制转换为 TIMESTAMP 值。 这符合 SQL 标准,即将较不精确的数据类型强制转换为最精确的数据类型。
例如,采用新的行为(这是符合标准的),当这些字段的值对应相同的日历日期时(除非 MyTimestamp 正好对应午夜),查询谓词“MyTimeStamp > MyDate”的评估结果为 FALSE。 之前,只有当 MyTimeStamp 字段被定义为 %PosixTime 格式时,行为才完全符合标准,而在使用 %Timestamp 或某些特殊函数和变量的组合时,某些情况下会返回不符合标准的结果。
为了确保比较的可预测性,InterSystems 建议使用显式的 CAST 函数,特别是在使用 CASE 语句或 SQL 函数(如 GETDATE()、NVL() 和 IFNULL())时,因为这些函数的结果类型可能并不明显。
为了帮助评估哪些语句会受到行为变更的影响,InterSystems 在查询计划中引入了一个警告,并提供了一个可选的系统标志,使得此类语句在运行时能够引发错误。 启用该标记有助于对应用程序代码进行回归测试,并为运行时的用户查询提供额外的安全网。 此信息功能标识为 DP-436633,将包含在从 2024.1.4 和 2025.1.0 开始的所有未来产品版本中。
更多信息
如果您对本警报有任何疑问,请联系
全球响应中心。