aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/path/orindxpath.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/path/orindxpath.c')
-rw-r--r--src/backend/optimizer/path/orindxpath.c42
1 files changed, 22 insertions, 20 deletions
diff --git a/src/backend/optimizer/path/orindxpath.c b/src/backend/optimizer/path/orindxpath.c
index 2cc1c2467f3..9eb0484fc2f 100644
--- a/src/backend/optimizer/path/orindxpath.c
+++ b/src/backend/optimizer/path/orindxpath.c
@@ -8,14 +8,12 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/path/orindxpath.c,v 1.35 2000/01/26 05:56:34 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/orindxpath.c,v 1.36 2000/02/05 18:26:09 tgl Exp $
*
*-------------------------------------------------------------------------
*/
-#include "postgres.h"
-
-
+#include "postgres.h"
#include "nodes/nodeFuncs.h"
#include "optimizer/clauses.h"
@@ -33,7 +31,8 @@ static void best_or_subclause_indices(Query *root, RelOptInfo *rel,
List **indexids,
Cost *cost);
static void best_or_subclause_index(Query *root, RelOptInfo *rel,
- List *indexqual, List *indices,
+ Expr *subclause, List *indices,
+ List **retIndexQual,
Oid *retIndexid,
Cost *retCost);
@@ -43,7 +42,7 @@ static void best_or_subclause_index(Query *root, RelOptInfo *rel,
* Creates index paths for indices that match 'or' clauses.
* create_index_paths() must already have been called.
*
- * 'rel' is the relation entry for which the paths are to be defined on
+ * 'rel' is the relation entry for which the paths are to be created
* 'clauses' is the list of available restriction clause nodes
*
* Returns a list of index path nodes.
@@ -164,21 +163,16 @@ best_or_subclause_indices(Query *root,
foreach(slist, subclauses)
{
Expr *subclause = lfirst(slist);
- List *indexqual;
+ List *best_indexqual;
Oid best_indexid;
Cost best_cost;
- /* Convert this 'or' subclause to an indexqual list */
- indexqual = make_ands_implicit(subclause);
- /* expand special operators to indexquals the executor can handle */
- indexqual = expand_indexqual_conditions(indexqual);
-
- best_or_subclause_index(root, rel, indexqual, lfirst(indices),
- &best_indexid, &best_cost);
+ best_or_subclause_index(root, rel, subclause, lfirst(indices),
+ &best_indexqual, &best_indexid, &best_cost);
Assert(best_indexid != InvalidOid);
- *indexquals = lappend(*indexquals, indexqual);
+ *indexquals = lappend(*indexquals, best_indexqual);
*indexids = lappendi(*indexids, best_indexid);
*cost += best_cost;
@@ -193,41 +187,49 @@ best_or_subclause_indices(Query *root,
* the least expensive.
*
* 'rel' is the node of the relation on which the index is defined
- * 'indexqual' is the indexqual list derived from the subclause
+ * 'subclause' is the OR subclause being considered
* 'indices' is a list of IndexOptInfo nodes that match the subclause
+ * '*retIndexQual' gets a list of the indexqual conditions for the best index
* '*retIndexid' gets the OID of the best index
* '*retCost' gets the cost of a scan with that index
*/
static void
best_or_subclause_index(Query *root,
RelOptInfo *rel,
- List *indexqual,
+ Expr *subclause,
List *indices,
+ List **retIndexQual, /* return value */
Oid *retIndexid, /* return value */
Cost *retCost) /* return value */
{
- bool first_run = true;
+ bool first_time = true;
List *ilist;
/* if we don't match anything, return zeros */
+ *retIndexQual = NIL;
*retIndexid = InvalidOid;
*retCost = 0.0;
foreach(ilist, indices)
{
IndexOptInfo *index = (IndexOptInfo *) lfirst(ilist);
+ List *indexqual;
Cost subcost;
Assert(IsA(index, IndexOptInfo));
+ /* Convert this 'or' subclause to an indexqual list */
+ indexqual = extract_or_indexqual_conditions(rel, index, subclause);
+
subcost = cost_index(root, rel, index, indexqual,
false);
- if (first_run || subcost < *retCost)
+ if (first_time || subcost < *retCost)
{
+ *retIndexQual = indexqual;
*retIndexid = index->indexoid;
*retCost = subcost;
- first_run = false;
+ first_time = false;
}
}
}