From 56ee2ecba96a742bb6e18dfe8ee48054e90ebaa9 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 26 Feb 2002 22:47:12 +0000 Subject: Restructure command-completion-report code so that there is just one report for each received SQL command, regardless of rewriting activity. Also ensure that this report comes from the 'original' command, not the last command generated by rewrite; this fixes 7.2 breakage for INSERT commands that have actions added by rules. Fernando Nasser and Tom Lane. --- src/backend/commands/command.c | 54 +++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 24 deletions(-) (limited to 'src/backend/commands/command.c') diff --git a/src/backend/commands/command.c b/src/backend/commands/command.c index f01cf4498fd..676caba22d5 100644 --- a/src/backend/commands/command.c +++ b/src/backend/commands/command.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.154 2002/02/19 20:11:12 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.155 2002/02/26 22:47:04 tgl Exp $ * * NOTES * The PerformAddAttribute() code, like most of the relation @@ -89,16 +89,25 @@ PortalCleanup(Portal portal) MemoryContextSwitchTo(oldcontext); } -/* -------------------------------- - * PerformPortalFetch - * -------------------------------- + +/* + * PerformPortalFetch + * + * name: name of portal + * forward: forward or backward fetch? + * count: # of tuples to fetch (0 implies all) + * dest: where to send results + * completionTag: points to a buffer of size COMPLETION_TAG_BUFSIZE + * in which to store a command completion status string. + * + * completionTag may be NULL if caller doesn't want a status string. */ void PerformPortalFetch(char *name, bool forward, int count, - char *tag, - CommandDest dest) + CommandDest dest, + char *completionTag) { Portal portal; QueryDesc *queryDesc; @@ -107,6 +116,10 @@ PerformPortalFetch(char *name, CommandId savedId; bool temp_desc = false; + /* initialize completion status in case of early exit */ + if (completionTag) + strcpy(completionTag, (dest == None) ? "MOVE 0" : "FETCH 0"); + /* * sanity checks */ @@ -167,7 +180,7 @@ PerformPortalFetch(char *name, * relations */ false, /* this is a portal fetch, not a "retrieve * portal" */ - tag, + NULL, /* not used */ queryDesc->dest); /* @@ -193,16 +206,15 @@ PerformPortalFetch(char *name, { ExecutorRun(queryDesc, estate, EXEC_FOR, (long) count); - /* - * I use CMD_UPDATE, because no CMD_MOVE or the like exists, - * and I would like to provide the same kind of info as - * CMD_UPDATE - */ - UpdateCommandInfo(CMD_UPDATE, 0, estate->es_processed); if (estate->es_processed > 0) portal->atStart = false; /* OK to back up now */ if (count <= 0 || (int) estate->es_processed < count) portal->atEnd = true; /* we retrieved 'em all */ + + if (completionTag) + snprintf(completionTag, COMPLETION_TAG_BUFSIZE, "%s %u", + (dest == None) ? "MOVE" : "FETCH", + estate->es_processed); } } else @@ -211,16 +223,15 @@ PerformPortalFetch(char *name, { ExecutorRun(queryDesc, estate, EXEC_BACK, (long) count); - /* - * I use CMD_UPDATE, because no CMD_MOVE or the like exists, - * and I would like to provide the same kind of info as - * CMD_UPDATE - */ - UpdateCommandInfo(CMD_UPDATE, 0, estate->es_processed); if (estate->es_processed > 0) portal->atEnd = false; /* OK to go forward now */ if (count <= 0 || (int) estate->es_processed < count) portal->atStart = true; /* we retrieved 'em all */ + + if (completionTag) + snprintf(completionTag, COMPLETION_TAG_BUFSIZE, "%s %u", + (dest == None) ? "MOVE" : "FETCH", + estate->es_processed); } } @@ -236,11 +247,6 @@ PerformPortalFetch(char *name, pfree(queryDesc); MemoryContextSwitchTo(oldcontext); - - /* - * Note: the "end-of-command" tag is returned by higher-level utility - * code - */ } /* -------------------------------- -- cgit v1.2.3