aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Munro <tmunro@postgresql.org>2019-06-18 22:38:30 +1200
committerThomas Munro <tmunro@postgresql.org>2019-06-19 02:13:52 +1200
commit14d8b539d3bd4cf9faf65ca86a733bada202107f (patch)
tree5e6d8f501f6c0bcb5db8117657ee9bc3731578d1
parente5f26d79badfae8018ac70f2137158fe36246c2b (diff)
downloadpostgresql-14d8b539d3bd4cf9faf65ca86a733bada202107f.tar.gz
postgresql-14d8b539d3bd4cf9faf65ca86a733bada202107f.zip
Prevent Parallel Hash Join for JOIN_UNIQUE_INNER.
WHERE EXISTS (...) queries cannot be executed by Parallel Hash Join with jointype JOIN_UNIQUE_INNER, because there is no way to make a partial plan totally unique. The consequence of allowing such plans was duplicate results from some EXISTS queries. Back-patch to 11. Bug #15857. Author: Thomas Munro Reviewed-by: Tom Lane Reported-by: Vladimir Kriukov Discussion: https://postgr.es/m/15857-d1ba2a64bce0795e%40postgresql.org
-rw-r--r--src/backend/optimizer/path/joinpath.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/backend/optimizer/path/joinpath.c b/src/backend/optimizer/path/joinpath.c
index 642f9510938..1a00200ac1b 100644
--- a/src/backend/optimizer/path/joinpath.c
+++ b/src/backend/optimizer/path/joinpath.c
@@ -1867,9 +1867,12 @@ hash_inner_and_outer(PlannerInfo *root,
/*
* Can we use a partial inner plan too, so that we can build a
- * shared hash table in parallel?
+ * shared hash table in parallel? We can't handle
+ * JOIN_UNIQUE_INNER because we can't guarantee uniqueness.
*/
- if (innerrel->partial_pathlist != NIL && enable_parallel_hash)
+ if (innerrel->partial_pathlist != NIL &&
+ save_jointype != JOIN_UNIQUE_INNER &&
+ enable_parallel_hash)
{
cheapest_partial_inner =
(Path *) linitial(innerrel->partial_pathlist);