PostgreSQL Source Code: src/backend/executor/nodeLimit.c Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
23
27
30
31
32
33
34
35
36
37
38
41{
47
49
50
51
52
55
56
57
58
60 {
62
63
64
65
66
67
68
70
71
72
74
75
76
77
79 return NULL;
80
81
82
83
85 {
87 return NULL;
88 }
89
90
91
92
93 for (;;)
94 {
97 {
98
99
100
101
103 return NULL;
104 }
105
106
107
108
109
112 {
114 }
117 break;
118 }
119
120
121
122
124 break;
125
127
128
129
130
131
132 return NULL;
133
136 {
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
155 {
157 {
159 return NULL;
160 }
161 else
162 {
164
165 }
166 }
167 else
168 {
169
170
171
174 {
176 return NULL;
177 }
178
179
180
181
182
183
186 {
188 }
191 break;
192 }
193 }
194 else
195 {
196
197
198
199
201 {
203 return NULL;
204 }
205
206
207
208
211 elog(ERROR, "LIMIT subplan failed to run backwards");
214 break;
215 }
216
218
219
222 {
223
224
225
226
229 {
231 return NULL;
232 }
233
234
235
236
237
241 {
244 }
245 else
246 {
248 return NULL;
249 }
250 }
251 else
252 {
253
254
255
256
258 {
260 return NULL;
261 }
262
263
264
265
266
269 elog(ERROR, "LIMIT subplan failed to run backwards");
273 }
274 break;
275
278 return NULL;
279
280
281
282
283
286 elog(ERROR, "LIMIT subplan failed to run backwards");
289
290 break;
291
294 return NULL;
295
296
297
298
299
300
302 {
305 elog(ERROR, "LIMIT subplan failed to run backwards");
308 }
309 else
310 {
311
312
313
314
317
318 }
319 break;
320
323 return NULL;
324
325
326
327
328
331
332 break;
333
334 default:
335 elog(ERROR, "impossible LIMIT state: %d",
337 slot = NULL;
338 break;
339 }
340
341
343
344 return slot;
345}
346
347
348
349
350
351
352static void
354{
357 bool isNull;
358
360 {
362 econtext,
363 &isNull);
364
365 if (isNull)
367 else
368 {
370 if (node->offset < 0)
372 (errcode(ERRCODE_INVALID_ROW_COUNT_IN_RESULT_OFFSET_CLAUSE),
373 errmsg("OFFSET must not be negative")));
374 }
375 }
376 else
377 {
378
380 }
381
383 {
385 econtext,
386 &isNull);
387
388 if (isNull)
389 {
392 }
393 else
394 {
396 if (node->count < 0)
398 (errcode(ERRCODE_INVALID_ROW_COUNT_IN_LIMIT_CLAUSE),
399 errmsg("LIMIT must not be negative")));
401 }
402 }
403 else
404 {
405
408 }
409
410
413
414
416
417
418
419
420
421
422
424}
425
426
427
428
429
432{
434 return -1;
435
437}
438
439
440
441
442
443
444
445
448{
451
452
454
455
456
457
460 limitstate->ps.state = estate;
462
464
465
466
467
468
469
470
472
473
474
475
478
479
480
481
487
488
489
490
492
496
497
498
499
500
502
503
504
505
507 {
510
513
517 node->uniqColIdx,
518 node->uniqOperators,
519 node->uniqCollations,
520 &limitstate->ps);
521 }
522
523 return limitstate;
524}
525
526
527
528
529
530
531
532
533void
535{
537}
538
539
540void
542{
544
545
546
547
548
549
551
552
553
554
555
558}
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
void ExecReScan(PlanState *node)
ExprState * ExecInitExpr(Expr *node, PlanState *parent)
ExprState * execTuplesMatchPrepare(TupleDesc desc, int numCols, const AttrNumber *keyColIdx, const Oid *eqOperators, const Oid *collations, PlanState *parent)
void ExecSetTupleBound(int64 tuples_needed, PlanState *child_node)
void ExecEndNode(PlanState *node)
PlanState * ExecInitNode(Plan *node, EState *estate, int eflags)
void ExecInitResultTypeTL(PlanState *planstate)
TupleTableSlot * ExecInitExtraTupleSlot(EState *estate, TupleDesc tupledesc, const TupleTableSlotOps *tts_ops)
TupleDesc ExecGetResultType(PlanState *planstate)
void ExecAssignExprContext(EState *estate, PlanState *planstate)
const TupleTableSlotOps * ExecGetResultSlotOps(PlanState *planstate, bool *isfixed)
#define outerPlanState(node)
static bool ExecQualAndReset(ExprState *state, ExprContext *econtext)
static TupleTableSlot * ExecProcNode(PlanState *node)
static Datum ExecEvalExprSwitchContext(ExprState *state, ExprContext *econtext, bool *isNull)
Assert(PointerIsAligned(start, uint64))
#define CHECK_FOR_INTERRUPTS()
void ExecReScanLimit(LimitState *node)
LimitState * ExecInitLimit(Limit *node, EState *estate, int eflags)
static int64 compute_tuples_needed(LimitState *node)
static void recompute_limits(LimitState *node)
void ExecEndLimit(LimitState *node)
static TupleTableSlot * ExecLimit(PlanState *pstate)
#define castNode(_type_, nodeptr)
static int64 DatumGetInt64(Datum X)
#define ScanDirectionIsForward(direction)
ScanDirection es_direction
TupleTableSlot * ecxt_innertuple
TupleTableSlot * ecxt_outertuple
TupleTableSlot * last_slot
const TupleTableSlotOps * resultops
ExprContext * ps_ExprContext
ProjectionInfo * ps_ProjInfo
ExecProcNodeMtd ExecProcNode
static TupleTableSlot * ExecCopySlot(TupleTableSlot *dstslot, TupleTableSlot *srcslot)