• Sergey Petrunya's avatar
    Port of code for: (part of testcase is in mysql-test/t/subquery*.test and will... · 0ef2f743
    Sergey Petrunya authored
    Port of code for: (part of testcase is in mysql-test/t/subquery*.test and will be ported separately)
    
    Bug#11766642: crash in Item_field::register_field_in_read_map 
                  with view
    
    (Former 59793)
    
    Prior to the refactoring in this patch, Item_cond_xor behaved 
    partially as an Item_cond and partially as an Item_func. The
    reasoning behind this was that XOR is currently not optimized
    (thus should be Item_func instead of Item_cond), but it was 
    planned optimize it in the future (thus, made Item_cond anyway 
    to ease optimization later). 
    
    Even though Item_cond inherits from Item_func, there are 
    differences between these two. One difference is that the 
    arguments are stored differently. Item_cond stores them in a 
    list while Item_func store them in an args[]. 
    
    BUG no 45221 was caused by Item_cond_xor storing arguments in 
    the list while users of the objects would look for them in 
    args[]. The fix back then was to store the arguments in both 
    locations.
    
    In this bug, Item_cond_xor initially gets two Item_field 
    arguments. These are stored in the list inherited from 
    Item_cond and in args[] inherited from Item_func. During
    resolution, find_field_in_view() replaces the Item_fields 
    stored in the list with Item_direct_view_refs, but args[] 
    still points to the unresolved Item_fields. This shows that 
    the fix for 45221 was incorrect.
    
    The refactoring performed in this patch removes the confusion
    by making the XOR item an Item_func period. A neg_transformer() 
    is also implemented for Item_func_xor to improve performance 
    when negating XOR expressions. An XOR is negated by negating 
    one of the operands.
    0ef2f743
negation_elimination.test 3.93 KB