diff -cprN head/src/backend/executor/nodeBitmapHeapscan.c work/src/backend/executor/nodeBitmapHeapscan.c
*** head/src/backend/executor/nodeBitmapHeapscan.c	2010-01-04 09:10:26.638773000 +0900
--- work/src/backend/executor/nodeBitmapHeapscan.c	2010-02-26 14:34:20.629724292 +0900
*************** BitmapHeapNext(BitmapHeapScanState *node
*** 74,80 ****
  	 */
  	econtext = node->ss.ps.ps_ExprContext;
  	slot = node->ss.ss_ScanTupleSlot;
! 	scan = node->ss.ss_currentScanDesc;
  	tbm = node->tbm;
  	tbmiterator = node->tbmiterator;
  	tbmres = node->tbmres;
--- 74,80 ----
  	 */
  	econtext = node->ss.ps.ps_ExprContext;
  	slot = node->ss.ss_ScanTupleSlot;
! 	scan = node->currentScanDesc;
  	tbm = node->tbm;
  	tbmiterator = node->tbmiterator;
  	tbmres = node->tbmres;
*************** ExecBitmapHeapReScan(BitmapHeapScanState
*** 439,445 ****
  	}
  
  	/* rescan to release any page pin */
! 	heap_rescan(node->ss.ss_currentScanDesc, NULL);
  
  	if (node->tbmiterator)
  		tbm_end_iterate(node->tbmiterator);
--- 439,445 ----
  	}
  
  	/* rescan to release any page pin */
! 	heap_rescan(node->currentScanDesc, NULL);
  
  	if (node->tbmiterator)
  		tbm_end_iterate(node->tbmiterator);
*************** ExecEndBitmapHeapScan(BitmapHeapScanStat
*** 475,481 ****
  	 * extract information from the node
  	 */
  	relation = node->ss.ss_currentRelation;
! 	scanDesc = node->ss.ss_currentScanDesc;
  
  	/*
  	 * Free the exprcontext
--- 475,481 ----
  	 * extract information from the node
  	 */
  	relation = node->ss.ss_currentRelation;
! 	scanDesc = node->currentScanDesc;
  
  	/*
  	 * Free the exprcontext
*************** ExecInitBitmapHeapScan(BitmapHeapScan *n
*** 588,597 ****
  	 * Even though we aren't going to do a conventional seqscan, it is useful
  	 * to create a HeapScanDesc --- most of the fields in it are usable.
  	 */
! 	scanstate->ss.ss_currentScanDesc = heap_beginscan_bm(currentRelation,
! 														 estate->es_snapshot,
! 														 0,
! 														 NULL);
  
  	/*
  	 * get the scan type from the relation descriptor.
--- 588,597 ----
  	 * Even though we aren't going to do a conventional seqscan, it is useful
  	 * to create a HeapScanDesc --- most of the fields in it are usable.
  	 */
! 	scanstate->currentScanDesc = heap_beginscan_bm(currentRelation,
! 												   estate->es_snapshot,
! 												   0,
! 												   NULL);
  
  	/*
  	 * get the scan type from the relation descriptor.
diff -cprN head/src/backend/executor/nodeBitmapIndexscan.c work/src/backend/executor/nodeBitmapIndexscan.c
*** head/src/backend/executor/nodeBitmapIndexscan.c	2010-01-04 09:10:26.638773000 +0900
--- work/src/backend/executor/nodeBitmapIndexscan.c	2010-02-26 14:27:50.199723199 +0900
*************** ExecInitBitmapIndexScan(BitmapIndexScan 
*** 242,248 ****
  	 */
  
  	indexstate->ss.ss_currentRelation = NULL;
- 	indexstate->ss.ss_currentScanDesc = NULL;
  
  	/*
  	 * If we are just doing EXPLAIN (ie, aren't going to run the plan), stop
--- 242,247 ----
diff -cprN head/src/backend/executor/nodeIndexscan.c work/src/backend/executor/nodeIndexscan.c
*** head/src/backend/executor/nodeIndexscan.c	2010-01-04 09:10:26.638773000 +0900
--- work/src/backend/executor/nodeIndexscan.c	2010-02-26 14:27:52.223712119 +0900
*************** ExecInitIndexScan(IndexScan *node, EStat
*** 526,532 ****
  	currentRelation = ExecOpenScanRelation(estate, node->scan.scanrelid);
  
  	indexstate->ss.ss_currentRelation = currentRelation;
- 	indexstate->ss.ss_currentScanDesc = NULL;	/* no heap scan here */
  
  	/*
  	 * get the scan type from the relation descriptor.
--- 526,531 ----
diff -cprN head/src/backend/executor/nodeSeqscan.c work/src/backend/executor/nodeSeqscan.c
*** head/src/backend/executor/nodeSeqscan.c	2010-01-04 09:10:26.638773000 +0900
--- work/src/backend/executor/nodeSeqscan.c	2010-02-26 14:33:43.076003022 +0900
*************** SeqNext(SeqScanState *node)
*** 56,64 ****
  	 * get information from the estate and scan state
  	 */
  	scandesc = node->ss_currentScanDesc;
! 	estate = node->ps.state;
  	direction = estate->es_direction;
! 	slot = node->ss_ScanTupleSlot;
  
  	/*
  	 * get the next tuple from the table
--- 56,64 ----
  	 * get information from the estate and scan state
  	 */
  	scandesc = node->ss_currentScanDesc;
! 	estate = node->ss.ps.state;
  	direction = estate->es_direction;
! 	slot = node->ss.ss_ScanTupleSlot;
  
  	/*
  	 * get the next tuple from the table
*************** InitScanRelation(SeqScanState *node, ESt
*** 134,150 ****
  	 * open that relation and acquire appropriate lock on it.
  	 */
  	currentRelation = ExecOpenScanRelation(estate,
! 									 ((SeqScan *) node->ps.plan)->scanrelid);
  
  	currentScanDesc = heap_beginscan(currentRelation,
  									 estate->es_snapshot,
  									 0,
  									 NULL);
  
! 	node->ss_currentRelation = currentRelation;
  	node->ss_currentScanDesc = currentScanDesc;
  
! 	ExecAssignScanType(node, RelationGetDescr(currentRelation));
  }
  
  
--- 134,150 ----
  	 * open that relation and acquire appropriate lock on it.
  	 */
  	currentRelation = ExecOpenScanRelation(estate,
! 									 ((SeqScan *) node->ss.ps.plan)->scanrelid);
  
  	currentScanDesc = heap_beginscan(currentRelation,
  									 estate->es_snapshot,
  									 0,
  									 NULL);
  
! 	node->ss.ss_currentRelation = currentRelation;
  	node->ss_currentScanDesc = currentScanDesc;
  
! 	ExecAssignScanType(&node->ss, RelationGetDescr(currentRelation));
  }
  
  
*************** ExecInitSeqScan(SeqScan *node, EState *e
*** 168,211 ****
  	 * create state structure
  	 */
  	scanstate = makeNode(SeqScanState);
! 	scanstate->ps.plan = (Plan *) node;
! 	scanstate->ps.state = estate;
  
  	/*
  	 * Miscellaneous initialization
  	 *
  	 * create expression context for node
  	 */
! 	ExecAssignExprContext(estate, &scanstate->ps);
  
  	/*
  	 * initialize child expressions
  	 */
! 	scanstate->ps.targetlist = (List *)
  		ExecInitExpr((Expr *) node->plan.targetlist,
  					 (PlanState *) scanstate);
! 	scanstate->ps.qual = (List *)
  		ExecInitExpr((Expr *) node->plan.qual,
  					 (PlanState *) scanstate);
  
  	/*
  	 * tuple table initialization
  	 */
! 	ExecInitResultTupleSlot(estate, &scanstate->ps);
! 	ExecInitScanTupleSlot(estate, scanstate);
  
  	/*
  	 * initialize scan relation
  	 */
  	InitScanRelation(scanstate, estate);
  
! 	scanstate->ps.ps_TupFromTlist = false;
  
  	/*
  	 * Initialize result tuple type and projection info.
  	 */
! 	ExecAssignResultTypeFromTL(&scanstate->ps);
! 	ExecAssignScanProjectionInfo(scanstate);
  
  	return scanstate;
  }
--- 168,211 ----
  	 * create state structure
  	 */
  	scanstate = makeNode(SeqScanState);
! 	scanstate->ss.ps.plan = (Plan *) node;
! 	scanstate->ss.ps.state = estate;
  
  	/*
  	 * Miscellaneous initialization
  	 *
  	 * create expression context for node
  	 */
! 	ExecAssignExprContext(estate, &scanstate->ss.ps);
  
  	/*
  	 * initialize child expressions
  	 */
! 	scanstate->ss.ps.targetlist = (List *)
  		ExecInitExpr((Expr *) node->plan.targetlist,
  					 (PlanState *) scanstate);
! 	scanstate->ss.ps.qual = (List *)
  		ExecInitExpr((Expr *) node->plan.qual,
  					 (PlanState *) scanstate);
  
  	/*
  	 * tuple table initialization
  	 */
! 	ExecInitResultTupleSlot(estate, &scanstate->ss.ps);
! 	ExecInitScanTupleSlot(estate, &scanstate->ss);
  
  	/*
  	 * initialize scan relation
  	 */
  	InitScanRelation(scanstate, estate);
  
! 	scanstate->ss.ps.ps_TupFromTlist = false;
  
  	/*
  	 * Initialize result tuple type and projection info.
  	 */
! 	ExecAssignResultTypeFromTL(&scanstate->ss.ps);
! 	ExecAssignScanProjectionInfo(&scanstate->ss);
  
  	return scanstate;
  }
*************** ExecEndSeqScan(SeqScanState *node)
*** 225,243 ****
  	/*
  	 * get information from node
  	 */
! 	relation = node->ss_currentRelation;
  	scanDesc = node->ss_currentScanDesc;
  
  	/*
  	 * Free the exprcontext
  	 */
! 	ExecFreeExprContext(&node->ps);
  
  	/*
  	 * clean out the tuple table
  	 */
! 	ExecClearTuple(node->ps.ps_ResultTupleSlot);
! 	ExecClearTuple(node->ss_ScanTupleSlot);
  
  	/*
  	 * close heap scan
--- 225,243 ----
  	/*
  	 * get information from node
  	 */
! 	relation = node->ss.ss_currentRelation;
  	scanDesc = node->ss_currentScanDesc;
  
  	/*
  	 * Free the exprcontext
  	 */
! 	ExecFreeExprContext(&node->ss.ps);
  
  	/*
  	 * clean out the tuple table
  	 */
! 	ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
! 	ExecClearTuple(node->ss.ss_ScanTupleSlot);
  
  	/*
  	 * close heap scan
*************** ExecSeqRestrPos(SeqScanState *node)
*** 305,311 ****
  	 * heap_restrpos will change; we'd have an internally inconsistent slot if
  	 * we didn't do this.
  	 */
! 	ExecClearTuple(node->ss_ScanTupleSlot);
  
  	heap_restrpos(scan);
  }
--- 305,311 ----
  	 * heap_restrpos will change; we'd have an internally inconsistent slot if
  	 * we didn't do this.
  	 */
! 	ExecClearTuple(node->ss.ss_ScanTupleSlot);
  
  	heap_restrpos(scan);
  }
diff -cprN head/src/backend/executor/nodeTidscan.c work/src/backend/executor/nodeTidscan.c
*** head/src/backend/executor/nodeTidscan.c	2010-01-04 09:10:26.638773000 +0900
--- work/src/backend/executor/nodeTidscan.c	2010-02-26 14:27:40.397702346 +0900
*************** ExecInitTidScan(TidScan *node, EState *e
*** 539,545 ****
  	currentRelation = ExecOpenScanRelation(estate, node->scan.scanrelid);
  
  	tidstate->ss.ss_currentRelation = currentRelation;
- 	tidstate->ss.ss_currentScanDesc = NULL;		/* no heap scan here */
  
  	/*
  	 * get the scan type from the relation descriptor.
--- 539,544 ----
diff -cprN head/src/include/nodes/execnodes.h work/src/include/nodes/execnodes.h
*** head/src/include/nodes/execnodes.h	2010-02-15 09:36:12.612700000 +0900
--- work/src/include/nodes/execnodes.h	2010-02-26 14:29:08.168697413 +0900
*************** typedef struct BitmapOrState
*** 1111,1117 ****
   *		retrieved from the subplan.
   *
   *		currentRelation    relation being scanned (NULL if none)
-  *		currentScanDesc    current scan descriptor for scan (NULL if none)
   *		ScanTupleSlot	   pointer to slot in tuple table holding scan tuple
   * ----------------
   */
--- 1111,1116 ----
*************** typedef struct ScanState
*** 1119,1133 ****
  {
  	PlanState	ps;				/* its first field is NodeTag */
  	Relation	ss_currentRelation;
- 	HeapScanDesc ss_currentScanDesc;
  	TupleTableSlot *ss_ScanTupleSlot;
  } ScanState;
  
! /*
!  * SeqScan uses a bare ScanState as its state node, since it needs
!  * no additional fields.
   */
! typedef ScanState SeqScanState;
  
  /*
   * These structs store information about index quals that don't have simple
--- 1118,1137 ----
  {
  	PlanState	ps;				/* its first field is NodeTag */
  	Relation	ss_currentRelation;
  	TupleTableSlot *ss_ScanTupleSlot;
  } ScanState;
  
! /* ----------------
!  *	 SeqScanState information
!  *
!  *		currentScanDesc    current scan descriptor for scan
!  * ----------------
   */
! typedef struct SeqScanState
! {
! 	ScanState	ss;				/* its first field is NodeTag */
! 	HeapScanDesc ss_currentScanDesc;
! } SeqScanState;
  
  /*
   * These structs store information about index quals that don't have simple
*************** typedef struct BitmapIndexScanState
*** 1214,1219 ****
--- 1218,1224 ----
  /* ----------------
   *	 BitmapHeapScanState information
   *
+  *		currentScanDesc    current scan descriptor for scan
   *		bitmapqualorig	   execution state for bitmapqualorig expressions
   *		tbm				   bitmap obtained from child index scan(s)
   *		tbmiterator		   iterator for scanning current pages
*************** typedef struct BitmapIndexScanState
*** 1226,1231 ****
--- 1231,1237 ----
  typedef struct BitmapHeapScanState
  {
  	ScanState	ss;				/* its first field is NodeTag */
+ 	HeapScanDesc currentScanDesc;
  	List	   *bitmapqualorig;
  	TIDBitmap  *tbm;
  	TBMIterator *tbmiterator;