• Alexander Barkov's avatar
    A joint patch for: · 92bd6801
    Alexander Barkov authored
    - MDEV-5689 ExtractValue(xml, 'substring(/x,/y)') crashes
    - MDEV-5709 ExtractValue() with XPath variable references returns wrong result.
    
    Description:
    
    1. The main problem was that that nodeset_func->fix_fields() was
    called in Item_func_xml_extractvalue::val_str() and
    Item_func_xml_update::val_str(), which led in some cases to
    execution of the XPath engine *before* having a parsed XML value.
    Moved to Item_xml_str_func::fix_fields().
    
    2. Cleanup: added a new method Item_xml_str_func::fix_fields() and moved
    most of the code from Item_xml_str_func::fix_length_and_dec()
    to Item_xml_str_func::fix_fields(), to follow the usual Item layout.
    
    3. Cleanup: a parsed XML value is useless without the raw XML value
    it was built from.
    
    Previously the parsed and the raw values where stored in separate String
    instances. It was hard to follow how they are synchronized.
    Added a helper class XML which contains both parsed and raw values.
    Makes things easier to read and modify.
    
    4. MDEV-5709: const_item() could incorrectly return a "true"
    result when XPath expression contains users/SP variable references.
    Now nodeset_func->const_item() is also taken into account to
    catch such cases.
    
    5. Minor code enhancements.
    92bd6801
item_xmlfunc.cc 74.9 KB