aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer')
-rw-r--r--src/backend/optimizer/path/indxpath.c9
-rw-r--r--src/backend/optimizer/plan/createplan.c5
2 files changed, 13 insertions, 1 deletions
diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c
index 58b8797b738..e97c1636b1a 100644
--- a/src/backend/optimizer/path/indxpath.c
+++ b/src/backend/optimizer/path/indxpath.c
@@ -2286,6 +2286,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 7a81010e4cf..bf0c6208333 100644
--- a/src/backend/optimizer/plan/createplan.c
+++ b/src/backend/optimizer/plan/createplan.c
@@ -2623,8 +2623,11 @@ fix_indexqual_operand(Node *node, IndexOptInfo *index)
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;