aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/gist/gistscan.c
diff options
context:
space:
mode:
authorNeil Conway <neilc@samurai.com>2005-06-15 07:27:44 +0000
committerNeil Conway <neilc@samurai.com>2005-06-15 07:27:44 +0000
commitc119c5bd49baa424480bd9e8f9dda69a09f5a572 (patch)
treec9466886d6e4b74506ce7f6fe190efb34d63dd2e /src/backend/access/gist/gistscan.c
parent4aaff553597222467769dd3b26e0d56c9c4a9b09 (diff)
downloadpostgresql-c119c5bd49baa424480bd9e8f9dda69a09f5a572.tar.gz
postgresql-c119c5bd49baa424480bd9e8f9dda69a09f5a572.zip
Change the implementation of hash join to attempt to avoid unnecessary
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.
Diffstat (limited to 'src/backend/access/gist/gistscan.c')
0 files changed, 0 insertions, 0 deletions