• Tom Lane's avatar
    Fix incorrect permissions-checking code for extended statistics. · 7c6ce047
    Tom Lane authored
    Commit a4d75c86 improved the extended-stats logic to allow extended
    stats to be collected on expressions not just bare Vars.  To apply
    such stats, we first verify that the user has permissions to read all
    columns used in the stats.  (If not, the query will likely fail at
    runtime, but the planner ought not do so.)  That had to get extended
    to check permissions of columns appearing within such expressions,
    but the code for that was completely wrong: it applied pull_varattnos
    to the wrong pointer, leading to "unrecognized node type" failures.
    Furthermore, although you couldn't get to this because of that bug,
    it failed to account for the attnum offset applied by pull_varattnos.
    
    This escaped recognition so far because the code in question is not
    reached when the user has whole-table SELECT privilege (which is the
    common case), and because only subexpressions not specially handled
    by statext_is_compatible_clause_internal() are at risk.
    
    I think a large part of the reason for this bug is under-documentation
    of what statext_is_compatible_clause() is doing and what its arguments
    are, so do some work on the comments to try to improve that.
    
    Per bug #17570 from Alexander Kozhemyakin.  Patch by Richard Guo;
    comments and other cosmetic improvements by me.  (Thanks also to
    Japin Li for diagnosis.)  Back-patch to v14 where the bug came in.
    
    Discussion: https://postgr.es/m/17570-f2f2e0f4bccf0965@postgresql.org
    7c6ce047
stats_ext.out 113 KB