diff options
Diffstat (limited to 'src/backend/commands/prepare.c')
-rw-r--r-- | src/backend/commands/prepare.c | 54 |
1 files changed, 53 insertions, 1 deletions
diff --git a/src/backend/commands/prepare.c b/src/backend/commands/prepare.c index be3416bd3e5..dec3d249dfa 100644 --- a/src/backend/commands/prepare.c +++ b/src/backend/commands/prepare.c @@ -10,7 +10,7 @@ * Copyright (c) 2002-2005, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/prepare.c,v 1.39 2005/06/03 23:05:28 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/prepare.c,v 1.40 2005/06/22 17:45:45 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -446,6 +446,58 @@ FetchPreparedStatementResultDesc(PreparedStatement *stmt) } /* + * Given a prepared statement that returns tuples, extract the query + * targetlist. Returns NIL if the statement doesn't have a determinable + * targetlist. + * + * Note: do not modify the result. + * + * XXX be careful to keep this in sync with FetchPortalTargetList, + * and with UtilityReturnsTuples. + */ +List * +FetchPreparedStatementTargetList(PreparedStatement *stmt) +{ + PortalStrategy strategy = ChoosePortalStrategy(stmt->query_list); + + if (strategy == PORTAL_ONE_SELECT) + return ((Query *) linitial(stmt->query_list))->targetList; + if (strategy == PORTAL_UTIL_SELECT) + { + Node *utilityStmt; + + utilityStmt = ((Query *) linitial(stmt->query_list))->utilityStmt; + switch (nodeTag(utilityStmt)) + { + case T_FetchStmt: + { + FetchStmt *substmt = (FetchStmt *) utilityStmt; + Portal subportal; + + Assert(!substmt->ismove); + subportal = GetPortalByName(substmt->portalname); + Assert(PortalIsValid(subportal)); + return FetchPortalTargetList(subportal); + } + + case T_ExecuteStmt: + { + ExecuteStmt *substmt = (ExecuteStmt *) utilityStmt; + PreparedStatement *entry; + + Assert(!substmt->into); + entry = FetchPreparedStatement(substmt->name, true); + return FetchPreparedStatementTargetList(entry); + } + + default: + break; + } + } + return NIL; +} + +/* * Implements the 'DEALLOCATE' utility statement: deletes the * specified plan from storage. */ |