• Tom Lane's avatar
    Fix misapplication of pgstat_count_truncate to wrong relation. · 5deadfef
    Tom Lane authored
    The stanza of ExecuteTruncate[Guts] that truncates a target table's toast
    relation re-used the loop local variable "rel" to reference the toast rel.
    This was safe enough when written, but commit d42358ef added code below
    that that supposed "rel" still pointed to the parent table.  Therefore,
    the stats counter update was applied to the wrong relcache entry (the
    toast rel not the user rel); and if we were unlucky and that relcache
    entry had been flushed during reindex_relation, very bad things could
    ensue.
    
    (I'm surprised that CLOBBER_CACHE_ALWAYS testing hasn't found this.
    I'm even more surprised that the problem wasn't detected during the
    development of d42358ef; it must not have been tested in any case
    with a toast table, as the incorrect stats counts are very obvious.)
    
    To fix, replace use of "rel" in that code branch with a more local
    variable.  Adjust test cases added by d42358ef so that some of them
    use tables with toast tables.
    
    Per bug #15540 from Pan Bian.  Back-patch to 9.5 where d42358ef came in.
    
    Discussion: https://postgr.es/m/15540-01078812338195c0@postgresql.org
    5deadfef
stats.sql 6.35 KB