问题现象
当 MERGE INTO 的 insert 子句放在 update 子句之前时,如果走 Plan Cache 会触发该问题。
示例如下。
MERGE INTO lgj t using (select '15' C1 from dual) t1 on (t.C1 = t1.C1)
when not matched then
insert (C1,C2,C3)values('15','lgj','22')
when matched then
update set t.C2='13',t.C3='15' where t.C1='15'
关键诊断信息
触发条件
当 MERGE INTO 的 insert 子句放在 update 子句之前时,如果走 Plan Cache。
问题原因
对于上面的 SQL:
normal parser 解析序。
15 (13 15 15)[not match caluse] (15 lgj 22)[match caluse]faster parser 解析序。
15 (15 lgj 22)[match caluse] (13 15 15)[not match caluse]
应该是 parser 方面解析 MERGE INTO 子树有问题。
说明
fast parser 应该没有错误,解析参数的顺序是正常序;通常 normal parser 将语句生成语法树,那么语法树会经过参数化的逻辑,在参数化的逻辑中,通过树的后序遍历提取出参数。那么这个问题的核心点在于:normal parser 生成的语法树时,子树的序发生了错乱(类似于左子树和右子树颠倒了),导致参数化后,提取出的参数的顺序不对。
问题的风险及影响
正确性问题。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
影响的版本
OceanBase 数据库 V2.2.77 GA(oceanbase-2.2.77-20210508211731)及之后版本、V3.1.2 GA(oceanbase-3.1.2-20210618150922)及之后版本、V3.2.3 GA(oceanbase-3.2.3.0-20220418212020)及之后版本、V3.2.4 GA(oceanbase-3.2.4.0-100000072022102819)及之后版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库 V2.2.77 BP15(oceanbase-2.2.77-115000012023010607)及之后版本、V3.1.2 BP11(oceanbase-3.1.2-111000052023010412)及之后版本、V3.2.3 BP6 Hotfix4(oceanbase-3.2.3.3-106040022022122222)版本、V3.2.3 BP6 Hotfix5(oceanbase-3.2.3.3-106050012023051617)版本、V3.2.3 BP7(oceanbase-3.2.3.3-107000092023011911)及之后版本、V3.2.4 BP1(oceanbase-3.2.4.1-101000052023010822)及之后版本。
规避方式
可以先添加 Hint 禁用 Plan Cache 避过,MERGE /*+use_plan_cache(none)*/ INTO t_pmarket_task_organ_info。