diff --git a/src/backend/partitioning/partprune.c b/src/backend/partitioning/partprune.c index badd31a44c..9eecf14fa9 100644 --- a/src/backend/partitioning/partprune.c +++ b/src/backend/partitioning/partprune.c @@ -1905,6 +1905,47 @@ match_clause_to_partition_key(GeneratePruningStepsContext *context, return PARTCLAUSE_MATCH_CLAUSE; } + else if (IsA(clause, RowCompareExpr)) + { + RowCompareExpr *rcexpr = (RowCompareExpr *) clause; + int nopers = list_length(rcexpr->opnos); + ListCell *l_left_expr, + *l_right_expr, + *l_opno, + *l_opfamily, + *l_inputcollid; + List *elem_clauses = NIL; + + Assert(list_length(rcexpr->largs) == nopers); + Assert(list_length(rcexpr->rargs) == nopers); + Assert(list_length(rcexpr->opfamilies) == nopers); + Assert(list_length(rcexpr->inputcollids) == nopers); + + /* Now generate a list of clauses */ + forfive(l_left_expr, rcexpr->largs, + l_right_expr, rcexpr->rargs, + l_opno, rcexpr->opnos, + l_opfamily, rcexpr->opfamilies, + l_inputcollid, rcexpr->inputcollids) + { + Expr *left_expr = (Expr *) lfirst(l_left_expr); + Expr *right_expr = (Expr *) lfirst(l_right_expr); + Expr *elem_clause; + Oid opno = lfirst_oid(l_opno); + Oid inputcollid = lfirst_oid(l_inputcollid); + + elem_clause = make_opclause(opno, BOOLOID, false, + left_expr, right_expr, + InvalidOid, inputcollid); + elem_clauses = lappend(elem_clauses, elem_clause); + } + + /* Finally, generate steps */ + *clause_steps = gen_partprune_steps_internal(context, elem_clauses); + if (*clause_steps == NIL) + return PARTCLAUSE_UNSUPPORTED; + return PARTCLAUSE_MATCH_STEPS; + } else if (IsA(clause, ScalarArrayOpExpr)) { ScalarArrayOpExpr *saop = (ScalarArrayOpExpr *) clause;