26
26
*
27
27
*
28
28
* IDENTIFICATION
29
- * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.68 1999/01/29 11:56:00 vadim Exp $
29
+ * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.69 1999/01/29 13:24:36 vadim Exp $
30
30
*
31
31
*-------------------------------------------------------------------------
32
32
*/
@@ -1593,7 +1593,7 @@ EvalPlanQual(EState *estate, Index rti, ItemPointer tid)
1593
1593
/* try to reuse plan used previously */
1594
1594
evalPlanQual * newepq = (epq != NULL ) ? epq -> free : NULL ;
1595
1595
1596
- if (newepq == NULL )
1596
+ if (newepq == NULL ) /* first call or freePQ stack is empty */
1597
1597
{
1598
1598
newepq = (evalPlanQual * ) palloc (sizeof (evalPlanQual ));
1599
1599
/* Init EState */
@@ -1614,21 +1614,18 @@ EvalPlanQual(EState *estate, Index rti, ItemPointer tid)
1614
1614
/* ... rest */
1615
1615
newepq -> plan = copyObject (estate -> es_origPlan );
1616
1616
newepq -> free = NULL ;
1617
- if (epq == NULL )
1617
+ epqstate -> es_evTupleNull = (bool * )
1618
+ palloc (length (estate -> es_range_table ) * sizeof (bool ));
1619
+ if (epq == NULL ) /* first call */
1618
1620
{
1619
1621
epqstate -> es_evTuple = (HeapTuple * )
1620
1622
palloc (length (estate -> es_range_table ) * sizeof (HeapTuple ));
1621
1623
memset (epqstate -> es_evTuple , 0 ,
1622
1624
length (estate -> es_range_table ) * sizeof (HeapTuple ));
1623
- epqstate -> es_evTupleNull = (bool * )
1624
- palloc (length (estate -> es_range_table ) * sizeof (bool ));
1625
- memset (epqstate -> es_evTupleNull , false,
1626
- length (estate -> es_range_table ) * sizeof (bool ));
1627
1625
}
1628
1626
else
1629
1627
{
1630
1628
epqstate -> es_evTuple = epq -> estate .es_evTuple ;
1631
- epqstate -> es_evTupleNull = epq -> estate .es_evTupleNull ;
1632
1629
}
1633
1630
}
1634
1631
else
@@ -1697,8 +1694,9 @@ EvalPlanQual(EState *estate, Index rti, ItemPointer tid)
1697
1694
/*
1698
1695
* Nice! We got tuple - now copy it.
1699
1696
*/
1697
+ if (epqstate -> es_evTuple [epq -> rti - 1 ] != NULL )
1698
+ pfree (epqstate -> es_evTuple [epq -> rti - 1 ]);
1700
1699
epqstate -> es_evTuple [epq -> rti - 1 ] = heap_copytuple (& tuple );
1701
- epqstate -> es_evTupleNull [epq -> rti - 1 ] = false;
1702
1700
ReleaseBuffer (buffer );
1703
1701
break ;
1704
1702
}
@@ -1738,6 +1736,8 @@ EvalPlanQual(EState *estate, Index rti, ItemPointer tid)
1738
1736
if (estate -> es_origPlan -> nParamExec > 0 )
1739
1737
memset (epqstate -> es_param_exec_vals , 0 ,
1740
1738
estate -> es_origPlan -> nParamExec * sizeof (ParamExecData ));
1739
+ memset (epqstate -> es_evTupleNull , false,
1740
+ length (estate -> es_range_table ) * sizeof (bool ));
1741
1741
ExecInitNode (epq -> plan , epqstate , NULL );
1742
1742
1743
1743
/*
0 commit comments