• Neil Conway's avatar
    Change the implementation of hash join to attempt to avoid unnecessary · c119c5bd
    Neil Conway authored
    work if either of the join relations are empty. The logic is:
    
    (1) if the inner relation's startup cost is less than the outer
        relation's startup cost and this is not an outer join, read
        a single tuple from the inner relation via ExecHash()
          - if NULL, we're done
    
    (2) read a single tuple from the outer relation
          - if NULL, we're done
    
    (3) build the hash table on the inner relation
          - if hash table is empty and this is not an outer join,
            we're done
    
    (4) otherwise, do hash join as usual
    
    The implementation uses the new MultiExecProcNode API, per a
    suggestion from Tom: invoking ExecHash() now produces the first
    tuple from the Hash node's child node, whereas MultiExecHash()
    builds the hash table.
    
    I had to put in a bit of a kludge to get the row count returned
    for EXPLAIN ANALYZE to be correct: since ExecHash() is invoked to
    return a tuple, and then MultiExecHash() is invoked, we would
    return one too many tuples to EXPLAIN ANALYZE. I hacked around
    this by just manually detecting this situation and subtracting 1
    from the EXPLAIN ANALYZE row count.
    c119c5bd
execnodes.h 41.7 KB