]> granicus.if.org Git - postgresql/commitdiff
Fix handling of SPI_tuptable.
authorVadim B. Mikheev <vadim4o@yahoo.com>
Thu, 25 Sep 1997 12:16:05 +0000 (12:16 +0000)
committerVadim B. Mikheev <vadim4o@yahoo.com>
Thu, 25 Sep 1997 12:16:05 +0000 (12:16 +0000)
src/backend/executor/spi.c

index 6a3d1485158fabe0aedd9077a2bc74a7efb69ed4..c1a584846aeb84bbf68cfe23d7fe37aa2319b654 100644 (file)
@@ -60,7 +60,7 @@ static int    _SPI_begin_call(bool execmem);
 static int     _SPI_end_call(bool procmem);
 static MemoryContext _SPI_execmem(void);
 static MemoryContext _SPI_procmem(void);
-static bool _SPI_checktuples(bool isRetrieveIntoRelation);
+static bool _SPI_checktuples(void);
 
 #ifdef SPI_EXECUTOR_STATS
 extern int     ShowExecutorStats;
@@ -774,19 +774,16 @@ _SPI_execute_plan(_SPI_plan * plan, Datum * Values, char *Nulls, int tcount)
 static int
 _SPI_pquery(QueryDesc * queryDesc, EState * state, int tcount)
 {
-       Query      *parseTree;
-       Plan       *plan;
-       int                     operation;
+       Query      *parseTree = queryDesc->parsetree;
+       Plan       *plan = queryDesc->plantree;
+       int                     operation = queryDesc->operation;
+       CommandDest     dest = queryDesc->dest;
        TupleDesc       tupdesc;
        bool            isRetrieveIntoPortal = false;
        bool            isRetrieveIntoRelation = false;
        char       *intoName = NULL;
        int                     res;
 
-       parseTree = queryDesc->parsetree;
-       plan = queryDesc->plantree;
-       operation = queryDesc->operation;
-
        switch (operation)
        {
                case CMD_SELECT:
@@ -804,6 +801,7 @@ _SPI_pquery(QueryDesc * queryDesc, EState * state, int tcount)
                        {
                                res = SPI_OK_SELINTO;
                                isRetrieveIntoRelation = true;
+                               queryDesc->dest = None;                 /* */
                        }
                        break;
                case CMD_INSERT:
@@ -844,7 +842,7 @@ _SPI_pquery(QueryDesc * queryDesc, EState * state, int tcount)
        _SPI_current->processed = state->es_processed;
        if (operation == CMD_SELECT && queryDesc->dest == SPI)
        {
-               if (_SPI_checktuples(isRetrieveIntoRelation))
+               if (_SPI_checktuples())
                        elog(FATAL, "SPI_select: # of processed tuples check failed");
        }
 
@@ -858,11 +856,12 @@ _SPI_pquery(QueryDesc * queryDesc, EState * state, int tcount)
        }
 #endif
 
-       if (queryDesc->dest == SPI)
+       if (dest == SPI)
        {
                SPI_processed = _SPI_current->processed;
                SPI_tuptable = _SPI_current->tuptable;
        }
+       queryDesc->dest = dest;
 
        return (res);
 
@@ -898,7 +897,7 @@ _SPI_fetch(FetchStmt * stmt)
                                                                                 * context */
 
        _SPI_current->processed = state->es_processed;
-       if (_SPI_checktuples(false))
+       if (_SPI_checktuples())
                elog(FATAL, "SPI_fetch: # of processed tuples check failed");
 
        SPI_processed = _SPI_current->processed;
@@ -982,7 +981,7 @@ _SPI_end_call(bool procmem)
 }
 
 static bool
-_SPI_checktuples(bool isRetrieveIntoRelation)
+_SPI_checktuples()
 {
        uint32          processed = _SPI_current->processed;
        SPITupleTable *tuptable = _SPI_current->tuptable;
@@ -993,15 +992,9 @@ _SPI_checktuples(bool isRetrieveIntoRelation)
                if (tuptable != NULL)
                        failed = true;
        }
-       else
-/* some tuples were processed */
+       else    /* some tuples were processed */
        {
                if (tuptable == NULL)   /* spi_printtup was not called */
-               {
-                       if (!isRetrieveIntoRelation)
-                               failed = true;
-               }
-               else if (isRetrieveIntoRelation)
                        failed = true;
                else if (processed != (tuptable->alloced - tuptable->free))
                        failed = true;