diff options
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/optimizer/path/indxpath.c | 9 | ||||
-rw-r--r-- | src/backend/optimizer/plan/createplan.c | 5 |
2 files changed, 13 insertions, 1 deletions
diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c index 920593781b2..d51e84a80a2 100644 --- a/src/backend/optimizer/path/indxpath.c +++ b/src/backend/optimizer/path/indxpath.c @@ -2581,6 +2581,15 @@ match_index_to_operand(Node *operand, int indkey; /* + * Ignore any PlaceHolderVar nodes above the operand. This is needed so + * that we can successfully use expression-index constraints pushed down + * through appendrels (UNION ALL). It's safe because a PlaceHolderVar + * appearing in a relation-scan-level expression is certainly a no-op. + */ + while (operand && IsA(operand, PlaceHolderVar)) + operand = (Node *) ((PlaceHolderVar *) operand)->phexpr; + + /* * Ignore any RelabelType node above the operand. This is needed to be * able to apply indexscanning in binary-compatible-operator cases. Note: * we can assume there is at most one RelabelType node; diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index aea42b1dd46..9ac0c991902 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -2673,8 +2673,11 @@ fix_indexqual_operand(Node *node, IndexOptInfo *index, int indexcol) ListCell *indexpr_item; /* - * Remove any binary-compatible relabeling of the indexkey + * Remove any PlaceHolderVars or binary-compatible relabeling of the + * indexkey (this must match logic in match_index_to_operand()). */ + while (IsA(node, PlaceHolderVar)) + node = (Node *) ((PlaceHolderVar *) node)->phexpr; if (IsA(node, RelabelType)) node = (Node *) ((RelabelType *) node)->arg; |