diff options
author | Vadim B. Mikheev <vadim4o@yahoo.com> | 1997-08-27 09:05:24 +0000 |
---|---|---|
committer | Vadim B. Mikheev <vadim4o@yahoo.com> | 1997-08-27 09:05:24 +0000 |
commit | 3751b49545d71881b93035ef8cdd1c4034f08a59 (patch) | |
tree | 6021423b94d39d1969c34225df10e5c97840d69d | |
parent | 40ac5a692bedde826da70158cb1194e6774b8888 (diff) | |
download | postgresql-3751b49545d71881b93035ef8cdd1c4034f08a59.tar.gz postgresql-3751b49545d71881b93035ef8cdd1c4034f08a59.zip |
Number of tuples inserted/affected by INSERT/UPDATE/DELETE...
-rw-r--r-- | src/backend/executor/execMain.c | 41 | ||||
-rw-r--r-- | src/backend/tcop/dest.c | 70 | ||||
-rw-r--r-- | src/backend/tcop/pquery.c | 5 | ||||
-rw-r--r-- | src/include/nodes/execnodes.h | 4 | ||||
-rw-r--r-- | src/include/tcop/dest.h | 4 | ||||
-rw-r--r-- | src/interfaces/libpq/fe-exec.c | 74 | ||||
-rw-r--r-- | src/interfaces/libpq/libpq-fe.h | 3 |
7 files changed, 116 insertions, 85 deletions
diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index cc8d98d8986..62e76e6cfb7 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -26,7 +26,7 @@ * * * 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 $ * *------------------------------------------------------------------------- */ @@ -65,7 +65,7 @@ static TupleTableSlot *ExecutePlan(EState *estate, Plan *plan, 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, @@ -171,6 +171,8 @@ ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature, int count) plan = queryDesc->plantree; dest = queryDesc->dest; destination = (void (*)()) DestToFunction(dest); + estate->es_processed = 0; + estate->es_lastoid = InvalidOid; #if 0 /* @@ -665,7 +667,6 @@ ExecutePlan(EState *estate, ScanDirection direction, void (*printfunc)()) { - Relation intoRelationDesc; JunkFilter *junkfilter; TupleTableSlot *slot; @@ -675,12 +676,6 @@ ExecutePlan(EState *estate, TupleTableSlot *result; /* ---------------- - * get information - * ---------------- - */ - intoRelationDesc = estate->es_into_relation_descriptor; - - /* ---------------- * initialize local variables * ---------------- */ @@ -780,9 +775,9 @@ ExecutePlan(EState *estate, 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; @@ -853,7 +848,7 @@ ExecutePlan(EState *estate, static void ExecRetrieve(TupleTableSlot *slot, void (*printfunc)(), - Relation intoRelationDesc) + EState *estate) { HeapTuple tuple; TupleDesc attrtype; @@ -869,9 +864,10 @@ ExecRetrieve(TupleTableSlot *slot, * 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(); } /* ---------------- @@ -880,6 +876,7 @@ ExecRetrieve(TupleTableSlot *slot, */ (*printfunc)(tuple, attrtype); IncrRetrieved(); + (estate->es_processed)++; } /* ---------------------------------------------------------------- @@ -947,7 +944,6 @@ ExecAppend(TupleTableSlot *slot, newId = heap_insert(resultRelationDesc, /* relation desc */ tuple); /* heap tuple */ IncrAppended(); - UpdateAppendOid(newId); /* ---------------- * process indices @@ -961,6 +957,8 @@ ExecAppend(TupleTableSlot *slot, if (numIndices > 0) { ExecInsertIndexTuples(slot, &(tuple->t_ctid), estate, false); } + (estate->es_processed)++; + estate->es_lastoid = newId; } /* ---------------------------------------------------------------- @@ -989,10 +987,12 @@ ExecDelete(TupleTableSlot *slot, * 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 @@ -1094,6 +1094,7 @@ ExecReplace(TupleTableSlot *slot, } IncrReplaced(); + (estate->es_processed)++; /* ---------------- * Note: instead of having to update the old index tuples diff --git a/src/backend/tcop/dest.c b/src/backend/tcop/dest.c index 6974251b1ea..e42579a23a6 100644 --- a/src/backend/tcop/dest.c +++ b/src/backend/tcop/dest.c @@ -7,7 +7,7 @@ * * * 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 $ * *------------------------------------------------------------------------- */ @@ -43,8 +43,7 @@ #include "commands/async.h" -static Oid GetAppendOid(void); -static void ResetAppendOid(void); +static char CommandInfo[32] = {0}; /* ---------------- * output functions @@ -87,8 +86,6 @@ void (*DestToFunction(CommandDest dest))(HeapTuple, TupleDesc) return donothing; } -#define IS_INSERT_TAG(tag) (*tag == 'I' && *(tag+1) == 'N') - /* ---------------- * EndCommand - tell destination that no more tuples will arrive * ---------------- @@ -106,14 +103,8 @@ EndCommand(char *commandTag, CommandDest dest) * ---------------- */ 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; @@ -239,7 +230,7 @@ BeginCommand(char *pname, * because nothing needs to be sent to the fe. * ---------------- */ - ResetAppendOid(); + CommandInfo[0] = 0; if (isIntoPortal) return; @@ -318,41 +309,22 @@ BeginCommand(char *pname, } } -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; } diff --git a/src/backend/tcop/pquery.c b/src/backend/tcop/pquery.c index 6f3087709fa..1d11cbeae49 100644 --- a/src/backend/tcop/pquery.c +++ b/src/backend/tcop/pquery.c @@ -7,7 +7,7 @@ * * * 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 $ * *------------------------------------------------------------------------- */ @@ -322,6 +322,9 @@ ProcessQueryDesc(QueryDesc *queryDesc) */ 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() diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index ff01ff5a62e..7cf450785c9 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -6,7 +6,7 @@ * * 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 $ * *------------------------------------------------------------------------- */ @@ -197,6 +197,8 @@ typedef struct EState { TupleTable es_tupleTable; JunkFilter *es_junkFilter; int *es_refcount; + uint32 es_processed; /* # of tuples processed */ + Oid es_lastoid; /* last oid processed (by INSERT) */ } EState; /* ---------------- diff --git a/src/include/tcop/dest.h b/src/include/tcop/dest.h index 1148b28e73f..a1f9f71f987 100644 --- a/src/include/tcop/dest.h +++ b/src/include/tcop/dest.h @@ -26,7 +26,7 @@ * * 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 $ * *------------------------------------------------------------------------- */ @@ -69,6 +69,6 @@ extern void NullCommand(CommandDest dest); 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 */ diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c index 9214b3a941a..97543a05d15 100644 --- a/src/interfaces/libpq/fe-exec.c +++ b/src/interfaces/libpq/fe-exec.c @@ -7,7 +7,7 @@ * * * 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 $ * *------------------------------------------------------------------------- */ @@ -1532,18 +1532,70 @@ char* PQcmdStatus(PGresult *res) { 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 ""; } diff --git a/src/interfaces/libpq/libpq-fe.h b/src/interfaces/libpq/libpq-fe.h index c5eefc182a4..fdd29fe42d2 100644 --- a/src/interfaces/libpq/libpq-fe.h +++ b/src/interfaces/libpq/libpq-fe.h @@ -6,7 +6,7 @@ * * 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 $ * *------------------------------------------------------------------------- */ @@ -225,6 +225,7 @@ extern Oid PQftype(PGresult *res, int field_num); 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); |