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;
