summaryrefslogtreecommitdiff
path: root/src/backend/tcop/pquery.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2002-02-26 22:47:12 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2002-02-26 22:47:12 +0000
commit56ee2ecba96a742bb6e18dfe8ee48054e90ebaa9 (patch)
tree905c72dc3db475d47d04472a1de7ab715b5725c7 /src/backend/tcop/pquery.c
parentf71dc6d0e28a855f2d782ec48f950ffeaca1307d (diff)
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.
Diffstat (limited to 'src/backend/tcop/pquery.c')
-rw-r--r--src/backend/tcop/pquery.c110
1 files changed, 51 insertions, 59 deletions
diff --git a/src/backend/tcop/pquery.c b/src/backend/tcop/pquery.c
index 91d98a2d50d..75b99c21fab 100644
--- a/src/backend/tcop/pquery.c
+++ b/src/backend/tcop/pquery.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/tcop/pquery.c,v 1.46 2001/10/25 05:49:43 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/tcop/pquery.c,v 1.47 2002/02/26 22:47:09 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -23,9 +23,6 @@
#include "utils/ps_status.h"
-static char *CreateOperationTag(int operationType);
-
-
/* ----------------------------------------------------------------
* CreateQueryDesc
* ----------------------------------------------------------------
@@ -89,42 +86,6 @@ CreateExecutorState(void)
return state;
}
-/* ----------------------------------------------------------------
- * CreateOperationTag
- *
- * utility to get a string representation of the
- * query operation.
- * ----------------------------------------------------------------
- */
-static char *
-CreateOperationTag(int operationType)
-{
- char *tag;
-
- switch (operationType)
- {
- case CMD_SELECT:
- tag = "SELECT";
- break;
- case CMD_INSERT:
- tag = "INSERT";
- break;
- case CMD_DELETE:
- tag = "DELETE";
- break;
- case CMD_UPDATE:
- tag = "UPDATE";
- break;
- default:
- elog(DEBUG, "CreateOperationTag: unknown operation type %d",
- operationType);
- tag = "???";
- break;
- }
-
- return tag;
-}
-
/* ----------------
* PreparePortal
* ----------------
@@ -158,19 +119,25 @@ PreparePortal(char *portalName)
}
-/* ----------------------------------------------------------------
- * ProcessQuery
+/*
+ * ProcessQuery
+ * Execute a query
*
- * Execute a plan, the non-parallel version
- * ----------------------------------------------------------------
+ * parsetree: the query tree
+ * plan: the plan tree for the query
+ * 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
ProcessQuery(Query *parsetree,
Plan *plan,
- CommandDest dest)
+ CommandDest dest,
+ char *completionTag)
{
int operation = parsetree->commandType;
- char *tag;
bool isRetrieveIntoPortal;
bool isRetrieveIntoRelation;
char *intoName = NULL;
@@ -180,8 +147,6 @@ ProcessQuery(Query *parsetree,
EState *state;
TupleDesc attinfo;
- set_ps_display(tag = CreateOperationTag(operation));
-
/*
* initialize portal/into relation status
*/
@@ -238,8 +203,7 @@ ProcessQuery(Query *parsetree,
* When performing a retrieve into, we override the normal
* communication destination during the processing of the the query.
* This only affects the tuple-output function - the correct
- * destination will still see BeginCommand() and EndCommand()
- * messages.
+ * destination will still see the BeginCommand() call.
*/
if (isRetrieveIntoRelation)
queryDesc->dest = None;
@@ -263,7 +227,7 @@ ProcessQuery(Query *parsetree,
attinfo,
isRetrieveIntoRelation,
isRetrieveIntoPortal,
- tag,
+ NULL, /* not used */
dest);
/*
@@ -281,7 +245,9 @@ ProcessQuery(Query *parsetree,
/* Now we can return to caller's memory context. */
MemoryContextSwitchTo(oldContext);
- EndCommand(tag, dest);
+ /* Set completion tag. SQL calls this operation DECLARE CURSOR */
+ if (completionTag)
+ strcpy(completionTag, "DECLARE");
return;
}
@@ -292,16 +258,42 @@ ProcessQuery(Query *parsetree,
*/
ExecutorRun(queryDesc, state, EXEC_RUN, 0L);
- /* save infos for EndCommand */
- UpdateCommandInfo(operation, state->es_lastoid, state->es_processed);
-
/*
- * Now, we close down all the scans and free allocated resources.
+ * Build command completion status string, if caller wants one.
*/
- ExecutorEnd(queryDesc, state);
+ if (completionTag)
+ {
+ Oid lastOid;
+
+ switch (operation)
+ {
+ case CMD_SELECT:
+ strcpy(completionTag, "SELECT");
+ break;
+ case CMD_INSERT:
+ if (state->es_processed == 1)
+ lastOid = state->es_lastoid;
+ else
+ lastOid = InvalidOid;
+ snprintf(completionTag, COMPLETION_TAG_BUFSIZE,
+ "INSERT %u %u", lastOid, state->es_processed);
+ break;
+ case CMD_UPDATE:
+ snprintf(completionTag, COMPLETION_TAG_BUFSIZE,
+ "UPDATE %u", state->es_processed);
+ break;
+ case CMD_DELETE:
+ snprintf(completionTag, COMPLETION_TAG_BUFSIZE,
+ "DELETE %u", state->es_processed);
+ break;
+ default:
+ strcpy(completionTag, "???");
+ break;
+ }
+ }
/*
- * Notify the destination of end of processing.
+ * Now, we close down all the scans and free allocated resources.
*/
- EndCommand(tag, dest);
+ ExecutorEnd(queryDesc, state);
}