基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
merge into 临时表时在计划执行阶段触发报错-4016 问题排查
更新时间:2026-08-25 02:41
问题现象
在执行包含 MERGE INTO 语句的存储过程时,若目标表为临时表,且 MERGE INTO 语句同时包含 INSERT 和 UPDATE 子句,且源表(src 表)为复杂视图,SQL 执行会报错 -4016。
ORA-00600: internal error code, arguments: -4016, Internal error
问题原因
该问题是 OceanBase 数据库内核中的一个 Bug。在计划生成阶段,当 MERGE INTO 语句的目标为临时表,且源表为复杂视图时,优化器在解析表别名时出现逻辑错误。具体表现为:代价改写深拷贝 stmt 时没有维护 view_base_item_,而优化阶段有一些地方依赖这个字段,导致报错。
关键信息
关键日志
[2024-08-13 11:29:39.252968] WDIAG [SQL.OPT] generate_equal_constraint (ob_merge_log_plan.cpp:557) [1263491][T1002_L0_G0][T1002][YB42AC18793A-00061D45521BDE54-0-0] [lt=27][errcode=-4016] get unexpected null(ret=-4016, target_table_scan=NULL)
[2024-08-13 11:29:39.252990] WDIAG [SQL.OPT] check_update_insert_sharding_basic (ob_merge_log_plan.cpp:502) [1263491][T1002_L0_G0][T1002][YB42AC18793A-00061D45521BDE54-0-0] [lt=21][errcode=-4016] failed to generate equal constraint(ret=-4016)
[2024-08-13 11:29:39.252997] WDIAG [SQL.OPT] check_merge_need_multi_partition_dml (ob_merge_log_plan.cpp:455) [1263491][T1002_L0_G0][T1002][YB42AC18793A-00061D45521BDE54-0-0] [lt=6][errcode=-4016] failed to check update insert sharding basic(ret=-4016)
[2024-08-13 11:29:39.253006] WDIAG [SQL.OPT] create_merge_plans (ob_merge_log_plan.cpp:220) [1263491][T1002_L0_G0][T1002][YB42AC18793A-00061D45521BDE54-0-0] [lt=8][errcode=-4016] failed to check need multi-partition dml(ret=-4016)
[2024-08-13 11:29:39.253011] WDIAG [SQL.OPT] candi_allocate_merge (ob_merge_log_plan.cpp:176) [1263491][T1002_L0_G0][T1002][YB42AC18793A-00061D45521BDE54-0-0] [lt=4][errcode=-4016] failed to create merge plans(ret=-4016)
[2024-08-13 11:29:39.253016] WDIAG [SQL.OPT] generate_normal_raw_plan (ob_merge_log_plan.cpp:80) [1263491][T1002_L0_G0][T1002][YB42AC18793A-00061D45521BDE54-0-0] [lt=5][errcode=-4016] failed to allocate merge operator(ret=-4016)
[2024-08-13 11:29:39.253024] WDIAG [SQL.OPT] generate_raw_plan (ob_log_plan.cpp:11977) [1263491][T1002_L0_G0][T1002][YB42AC18793A-00061D45521BDE54-0-0] [lt=8][errcode=-4016] fail to generate normal raw plan(ret=-4016)
问题的风险及影响
- SQL 执行报错
-4016。 - SQL 结果正确性问题。
- OBServer core(潜在风险)。
适用版本
OceanBase 数据库 4.x 版本。
解决方法
- 将
MERGE INTO语句拆分为独立的INSERT和UPDATE语句。 - 升级到已修复该问题的版本。
规避方式
- 将
MERGE INTO语句拆分为独立的INSERT和UPDATE语句。