mirror of
https://github.com/postgres/postgres.git
synced 2025-06-16 06:01:02 +03:00
Support parameters in CALL
To support parameters in CALL, move the parse analysis of the procedure and arguments into the global transformation phase, so that the parser hooks can be applied. And then at execution time pass the parameters from ProcessUtility on to ExecuteCallStmt.
This commit is contained in:
@ -2212,11 +2212,9 @@ ExecuteDoStmt(DoStmt *stmt, bool atomic)
|
||||
* commits that might occur inside the procedure.
|
||||
*/
|
||||
void
|
||||
ExecuteCallStmt(ParseState *pstate, CallStmt *stmt, bool atomic)
|
||||
ExecuteCallStmt(CallStmt *stmt, ParamListInfo params, bool atomic)
|
||||
{
|
||||
List *targs;
|
||||
ListCell *lc;
|
||||
Node *node;
|
||||
FuncExpr *fexpr;
|
||||
int nargs;
|
||||
int i;
|
||||
@ -2228,24 +2226,8 @@ ExecuteCallStmt(ParseState *pstate, CallStmt *stmt, bool atomic)
|
||||
ExprContext *econtext;
|
||||
HeapTuple tp;
|
||||
|
||||
/* We need to do parse analysis on the procedure call and its arguments */
|
||||
targs = NIL;
|
||||
foreach(lc, stmt->funccall->args)
|
||||
{
|
||||
targs = lappend(targs, transformExpr(pstate,
|
||||
(Node *) lfirst(lc),
|
||||
EXPR_KIND_CALL_ARGUMENT));
|
||||
}
|
||||
|
||||
node = ParseFuncOrColumn(pstate,
|
||||
stmt->funccall->funcname,
|
||||
targs,
|
||||
pstate->p_last_srf,
|
||||
stmt->funccall,
|
||||
true,
|
||||
stmt->funccall->location);
|
||||
|
||||
fexpr = castNode(FuncExpr, node);
|
||||
fexpr = stmt->funcexpr;
|
||||
Assert(fexpr);
|
||||
|
||||
aclresult = pg_proc_aclcheck(fexpr->funcid, GetUserId(), ACL_EXECUTE);
|
||||
if (aclresult != ACLCHECK_OK)
|
||||
@ -2289,6 +2271,7 @@ ExecuteCallStmt(ParseState *pstate, CallStmt *stmt, bool atomic)
|
||||
* we can't free this context till the procedure returns.
|
||||
*/
|
||||
estate = CreateExecutorState();
|
||||
estate->es_param_list_info = params;
|
||||
econtext = CreateExprContext(estate);
|
||||
|
||||
i = 0;
|
||||
|
Reference in New Issue
Block a user