现象:
执行select c.id from hrm_center_department a left join hrmresource b on a.department_id=b.departmentid left join uf_zxbm c on a.center_department_id=c.zxbm where b.id='641'发生coredump,稳定重现。
分析:
根据core文件可知,直接原因是FollowTailIterator::Read()内对m_stored_rows解引用时为空:
该成员本应由调用链MaterializeIterator::Init() -> MaterializeIterator::MaterializeRecursive() -> FollowTailIterator::set_stored_rows_pointer()设置,但测试发现并未调用MaterializeIterator::Init()和MaterializeIterator::MaterializeRecursive()就在FollowTailIterator::Read()中解引用,说明执行计划存在问题。
FollowTailIterator::Init()中的注释也明确表明该现象不符合预期,无法通过debug版本的assert,确定为bug。
解决方法:
该bug并未被发现,亦未被官方专门修复,但随着版本更新和与之相伴的代码重构,整套代码已于8.0.28被完全删除,该查询的实现方式全然不同,该bug亦随之消失。
若不能尽快升级,可添加/*+ NO_BNL */ hint绕过有问题的执行计划,或添加索引绕过hashjoin。