问题现象
在 OceanBase 数据库 V3.2.3 及之前版本,Oracle 模式下,执行如下 UPDATE 向量形式更新,向量子查询中存在常量,且子查询查询结果为空集的情况下,开启 PDML 会出现正确性问题。
开启 PDML 执行,B 为空表。
UPDATE /*+ enable_parallel_dml parallel(4) */ A
SET (c1,c2) = (SELECT 1, c1 from B);
关键诊断信息
触发条件
Oracle 模式下,执行 UPDATE 向量形式更新,向量子查询中存在常量,且子查询查询结果为空集的情况下,开启 PDML 会出现正确性问题。
问题原因
OceanBase 当前对于 remove_const 这个表达式的标记维护的不对,依然保留了其 IS_CONST 的标,导致表达式分配框架没有把 remove_const 识别为共享表达式。
影响租户
影响 OceanBase 数据库中的 Oracle 租户,对于 SYS 租户和 MySQL 租户无影响。
影响版本
OceanBase 数据库 V3.1.2 GA(oceanbase-3.1.2-20210618150922)及之后版本、V3.2.3 GA(oceanbase-3.2.3.0-20220419)及之后版本。
解决方法
升级到问题已修复版本,目前已修复的版本包含 OceanBase 数据库 V3.2.3 BP9(oceanbase-3.2.3.3-109000182023071410)。
规避方式
对于向量形式的更新语句,且子查询中存在常量的情况,禁用 PDML。