Small fix for READ COMMITTED isolevel.
authorVadim B. Mikheev
Fri, 29 Jan 1999 13:24:36 +0000 (13:24 +0000)
committerVadim B. Mikheev
Fri, 29 Jan 1999 13:24:36 +0000 (13:24 +0000)
src/backend/executor/execMain.c

index f074ce951fd7cf4e65496529a9b0e840764737a2..00137272e2425c5ebda09d0f4db13e8fa844d5c1 100644 (file)
@@ -26,7 +26,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.68 1999/01/29 11:56:00 vadim Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.69 1999/01/29 13:24:36 vadim Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1593,7 +1593,7 @@ EvalPlanQual(EState *estate, Index rti, ItemPointer tid)
        /* try to reuse plan used previously */
        evalPlanQual   *newepq = (epq != NULL) ? epq->free : NULL;
 
-       if (newepq == NULL)
+       if (newepq == NULL)     /* first call or freePQ stack is empty */
        {
            newepq = (evalPlanQual*) palloc(sizeof(evalPlanQual));
            /* Init EState */
@@ -1614,21 +1614,18 @@ EvalPlanQual(EState *estate, Index rti, ItemPointer tid)
            /* ... rest */
            newepq->plan = copyObject(estate->es_origPlan);
            newepq->free = NULL;
-           if (epq == NULL)
+           epqstate->es_evTupleNull = (bool*) 
+               palloc(length(estate->es_range_table) * sizeof(bool));
+           if (epq == NULL)    /* first call */
            {
                epqstate->es_evTuple = (HeapTuple*) 
                    palloc(length(estate->es_range_table) * sizeof(HeapTuple));
                memset(epqstate->es_evTuple, 0, 
                    length(estate->es_range_table) * sizeof(HeapTuple));
-               epqstate->es_evTupleNull = (bool*) 
-                   palloc(length(estate->es_range_table) * sizeof(bool));
-               memset(epqstate->es_evTupleNull, false, 
-                   length(estate->es_range_table) * sizeof(bool));
            }
            else
            {
                epqstate->es_evTuple = epq->estate.es_evTuple;
-               epqstate->es_evTupleNull = epq->estate.es_evTupleNull;
            }
        }
        else
@@ -1697,8 +1694,9 @@ EvalPlanQual(EState *estate, Index rti, ItemPointer tid)
            /*
             * Nice! We got tuple - now copy it.
             */
+           if (epqstate->es_evTuple[epq->rti - 1] != NULL)
+               pfree(epqstate->es_evTuple[epq->rti - 1]);
            epqstate->es_evTuple[epq->rti - 1] = heap_copytuple(&tuple);
-           epqstate->es_evTupleNull[epq->rti - 1] = false;
            ReleaseBuffer(buffer);
            break;
        }
@@ -1738,6 +1736,8 @@ EvalPlanQual(EState *estate, Index rti, ItemPointer tid)
    if (estate->es_origPlan->nParamExec > 0)
        memset(epqstate->es_param_exec_vals, 0, 
                estate->es_origPlan->nParamExec * sizeof(ParamExecData));
+   memset(epqstate->es_evTupleNull, false, 
+           length(estate->es_range_table) * sizeof(bool));
    ExecInitNode(epq->plan, epqstate, NULL);
 
    /*