diff options
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/commands/prepare.c | 30 | ||||
-rw-r--r-- | src/backend/tcop/postgres.c | 26 | ||||
-rw-r--r-- | src/backend/tcop/utility.c | 23 |
3 files changed, 56 insertions, 23 deletions
diff --git a/src/backend/commands/prepare.c b/src/backend/commands/prepare.c index c317494f6fa..6e16853fd78 100644 --- a/src/backend/commands/prepare.c +++ b/src/backend/commands/prepare.c @@ -10,7 +10,7 @@ * Copyright (c) 2002-2003, PostgreSQL Global Development Group * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/prepare.c,v 1.16 2003/05/06 20:26:26 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/prepare.c,v 1.17 2003/05/06 21:51:41 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -394,6 +394,34 @@ FetchPreparedStatementParams(const char *stmt_name) } /* + * Given a prepared statement, determine the result tupledesc it will + * produce. Returns NULL if the execution will not return tuples. + * + * Note: the result is created or copied into current memory context. + */ +TupleDesc +FetchPreparedStatementResultDesc(PreparedStatement *stmt) +{ + Query *query; + + switch (ChoosePortalStrategy(stmt->query_list)) + { + case PORTAL_ONE_SELECT: + query = (Query *) lfirst(stmt->query_list); + return ExecCleanTypeFromTL(query->targetList, false); + + case PORTAL_UTIL_SELECT: + query = (Query *) lfirst(stmt->query_list); + return UtilityTupleDescriptor(query->utilityStmt); + + case PORTAL_MULTI_QUERY: + /* will not return tuples */ + break; + } + return NULL; +} + +/* * Implements the 'DEALLOCATE' utility statement: deletes the * specified plan from storage. */ diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index a7dd5cb904a..c9ba35f7bde 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.336 2003/05/06 20:26:27 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.337 2003/05/06 21:51:41 tgl Exp $ * * NOTES * this is the "main" module of the postgres backend and @@ -1428,6 +1428,7 @@ static void exec_describe_statement_message(const char *stmt_name) { PreparedStatement *pstmt; + TupleDesc tupdesc; List *l; StringInfoData buf; @@ -1445,6 +1446,9 @@ exec_describe_statement_message(const char *stmt_name) if (whereToSendOutput != Remote) return; /* can't actually do anything... */ + /* + * First describe the parameters... + */ pq_beginmessage(&buf, 't'); /* parameter description message type */ pq_sendint(&buf, length(pstmt->argtype_list), 4); @@ -1455,6 +1459,24 @@ exec_describe_statement_message(const char *stmt_name) pq_sendint(&buf, (int) ptype, 4); } pq_endmessage(&buf); + + /* + * Next send RowDescription or NoData to describe the result... + */ + tupdesc = FetchPreparedStatementResultDesc(pstmt); + if (tupdesc) + { + List *targetlist; + + if (ChoosePortalStrategy(pstmt->query_list) == PORTAL_ONE_SELECT) + targetlist = ((Query *) lfirst(pstmt->query_list))->targetList; + else + targetlist = NIL; + SendRowDescriptionMessage(tupdesc, targetlist); + } + else + pq_putemptymessage('n'); /* NoData */ + } /* @@ -2359,7 +2381,7 @@ PostgresMain(int argc, char *argv[], const char *username) if (!IsUnderPostmaster) { puts("\nPOSTGRES backend interactive interface "); - puts("$Revision: 1.336 $ $Date: 2003/05/06 20:26:27 $\n"); + puts("$Revision: 1.337 $ $Date: 2003/05/06 21:51:41 $\n"); } /* diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index 5fce0d5e755..5f015f4636a 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.199 2003/05/06 20:26:27 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.200 2003/05/06 21:51:41 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1052,11 +1052,6 @@ UtilityReturnsTuples(Node *parsetree) portal = GetPortalByName(stmt->portalname); if (!PortalIsValid(portal)) return false; /* not our business to raise error */ - /* - * Note: if portal contains multiple statements then it's - * possible some of them will return tuples, but we don't - * handle that case here. - */ return portal->tupDesc ? true : false; } @@ -1077,7 +1072,7 @@ UtilityReturnsTuples(Node *parsetree) case PORTAL_UTIL_SELECT: return true; case PORTAL_MULTI_QUERY: - /* can't figure it out, per note above */ + /* will not return tuples */ break; } return false; @@ -1124,25 +1119,13 @@ UtilityTupleDescriptor(Node *parsetree) { ExecuteStmt *stmt = (ExecuteStmt *) parsetree; PreparedStatement *entry; - Query *query; if (stmt->into) return NULL; entry = FetchPreparedStatement(stmt->name, false); if (!entry) return NULL; /* not our business to raise error */ - switch (ChoosePortalStrategy(entry->query_list)) - { - case PORTAL_ONE_SELECT: - query = (Query *) lfirst(entry->query_list); - return ExecCleanTypeFromTL(query->targetList, false); - case PORTAL_UTIL_SELECT: - query = (Query *) lfirst(entry->query_list); - return UtilityTupleDescriptor(query->utilityStmt); - case PORTAL_MULTI_QUERY: - break; - } - return NULL; + return FetchPreparedStatementResultDesc(entry); } case T_ExplainStmt: |