diff --git a/src/backend/optimizer/plan/analyzejoins.c b/src/backend/optimizer/plan/analyzejoins.c index 16acafe..3516274 100644 --- a/src/backend/optimizer/plan/analyzejoins.c +++ b/src/backend/optimizer/plan/analyzejoins.c @@ -1111,6 +1111,16 @@ rel_is_distinct_for(PlannerInfo *root, RelOptInfo *rel, List *clause_list) var = (Var *) get_leftop(rinfo->clause); /* + * 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; eval_const_expressions() will have simplified if more + * than one. + */ + if (var && IsA(var, RelabelType)) + var = (Var *) ((RelabelType *) var)->arg; + + /* * If inner side isn't a Var referencing a subquery output column, * this clause doesn't help us. */