diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2019-02-14 19:37:30 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2019-02-14 19:37:30 -0500 |
commit | 8fd3fdd85a3e22f04b2cb0949450f63cb48952cd (patch) | |
tree | 1b3468699da2df4730637f972a7eb94e2546acce /src/backend/optimizer/plan/createplan.c | |
parent | 86eea78694ce0d95e74cc82cc29c096d66a9accd (diff) | |
download | postgresql-8fd3fdd85a3e22f04b2cb0949450f63cb48952cd.tar.gz postgresql-8fd3fdd85a3e22f04b2cb0949450f63cb48952cd.zip |
Simplify the planner's new representation of indexable clauses a little.
In commit 1a8d5afb0, I thought it'd be a good idea to define
IndexClause.indexquals as NIL in the most common case where the given
clause (IndexClause.rinfo) is usable exactly as-is. It'd be more
consistent to define the indexquals in that case as being a one-element
list containing IndexClause.rinfo, but I thought saving the palloc
overhead for making such a list would be worthwhile.
In hindsight, that was a great example of "premature optimization is the
root of all evil": it's complicated everyplace that needs to deal with
the indexquals, requiring duplicative code to handle both the simple
case and the not-simple case. I'd initially found that tolerable but
it's getting less so as I mop up some areas that I'd not touched in
1a8d5afb0. In any case, two more pallocs during a planner run are
surely at the noise level (a conclusion confirmed by a bit of
microbenchmarking). So let's change this decision before it becomes
set in stone, and insist that IndexClause.indexquals always be a valid
list of the actual index quals for the clause.
Discussion: https://postgr.es/m/24586.1550106354@sss.pgh.pa.us
Diffstat (limited to 'src/backend/optimizer/plan/createplan.c')
-rw-r--r-- | src/backend/optimizer/plan/createplan.c | 30 |
1 files changed, 6 insertions, 24 deletions
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index c7645acad2c..236f506cfb2 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -3075,11 +3075,8 @@ create_bitmap_subplan(PlannerInfo *root, Path *bitmapqual, Assert(!rinfo->pseudoconstant); subquals = lappend(subquals, rinfo->clause); - if (iclause->indexquals) - subindexquals = list_concat(subindexquals, - get_actual_clauses(iclause->indexquals)); - else - subindexquals = lappend(subindexquals, rinfo->clause); + subindexquals = list_concat(subindexquals, + get_actual_clauses(iclause->indexquals)); if (rinfo->parent_ec) subindexECs = lappend(subindexECs, rinfo->parent_ec); } @@ -4491,33 +4488,18 @@ fix_indexqual_references(PlannerInfo *root, IndexPath *index_path, { IndexClause *iclause = lfirst_node(IndexClause, lc); int indexcol = iclause->indexcol; + ListCell *lc2; - if (iclause->indexquals == NIL) + foreach(lc2, iclause->indexquals) { - /* rinfo->clause is directly usable as an indexqual */ - Node *clause = (Node *) iclause->rinfo->clause; + RestrictInfo *rinfo = lfirst_node(RestrictInfo, lc2); + Node *clause = (Node *) rinfo->clause; stripped_indexquals = lappend(stripped_indexquals, clause); clause = fix_indexqual_clause(root, index, indexcol, clause, iclause->indexcols); fixed_indexquals = lappend(fixed_indexquals, clause); } - else - { - /* Process the derived indexquals */ - ListCell *lc2; - - foreach(lc2, iclause->indexquals) - { - RestrictInfo *rinfo = lfirst_node(RestrictInfo, lc2); - Node *clause = (Node *) rinfo->clause; - - stripped_indexquals = lappend(stripped_indexquals, clause); - clause = fix_indexqual_clause(root, index, indexcol, - clause, iclause->indexcols); - fixed_indexquals = lappend(fixed_indexquals, clause); - } - } } *stripped_indexquals_p = stripped_indexquals; |