首批通过分布式安全可靠测评,为关键业务系统打造
非严格模式下 INSERT 分区裁剪报 4377
更新时间:2026-05-21 09:16
问题现象
该 BUG 复现的充分条件为: 1)多分区表,且涉及分区裁剪。 2)非严格模式向分区键插入 null 值。
set sql_mode='';
create table t1 (c1 int primary key) partition by key(c1) partitions 4; //primary key 默认 not null
insert into t1(c1) values(null), (null);
非严格模式下,向分区键插入 null 值时报如下错误。
check_new_row_partition_validity, fatal internal error(msg="Fatal Error!!! Catch a defensive error!", ret=-4377
关键诊断信息
触发条件
该 BUG 复现的充分条件为: 1)多分区表,且涉及分区裁剪。 2)非严格模式向分区键插入 null 值。
问题原因
在 OceanBase 数据库 V3.2.x 上实现非严格模式忽略 null 约束引入 目前优化器的设计上分配 insert 算子时优化器会进行分区裁剪,分配 distribute insert 时执行期动态计算。 非严格模式下,优化器按照 null 进行分区裁剪,但是实际上 null 是不能写入的,写的时候会写入当前数据类型的 zero 值,出现优化器裁剪错分区和执行器期间计算出的分区不一致问题,需要交给执行器期间动态运算,因为非严格模式下忽略 null 约束,应该分配 distribut insert,而不能分配普通的 insert。
问题风险及影响
导致优化器裁剪错分区和执行器期间计算出的分区不一致问题,读写数据的分区不符合预期。
影响租户
影响 OceanBase 数据库中的 Oracle 租户和 MySQL 租户,对于 SYS 租户无影响。
影响版本
OceanBase 数据库 V3.2.4 GA(oceanbase-3.2.4.0-100000072022102819)及之后版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库 V3.2.4 BP3 Hotfix2(oceanbase-3.2.4.3-103020012023051810)、V3.2.4 BP4(oceanbase-3.2.4.4-104000052023062021)及之后版本。
不使用非严格模式或不能向
not null列插入null值。
规避方式
不使用非严格模式或不能向 not null 列插入 null 值。