• Tom Lane's avatar
    Reduce memory consumption for multi-statement query strings. · b5810de3
    Tom Lane authored
    Previously, exec_simple_query always ran parse analysis, rewrite, and
    planning in MessageContext, allowing all the data generated thereby
    to persist until the end of processing of the whole query string.
    That's fine for single-command strings, but if a client sends many
    commands in a single simple-Query message, this strategy could result
    in annoying memory bloat, as complained of by Andreas Seltenreich.
    
    To fix, create a child context to do this work in, and reclaim it
    after each command.  But we only do so for parsetrees that are not
    last in their query string.  That avoids adding any memory management
    overhead for the typical case of a single-command string.  Memory
    allocated for the last parsetree would be freed immediately after
    finishing the command string anyway.
    
    Similarly, adjust extension.c's execute_sql_string() to reclaim memory
    after each command.  In that usage, multi-command strings are the norm,
    so it's a bit surprising that no one has yet complained of bloat ---
    especially since the bloat extended to whatever data ProcessUtility
    execution might leak.
    
    Amit Langote, reviewed by Julien Rouhaud
    
    Discussion: https://postgr.es/m/87ftp6l2qr.fsf@credativ.de
    b5810de3
extension.c 92.9 KB