2626 *
2727 *
2828 * IDENTIFICATION
29- * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.68 1999/01/2911:56:00 vadim Exp $
29+ * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.69 1999/01/2913:24:36 vadim Exp $
3030 *
3131 *-------------------------------------------------------------------------
3232 */
@@ -1593,7 +1593,7 @@ EvalPlanQual(EState *estate, Index rti, ItemPointer tid)
15931593/* try to reuse plan used previously */
15941594evalPlanQual * newepq = (epq != NULL ) ?epq -> free :NULL ;
15951595
1596- if (newepq == NULL )
1596+ if (newepq == NULL )/* first call or freePQ stack is empty */
15971597{
15981598newepq = (evalPlanQual * )palloc (sizeof (evalPlanQual ));
15991599/* Init EState */
@@ -1614,21 +1614,18 @@ EvalPlanQual(EState *estate, Index rti, ItemPointer tid)
16141614/* ... rest */
16151615newepq -> plan = copyObject (estate -> es_origPlan );
16161616newepq -> 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 */
16181620{
16191621epqstate -> es_evTuple = (HeapTuple * )
16201622palloc (length (estate -> es_range_table )* sizeof (HeapTuple ));
16211623memset (epqstate -> es_evTuple ,0 ,
16221624length (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 ));
16271625}
16281626else
16291627{
16301628epqstate -> es_evTuple = epq -> estate .es_evTuple ;
1631- epqstate -> es_evTupleNull = epq -> estate .es_evTupleNull ;
16321629}
16331630}
16341631else
@@ -1697,8 +1694,9 @@ EvalPlanQual(EState *estate, Index rti, ItemPointer tid)
16971694/*
16981695 * Nice! We got tuple - now copy it.
16991696 */
1697+ if (epqstate -> es_evTuple [epq -> rti - 1 ]!= NULL )
1698+ pfree (epqstate -> es_evTuple [epq -> rti - 1 ]);
17001699epqstate -> es_evTuple [epq -> rti - 1 ]= heap_copytuple (& tuple );
1701- epqstate -> es_evTupleNull [epq -> rti - 1 ]= false;
17021700ReleaseBuffer (buffer );
17031701break ;
17041702}
@@ -1738,6 +1736,8 @@ EvalPlanQual(EState *estate, Index rti, ItemPointer tid)
17381736if (estate -> es_origPlan -> nParamExec > 0 )
17391737memset (epqstate -> es_param_exec_vals ,0 ,
17401738estate -> es_origPlan -> nParamExec * sizeof (ParamExecData ));
1739+ memset (epqstate -> es_evTupleNull , false,
1740+ length (estate -> es_range_table )* sizeof (bool ));
17411741ExecInitNode (epq -> plan ,epqstate ,NULL );
17421742
17431743/*