aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/util/restrictinfo.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/util/restrictinfo.c')
-rw-r--r--src/backend/optimizer/util/restrictinfo.c187
1 files changed, 0 insertions, 187 deletions
diff --git a/src/backend/optimizer/util/restrictinfo.c b/src/backend/optimizer/util/restrictinfo.c
index 55ce9d86543..d500154f5d8 100644
--- a/src/backend/optimizer/util/restrictinfo.c
+++ b/src/backend/optimizer/util/restrictinfo.c
@@ -15,7 +15,6 @@
#include "postgres.h"
#include "optimizer/clauses.h"
-#include "optimizer/predtest.h"
#include "optimizer/restrictinfo.h"
#include "optimizer/var.h"
@@ -88,192 +87,6 @@ make_restrictinfo(Expr *clause,
}
/*
- * make_restrictinfo_from_bitmapqual
- *
- * Given the bitmapqual Path structure for a bitmap indexscan, generate
- * RestrictInfo node(s) equivalent to the condition represented by the
- * indexclauses of the Path structure.
- *
- * The result is a List (effectively, implicit-AND representation) of
- * RestrictInfos.
- *
- * The caller must pass is_pushed_down, but we assume outerjoin_delayed
- * and pseudoconstant are false while outer_relids and nullable_relids
- * are NULL (no other kind of qual should ever get into a bitmapqual).
- *
- * If include_predicates is true, we add any partial index predicates to
- * the explicit index quals. When this is not true, we return a condition
- * that might be weaker than the actual scan represents.
- *
- * To do this through the normal make_restrictinfo() API, callers would have
- * to strip off the RestrictInfo nodes present in the indexclauses lists, and
- * then make_restrictinfo() would have to build new ones. It's better to have
- * a specialized routine to allow sharing of RestrictInfos.
- *
- * The qual manipulations here are much the same as in create_bitmap_subplan;
- * keep the two routines in sync!
- */
-List *
-make_restrictinfo_from_bitmapqual(Path *bitmapqual,
- bool is_pushed_down,
- bool include_predicates)
-{
- List *result;
- ListCell *l;
-
- if (IsA(bitmapqual, BitmapAndPath))
- {
- BitmapAndPath *apath = (BitmapAndPath *) bitmapqual;
-
- /*
- * There may well be redundant quals among the subplans, since a
- * top-level WHERE qual might have gotten used to form several
- * different index quals. We don't try exceedingly hard to eliminate
- * redundancies, but we do eliminate obvious duplicates by using
- * list_concat_unique.
- */
- result = NIL;
- foreach(l, apath->bitmapquals)
- {
- List *sublist;
-
- sublist = make_restrictinfo_from_bitmapqual((Path *) lfirst(l),
- is_pushed_down,
- include_predicates);
- result = list_concat_unique(result, sublist);
- }
- }
- else if (IsA(bitmapqual, BitmapOrPath))
- {
- BitmapOrPath *opath = (BitmapOrPath *) bitmapqual;
- List *withris = NIL;
- List *withoutris = NIL;
-
- /*
- * Here, we only detect qual-free subplans. A qual-free subplan would
- * cause us to generate "... OR true ..." which we may as well reduce
- * to just "true". We do not try to eliminate redundant subclauses
- * because (a) it's not as likely as in the AND case, and (b) we might
- * well be working with hundreds or even thousands of OR conditions,
- * perhaps from a long IN list. The performance of list_append_unique
- * would be unacceptable.
- */
- foreach(l, opath->bitmapquals)
- {
- List *sublist;
-
- sublist = make_restrictinfo_from_bitmapqual((Path *) lfirst(l),
- is_pushed_down,
- include_predicates);
- if (sublist == NIL)
- {
- /*
- * If we find a qual-less subscan, it represents a constant
- * TRUE, and hence the OR result is also constant TRUE, so we
- * can stop here.
- */
- return NIL;
- }
-
- /*
- * If the sublist contains multiple RestrictInfos, we create an
- * AND subclause. If there's just one, we have to check if it's
- * an OR clause, and if so flatten it to preserve AND/OR flatness
- * of our output.
- *
- * We construct lists with and without sub-RestrictInfos, so as
- * not to have to regenerate duplicate RestrictInfos below.
- */
- if (list_length(sublist) > 1)
- {
- withris = lappend(withris, make_andclause(sublist));
- sublist = get_actual_clauses(sublist);
- withoutris = lappend(withoutris, make_andclause(sublist));
- }
- else
- {
- RestrictInfo *subri = (RestrictInfo *) linitial(sublist);
-
- Assert(IsA(subri, RestrictInfo));
- if (restriction_is_or_clause(subri))
- {
- BoolExpr *subor = (BoolExpr *) subri->orclause;
-
- Assert(or_clause((Node *) subor));
- withris = list_concat(withris,
- list_copy(subor->args));
- subor = (BoolExpr *) subri->clause;
- Assert(or_clause((Node *) subor));
- withoutris = list_concat(withoutris,
- list_copy(subor->args));
- }
- else
- {
- withris = lappend(withris, subri);
- withoutris = lappend(withoutris, subri->clause);
- }
- }
- }
-
- /*
- * Avoid generating one-element ORs, which could happen due to
- * redundancy elimination or ScalarArrayOpExpr quals.
- */
- if (list_length(withris) <= 1)
- result = withris;
- else
- {
- /* Here's the magic part not available to outside callers */
- result =
- list_make1(make_restrictinfo_internal(make_orclause(withoutris),
- make_orclause(withris),
- is_pushed_down,
- false,
- false,
- NULL,
- NULL,
- NULL));
- }
- }
- else if (IsA(bitmapqual, IndexPath))
- {
- IndexPath *ipath = (IndexPath *) bitmapqual;
-
- result = list_copy(ipath->indexclauses);
- if (include_predicates && ipath->indexinfo->indpred != NIL)
- {
- foreach(l, ipath->indexinfo->indpred)
- {
- Expr *pred = (Expr *) lfirst(l);
-
- /*
- * We know that the index predicate must have been implied by
- * the query condition as a whole, but it may or may not be
- * implied by the conditions that got pushed into the
- * bitmapqual. Avoid generating redundant conditions.
- */
- if (!predicate_implied_by(list_make1(pred), result))
- result = lappend(result,
- make_restrictinfo(pred,
- is_pushed_down,
- false,
- false,
- NULL,
- NULL,
- NULL));
- }
- }
- }
- else
- {
- elog(ERROR, "unrecognized node type: %d", nodeTag(bitmapqual));
- result = NIL; /* keep compiler quiet */
- }
-
- return result;
-}
-
-/*
* make_restrictinfos_from_actual_clauses
*
* Given a list of implicitly-ANDed restriction clauses, produce a list