diff options
author | Bruce Momjian <bruce@momjian.us> | 2010-02-16 20:58:14 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 2010-02-16 20:58:14 +0000 |
commit | aa7e7ae9a6adfd5553ed05144cf765fbf7c8f5af (patch) | |
tree | fc46bf6e0d1c1a278c30c8e41a5e19547786d55b /src | |
parent | 346a721eed4c0bcfb07039633807b67443f21bbf (diff) | |
download | postgresql-aa7e7ae9a6adfd5553ed05144cf765fbf7c8f5af.tar.gz postgresql-aa7e7ae9a6adfd5553ed05144cf765fbf7c8f5af.zip |
Have SELECT and CREATE TABLE AS queries return a row count. While this
is invisible in psql, other interfaces, like libpq, make this value
visible.
Boszormenyi Zoltan
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/tcop/pquery.c | 46 | ||||
-rw-r--r-- | src/interfaces/libpq/fe-exec.c | 5 |
2 files changed, 26 insertions, 25 deletions
diff --git a/src/backend/tcop/pquery.c b/src/backend/tcop/pquery.c index 42960b82250..8beb82385a6 100644 --- a/src/backend/tcop/pquery.c +++ b/src/backend/tcop/pquery.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/tcop/pquery.c,v 1.135 2010/02/13 22:45:41 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/tcop/pquery.c,v 1.136 2010/02/16 20:58:14 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -205,7 +205,8 @@ ProcessQuery(PlannedStmt *plan, switch (queryDesc->operation) { case CMD_SELECT: - strcpy(completionTag, "SELECT"); + snprintf(completionTag, COMPLETION_TAG_BUFSIZE, + "SELECT %u", queryDesc->estate->es_processed); break; case CMD_INSERT: if (queryDesc->estate->es_processed == 1) @@ -714,6 +715,7 @@ PortalRun(Portal portal, long count, bool isTopLevel, char *completionTag) { bool result; + uint32 nprocessed; ResourceOwner saveTopTransactionResourceOwner; MemoryContext saveTopTransactionContext; Portal saveActivePortal; @@ -776,39 +778,35 @@ PortalRun(Portal portal, long count, bool isTopLevel, switch (portal->strategy) { case PORTAL_ONE_SELECT: - (void) PortalRunSelect(portal, true, count, dest); - - /* we know the query is supposed to set the tag */ - if (completionTag && portal->commandTag) - strcpy(completionTag, portal->commandTag); - - /* Mark portal not active */ - portal->status = PORTAL_READY; - - /* - * Since it's a forward fetch, say DONE iff atEnd is now true. - */ - result = portal->atEnd; - break; - case PORTAL_ONE_RETURNING: case PORTAL_UTIL_SELECT: /* * If we have not yet run the command, do so, storing its - * results in the portal's tuplestore. + * results in the portal's tuplestore. Do this only for the + * PORTAL_ONE_RETURNING and PORTAL_UTIL_SELECT cases. */ - if (!portal->holdStore) + if (portal->strategy != PORTAL_ONE_SELECT && !portal->holdStore) FillPortalStore(portal, isTopLevel); /* * Now fetch desired portion of results. */ - (void) PortalRunSelect(portal, true, count, dest); + nprocessed = PortalRunSelect(portal, true, count, dest); - /* we know the query is supposed to set the tag */ + /* + * If the portal result contains a command tag and the caller + * gave us a pointer to store it, copy it. Patch the "SELECT" + * tag to also provide the rowcount. + */ if (completionTag && portal->commandTag) - strcpy(completionTag, portal->commandTag); + { + if (strcmp(portal->commandTag, "SELECT") == 0) + snprintf(completionTag, COMPLETION_TAG_BUFSIZE, + "SELECT %u", nprocessed); + else + strcpy(completionTag, portal->commandTag); + } /* Mark portal not active */ portal->status = PORTAL_READY; @@ -1331,7 +1329,9 @@ PortalRunMulti(Portal portal, bool isTopLevel, { if (portal->commandTag) strcpy(completionTag, portal->commandTag); - if (strcmp(completionTag, "INSERT") == 0) + if (strcmp(completionTag, "SELECT") == 0) + sprintf(completionTag, "SELECT 0 0"); + else if (strcmp(completionTag, "INSERT") == 0) strcpy(completionTag, "INSERT 0 0"); else if (strcmp(completionTag, "UPDATE") == 0) strcpy(completionTag, "UPDATE 0"); diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c index 2e5551d31e5..df4e8879c84 100644 --- a/src/interfaces/libpq/fe-exec.c +++ b/src/interfaces/libpq/fe-exec.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/interfaces/libpq/fe-exec.c,v 1.208 2010/01/21 18:43:25 rhaas Exp $ + * $PostgreSQL: pgsql/src/interfaces/libpq/fe-exec.c,v 1.209 2010/02/16 20:58:14 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -2752,7 +2752,8 @@ PQcmdTuples(PGresult *res) goto interpret_error; /* no space? */ p++; } - else if (strncmp(res->cmdStatus, "DELETE ", 7) == 0 || + else if (strncmp(res->cmdStatus, "SELECT ", 7) == 0 || + strncmp(res->cmdStatus, "DELETE ", 7) == 0 || strncmp(res->cmdStatus, "UPDATE ", 7) == 0) p = res->cmdStatus + 7; else if (strncmp(res->cmdStatus, "FETCH ", 6) == 0) |