• David Rowley's avatar
    Fix planner's use of Result Cache with unique joins · 9e215378
    David Rowley authored
    When the planner considered using a Result Cache node to cache results
    from the inner side of a Nested Loop Join, it failed to consider that the
    inner path's parameterization may not be the entire join condition.  If
    the join was marked as inner_unique then we may accidentally put the cache
    in singlerow mode.  This meant that entries would be marked as complete
    after caching the first row.  That was wrong as if only part of the join
    condition was parameterized then the uniqueness of the unique join was not
    guaranteed at the Result Cache's level.  The uniqueness is only guaranteed
    after Nested Loop applies the join filter.  If subsequent rows were found,
    this would lead to:
    
    ERROR: cache entry already complete
    
    This could have been fixed by only putting the cache in singlerow mode if
    the entire join condition was parameterized.  However, Nested Loop will
    only read its inner side so far as the first matching row when the join is
    unique, so that might mean we never get an opportunity to mark cache
    entries as complete.  Since non-complete cache entries are useless for
    subsequent lookups, we just don't bother considering a Result Cache path
    in this case.
    
    In passing, remove the XXX comment that claimed the above ERROR might be
    better suited to be an Assert.  After there being an actual case which
    triggered it, it seems better to keep it an ERROR.
    
    Reported-by: David Christensen
    Discussion: https://postgr.es/m/CAOxo6X+dy-V58iEPFgst8ahPKEU+38NZzUuc+a7wDBZd4TrHMQ@mail.gmail.com
    9e215378
nodeResultCache.c 33.7 KB