diff options
Diffstat (limited to 'src/backend/optimizer/plan/createplan.c')
-rw-r--r-- | src/backend/optimizer/plan/createplan.c | 42 |
1 files changed, 36 insertions, 6 deletions
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index 70a5e6461bd..341e6080d60 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.1.1.1 1996/07/09 06:21:37 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.2 1996/08/26 06:31:15 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -316,8 +316,11 @@ create_indexscan_node(IndexPath *best_path, List *indxqual = NIL; List *qpqual = NIL; List *fixed_indxqual = NIL; + List *ixid; IndexScan *scan_node = (IndexScan*)NULL; - + bool lossy = FALSE; + HeapTuple indexTuple; + IndexTupleForm index; /* * If an 'or' clause is to be used with this index, the indxqual @@ -340,15 +343,42 @@ create_indexscan_node(IndexPath *best_path, NIL); } + /* check and see if any indices are lossy */ + foreach (ixid, best_path->indexid) { + indexTuple = SearchSysCacheTuple(INDEXRELID, + ObjectIdGetDatum(lfirsti(ixid)), + 0,0,0); + if (!HeapTupleIsValid(indexTuple)) + elog(WARN, "create_plan: index %d not found", + lfirsti(ixid)); + index = (IndexTupleForm)GETSTRUCT(indexTuple); + if (index->indislossy) + lossy = TRUE; + } + + /* - * The qpqual field contains all restrictions except the indxqual. + * The qpqual field contains all restrictions not automatically handled + * by the index. Note that for non-lossy indices, the predicates + * in the indxqual are handled by the index, while for lossy indices + * the indxqual predicates need to be double-checked after the + * index fetches the best-guess tuples. */ - if(or_clause((Node*)index_clause)) + if(or_clause((Node*)index_clause)) { qpqual = set_difference(scan_clauses, lcons(index_clause,NIL)); - else + + if (lossy) + qpqual = nconc(qpqual, + lcons((List *)copyObject(index_clause),NIL)); + } + else { qpqual = set_difference(scan_clauses, lfirst(indxqual)); - + if (lossy) + qpqual = nconc(qpqual, + (List *)copyObject(lfirst(indxqual))); + } + fixed_indxqual = (List*)fix_indxqual_references((Node*)indxqual,(Path*)best_path); |