1. test_if_ref method which checks whether predicate is already evaluated due to ref/eq_ref access or not was incorrectly removing a predicate that was not implicitly evaluated due to ref access (due to presence of filesort ?) It was field=NULL predicate. Such predicate should be kept and execution engine will filter out rows correctly. Removal of such predicate led to returning of rows which had NULL for join/predicate columns. 2. field COMP_OP NULL will always false for all fields except when COMP_OP is NULL-safe equality operator. Modified range optimizer to return zero row count in such cases. Query now does not even run. It returns zero result. As such Fix(1) is not required but we might hit that case in some other query (I have not tried it yet) 3. Fixed Field::val_str to print "NULL" for literal NULL instead of "0". It added lot of confusion while debugging.