PostgreSQL Source Code
git master
Loading...
Searching...
No Matches
supportnodes.h
Go to the documentation of this file.
1
/*-------------------------------------------------------------------------
2
*
3
* supportnodes.h
4
* Definitions for planner support functions.
5
*
6
* This file defines the API for "planner support functions", which
7
* are SQL functions (normally written in C) that can be attached to
8
* another "target" function to give the system additional knowledge
9
* about the target function. The name is now something of a misnomer,
10
* since some of the call sites are in the executor not the planner,
11
* but "function support function" would be a confusing name so we
12
* stick with "planner support function".
13
*
14
* A support function must have the SQL signature
15
* supportfn(internal) returns internal
16
* The argument is a pointer to one of the Node types defined in this file.
17
* The result is usually also a Node pointer, though its type depends on
18
* which capability is being invoked. In all cases, a NULL pointer result
19
* (that's PG_RETURN_POINTER(NULL), not PG_RETURN_NULL()) indicates that
20
* the support function cannot do anything useful for the given request.
21
* Support functions must return a NULL pointer, not fail, if they do not
22
* recognize the request node type or cannot handle the given case; this
23
* allows for future extensions of the set of request cases.
24
*
25
*
26
* Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
27
* Portions Copyright (c) 1994, Regents of the University of California
28
*
29
* src/include/nodes/supportnodes.h
30
*
31
*-------------------------------------------------------------------------
32
*/
33
#ifndef SUPPORTNODES_H
34
#define SUPPORTNODES_H
35
36
#include "
nodes/plannodes.h
"
37
38
typedef
struct
PlannerInfo
PlannerInfo
;
/* avoid including pathnodes.h here */
39
typedef
struct
IndexOptInfo
IndexOptInfo
;
40
typedef
struct
SpecialJoinInfo
SpecialJoinInfo
;
41
typedef
struct
WindowClause
WindowClause
;
42
typedef
struct
RangeTblFunction
RangeTblFunction
;
/* ditto for parsenodes.h */
43
typedef
struct
HeapTupleData
*
HeapTuple
;
/* and htup.h too */
44
45
/*
46
* The Simplify request allows the support function to perform plan-time
47
* simplification of a call to its target function. For example, a varchar
48
* length coercion that does not decrease the allowed length of its argument
49
* could be replaced by a RelabelType node, or "x + 0" could be replaced by
50
* "x". This is invoked during the planner's constant-folding pass, so the
51
* function's arguments can be presumed already simplified.
52
*
53
* The planner's PlannerInfo "root" is typically not needed, but can be
54
* consulted if it's necessary to obtain info about Vars present in
55
* the given node tree. Beware that root could be NULL in some usages.
56
*
57
* "fcall" will be a FuncExpr invoking the support function's target
58
* function. (This is true even if the original parsetree node was an
59
* operator call; a FuncExpr is synthesized for this purpose.)
60
*
61
* The result should be a semantically-equivalent transformed node tree,
62
* or NULL if no simplification could be performed. Do *not* return or
63
* modify *fcall, as it isn't really a separately allocated Node. But
64
* it's okay to use fcall->args, or parts of it, in the result tree.
65
*/
66
typedef
struct
SupportRequestSimplify
67
{
68
NodeTag
type
;
69
70
PlannerInfo
*
root
;
/* Planner's infrastructure */
71
FuncExpr
*
fcall
;
/* Function call to be simplified */
72
}
SupportRequestSimplify
;
73
74
/*
75
* Similar to SupportRequestSimplify but for Aggref node types.
76
*
77
* This supports conversions such as swapping COUNT(1) or COUNT(notnullcol)
78
* for COUNT(*).
79
*
80
* Supporting functions can consult 'root' and the input 'aggref'. When the
81
* implementing support function deems the simplification is possible, it must
82
* create a new Node (probably another Aggref) and not modify the original.
83
* The newly created Node should then be returned to indicate that the
84
* conversion is to take place. When no conversion is possible, a NULL
85
* pointer should be returned.
86
*
87
* It is important to consider that implementing support functions can receive
88
* Aggrefs with agglevelsup > 0. Careful consideration should be given to
89
* whether the simplification is still possible at levels above 0.
90
*/
91
typedef
struct
SupportRequestSimplifyAggref
92
{
93
NodeTag
type
;
94
95
PlannerInfo
*
root
;
/* Planner's infrastructure */
96
Aggref
*
aggref
;
/* Aggref to be simplified */
97
}
SupportRequestSimplifyAggref
;
98
99
/*
100
* The InlineInFrom request allows the support function to perform plan-time
101
* simplification of a call to its target function that appears in FROM.
102
* The rules for this are sufficiently different from ordinary expressions
103
* that it's best to make this a separate request from Simplify.
104
*
105
* The planner's PlannerInfo "root" is typically not needed, but can be
106
* consulted if it's necessary to obtain info about Vars present in
107
* the given node tree. Beware that root could be NULL in some usages.
108
*
109
* "rtfunc" will be a RangeTblFunction node for the support function's target
110
* function. The call appeared alone (and without ORDINALITY) in FROM.
111
*
112
* "proc" will be the HeapTuple for the pg_proc row of the target function.
113
*
114
* The result should be a semantically-equivalent SELECT Query tree,
115
* or NULL if no simplification could be performed. The tree must have
116
* been passed through parse analysis and rewrite.
117
*/
118
typedef
struct
SupportRequestInlineInFrom
119
{
120
NodeTag
type
;
121
122
PlannerInfo
*
root
;
/* Planner's infrastructure */
123
RangeTblFunction
*
rtfunc
;
/* Function call to be simplified */
124
HeapTuple
proc
;
/* Function definition from pg_proc */
125
}
SupportRequestInlineInFrom
;
126
127
/*
128
* The Selectivity request allows the support function to provide a
129
* selectivity estimate for a function appearing at top level of a WHERE
130
* clause (so it applies only to functions returning boolean).
131
*
132
* The input arguments are the same as are supplied to operator restriction
133
* and join estimators, except that we unify those two APIs into just one
134
* request type. See clause_selectivity() for the details.
135
*
136
* If an estimate can be made, store it into the "selectivity" field and
137
* return the address of the SupportRequestSelectivity node; the estimate
138
* must be between 0 and 1 inclusive. Return NULL if no estimate can be
139
* made (in which case the planner will fall back to a default estimate,
140
* traditionally 1/3).
141
*
142
* If the target function is being used as the implementation of an operator,
143
* the support function will not be used for this purpose; the operator's
144
* restriction or join estimator is consulted instead.
145
*/
146
typedef
struct
SupportRequestSelectivity
147
{
148
NodeTag
type
;
149
150
/* Input fields: */
151
PlannerInfo
*
root
;
/* Planner's infrastructure */
152
Oid
funcid
;
/* function we are inquiring about */
153
List
*
args
;
/* pre-simplified arguments to function */
154
Oid
inputcollid
;
/* function's input collation */
155
bool
is_join
;
/* is this a join or restriction case? */
156
int
varRelid
;
/* if restriction, RTI of target relation */
157
JoinType
jointype
;
/* if join, outer join type */
158
SpecialJoinInfo
*
sjinfo
;
/* if outer join, info about join */
159
160
/* Output fields: */
161
Selectivity
selectivity
;
/* returned selectivity estimate */
162
}
SupportRequestSelectivity
;
163
164
/*
165
* The Cost request allows the support function to provide an execution
166
* cost estimate for its target function. The cost estimate can include
167
* both a one-time (query startup) component and a per-execution component.
168
* The estimate should *not* include the costs of evaluating the target
169
* function's arguments, only the target function itself.
170
*
171
* The "node" argument is normally the parse node that is invoking the
172
* target function. This is a FuncExpr in the simplest case, but it could
173
* also be an OpExpr, DistinctExpr, NullIfExpr, or WindowFunc, or possibly
174
* other cases in future. NULL is passed if the function cannot presume
175
* its arguments to be equivalent to what the calling node presents as
176
* arguments; that happens for, e.g., aggregate support functions and
177
* per-column comparison operators used by RowExprs.
178
*
179
* If an estimate can be made, store it into the cost fields and return the
180
* address of the SupportRequestCost node. Return NULL if no estimate can be
181
* made, in which case the planner will rely on the target function's procost
182
* field. (Note: while procost is automatically scaled by cpu_operator_cost,
183
* this is not the case for the outputs of the Cost request; the support
184
* function must scale its results appropriately on its own.)
185
*/
186
typedef
struct
SupportRequestCost
187
{
188
NodeTag
type
;
189
190
/* Input fields: */
191
PlannerInfo
*
root
;
/* Planner's infrastructure (could be NULL) */
192
Oid
funcid
;
/* function we are inquiring about */
193
Node
*
node
;
/* parse node invoking function, or NULL */
194
195
/* Output fields: */
196
Cost
startup
;
/* one-time cost */
197
Cost
per_tuple
;
/* per-evaluation cost */
198
}
SupportRequestCost
;
199
200
/*
201
* The Rows request allows the support function to provide an output rowcount
202
* estimate for its target function (so it applies only to set-returning
203
* functions).
204
*
205
* The "node" argument is the parse node that is invoking the target function;
206
* currently this will always be a FuncExpr or OpExpr.
207
*
208
* If an estimate can be made, store it into the rows field and return the
209
* address of the SupportRequestRows node. Return NULL if no estimate can be
210
* made, in which case the planner will rely on the target function's prorows
211
* field.
212
*/
213
typedef
struct
SupportRequestRows
214
{
215
NodeTag
type
;
216
217
/* Input fields: */
218
PlannerInfo
*
root
;
/* Planner's infrastructure (could be NULL) */
219
Oid
funcid
;
/* function we are inquiring about */
220
Node
*
node
;
/* parse node invoking function */
221
222
/* Output fields: */
223
double
rows
;
/* number of rows expected to be returned */
224
}
SupportRequestRows
;
225
226
/*
227
* The IndexCondition request allows the support function to generate
228
* a directly-indexable condition based on a target function call that is
229
* not itself indexable. The target function call must appear at the top
230
* level of WHERE or JOIN/ON, so this applies only to functions returning
231
* boolean.
232
*
233
* The "node" argument is the parse node that is invoking the target function;
234
* currently this will always be a FuncExpr or OpExpr. The call is made
235
* only if at least one function argument matches an index column's variable
236
* or expression. "indexarg" identifies the matching argument (it's the
237
* argument's zero-based index in the node's args list).
238
*
239
* If the transformation is possible, return a List of directly-indexable
240
* condition expressions, else return NULL. (A List is used because it's
241
* sometimes useful to generate more than one indexable condition, such as
242
* when a LIKE with constant prefix gives rise to both >= and < conditions.)
243
*
244
* "Directly indexable" means that the condition must be directly executable
245
* by the index machinery. Typically this means that it is a binary OpExpr
246
* with the index column value on the left, a pseudo-constant on the right,
247
* and an operator that is in the index column's operator family. Other
248
* possibilities include RowCompareExpr, ScalarArrayOpExpr, and NullTest,
249
* depending on the index type; but those seem less likely to be useful for
250
* derived index conditions. "Pseudo-constant" means that the right-hand
251
* expression must not contain any volatile functions, nor any Vars of the
252
* table the index is for; use is_pseudo_constant_for_index() to check this.
253
* (Note: if the passed "node" is an OpExpr, the core planner already verified
254
* that the non-indexkey operand is pseudo-constant; but when the "node"
255
* is a FuncExpr, it does not check, since it doesn't know which of the
256
* function's arguments you might need to use in an index comparison value.)
257
*
258
* In many cases, an index condition can be generated but it is weaker than
259
* the function condition itself; for example, a LIKE with a constant prefix
260
* can produce an index range check based on the prefix, but we still need
261
* to execute the LIKE operator to verify the rest of the pattern. We say
262
* that such an index condition is "lossy". When returning an index condition,
263
* you should set the "lossy" request field to true if the condition is lossy,
264
* or false if it is an exact equivalent of the function's result. The core
265
* code will initialize that field to true, which is the common case.
266
*
267
* It is important to verify that the index operator family is the correct
268
* one for the condition you want to generate. Core support functions tend
269
* to use the known OID of a built-in opfamily for this, but extensions need
270
* to work harder, since their OIDs aren't fixed. A possibly workable
271
* answer for an index on an extension datatype is to verify the index AM's
272
* OID instead, and then assume that there's only one relevant opclass for
273
* your datatype so the opfamily must be the right one. Generating OpExpr
274
* nodes may also require knowing extension datatype OIDs (often you can
275
* find these out by applying exprType() to a function argument) and
276
* operator OIDs (which you can look up using get_opfamily_member).
277
*/
278
typedef
struct
SupportRequestIndexCondition
279
{
280
NodeTag
type
;
281
282
/* Input fields: */
283
PlannerInfo
*
root
;
/* Planner's infrastructure */
284
Oid
funcid
;
/* function we are inquiring about */
285
Node
*
node
;
/* parse node invoking function */
286
int
indexarg
;
/* index of function arg matching indexcol */
287
IndexOptInfo
*
index
;
/* planner's info about target index */
288
int
indexcol
;
/* index of target index column (0-based) */
289
Oid
opfamily
;
/* index column's operator family */
290
Oid
indexcollation
;
/* index column's collation */
291
292
/* Output fields: */
293
bool
lossy
;
/* set to false if index condition is an exact
294
* equivalent of the function call */
295
}
SupportRequestIndexCondition
;
296
297
/* ----------
298
* To support more efficient query execution of any monotonically increasing
299
* and/or monotonically decreasing window functions, we support calling the
300
* window function's prosupport function passing along this struct whenever
301
* the planner sees an OpExpr qual directly reference a window function in a
302
* subquery. When the planner encounters this, we populate this struct and
303
* pass it along to the window function's prosupport function so that it can
304
* evaluate if the given WindowFunc is;
305
*
306
* a) monotonically increasing, or
307
* b) monotonically decreasing, or
308
* c) both monotonically increasing and decreasing, or
309
* d) none of the above.
310
*
311
* A function that is monotonically increasing can never return a value that
312
* is lower than a value returned in a "previous call". A monotonically
313
* decreasing function can never return a value higher than a value returned
314
* in a previous call. A function that is both must return the same value
315
* each time.
316
*
317
* We define "previous call" to mean a previous call to the same WindowFunc
318
* struct in the same window partition.
319
*
320
* row_number() is an example of a monotonically increasing function. The
321
* return value will be reset back to 1 in each new partition. An example of
322
* a monotonically increasing and decreasing function is COUNT(*) OVER ().
323
* Since there is no ORDER BY clause in this example, all rows in the
324
* partition are peers and all rows within the partition will be within the
325
* frame bound. Likewise for COUNT(*) OVER(ORDER BY a ROWS BETWEEN UNBOUNDED
326
* PRECEDING AND UNBOUNDED FOLLOWING).
327
*
328
* COUNT(*) OVER (ORDER BY a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
329
* is an example of a monotonically decreasing function.
330
*
331
* Implementations must only concern themselves with the given WindowFunc
332
* being monotonic in a single partition.
333
*
334
* Inputs:
335
* 'window_func' is the pointer to the window function being called.
336
*
337
* 'window_clause' pointer to the WindowClause data. Support functions can
338
* use this to check frame bounds, etc.
339
*
340
* Outputs:
341
* 'monotonic' the resulting MonotonicFunction value for the given input
342
* window function and window clause.
343
* ----------
344
*/
345
typedef
struct
SupportRequestWFuncMonotonic
346
{
347
NodeTag
type
;
348
349
/* Input fields: */
350
WindowFunc
*
window_func
;
/* Pointer to the window function data */
351
WindowClause
*
window_clause
;
/* Pointer to the window clause data */
352
353
/* Output fields: */
354
MonotonicFunction
monotonic
;
355
}
SupportRequestWFuncMonotonic
;
356
357
/*
358
* Some WindowFunc behavior might not be affected by certain variations in
359
* the WindowClause's frameOptions. For example, row_number() is coded in
360
* such a way that the frame options don't change the returned row number.
361
* nodeWindowAgg.c will have less work to do if the ROWS option is used
362
* instead of the RANGE option as no check needs to be done for peer rows.
363
* Since RANGE is included in the default frame options, window functions
364
* such as row_number() might want to change that to ROW.
365
*
366
* Here we allow a WindowFunc's support function to determine which, if
367
* anything, can be changed about the WindowClause which the WindowFunc
368
* belongs to. Currently only the frameOptions can be modified. However,
369
* we may want to allow more optimizations in the future.
370
*
371
* The support function is responsible for ensuring the optimized version of
372
* the frameOptions doesn't affect the result of the window function. The
373
* planner is responsible for only changing the frame options when all
374
* WindowFuncs using this particular WindowClause agree on what the optimized
375
* version of the frameOptions are. If a particular WindowFunc being used
376
* does not have a support function then the planner will not make any changes
377
* to the WindowClause's frameOptions.
378
*
379
* 'window_func' and 'window_clause' are set by the planner before calling the
380
* support function so that the support function has these fields available.
381
* These may be required in order to determine which optimizations are
382
* possible.
383
*
384
* 'frameOptions' is set by the planner to WindowClause.frameOptions. The
385
* support function must only adjust this if optimizations are possible for
386
* the given WindowFunc.
387
*/
388
typedef
struct
SupportRequestOptimizeWindowClause
389
{
390
NodeTag
type
;
391
392
/* Input fields: */
393
WindowFunc
*
window_func
;
/* Pointer to the window function data */
394
WindowClause
*
window_clause
;
/* Pointer to the window clause data */
395
396
/* Input/Output fields: */
397
int
frameOptions
;
/* New frameOptions, or left untouched if no
398
* optimizations are possible. */
399
}
SupportRequestOptimizeWindowClause
;
400
401
/*
402
* The ModifyInPlace request allows the support function to detect whether
403
* a call to its target function can be allowed to modify a read/write
404
* expanded object in-place. The context is that we are considering a
405
* PL/pgSQL (or similar PL) assignment of the form "x := f(x, ...)" where
406
* the variable x is of a type that can be represented as an expanded object
407
* (see utils/expandeddatum.h). If f() can usefully optimize by modifying
408
* the passed-in object in-place, then this request can be implemented to
409
* instruct PL/pgSQL to pass a read-write expanded pointer to the variable's
410
* value. (Note that there is no guarantee that later calls to f() will
411
* actually do so. If f() receives a read-only pointer, or a pointer to a
412
* non-expanded object, it must follow the usual convention of not modifying
413
* the pointed-to object.) There are two requirements that must be met
414
* to make this safe:
415
* 1. f() must guarantee that it will not have modified the object if it
416
* fails. Otherwise the variable's value might change unexpectedly.
417
* 2. If the other arguments to f() ("..." in the above example) contain
418
* references to x, f() must be able to cope with that; or if that's not
419
* safe, the support function must scan the other arguments to verify that
420
* there are no other references to x. An example of the concern here is
421
* that in "arr := array_append(arr, arr[1])", if the array element type
422
* is pass-by-reference then array_append would receive a second argument
423
* that points into the array object it intends to modify. array_append is
424
* coded to make that safe, but other functions might not be able to cope.
425
*
426
* "args" is a node tree list representing the function's arguments.
427
* One or more nodes within the node tree will be PARAM_EXTERN Params
428
* with ID "paramid", which represent the assignment target variable.
429
* (Note that such references are not necessarily at top level in the list,
430
* for example we might have "x := f(x, g(x))". Generally it's only safe
431
* to optimize a reference that is at top level, else we're making promises
432
* about the behavior of g() as well as f().)
433
*
434
* If modify-in-place is safe, the support function should return the
435
* address of the Param node that is to return a read-write pointer.
436
* (At most one of the references is allowed to do so.) Otherwise,
437
* return NULL.
438
*/
439
typedef
struct
SupportRequestModifyInPlace
440
{
441
NodeTag
type
;
442
443
Oid
funcid
;
/* PG_PROC OID of the target function */
444
List
*
args
;
/* Arguments to the function */
445
int
paramid
;
/* ID of Param(s) representing variable */
446
}
SupportRequestModifyInPlace
;
447
448
#endif
/* SUPPORTNODES_H */
Cost
double Cost
Definition
nodes.h:261
NodeTag
NodeTag
Definition
nodes.h:27
Selectivity
double Selectivity
Definition
nodes.h:260
JoinType
JoinType
Definition
nodes.h:298
plannodes.h
MonotonicFunction
MonotonicFunction
Definition
plannodes.h:1817
Oid
unsigned int Oid
Definition
postgres_ext.h:32
Aggref
Definition
primnodes.h:459
FuncExpr
Definition
primnodes.h:779
HeapTupleData
Definition
htup.h:63
IndexOptInfo
Definition
pathnodes.h:1251
List
Definition
pg_list.h:54
Node
Definition
nodes.h:135
PlannerInfo
Definition
pathnodes.h:221
RangeTblFunction
Definition
parsenodes.h:1375
SpecialJoinInfo
Definition
pathnodes.h:3113
SupportRequestCost
Definition
supportnodes.h:187
SupportRequestCost::startup
Cost startup
Definition
supportnodes.h:196
SupportRequestCost::root
PlannerInfo * root
Definition
supportnodes.h:191
SupportRequestCost::node
Node * node
Definition
supportnodes.h:193
SupportRequestCost::per_tuple
Cost per_tuple
Definition
supportnodes.h:197
SupportRequestCost::funcid
Oid funcid
Definition
supportnodes.h:192
SupportRequestCost::type
NodeTag type
Definition
supportnodes.h:188
SupportRequestIndexCondition
Definition
supportnodes.h:279
SupportRequestIndexCondition::type
NodeTag type
Definition
supportnodes.h:280
SupportRequestIndexCondition::funcid
Oid funcid
Definition
supportnodes.h:284
SupportRequestIndexCondition::indexcollation
Oid indexcollation
Definition
supportnodes.h:290
SupportRequestIndexCondition::indexarg
int indexarg
Definition
supportnodes.h:286
SupportRequestIndexCondition::node
Node * node
Definition
supportnodes.h:285
SupportRequestIndexCondition::indexcol
int indexcol
Definition
supportnodes.h:288
SupportRequestIndexCondition::index
IndexOptInfo * index
Definition
supportnodes.h:287
SupportRequestIndexCondition::lossy
bool lossy
Definition
supportnodes.h:293
SupportRequestIndexCondition::opfamily
Oid opfamily
Definition
supportnodes.h:289
SupportRequestIndexCondition::root
PlannerInfo * root
Definition
supportnodes.h:283
SupportRequestInlineInFrom
Definition
supportnodes.h:119
SupportRequestInlineInFrom::type
NodeTag type
Definition
supportnodes.h:120
SupportRequestInlineInFrom::root
PlannerInfo * root
Definition
supportnodes.h:122
SupportRequestInlineInFrom::rtfunc
RangeTblFunction * rtfunc
Definition
supportnodes.h:123
SupportRequestInlineInFrom::proc
HeapTuple proc
Definition
supportnodes.h:124
SupportRequestModifyInPlace
Definition
supportnodes.h:440
SupportRequestModifyInPlace::type
NodeTag type
Definition
supportnodes.h:441
SupportRequestModifyInPlace::paramid
int paramid
Definition
supportnodes.h:445
SupportRequestModifyInPlace::args
List * args
Definition
supportnodes.h:444
SupportRequestModifyInPlace::funcid
Oid funcid
Definition
supportnodes.h:443
SupportRequestOptimizeWindowClause
Definition
supportnodes.h:389
SupportRequestOptimizeWindowClause::window_clause
WindowClause * window_clause
Definition
supportnodes.h:394
SupportRequestOptimizeWindowClause::window_func
WindowFunc * window_func
Definition
supportnodes.h:393
SupportRequestOptimizeWindowClause::frameOptions
int frameOptions
Definition
supportnodes.h:397
SupportRequestOptimizeWindowClause::type
NodeTag type
Definition
supportnodes.h:390
SupportRequestRows
Definition
supportnodes.h:214
SupportRequestRows::rows
double rows
Definition
supportnodes.h:223
SupportRequestRows::type
NodeTag type
Definition
supportnodes.h:215
SupportRequestRows::node
Node * node
Definition
supportnodes.h:220
SupportRequestRows::root
PlannerInfo * root
Definition
supportnodes.h:218
SupportRequestRows::funcid
Oid funcid
Definition
supportnodes.h:219
SupportRequestSelectivity
Definition
supportnodes.h:147
SupportRequestSelectivity::varRelid
int varRelid
Definition
supportnodes.h:156
SupportRequestSelectivity::is_join
bool is_join
Definition
supportnodes.h:155
SupportRequestSelectivity::sjinfo
SpecialJoinInfo * sjinfo
Definition
supportnodes.h:158
SupportRequestSelectivity::type
NodeTag type
Definition
supportnodes.h:148
SupportRequestSelectivity::selectivity
Selectivity selectivity
Definition
supportnodes.h:161
SupportRequestSelectivity::funcid
Oid funcid
Definition
supportnodes.h:152
SupportRequestSelectivity::jointype
JoinType jointype
Definition
supportnodes.h:157
SupportRequestSelectivity::args
List * args
Definition
supportnodes.h:153
SupportRequestSelectivity::inputcollid
Oid inputcollid
Definition
supportnodes.h:154
SupportRequestSelectivity::root
PlannerInfo * root
Definition
supportnodes.h:151
SupportRequestSimplifyAggref
Definition
supportnodes.h:92
SupportRequestSimplifyAggref::aggref
Aggref * aggref
Definition
supportnodes.h:96
SupportRequestSimplifyAggref::root
PlannerInfo * root
Definition
supportnodes.h:95
SupportRequestSimplifyAggref::type
NodeTag type
Definition
supportnodes.h:93
SupportRequestSimplify
Definition
supportnodes.h:67
SupportRequestSimplify::type
NodeTag type
Definition
supportnodes.h:68
SupportRequestSimplify::fcall
FuncExpr * fcall
Definition
supportnodes.h:71
SupportRequestSimplify::root
PlannerInfo * root
Definition
supportnodes.h:70
SupportRequestWFuncMonotonic
Definition
supportnodes.h:346
SupportRequestWFuncMonotonic::type
NodeTag type
Definition
supportnodes.h:347
SupportRequestWFuncMonotonic::window_clause
WindowClause * window_clause
Definition
supportnodes.h:351
SupportRequestWFuncMonotonic::monotonic
MonotonicFunction monotonic
Definition
supportnodes.h:354
SupportRequestWFuncMonotonic::window_func
WindowFunc * window_func
Definition
supportnodes.h:350
WindowClause
Definition
parsenodes.h:1595
WindowFunc
Definition
primnodes.h:594
HeapTuple
struct HeapTupleData * HeapTuple
Definition
supportnodes.h:43
src
include
nodes
supportnodes.h
Generated on Tue Jan 27 2026 06:13:17 for PostgreSQL Source Code by
1.9.8