• Evgeny Potemkin's avatar
    Bug#33546: Slowdown on re-evaluation of constant expressions. · 9f7d2458
    Evgeny Potemkin authored
          
    Constant expressions in WHERE/HAVING/ON clauses aren't cached and evaluated
    for each row. This causes slowdown of query execution especially if constant
    UDF/SP function are used.
          
    Now WHERE/HAVING/ON expressions are analyzed in the top-bottom direction with
    help of the compile function. When analyzer meets a constant item it
    sets a flag for the tree transformer to cache the item and doesn't allow tree
    walker to go deeper. Thus, the topmost item of a constant expression if
    cached. This is done after all other optimizations were applied to
    WHERE/HAVING/ON expressions
          
    A helper function called cache_const_exprs is added to the JOIN class.
    It calls compile method with caching analyzer and transformer on WHERE,
    HAVING, ON expressions if they're present.
    The cache_const_expr_analyzer and cache_const_expr_transformer functions are
    added to the Item class. The first one check if the item can be cached and
    the second caches it if so.
    A new Item_cache_datetime class is derived from the Item_cache class.
    It caches both int and string values of the underlying item independently to
    avoid DATETIME aware int-to-string conversion. Thus it completely relies on
    the ability of the underlying item to correctly convert DATETIME value from
    int to string and vice versa.
    9f7d2458
item.h 103 KB