mirror of
https://github.com/apache/impala.git
synced 2026-01-08 12:02:54 -05:00
The bug: When gathering join predicates, we eliminate redundant ones based on equivalence classes. However, predicates that reference an outer-joined tuple cannot be safely removed even if the corresponding equivalence class is already covered by another predicate because such predicates could imply 'slot IS NOT NULL' and removing them would allow NULL tuples from outer joins to be incorrectly returned. The fix: Retain otherwise redundant predicates if they reference a slot of an outer-joined tuple to maintain that the output of a join satisfies 'slot IS NOT NULL' (otherwise NULL tuples from preceding outer joins could incorrectly survive). For each outer-joined slot we only need to retain a single predicate. TODO: Consider better fixes for outer-joined slots: (1) Create IS NOT NULL predicates and place them at the lowest possible plan node. (2) Convert outer joins into inner joins (or full outer joins into left/right outer joins). Change-Id: Ie4dc20c1db3f3822d4b60e5dfbc00c024a1d3db7 Reviewed-on: http://gerrit.sjc.cloudera.com:8080/4485 Reviewed-by: Alex Behm <alex.behm@cloudera.com> Tested-by: jenkins