• Neil Conway's avatar
    Per a bug report from Theo Schlossnagle, plperl_return_next() leaks · ebdefb93
    Neil Conway authored
    memory in the executor's per-query memory context. It also inefficient:
    it invokes get_call_result_type() and TupleDescGetAttInMetadata() for
    every call to return_next, rather than invoking them once (per PL/Perl
    function call) and memoizing the result.
    
    This patch makes the following changes:
    
    - refactor the code to include all the "per PL/Perl function call" data
    inside a single struct, "current_call_data". This means we don't need to
    save and restore N pointers for every recursive call into PL/Perl, we
    can just save and restore one.
    
    - lookup the return type metadata needed by plperl_return_next() once,
    and then stash it in "current_call_data", so as to avoid doing the
    lookup for every call to return_next.
    
    - create a temporary memory context in which to evaluate the return
    type's input functions. This memory context is reset for each call to
    return_next.
    
    The patch appears to fix the memory leak, and substantially reduces
    the overhead imposed by return_next.
    ebdefb93
plperl.c 47.2 KB