From 95871703e395889fd371ce6604b68617d33b32a4 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 1 Mar 2005 01:40:05 +0000 Subject: [PATCH] Adjust OR indexscan logic to not generate redundant condition-free OR indexscans involving partial indexes. These would always be dominated by a simple indexscan on such an index, so there's no point in considering them. Fixes overoptimism in a patch I applied last October. --- src/backend/optimizer/path/orindxpath.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/backend/optimizer/path/orindxpath.c b/src/backend/optimizer/path/orindxpath.c index 210abfe1d9..ffd08c738c 100644 --- a/src/backend/optimizer/path/orindxpath.c +++ b/src/backend/optimizer/path/orindxpath.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/path/orindxpath.c,v 1.64 2004/12/31 22:00:04 pgsql Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/path/orindxpath.c,v 1.65 2005/03/01 01:40:05 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -387,10 +387,14 @@ best_or_subclause_index(Query *root, /* * Ignore index if it doesn't match the subclause at all; except - * that if it's a partial index, consider it anyway, since the - * selectivity of the predicate alone might make the index useful. + * that if it's a partial index matching the current OR subclause, + * consider it anyway, since effectively we are using the index + * predicate to match the subclause. (Note: we exclude partial + * indexes that are predOK; else such a partial index would be + * considered to match *every* OR subclause, generating bogus OR + * plans that are redundant with the basic scan on that index.) */ - if (indexclauses == NIL && index->indpred == NIL) + if (indexclauses == NIL && (index->indpred == NIL || index->predOK)) continue; /* Convert clauses to indexquals the executor can handle */ -- 2.40.0