diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2005-06-22 17:45:46 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2005-06-22 17:45:46 +0000 |
commit | e98edb5555de0197ba4ffc99b4f3db134c99a86f (patch) | |
tree | f022547496d97cf1984bae42f972e5da458510a5 /src/backend/commands/prepare.c | |
parent | 84d73a6dbc23dda43bf4d83ee71b344063524cbe (diff) | |
download | postgresql-e98edb5555de0197ba4ffc99b4f3db134c99a86f.tar.gz postgresql-e98edb5555de0197ba4ffc99b4f3db134c99a86f.zip |
Fix the mechanism for reporting the original table OID and column number
of columns of a query result so that it can "see through" cursors and
prepared statements. Per gripe a couple months back from John DeSoi.
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. */ |