• Varun Gupta's avatar
    MDEV-7773: Aggregate stored functions · 60c44658
    Varun Gupta authored
    This commit implements aggregate stored functions. The basic idea behind
    the feature is:
    
    * Implement a special instruction FETCH GROUP NEXT ROW that will pause
    the execution of the stored function. When the instruction is reached,
    execution of the initial query resumes "as if" the function returned.
    This gives the server the opportunity to advance to the next row in the
    result set.
    
    * Stored aggregates behave like regular aggregate functions. The
    implementation of thus resides in the class Item_sum_sp. Because it is
    an aggregate function, for each new row in the group, the
    Item_sum_sp::add() method will be called. This is when execution resumes
    and the function does another iteration to "add" one extra element to
    the final result.
    
    * When the end of group is reached, val_xxx() method will be called for
    the item. This case is handled by another execute step for the stored
    function, only with a special flag to force a call to the return
    handler. See Item_sum_sp::execute() for details.
    
    To allow this pause and resume semantic, we must preserve the function
    context across executions. This is stored in Item_sp::sp_query_arena only for
    aggregate stored functions, but has no impact for regular functions.
    
    We also enforce aggregate functions to include the "FETCH GROUP NEXT ROW"
    instruction.
    Signed-off-by: default avatarVicențiu Ciorbaru <vicentiu@mariadb.org>
    60c44658
is_columns_mysql_embedded.result 52.2 KB