• Neil Conway's avatar
    ALTER TABLE ADD COLUMN exhibits a significant memory leak when adding a · 3df9abd1
    Neil Conway authored
    column with a default expression. In that situation, we need to rewrite
    the heap relation. To evaluate the new default expression, we use
    ExecEvalExpr(); however, this can allocate memory in the current memory
    context, and ATRewriteTable() does not switch out of the active portal's
    heap memory context. The end result is a rather large memory leak (on
    the order of gigabytes for a reasonably sized table).
    
    This patch changes ATRewriteTable() to switch to the per-tuple memory
    context before beginning the per-tuple loop. It also removes an explicit
    heap_freetuple() in the loop, since that is no longer needed.
    
    In an unrelated change, I noticed the code was scanning through the
    attributes of the new tuple descriptor for each tuple of the old table.
    I changed this to use precomputation, which should slightly speed up
    the loop.
    
    Thanks to steve@deefs.net for reporting the leak.
    3df9abd1
tablecmds.c 175 KB