• Evgeny Potemkin's avatar
    Bug#34384: Slow down on constant conversion. · 60d358af
    Evgeny Potemkin authored
    When values of different types are compared they're converted to a type that
    allows correct comparison. This conversion is done for each comparison and
    takes some time. When a constant is being compared it's possible to cache the
    value after conversion to speedup comparison. In some cases (large dataset,
    complex WHERE condition with many type conversions) query might be executed
    7% faster.
    
    A test case isn't provided because all changes are internal and isn't visible
    outside.
    
    The behavior of the Item_cache is changed to cache values on the first request
    of cached value rather than at the moment of storing item to be cached.
    A flag named value_cached is added to the Item_cache class. It's set to TRUE
    when cache holds the value of the last stored item.
    Function named cache_value() is added to the Item_cache class and derived classes.
    This function actually caches the value of the saved item.
    Item_cache_xxx::store functions now only store item to be cached and set
    value_cached flag to FALSE.
    Item_cache_xxx::val_xxx functions are changed to call cache_value function
    prior to returning cached value if value_cached is FALSE.
    The Arg_comparator::set_cmp_func function now calls cache_converted_constant
    to cache constants if they need a type conversion.
    The Item_cache::get_cache function is overloaded to allow setting of the
    cache type.
    The cache_converted_constant function is added to the Arg_comparator class.
    It checks whether a value can and should be cached and if so caches it.
    60d358af
item.cc 210 KB