为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【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);
-- r MFp
-- r MFp
-- 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
-- r MFp
对比结论:
相同逻辑的查询结果如下:
查询来源 实际行数 预期行数
视图 2 1
CTE 2 1
ON COMMIT PRESERVE ROWS 临时表 1 1
因为物化到临时表之后结果正常,怀疑错误发生在视图或 CTE 未物化时的优化器改写阶段,而不是 LIKE 运算本身。
希望确认的问题

应该是VIEW_PULLUP_FLAG包含2有关,改成1可以解决
sp_set_para_value(1,'VIEW_PULLUP_FLAG',1);