diff options
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/commands/functioncmds.c | 24 | ||||
-rw-r--r-- | src/backend/tcop/utility.c | 9 |
2 files changed, 33 insertions, 0 deletions
diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c index acc08b1990e..84daa19e064 100644 --- a/src/backend/commands/functioncmds.c +++ b/src/backend/commands/functioncmds.c @@ -51,6 +51,7 @@ #include "commands/proclang.h" #include "executor/execdesc.h" #include "executor/executor.h" +#include "funcapi.h" #include "miscadmin.h" #include "optimizer/clauses.h" #include "optimizer/var.h" @@ -2340,3 +2341,26 @@ ExecuteCallStmt(CallStmt *stmt, ParamListInfo params, bool atomic, DestReceiver FreeExecutorState(estate); } + +/* + * Construct the tuple descriptor for a CALL statement return + */ +TupleDesc +CallStmtResultDesc(CallStmt *stmt) +{ + FuncExpr *fexpr; + HeapTuple tuple; + TupleDesc tupdesc; + + fexpr = stmt->funcexpr; + + tuple = SearchSysCache1(PROCOID, ObjectIdGetDatum(fexpr->funcid)); + if (!HeapTupleIsValid(tuple)) + elog(ERROR, "cache lookup failed for procedure %u", fexpr->funcid); + + tupdesc = build_function_result_tupdesc_t(tuple); + + ReleaseSysCache(tuple); + + return tupdesc; +} diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index 4e1c21298e8..b5804f64ad4 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -1744,6 +1744,12 @@ UtilityReturnsTuples(Node *parsetree) { switch (nodeTag(parsetree)) { + case T_CallStmt: + { + CallStmt *stmt = (CallStmt *) parsetree; + + return (stmt->funcexpr->funcresulttype == RECORDOID); + } case T_FetchStmt: { FetchStmt *stmt = (FetchStmt *) parsetree; @@ -1794,6 +1800,9 @@ UtilityTupleDescriptor(Node *parsetree) { switch (nodeTag(parsetree)) { + case T_CallStmt: + return CallStmtResultDesc((CallStmt *) parsetree); + case T_FetchStmt: { FetchStmt *stmt = (FetchStmt *) parsetree; |