execAmi.c 6.39 KB
Newer Older
1 2
/*-------------------------------------------------------------------------
 *
3
 * execAmi.c
4
 *	  miscellaneous executor access method routines
5
 *
Bruce Momjian's avatar
Bruce Momjian committed
6
 * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
Bruce Momjian's avatar
Add:  
Bruce Momjian committed
7
 * Portions Copyright (c) 1994, Regents of the University of California
8
 *
9
 *	$Header: /cvsroot/pgsql/src/backend/executor/execAmi.c,v 1.68 2002/12/14 00:17:50 tgl Exp $
10 11 12
 *
 *-------------------------------------------------------------------------
 */
13 14
#include "postgres.h"

Bruce Momjian's avatar
Bruce Momjian committed
15 16 17 18
#include "access/genam.h"
#include "access/heapam.h"
#include "catalog/heap.h"
#include "executor/execdebug.h"
19
#include "executor/instrument.h"
Bruce Momjian's avatar
Bruce Momjian committed
20 21
#include "executor/nodeAgg.h"
#include "executor/nodeAppend.h"
22
#include "executor/nodeFunctionscan.h"
Bruce Momjian's avatar
Bruce Momjian committed
23 24 25 26
#include "executor/nodeGroup.h"
#include "executor/nodeGroup.h"
#include "executor/nodeHash.h"
#include "executor/nodeHashjoin.h"
27
#include "executor/nodeIndexscan.h"
28
#include "executor/nodeLimit.h"
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
29
#include "executor/nodeMaterial.h"
Bruce Momjian's avatar
Bruce Momjian committed
30
#include "executor/nodeMergejoin.h"
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
31 32
#include "executor/nodeNestloop.h"
#include "executor/nodeResult.h"
Bruce Momjian's avatar
Bruce Momjian committed
33
#include "executor/nodeSeqscan.h"
34
#include "executor/nodeSetOp.h"
Bruce Momjian's avatar
Bruce Momjian committed
35
#include "executor/nodeSort.h"
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
36
#include "executor/nodeSubplan.h"
37
#include "executor/nodeSubqueryscan.h"
38
#include "executor/nodeTidscan.h"
Bruce Momjian's avatar
Bruce Momjian committed
39
#include "executor/nodeUnique.h"
40

41

42
/* ----------------------------------------------------------------
43
 *		ExecReScan
44
 *
45 46 47
 *		takes the new expression context as an argument, so that
 *		index scans needn't have their scan keys updated separately
 *		- marcel 09/20/94
48 49 50
 * ----------------------------------------------------------------
 */
void
51
ExecReScan(PlanState *node, ExprContext *exprCtxt)
52
{
53
	/* If collecting timing stats, update them */
54 55
	if (node->instrument)
		InstrEndLoop(node->instrument);
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
56

57 58
	/* If we have changed parameters, propagate that info */
	if (node->chgParam != NIL)
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
59
	{
60 61 62
		List	   *lst;

		foreach(lst, node->initPlan)
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
63
		{
64
			SubPlanState  *sstate = (SubPlanState *) lfirst(lst);
65
			PlanState  *splan = sstate->planstate;
66

67
			if (splan->plan->extParam != NIL)	/* don't care about child
68 69
												 * locParam */
				SetChangedParamList(splan, node->chgParam);
70
			if (splan->chgParam != NIL)
71
				ExecReScanSetParamPlan(sstate, node);
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
72
		}
73
		foreach(lst, node->subPlan)
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
74
		{
75
			SubPlanState  *sstate = (SubPlanState *) lfirst(lst);
76
			PlanState  *splan = sstate->planstate;
77

78
			if (splan->plan->extParam != NIL)
79
				SetChangedParamList(splan, node->chgParam);
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
80 81
		}
		/* Well. Now set chgParam for left/right trees. */
82 83 84 85
		if (node->lefttree != NULL)
			SetChangedParamList(node->lefttree, node->chgParam);
		if (node->righttree != NULL)
			SetChangedParamList(node->righttree, node->chgParam);
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
86 87
	}

88 89
	switch (nodeTag(node))
	{
90 91
		case T_ResultState:
			ExecReScanResult((ResultState *) node, exprCtxt);
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
92
			break;
93

94 95
		case T_AppendState:
			ExecReScanAppend((AppendState *) node, exprCtxt);
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
96
			break;
97

98 99
		case T_SeqScanState:
			ExecSeqReScan((SeqScanState *) node, exprCtxt);
100 101
			break;

102 103
		case T_IndexScanState:
			ExecIndexReScan((IndexScanState *) node, exprCtxt);
104 105
			break;

106 107
		case T_TidScanState:
			ExecTidReScan((TidScanState *) node, exprCtxt);
108 109
			break;

110 111
		case T_SubqueryScanState:
			ExecSubqueryReScan((SubqueryScanState *) node, exprCtxt);
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
112
			break;
113

114 115
		case T_FunctionScanState:
			ExecFunctionReScan((FunctionScanState *) node, exprCtxt);
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
116 117
			break;

118 119
		case T_NestLoopState:
			ExecReScanNestLoop((NestLoopState *) node, exprCtxt);
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
120 121
			break;

122 123
		case T_MergeJoinState:
			ExecReScanMergeJoin((MergeJoinState *) node, exprCtxt);
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
124 125
			break;

126 127
		case T_HashJoinState:
			ExecReScanHashJoin((HashJoinState *) node, exprCtxt);
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
128
			break;
129

130 131
		case T_MaterialState:
			ExecMaterialReScan((MaterialState *) node, exprCtxt);
Bruce Momjian's avatar
Bruce Momjian committed
132 133
			break;

134 135
		case T_SortState:
			ExecReScanSort((SortState *) node, exprCtxt);
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
136 137
			break;

138 139
		case T_GroupState:
			ExecReScanGroup((GroupState *) node, exprCtxt);
140 141
			break;

142 143
		case T_AggState:
			ExecReScanAgg((AggState *) node, exprCtxt);
144 145
			break;

146 147
		case T_UniqueState:
			ExecReScanUnique((UniqueState *) node, exprCtxt);
148 149
			break;

150 151
		case T_HashState:
			ExecReScanHash((HashState *) node, exprCtxt);
152 153
			break;

154 155
		case T_SetOpState:
			ExecReScanSetOp((SetOpState *) node, exprCtxt);
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
156 157
			break;

158 159
		case T_LimitState:
			ExecReScanLimit((LimitState *) node, exprCtxt);
160 161
			break;

162
		default:
163 164
			elog(ERROR, "ExecReScan: node type %d not supported",
				 nodeTag(node));
165
			return;
166
	}
167

168
	if (node->chgParam != NIL)
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
169
	{
170
		freeList(node->chgParam);
171
		node->chgParam = NIL;
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
172
	}
173
}
174

175 176
/*
 * ExecMarkPos
177
 *
178
 * Marks the current scan position.
179 180
 */
void
181
ExecMarkPos(PlanState *node)
182
{
183 184
	switch (nodeTag(node))
	{
185 186
		case T_SeqScanState:
			ExecSeqMarkPos((SeqScanState *) node);
187
			break;
188

189 190
		case T_IndexScanState:
			ExecIndexMarkPos((IndexScanState *) node);
191
			break;
192

193 194
		case T_TidScanState:
			ExecTidMarkPos((TidScanState *) node);
195 196
			break;

197 198
		case T_FunctionScanState:
			ExecFunctionMarkPos((FunctionScanState *) node);
199 200
			break;

201 202
		case T_MaterialState:
			ExecMaterialMarkPos((MaterialState *) node);
203 204
			break;

205 206
		case T_SortState:
			ExecSortMarkPos((SortState *) node);
207
			break;
208

209
		default:
210
			/* don't make hard error unless caller asks to restore... */
211
			elog(DEBUG1, "ExecMarkPos: node type %d not supported",
212
				 nodeTag(node));
213
			break;
214
	}
215
}
216

217 218
/*
 * ExecRestrPos
219
 *
220
 * restores the scan position previously saved with ExecMarkPos()
221 222
 */
void
223
ExecRestrPos(PlanState *node)
224
{
225 226
	switch (nodeTag(node))
	{
227 228
		case T_SeqScanState:
			ExecSeqRestrPos((SeqScanState *) node);
229
			break;
230

231 232
		case T_IndexScanState:
			ExecIndexRestrPos((IndexScanState *) node);
233
			break;
234

235 236
		case T_TidScanState:
			ExecTidRestrPos((TidScanState *) node);
237 238
			break;

239 240
		case T_FunctionScanState:
			ExecFunctionRestrPos((FunctionScanState *) node);
241 242
			break;

243 244
		case T_MaterialState:
			ExecMaterialRestrPos((MaterialState *) node);
245
			break;
246

247 248
		case T_SortState:
			ExecSortRestrPos((SortState *) node);
249
			break;
250

251
		default:
252 253 254
			elog(ERROR, "ExecRestrPos: node type %d not supported",
				 nodeTag(node));
			break;
255
	}
256
}
257 258 259 260 261 262

/*
 * ExecSupportsMarkRestore - does a plan type support mark/restore?
 *
 * XXX Ideally, all plan node types would support mark/restore, and this
 * wouldn't be needed.  For now, this had better match the routines above.
263
 * But note the test is on Plan nodetype, not PlanState nodetype.
264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283
 */
bool
ExecSupportsMarkRestore(NodeTag plantype)
{
	switch (plantype)
	{
		case T_SeqScan:
		case T_IndexScan:
		case T_TidScan:
		case T_FunctionScan:
		case T_Material:
		case T_Sort:
			return true;

		default:
			break;
	}

	return false;
}