diff --git a/src/backend/executor/functions.c b/src/backend/executor/functions.c index 359aafea681..9c149c94c34 100644 --- a/src/backend/executor/functions.c +++ b/src/backend/executor/functions.c @@ -709,24 +709,42 @@ init_execution_state(SQLFunctionCachePtr fcache) { if (IsA(stmt->utilityStmt, CopyStmt) && ((CopyStmt *) stmt->utilityStmt)->filename == NULL) + { + ReleaseCachedPlan(fcache->cplan, fcache->cowner); + fcache->cowner = NULL; + fcache->cplan = NULL; + ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot COPY to/from client in an SQL function"))); + } if (IsA(stmt->utilityStmt, TransactionStmt)) + { + ReleaseCachedPlan(fcache->cplan, fcache->cowner); + fcache->cowner = NULL; + fcache->cplan = NULL; + ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), /* translator: %s is a SQL statement name */ errmsg("%s is not allowed in an SQL function", CreateCommandName(stmt->utilityStmt)))); + } } if (fcache->func->readonly_func && !CommandIsReadOnly(stmt)) + { + ReleaseCachedPlan(fcache->cplan, fcache->cowner); + fcache->cowner = NULL; + fcache->cplan = NULL; + ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), /* translator: %s is a SQL statement name */ errmsg("%s is not allowed in a non-volatile function", CreateCommandName((Node *) stmt)))); + } /* OK, build the execution_state for this query */ newes = &fcache->esarray[foreach_current_index(lc)];