• Tom Lane's avatar
    Speed up ruleutils' name de-duplication code, and fix overlength-name case. · 8004953b
    Tom Lane authored
    Since commit 11e13185, ruleutils.c has
    attempted to ensure that each RTE in a query or plan tree has a unique
    alias name.  However, the code that was added for this could be quite slow,
    even as bad as O(N^3) if N identical RTE names must be replaced, as noted
    by Jeff Janes.  Improve matters by building a transient hash table within
    set_rtable_names.  The hash table in itself reduces the cost of detecting a
    duplicate from O(N) to O(1), and we can save another factor of N by storing
    the number of de-duplicated names already created for each entry, so that
    we don't have to re-try names already created.  This way is probably a bit
    slower overall for small range tables, but almost by definition, such cases
    should not be a performance problem.
    
    In principle the same problem applies to the column-name-de-duplication
    code; but in practice that seems to be less of a problem, first because
    N is limited since we don't support extremely wide tables, and second
    because duplicate column names within an RTE are fairly rare, so that in
    practice the cost is more like O(N^2) not O(N^3).  It would be very much
    messier to fix the column-name code, so for now I've left that alone.
    
    An independent problem in the same area was that the de-duplication code
    paid no attention to the identifier length limit, and would happily produce
    identifiers that were longer than NAMEDATALEN and wouldn't be unique after
    truncation to NAMEDATALEN.  This could result in dump/reload failures, or
    perhaps even views that silently behaved differently than before.  We can
    fix that by shortening the base name as needed.  Fix it for both the
    relation and column name cases.
    
    In passing, check for interrupts in set_rtable_names, just in case it's
    still slow enough to be an issue.
    
    Back-patch to 9.3 where this code was introduced.
    8004953b
create_view.sql 15.2 KB