注册

在 DM8 中,对同一个视图或 CTE 使用两个不同过滤条件进行 UNION ALL 查询时,LIKE '%A%' 分支错误返回了不匹配的数据。

Xy.Xie_WHU 2026/07/12 390 4

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:
DM Database Server 64 V8
DB Version: 0x7000d
03134284552-20260414-322369-20221
Msg Version: 1
Gsu level(5) cnt: 102
DM 管理工具
【操作系统】:
Windows 11 64 位
【CPU】:
Intel x86_64
【问题描述】*:
在 DM8 中,对同一个视图或 CTE 使用两个不同过滤条件进行 UNION ALL 查询时,LIKE '%A%' 分支错误返回了不匹配的数据。
测试字符串为:
r MFp
该字符串不包含字符 A,因此:
VC_0 LIKE '%A%' 应当为假。
但是,视图和 CTE 查询均返回两行相同数据。将相同查询结果物化到 ON COMMIT PRESERVE ROWS 临时表后,查询返回一行,结果恢复正常。
怀疑该问题与优化器对 UNION ALL、视图展开、CTE 展开或分支谓词处理有关。

复现脚本:
CREATE SCHEMA database0;
SET SCHEMA database0;
drop table if EXISTS T_DM_36;
drop view if EXISTS V_DM_36;
drop table if EXISTS TEMP_DM_36;
drop table if EXISTS TEMPOCPR_DM_36;

CREATE TABLE T_DM_36 (C0 BIGINT, C1 VARCHAR(32), C2 DOUBLE, C3 DOUBLE);

INSERT INTO T_DM_36 (C0, C1, C2, C3) VALUES (NULL, 'r MFp', 1942.077, 1777.559);

CREATE VIEW V_DM_36 (VC_0) AS SELECT A.C1 AS VC_0 FROM T_DM_36 A JOIN T_DM_36 B ON A.C2=B.C2 WHERE (A.C0 IS NULL) AND (A.C1 IS NOT NULL);
SELECT VC_0 FROM V_DM_36 WHERE VC_0 IS NOT NULL UNION ALL SELECT VC_0 FROM V_DM_36 WHERE VC_0 LIKE '%A%';
-- 2 row

-- r MFp
-- r MFp

WITH CTE AS (SELECT A.C1 AS VC_0 FROM T_DM_36 A JOIN T_DM_36 B ON A.C2=B.C2 WHERE (A.C0 IS NULL) AND (A.C1 IS NOT NULL)) SELECT VC_0 FROM CTE WHERE VC_0 IS NOT NULL UNION ALL SELECT VC_0 FROM CTE WHERE VC_0 LIKE '%A%';
-- 2 row

-- r MFp
-- r MFp

CREATE TEMPORARY TABLE TEMP_DM_36 AS SELECT A.C1 AS VC_0 FROM T_DM_36 A JOIN T_DM_36 B ON A.C2=B.C2 WHERE (A.C0 IS NULL) AND (A.C1 IS NOT NULL);
SELECT VC_0 FROM TEMP_DM_36 WHERE VC_0 IS NOT NULL UNION ALL SELECT VC_0 FROM TEMP_DM_36 WHERE VC_0 LIKE '%A%';
-- Empty set

CREATE TEMPORARY TABLE TEMPOCPR_DM_36 ON COMMIT PRESERVE ROWS AS SELECT A.C1 AS VC_0 FROM T_DM_36 A JOIN T_DM_36 B ON A.C2=B.C2 WHERE (A.C0 IS NULL) AND (A.C1 IS NOT NULL);
SELECT VC_0 FROM TEMPOCPR_DM_36 WHERE VC_0 IS NOT NULL UNION ALL SELECT VC_0 FROM TEMPOCPR_DM_36 WHERE VC_0 LIKE '%A%';
-- 1 row

-- r MFp

对比结论:
相同逻辑的查询结果如下:
查询来源 实际行数 预期行数
视图 2 1
CTE 2 1
ON COMMIT PRESERVE ROWS 临时表 1 1
因为物化到临时表之后结果正常,怀疑错误发生在视图或 CTE 未物化时的优化器改写阶段,而不是 LIKE 运算本身。

希望确认的问题

  1. 请问该现象是否为当前版本的已知 Bug?
  2. 是否与 UNION ALL 公共部分提取、视图展开、CTE 展开或谓词下推有关?
  3. 是否存在可以临时关闭的相关优化参数或 SQL Hint?
  4. 是否有包含该问题修复的补丁版本或更新计划?
  5. 除了物化临时表以外,是否有更合适的临时规避方案?
    该问题会导致 SQL 返回不符合过滤条件的数据,属于查询结果正确性问题,请协助确认,谢谢。
回答 0
暂无回答
扫一扫
联系客服