From 9d8e8e11253e177f24436fbdbc8aff0715b5dd39 Mon Sep 17 00:00:00 2001 From: =?utf-8?q?=E4=B8=80=E6=8C=83?= Date: Tue, 1 Feb 2022 17:37:27 +0800 Subject: [PATCH v1 4/6] remove duplicated qual executing. --- src/backend/optimizer/path/equivclass.c | 22 +++++++++++++++++++ src/backend/optimizer/plan/createplan.c | 29 +++++++++++++++++++++++-- src/include/optimizer/paths.h | 2 ++ src/test/regress/parallel_schedule | 2 ++ 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/src/backend/optimizer/path/equivclass.c b/src/backend/optimizer/path/equivclass.c index 6ed9e8c9064..9ce0249b10d 100644 --- a/src/backend/optimizer/path/equivclass.c +++ b/src/backend/optimizer/path/equivclass.c @@ -3350,6 +3350,28 @@ is_redundant_derived_clause(RestrictInfo *rinfo, List *clauselist) return false; } + +bool +is_correlated_derived_clause(RestrictInfo *rinfo, List *clauselist) +{ + EquivalenceClass *derived_ec = rinfo->derived; + ListCell *lc; + + /* Fail if it's not a potentially-derived clause from some EC */ + if (derived_ec == NULL) + return false; + + foreach(lc, clauselist) + { + RestrictInfo *otherrinfo = (RestrictInfo *) lfirst(lc); + + if (otherrinfo->parent_ec == derived_ec) + return true; + } + + return false; +} + /* * is_redundant_with_indexclauses * Test whether rinfo is redundant with any clause in the IndexClause diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index cd6d72c7633..03c5207ede0 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -556,11 +556,14 @@ static Plan * create_scan_plan(PlannerInfo *root, Path *best_path, int flags) { RelOptInfo *rel = best_path->parent; - List *scan_clauses; + List *scan_clauses = NIL; List *gating_clauses; List *tlist; Plan *plan; + List *ppi_clauses = best_path->param_info ? best_path->param_info->ppi_clauses : NIL; + ListCell *lc; + /* * Extract the relevant restriction clauses from the parent relation. The * executor must apply all these restrictions during the scan, except for @@ -591,8 +594,18 @@ create_scan_plan(PlannerInfo *root, Path *best_path, int flags) * For paranoia's sake, don't modify the stored baserestrictinfo list. */ if (best_path->param_info) - scan_clauses = list_concat_copy(scan_clauses, + { + List *stripped_quals = NIL; + foreach(lc, rel->baserestrictinfo) + { + RestrictInfo *rinfo = lfirst_node(RestrictInfo, lc); + + if (!is_correlated_derived_clause(rinfo, ppi_clauses)) + stripped_quals = lappend(stripped_quals, rinfo); + } + scan_clauses = list_concat_copy(stripped_quals, best_path->param_info->ppi_clauses); + } /* * Detect whether we have any pseudoconstant quals to deal with. Then, if @@ -4912,6 +4925,7 @@ fix_indexqual_references(PlannerInfo *root, IndexPath *index_path, List *stripped_indexquals; List *fixed_indexquals; ListCell *lc; + List *ppi_clauses = index_path->path.param_info ? index_path->path.param_info->ppi_clauses : NIL; stripped_indexquals = fixed_indexquals = NIL; @@ -4921,6 +4935,17 @@ fix_indexqual_references(PlannerInfo *root, IndexPath *index_path, int indexcol = iclause->indexcol; ListCell *lc2; + if (is_correlated_derived_clause(iclause->rinfo, ppi_clauses)) + { + /* + * bitmapscan will read this indexquals as well. so we can't just igrore + * it for now. we can totally delete it. + */ + index_path->indexclauses = foreach_delete_current(index_path->indexclauses, lc); + continue; + } + + foreach(lc2, iclause->indexquals) { RestrictInfo *rinfo = lfirst_node(RestrictInfo, lc2); diff --git a/src/include/optimizer/paths.h b/src/include/optimizer/paths.h index ce2aac7d3aa..08d8612cdba 100644 --- a/src/include/optimizer/paths.h +++ b/src/include/optimizer/paths.h @@ -188,6 +188,8 @@ extern bool eclass_useful_for_merging(PlannerInfo *root, extern bool is_redundant_derived_clause(RestrictInfo *rinfo, List *clauselist); extern bool is_redundant_with_indexclauses(RestrictInfo *rinfo, List *indexclauses); +extern bool is_correlated_derived_clause(RestrictInfo *rinfo, List *clauselist); + /* * pathkeys.c diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule index 861c30a73ae..b071324b961 100644 --- a/src/test/regress/parallel_schedule +++ b/src/test/regress/parallel_schedule @@ -134,3 +134,5 @@ test: fast_default # run stats by itself because its delay may be insufficient under heavy load test: stats + +test: ec_filter \ No newline at end of file -- 2.21.0