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