diff --git a/src/backend/partitioning/partprune.c b/src/backend/partitioning/partprune.c
index 58ec2a684d..b9e801e1d0 100644
--- a/src/backend/partitioning/partprune.c
+++ b/src/backend/partitioning/partprune.c
@@ -43,6 +43,7 @@
 #include "access/nbtree.h"
 #include "catalog/pg_operator.h"
 #include "catalog/pg_opfamily.h"
+#include "catalog/pg_proc.h"
 #include "catalog/pg_type.h"
 #include "executor/executor.h"
 #include "miscadmin.h"
@@ -2704,28 +2705,80 @@ pull_partkey_params(PartitionPruneInfo *pinfo, List *steps)
 		foreach(lc2, stepop->exprs)
 		{
 			Expr	   *expr = lfirst(lc2);
+			char		provolatile;
+			Param	   *param;
 
-			if (IsA(expr, Param))
+			switch (nodeTag(expr))
 			{
-				Param	   *param = (Param *) expr;
+				case T_OpExpr:
+				case T_DistinctExpr:
+				case T_NullIfExpr:
+				{
+					OpExpr	   *op = (OpExpr *) expr;
+					provolatile =  func_volatile(op->opfuncid);
+
+					if (provolatile == PROVOLATILE_STABLE ||
+						provolatile == PROVOLATILE_IMMUTABLE)
+					{
+						param = (Param *) expr;
+						pinfo->execparams = bms_add_member(pinfo->execparams,
+														   param->paramid);
 
-				switch (param->paramkind)
+					}
+					gotone = true;
+					break;
+				}
+				case T_FuncExpr:
 				{
-					case PARAM_EXTERN:
-						pinfo->extparams = bms_add_member(pinfo->extparams,
-														  param->paramid);
-						break;
-					case PARAM_EXEC:
+					FuncExpr	   *func = (FuncExpr *) expr;
+					provolatile =  func_volatile(func->funcid);
+
+					if (provolatile == PROVOLATILE_STABLE ||
+						provolatile == PROVOLATILE_IMMUTABLE)
+					{
+						param = (Param *) expr;
 						pinfo->execparams = bms_add_member(pinfo->execparams,
 														   param->paramid);
-						break;
 
-					default:
-						elog(ERROR, "unrecognized paramkind: %d",
-							 (int) param->paramkind);
-						break;
+					}
+					gotone = true;
+					break;
 				}
-				gotone = true;
+				case T_SQLValueFunction:
+				{
+					param = (Param *) expr;
+
+					pinfo->execparams = bms_add_member(pinfo->execparams,
+													   param->paramid);
+					gotone = true;
+					break;
+				}
+				case T_Param:
+				{
+					param = (Param *) expr;
+
+					switch (param->paramkind)
+					{
+						case PARAM_EXTERN:
+							pinfo->extparams = bms_add_member(pinfo->extparams,
+															  param->paramid);
+							break;
+						case PARAM_EXEC:
+							pinfo->execparams = bms_add_member(pinfo->execparams,
+															   param->paramid);
+							break;
+
+						default:
+							elog(ERROR, "unrecognized paramkind: %d",
+								 (int) param->paramkind);
+							break;
+					}
+					gotone = true;
+					break;
+				}
+				default:
+					gotone = false;
+					break;
 			}
 		}
 	}
@@ -3038,6 +3091,8 @@ partkey_datum_from_expr(PartitionPruneContext *context,
 			return true;
 
 		case T_Param:
+		case T_SQLValueFunction:
+		case T_FuncExpr:
 
 			/*
 			 * When being called from the executor we may be able to evaluate
