*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.19 1997/08/22 14:28:20 vadim Exp $
+ * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.20 1997/08/27 09:02:24 vadim Exp $
*
*-------------------------------------------------------------------------
*/
int numberTuples, ScanDirection direction,
void (*printfunc)());
static void ExecRetrieve(TupleTableSlot *slot, void (*printfunc)(),
- Relation intoRelationDesc);
+ EState *estate);
static void ExecAppend(TupleTableSlot *slot,ItemPointer tupleid,
EState *estate);
static void ExecDelete(TupleTableSlot *slot, ItemPointer tupleid,
plan = queryDesc->plantree;
dest = queryDesc->dest;
destination = (void (*)()) DestToFunction(dest);
+ estate->es_processed = 0;
+ estate->es_lastoid = InvalidOid;
#if 0
/*
ScanDirection direction,
void (*printfunc)())
{
- Relation intoRelationDesc;
JunkFilter *junkfilter;
TupleTableSlot *slot;
int current_tuple_count;
TupleTableSlot *result;
- /* ----------------
- * get information
- * ----------------
- */
- intoRelationDesc = estate->es_into_relation_descriptor;
-
/* ----------------
* initialize local variables
* ----------------
switch(operation) {
case CMD_SELECT:
- ExecRetrieve(slot, /* slot containing tuple */
- printfunc, /* print function */
- intoRelationDesc); /* "into" relation */
+ ExecRetrieve(slot, /* slot containing tuple */
+ printfunc, /* print function */
+ estate); /* */
result = slot;
break;
static void
ExecRetrieve(TupleTableSlot *slot,
void (*printfunc)(),
- Relation intoRelationDesc)
+ EState *estate)
{
HeapTuple tuple;
TupleDesc attrtype;
* insert the tuple into the "into relation"
* ----------------
*/
- if (intoRelationDesc != NULL) {
- heap_insert (intoRelationDesc, tuple);
- IncrAppended();
+ if ( estate->es_into_relation_descriptor != NULL )
+ {
+ heap_insert (estate->es_into_relation_descriptor, tuple);
+ IncrAppended();
}
/* ----------------
*/
(*printfunc)(tuple, attrtype);
IncrRetrieved();
+ (estate->es_processed)++;
}
/* ----------------------------------------------------------------
newId = heap_insert(resultRelationDesc, /* relation desc */
tuple); /* heap tuple */
IncrAppended();
- UpdateAppendOid(newId);
/* ----------------
* process indices
if (numIndices > 0) {
ExecInsertIndexTuples(slot, &(tuple->t_ctid), estate, false);
}
+ (estate->es_processed)++;
+ estate->es_lastoid = newId;
}
/* ----------------------------------------------------------------
* delete the tuple
* ----------------
*/
- heap_delete(resultRelationDesc, /* relation desc */
- tupleid); /* item pointer to tuple */
-
+ if ( heap_delete(resultRelationDesc, /* relation desc */
+ tupleid) ) /* item pointer to tuple */
+ return;
+
IncrDeleted();
+ (estate->es_processed)++;
/* ----------------
* Note: Normally one would think that we have to
}
IncrReplaced();
+ (estate->es_processed)++;
/* ----------------
* Note: instead of having to update the old index tuples
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/tcop/dest.c,v 1.7 1997/08/19 21:34:02 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/tcop/dest.c,v 1.8 1997/08/27 09:03:14 vadim Exp $
*
*-------------------------------------------------------------------------
*/
#include "commands/async.h"
-static Oid GetAppendOid(void);
-static void ResetAppendOid(void);
+static char CommandInfo[32] = {0};
/* ----------------
* output functions
return donothing;
}
-#define IS_INSERT_TAG(tag) (*tag == 'I' && *(tag+1) == 'N')
-
/* ----------------
* EndCommand - tell destination that no more tuples will arrive
* ----------------
* ----------------
*/
pq_putnchar("C", 1);
-/* pq_putint(0, 4); */
- if (IS_INSERT_TAG(commandTag))
- {
- sprintf(buf, "%s %d", commandTag, GetAppendOid());
- pq_putstr(buf);
- }
- else
- pq_putstr(commandTag);
+ sprintf(buf, "%s%s", commandTag, CommandInfo);
+ pq_putstr(buf);
pq_flush();
break;
* because nothing needs to be sent to the fe.
* ----------------
*/
- ResetAppendOid();
+ CommandInfo[0] = 0;
if (isIntoPortal)
return;
}
}
-static Oid AppendOid;
-
-static void
-ResetAppendOid(void)
-{
- AppendOid = InvalidOid;
-}
-
-#define MULTI_TUPLE_APPEND -1
-
void
-UpdateAppendOid(Oid newoid)
-{
- /*
- * First update after AppendOid was reset (at command beginning).
- */
- if (AppendOid == InvalidOid)
- AppendOid = newoid;
- /*
- * Already detected a multiple tuple append, return a void oid ;)
- */
- else if (AppendOid == MULTI_TUPLE_APPEND)
- return;
- /*
- * Oid has been assigned once before, tag this as a multiple tuple
- * append.
- */
- else
- AppendOid = MULTI_TUPLE_APPEND;
-}
-
-static Oid
-GetAppendOid(void)
+UpdateCommandInfo (int operation, Oid lastoid, uint32 tuples)
{
- if (AppendOid == MULTI_TUPLE_APPEND)
- return InvalidOid;
- return AppendOid;
+ switch (operation)
+ {
+ case CMD_INSERT :
+ if ( tuples > 1 )
+ lastoid = InvalidOid;
+ sprintf (CommandInfo, " %u %u", lastoid, tuples);
+ break;
+ case CMD_DELETE :
+ case CMD_UPDATE :
+ sprintf (CommandInfo, " %u", tuples);
+ break;
+ default :
+ CommandInfo[0] = 0;
+ }
+ return;
}
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/tcop/pquery.c,v 1.6 1997/08/19 21:34:07 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/tcop/pquery.c,v 1.7 1997/08/27 09:03:15 vadim Exp $
*
*-------------------------------------------------------------------------
*/
*/
ExecutorRun(queryDesc, state, EXEC_RUN, 0);
+ /* save infos for EndCommand */
+ UpdateCommandInfo (operation, state->es_lastoid, state->es_processed);
+
/* ----------------
* now, we close down all the scans and free allocated resources...
* with ExecutorEnd()
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: execnodes.h,v 1.7 1997/08/06 03:42:02 momjian Exp $
+ * $Id: execnodes.h,v 1.8 1997/08/27 09:04:52 vadim Exp $
*
*-------------------------------------------------------------------------
*/
TupleTable es_tupleTable;
JunkFilter *es_junkFilter;
int *es_refcount;
+ uint32 es_processed; /* # of tuples processed */
+ Oid es_lastoid; /* last oid processed (by INSERT) */
} EState;
/* ----------------
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: dest.h,v 1.6 1997/08/19 21:40:06 momjian Exp $
+ * $Id: dest.h,v 1.7 1997/08/27 09:05:09 vadim Exp $
*
*-------------------------------------------------------------------------
*/
extern void BeginCommand(char *pname, int operation, TupleDesc attinfo,
bool isIntoRel, bool isIntoPortal, char *tag,
CommandDest dest);
-extern void UpdateAppendOid(Oid newoid);
+extern void UpdateCommandInfo (int operation, Oid lastoid, uint32 tuples);
#endif /* DEST_H */
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.33 1997/07/12 20:31:47 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.34 1997/08/27 09:05:23 vadim Exp $
*
*-------------------------------------------------------------------------
*/
if the last command was an INSERT, return the oid string
if not, return ""
*/
-const char* PQoidStatus(PGresult *res) {
- if (!res) {
- fprintf(stderr, "PQoidStatus() -- pointer to PQresult is null");
- return NULL;
- }
+static char oidStatus[32] = {0};
+const char* PQoidStatus (PGresult *res)
+{
+ if (!res)
+ {
+ fprintf (stderr, "PQoidStatus () -- pointer to PQresult is null");
+ return NULL;
+ }
- if (!res->cmdStatus)
- return "";
+ oidStatus[0] = 0;
+ if ( !res->cmdStatus )
+ return oidStatus;
+
+ if ( strncmp (res->cmdStatus, "INSERT", 6) == 0 )
+ {
+ char *p = res->cmdStatus + 7;
+ char *e;
+
+ for (e = p; *e != ' ' && *e; ) e++;
+ sprintf (oidStatus, "%.*s", e - p, p);
+ }
+ return oidStatus;
+}
- if (strncmp(res->cmdStatus, "INSERT",6) == 0) {
- return res->cmdStatus+7;
- } else
+/*
+ PQcmdTuples -
+ if the last command was an INSERT/UPDATE/DELETE, return number
+ of inserted/affected tuples, if not, return ""
+*/
+const char* PQcmdTuples (PGresult *res)
+{
+ if (!res)
+ {
+ fprintf (stderr, "PQcmdTuples () -- pointer to PQresult is null");
+ return NULL;
+ }
+
+ if ( !res->cmdStatus )
+ return "";
+
+ if ( strncmp (res->cmdStatus, "INSERT", 6) == 0 ||
+ strncmp (res->cmdStatus, "DELETE", 6) == 0 ||
+ strncmp (res->cmdStatus, "UPDATE", 6) == 0 )
+ {
+ char *p = res->cmdStatus + 6;
+
+ if ( *p == 0 )
+ {
+ fprintf (stderr, "PQcmdTuples (%s) -- short input from server",
+ res->cmdStatus);
+ return NULL;
+ }
+ p++;
+ if ( *(res->cmdStatus) != 'I' ) /* UPDATE/DELETE */
+ return (p);
+ while ( *p != ' ' && *p ) p++; /* INSERT: skip oid */
+ if ( *p == 0 )
+ {
+ fprintf (stderr, "PQcmdTuples (INSERT) -- there's no # of tuples");
+ return NULL;
+ }
+ p++;
+ return (p);
+ }
return "";
}
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: libpq-fe.h,v 1.19 1997/05/09 03:28:54 scrappy Exp $
+ * $Id: libpq-fe.h,v 1.20 1997/08/27 09:05:24 vadim Exp $
*
*-------------------------------------------------------------------------
*/
extern short PQfsize(PGresult *res, int field_num);
extern char* PQcmdStatus(PGresult *res);
extern const char* PQoidStatus(PGresult *res);
+extern const char* PQcmdTuples(PGresult *res);
extern char* PQgetvalue(PGresult *res, int tup_num, int field_num);
extern int PQgetlength(PGresult *res, int tup_num, int field_num);
extern int PQgetisnull(PGresult *res, int tup_num, int field_num);