Thanks to visit codestin.com
Credit goes to doxygen.postgresql.org

PostgreSQL Source Code git master
plannodes.h
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * plannodes.h
4 * definitions for query plan nodes
5 *
6 *
7 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
9 *
10 * src/include/nodes/plannodes.h
11 *
12 *-------------------------------------------------------------------------
13 */
14#ifndef PLANNODES_H
15#define PLANNODES_H
16
17#include "access/sdir.h"
18#include "access/stratnum.h"
19#include "common/relpath.h"
20#include "lib/stringinfo.h"
21#include "nodes/bitmapset.h"
22#include "nodes/lockoptions.h"
23#include "nodes/primnodes.h"
24
25
26/* ----------------------------------------------------------------
27 * node definitions
28 * ----------------------------------------------------------------
29 */
30
31/* ----------------
32 * PlannedStmtOrigin
33 *
34 * PlannedStmtOrigin identifies from where a PlannedStmt comes from.
35 * ----------------
36 */
38{
39 PLAN_STMT_UNKNOWN = 0, /* plan origin is not yet known */
40 PLAN_STMT_INTERNAL, /* generated internally by a query */
41 PLAN_STMT_STANDARD, /* standard planned statement */
42 PLAN_STMT_CACHE_GENERIC, /* Generic cached plan */
43 PLAN_STMT_CACHE_CUSTOM, /* Custom cached plan */
45
46/* ----------------
47 * PlannedStmt node
48 *
49 * The output of the planner is a Plan tree headed by a PlannedStmt node.
50 * PlannedStmt holds the "one time" information needed by the executor.
51 *
52 * For simplicity in APIs, we also wrap utility statements in PlannedStmt
53 * nodes; in such cases, commandType == CMD_UTILITY, the statement itself
54 * is in the utilityStmt field, and the rest of the struct is mostly dummy.
55 * (We do use canSetTag, stmt_location, stmt_len, and possibly queryId.)
56 *
57 * PlannedStmt, as well as all varieties of Plan, do not support equal(),
58 * not because it's not sensible but because we currently have no need.
59 * ----------------
60 */
61typedef struct PlannedStmt
62{
63 pg_node_attr(no_equal, no_query_jumble)
64
66
67 /* select|insert|update|delete|merge|utility */
69
70 /* query identifier (copied from Query) */
72
73 /* plan identifier (can be set by plugins) */
75
76 /* origin of plan */
78
79 /* is it insert|update|delete|merge RETURNING? */
81
82 /* has insert|update|delete|merge in WITH? */
84
85 /* do I set the command result tag? */
87
88 /* redo plan when TransactionXmin changes? */
90
91 /* is plan specific to current role? */
93
94 /* parallel mode required to execute? */
96
97 /* which forms of JIT should be performed */
99
100 /* tree of Plan nodes */
101 struct Plan *planTree;
102
103 /*
104 * List of PartitionPruneInfo contained in the plan
105 */
107
108 /* list of RangeTblEntry nodes */
110
111 /*
112 * RT indexes of relations that are not subject to runtime pruning or are
113 * needed to perform runtime pruning
114 */
116
117 /*
118 * list of RTEPermissionInfo nodes for rtable entries needing one
119 */
121
122 /* rtable indexes of target relations for INSERT/UPDATE/DELETE/MERGE */
123 /* integer list of RT indexes, or NIL */
125
126 /* list of AppendRelInfo nodes */
128
129 /*
130 * Plan trees for SubPlan expressions; note that some could be NULL
131 */
133
134 /* indices of subplans that require REWIND */
136
137 /* a list of PlanRowMark's */
139
140 /* OIDs of relations the plan depends on */
142
143 /* other dependencies, as PlanInvalItems */
145
146 /* type OIDs for PARAM_EXEC Params */
148
149 /* non-null if this is utility stmt */
151
152 /* statement location in source string (copied from Query) */
153 /* start location, or -1 if unknown */
155 /* length in bytes; 0 means "rest of string" */
158
159/* macro for fetching the Plan associated with a SubPlan node */
160#define exec_subplan_get_plan(plannedstmt, subplan) \
161 ((Plan *) list_nth((plannedstmt)->subplans, (subplan)->plan_id - 1))
162
163
164/* ----------------
165 * Plan node
166 *
167 * All plan nodes "derive" from the Plan structure by having the
168 * Plan structure as the first field. This ensures that everything works
169 * when nodes are cast to Plan's. (node pointers are frequently cast to Plan*
170 * when passed around generically in the executor)
171 *
172 * We never actually instantiate any Plan nodes; this is just the common
173 * abstract superclass for all Plan-type nodes.
174 * ----------------
175 */
176typedef struct Plan
177{
178 pg_node_attr(abstract, no_equal, no_query_jumble)
179
181
182 /*
183 * estimated execution costs for plan (see costsize.c for more info)
184 */
185 /* count of disabled nodes */
187 /* cost expended before fetching any tuples */
189 /* total cost (assuming all tuples fetched) */
191
192 /*
193 * planner's estimate of result size of this plan step
194 */
195 /* number of rows plan is expected to emit */
197 /* average row width in bytes */
199
200 /*
201 * information needed for parallel query
202 */
203 /* engage parallel-aware logic? */
205 /* OK to use as part of parallel plan? */
207
208 /*
209 * information needed for asynchronous execution
210 */
211 /* engage asynchronous-capable logic? */
213
214 /*
215 * Common structural data for all Plan types.
216 */
217 /* unique across entire final plan tree */
219 /* target list to be computed at this node */
221 /* implicitly-ANDed qual conditions */
223 /* input plan tree(s) */
224 struct Plan *lefttree;
226 /* Init Plan nodes (un-correlated expr subselects) */
228
229 /*
230 * Information for management of parameter-change-driven rescanning
231 *
232 * extParam includes the paramIDs of all external PARAM_EXEC params
233 * affecting this plan node or its children. setParam params from the
234 * node's initPlans are not included, but their extParams are.
235 *
236 * allParam includes all the extParam paramIDs, plus the IDs of local
237 * params that affect the node (i.e., the setParams of its initplans).
238 * These are _all_ the PARAM_EXEC params that affect this node.
239 */
243
244/* ----------------
245 * these are defined to avoid confusion problems with "left"
246 * and "right" and "inner" and "outer". The convention is that
247 * the "left" plan is the "outer" plan and the "right" plan is
248 * the inner plan, but these make the code more readable.
249 * ----------------
250 */
251#define innerPlan(node) (((Plan *)(node))->righttree)
252#define outerPlan(node) (((Plan *)(node))->lefttree)
253
254
255/* ----------------
256 * ResultType -
257 * Classification of Result nodes
258 * ----------------
259 */
260typedef enum ResultType
261{
262 RESULT_TYPE_GATING, /* project or one-time-filter outer plan */
263 RESULT_TYPE_SCAN, /* replace empty scan */
264 RESULT_TYPE_JOIN, /* replace empty join */
265 RESULT_TYPE_UPPER, /* replace degenerate upper rel */
266 RESULT_TYPE_MINMAX /* implement minmax aggregate */
268
269/* ----------------
270 * Result node -
271 * If no outer plan, evaluate a variable-free targetlist.
272 * If outer plan, return tuples from outer plan (after a level of
273 * projection as shown by targetlist).
274 *
275 * If resconstantqual isn't NULL, it represents a one-time qualification
276 * test (i.e., one that doesn't depend on any variables from the outer plan,
277 * so needs to be evaluated only once).
278 *
279 * relids identifies the relation for which this Result node is generating the
280 * tuples. When subplan is not NULL, it should be empty: this node is not
281 * generating anything in that case, just acting on tuples generated by the
282 * subplan. Otherwise, it contains the relids of the planner relation that
283 * the Result represents.
284 * ----------------
285 */
286typedef struct Result
287{
293
294/* ----------------
295 * ProjectSet node -
296 * Apply a projection that includes set-returning functions to the
297 * output tuples of the outer plan.
298 * ----------------
299 */
300typedef struct ProjectSet
301{
304
305/* ----------------
306 * ModifyTable node -
307 * Apply rows produced by outer plan to result table(s),
308 * by inserting, updating, or deleting.
309 *
310 * If the originally named target table is a partitioned table or inheritance
311 * tree, both nominalRelation and rootRelation contain the RT index of the
312 * partition root or appendrel RTE, which is not otherwise mentioned in the
313 * plan. Otherwise rootRelation is zero. However, nominalRelation will
314 * always be set, as it's the rel that EXPLAIN should claim is the
315 * INSERT/UPDATE/DELETE/MERGE target.
316 *
317 * Note that rowMarks and epqParam are presumed to be valid for all the
318 * table(s); they can't contain any info that varies across tables.
319 * ----------------
320 */
321typedef struct ModifyTable
322{
324 /* INSERT, UPDATE, DELETE, or MERGE */
326 /* do we set the command tag/es_processed? */
328 /* Parent RT index for use of EXPLAIN */
330 /* Root RT index, if partitioned/inherited */
332 /* some part key in hierarchy updated? */
334 /* integer list of RT indexes */
336 /* per-target-table update_colnos lists */
338 /* per-target-table WCO lists */
340 /* alias for OLD in RETURNING lists */
342 /* alias for NEW in RETURNING lists */
344 /* per-target-table RETURNING tlists */
346 /* per-target-table FDW private data lists */
348 /* indices of FDW DM plans */
350 /* PlanRowMarks (non-locking only) */
352 /* ID of Param for EvalPlanQual re-eval */
354 /* ON CONFLICT action */
356 /* List of ON CONFLICT arbiter index OIDs */
358 /* INSERT ON CONFLICT DO UPDATE targetlist */
360 /* target column numbers for onConflictSet */
362 /* WHERE for ON CONFLICT UPDATE */
364 /* RTI of the EXCLUDED pseudo relation */
366 /* tlist of the EXCLUDED pseudo relation */
368 /* per-target-table lists of actions for MERGE */
370 /* per-target-table join conditions for MERGE */
373
374struct PartitionPruneInfo; /* forward reference to struct below */
375
376/* ----------------
377 * Append node -
378 * Generate the concatenation of the results of sub-plans.
379 * ----------------
380 */
381typedef struct Append
382{
384 /* RTIs of appendrel(s) formed by this node */
387 /* # of asynchronous plans */
389
390 /*
391 * All 'appendplans' preceding this index are non-partial plans. All
392 * 'appendplans' from this index onwards are partial plans.
393 */
395
396 /*
397 * Index into PlannedStmt.partPruneInfos and parallel lists in EState:
398 * es_part_prune_states and es_part_prune_results. Set to -1 if no
399 * run-time pruning is used.
400 */
403
404/* ----------------
405 * MergeAppend node -
406 * Merge the results of pre-sorted sub-plans to preserve the ordering.
407 * ----------------
408 */
409typedef struct MergeAppend
410{
412
413 /* RTIs of appendrel(s) formed by this node */
415
417
418 /* these fields are just like the sort-key info in struct Sort: */
419
420 /* number of sort-key columns */
422
423 /* their indexes in the target list */
424 AttrNumber *sortColIdx pg_node_attr(array_size(numCols));
425
426 /* OIDs of operators to sort them by */
427 Oid *sortOperators pg_node_attr(array_size(numCols));
428
429 /* OIDs of collations */
430 Oid *collations pg_node_attr(array_size(numCols));
431
432 /* NULLS FIRST/LAST directions */
433 bool *nullsFirst pg_node_attr(array_size(numCols));
434
435 /*
436 * Index into PlannedStmt.partPruneInfos and parallel lists in EState:
437 * es_part_prune_states and es_part_prune_results. Set to -1 if no
438 * run-time pruning is used.
439 */
442
443/* ----------------
444 * RecursiveUnion node -
445 * Generate a recursive union of two subplans.
446 *
447 * The "outer" subplan is always the non-recursive term, and the "inner"
448 * subplan is the recursive term.
449 * ----------------
450 */
451typedef struct RecursiveUnion
452{
454
455 /* ID of Param representing work table */
457
458 /* Remaining fields are zero/null in UNION ALL case */
459
460 /* number of columns to check for duplicate-ness */
462
463 /* their indexes in the target list */
464 AttrNumber *dupColIdx pg_node_attr(array_size(numCols));
465
466 /* equality operators to compare with */
467 Oid *dupOperators pg_node_attr(array_size(numCols));
468 Oid *dupCollations pg_node_attr(array_size(numCols));
469
470 /* estimated number of groups in input */
473
474/* ----------------
475 * BitmapAnd node -
476 * Generate the intersection of the results of sub-plans.
477 *
478 * The subplans must be of types that yield tuple bitmaps. The targetlist
479 * and qual fields of the plan are unused and are always NIL.
480 * ----------------
481 */
482typedef struct BitmapAnd
483{
487
488/* ----------------
489 * BitmapOr node -
490 * Generate the union of the results of sub-plans.
491 *
492 * The subplans must be of types that yield tuple bitmaps. The targetlist
493 * and qual fields of the plan are unused and are always NIL.
494 * ----------------
495 */
496typedef struct BitmapOr
497{
502
503/*
504 * ==========
505 * Scan nodes
506 *
507 * Scan is an abstract type that all relation scan plan types inherit from.
508 * ==========
509 */
510typedef struct Scan
511{
512 pg_node_attr(abstract)
513
514 Plan plan;
515 /* relid is index into the range table */
518
519/* ----------------
520 * sequential scan node
521 * ----------------
522 */
523typedef struct SeqScan
524{
527
528/* ----------------
529 * table sample scan node
530 * ----------------
531 */
532typedef struct SampleScan
533{
535 /* use struct pointer to avoid including parsenodes.h here */
538
539/* ----------------
540 * index scan node
541 *
542 * indexqualorig is an implicitly-ANDed list of index qual expressions, each
543 * in the same form it appeared in the query WHERE condition. Each should
544 * be of the form (indexkey OP comparisonval) or (comparisonval OP indexkey).
545 * The indexkey is a Var or expression referencing column(s) of the index's
546 * base table. The comparisonval might be any expression, but it won't use
547 * any columns of the base table. The expressions are ordered by index
548 * column position (but items referencing the same index column can appear
549 * in any order). indexqualorig is used at runtime only if we have to recheck
550 * a lossy indexqual.
551 *
552 * indexqual has the same form, but the expressions have been commuted if
553 * necessary to put the indexkeys on the left, and the indexkeys are replaced
554 * by Var nodes identifying the index columns (their varno is INDEX_VAR and
555 * their varattno is the index column number).
556 *
557 * indexorderbyorig is similarly the original form of any ORDER BY expressions
558 * that are being implemented by the index, while indexorderby is modified to
559 * have index column Vars on the left-hand side. Here, multiple expressions
560 * must appear in exactly the ORDER BY order, and this is not necessarily the
561 * index column order. Only the expressions are provided, not the auxiliary
562 * sort-order information from the ORDER BY SortGroupClauses; it's assumed
563 * that the sort ordering is fully determinable from the top-level operators.
564 * indexorderbyorig is used at runtime to recheck the ordering, if the index
565 * cannot calculate an accurate ordering. It is also needed for EXPLAIN.
566 *
567 * indexorderbyops is a list of the OIDs of the operators used to sort the
568 * ORDER BY expressions. This is used together with indexorderbyorig to
569 * recheck ordering at run time. (Note that indexorderby, indexorderbyorig,
570 * and indexorderbyops are used for amcanorderbyop cases, not amcanorder.)
571 *
572 * indexorderdir specifies the scan ordering, for indexscans on amcanorder
573 * indexes (for other indexes it should be "don't care").
574 * ----------------
575 */
576typedef struct IndexScan
577{
579 /* OID of index to scan */
581 /* list of index quals (usually OpExprs) */
583 /* the same in original form */
585 /* list of index ORDER BY exprs */
587 /* the same in original form */
589 /* OIDs of sort ops for ORDER BY exprs */
591 /* forward or backward or don't care */
594
595/* ----------------
596 * index-only scan node
597 *
598 * IndexOnlyScan is very similar to IndexScan, but it specifies an
599 * index-only scan, in which the data comes from the index not the heap.
600 * Because of this, *all* Vars in the plan node's targetlist, qual, and
601 * index expressions reference index columns and have varno = INDEX_VAR.
602 *
603 * We could almost use indexqual directly against the index's output tuple
604 * when rechecking lossy index operators, but that won't work for quals on
605 * index columns that are not retrievable. Hence, recheckqual is needed
606 * for rechecks: it expresses the same condition as indexqual, but using
607 * only index columns that are retrievable. (We will not generate an
608 * index-only scan if this is not possible. An example is that if an
609 * index has table column "x" in a retrievable index column "ind1", plus
610 * an expression f(x) in a non-retrievable column "ind2", an indexable
611 * query on f(x) will use "ind2" in indexqual and f(ind1) in recheckqual.
612 * Without the "ind1" column, an index-only scan would be disallowed.)
613 *
614 * We don't currently need a recheckable equivalent of indexorderby,
615 * because we don't support lossy operators in index ORDER BY.
616 *
617 * To help EXPLAIN interpret the index Vars for display, we provide
618 * indextlist, which represents the contents of the index as a targetlist
619 * with one TLE per index column. Vars appearing in this list reference
620 * the base table, and this is the only field in the plan node that may
621 * contain such Vars. Also, for the convenience of setrefs.c, TLEs in
622 * indextlist are marked as resjunk if they correspond to columns that
623 * the index AM cannot reconstruct.
624 * ----------------
625 */
626typedef struct IndexOnlyScan
627{
629 /* OID of index to scan */
631 /* list of index quals (usually OpExprs) */
633 /* index quals in recheckable form */
635 /* list of index ORDER BY exprs */
637 /* TargetEntry list describing index's cols */
639 /* forward or backward or don't care */
642
643/* ----------------
644 * bitmap index scan node
645 *
646 * BitmapIndexScan delivers a bitmap of potential tuple locations;
647 * it does not access the heap itself. The bitmap is used by an
648 * ancestor BitmapHeapScan node, possibly after passing through
649 * intermediate BitmapAnd and/or BitmapOr nodes to combine it with
650 * the results of other BitmapIndexScans.
651 *
652 * The fields have the same meanings as for IndexScan, except we don't
653 * store a direction flag because direction is uninteresting.
654 *
655 * In a BitmapIndexScan plan node, the targetlist and qual fields are
656 * not used and are always NIL. The indexqualorig field is unused at
657 * run time too, but is saved for the benefit of EXPLAIN.
658 * ----------------
659 */
660typedef struct BitmapIndexScan
661{
663 /* OID of index to scan */
665 /* Create shared bitmap if set */
667 /* list of index quals (OpExprs) */
669 /* the same in original form */
672
673/* ----------------
674 * bitmap sequential scan node
675 *
676 * This needs a copy of the qual conditions being used by the input index
677 * scans because there are various cases where we need to recheck the quals;
678 * for example, when the bitmap is lossy about the specific rows on a page
679 * that meet the index condition.
680 * ----------------
681 */
682typedef struct BitmapHeapScan
683{
685 /* index quals, in standard expr form */
688
689/* ----------------
690 * tid scan node
691 *
692 * tidquals is an implicitly OR'ed list of qual expressions of the form
693 * "CTID = pseudoconstant", or "CTID = ANY(pseudoconstant_array)",
694 * or a CurrentOfExpr for the relation.
695 * ----------------
696 */
697typedef struct TidScan
698{
700 /* qual(s) involving CTID = something */
703
704/* ----------------
705 * tid range scan node
706 *
707 * tidrangequals is an implicitly AND'ed list of qual expressions of the form
708 * "CTID relop pseudoconstant", where relop is one of >,>=,<,<=.
709 * ----------------
710 */
711typedef struct TidRangeScan
712{
714 /* qual(s) involving CTID op something */
717
718/* ----------------
719 * subquery scan node
720 *
721 * SubqueryScan is for scanning the output of a sub-query in the range table.
722 * We often need an extra plan node above the sub-query's plan to perform
723 * expression evaluations (which we can't push into the sub-query without
724 * risking changing its semantics). Although we are not scanning a physical
725 * relation, we make this a descendant of Scan anyway for code-sharing
726 * purposes.
727 *
728 * SubqueryScanStatus caches the trivial_subqueryscan property of the node.
729 * SUBQUERY_SCAN_UNKNOWN means not yet determined. This is only used during
730 * planning.
731 *
732 * Note: we store the sub-plan in the type-specific subplan field, not in
733 * the generic lefttree field as you might expect. This is because we do
734 * not want plan-tree-traversal routines to recurse into the subplan without
735 * knowing that they are changing Query contexts.
736 * ----------------
737 */
739{
744
745typedef struct SubqueryScan
746{
751
752/* ----------------
753 * FunctionScan node
754 * ----------------
755 */
756typedef struct FunctionScan
757{
759 /* list of RangeTblFunction nodes */
761 /* WITH ORDINALITY */
764
765/* ----------------
766 * ValuesScan node
767 * ----------------
768 */
769typedef struct ValuesScan
770{
772 /* list of expression lists */
775
776/* ----------------
777 * TableFunc scan node
778 * ----------------
779 */
780typedef struct TableFuncScan
781{
783 /* table function node */
786
787/* ----------------
788 * CteScan node
789 * ----------------
790 */
791typedef struct CteScan
792{
794 /* ID of init SubPlan for CTE */
796 /* ID of Param representing CTE output */
799
800/* ----------------
801 * NamedTuplestoreScan node
802 * ----------------
803 */
805{
807 /* Name given to Ephemeral Named Relation */
808 char *enrname;
810
811/* ----------------
812 * WorkTableScan node
813 * ----------------
814 */
815typedef struct WorkTableScan
816{
818 /* ID of Param representing work table */
821
822/* ----------------
823 * ForeignScan node
824 *
825 * fdw_exprs and fdw_private are both under the control of the foreign-data
826 * wrapper, but fdw_exprs is presumed to contain expression trees and will
827 * be post-processed accordingly by the planner; fdw_private won't be.
828 * Note that everything in both lists must be copiable by copyObject().
829 * One way to store an arbitrary blob of bytes is to represent it as a bytea
830 * Const. Usually, though, you'll be better off choosing a representation
831 * that can be dumped usefully by nodeToString().
832 *
833 * fdw_scan_tlist is a targetlist describing the contents of the scan tuple
834 * returned by the FDW; it can be NIL if the scan tuple matches the declared
835 * rowtype of the foreign table, which is the normal case for a simple foreign
836 * table scan. (If the plan node represents a foreign join, fdw_scan_tlist
837 * is required since there is no rowtype available from the system catalogs.)
838 * When fdw_scan_tlist is provided, Vars in the node's tlist and quals must
839 * have varno INDEX_VAR, and their varattnos correspond to resnos in the
840 * fdw_scan_tlist (which are also column numbers in the actual scan tuple).
841 * fdw_scan_tlist is never actually executed; it just holds expression trees
842 * describing what is in the scan tuple's columns.
843 *
844 * fdw_recheck_quals should contain any quals which the core system passed to
845 * the FDW but which were not added to scan.plan.qual; that is, it should
846 * contain the quals being checked remotely. This is needed for correct
847 * behavior during EvalPlanQual rechecks.
848 *
849 * When the plan node represents a foreign join, scan.scanrelid is zero and
850 * fs_relids must be consulted to identify the join relation. (fs_relids
851 * is valid for simple scans as well, but will always match scan.scanrelid.)
852 * fs_relids includes outer joins; fs_base_relids does not.
853 *
854 * If the FDW's PlanDirectModify() callback decides to repurpose a ForeignScan
855 * node to perform the UPDATE or DELETE operation directly in the remote
856 * server, it sets 'operation' and 'resultRelation' to identify the operation
857 * type and target relation. Note that these fields are only set if the
858 * modification is performed *fully* remotely; otherwise, the modification is
859 * driven by a local ModifyTable node and 'operation' is left to CMD_SELECT.
860 * ----------------
861 */
862typedef struct ForeignScan
863{
865 /* SELECT/INSERT/UPDATE/DELETE */
867 /* direct modification target's RT index */
869 /* user to perform the scan as; 0 means to check as current user */
871 /* OID of foreign server */
873 /* expressions that FDW may evaluate */
875 /* private data for FDW */
877 /* optional tlist describing scan tuple */
879 /* original quals not in scan.plan.qual */
881 /* base+OJ RTIs generated by this scan */
883 /* base RTIs generated by this scan */
885 /* true if any "system column" is needed */
888
889/* ----------------
890 * CustomScan node
891 *
892 * The comments for ForeignScan's fdw_exprs, fdw_private, fdw_scan_tlist,
893 * and fs_relids fields apply equally to CustomScan's custom_exprs,
894 * custom_private, custom_scan_tlist, and custom_relids fields. The
895 * convention of setting scan.scanrelid to zero for joins applies as well.
896 *
897 * Note that since Plan trees can be copied, custom scan providers *must*
898 * fit all plan data they need into those fields; embedding CustomScan in
899 * a larger struct will not work.
900 * ----------------
901 */
902struct CustomScanMethods;
903
904typedef struct CustomScan
905{
907 /* mask of CUSTOMPATH_* flags, see nodes/extensible.h */
909 /* list of Plan nodes, if any */
911 /* expressions that custom code may evaluate */
913 /* private data for custom code */
915 /* optional tlist describing scan tuple */
917 /* RTIs generated by this scan */
919
920 /*
921 * NOTE: The method field of CustomScan is required to be a pointer to a
922 * static table of callback functions. So we don't copy the table itself,
923 * just reference the original one.
924 */
927
928/*
929 * ==========
930 * Join nodes
931 * ==========
932 */
933
934/* ----------------
935 * Join node
936 *
937 * jointype: rule for joining tuples from left and right subtrees
938 * inner_unique each outer tuple can match to no more than one inner tuple
939 * joinqual: qual conditions that came from JOIN/ON or JOIN/USING
940 * (plan.qual contains conditions that came from WHERE)
941 *
942 * When jointype is INNER, joinqual and plan.qual are semantically
943 * interchangeable. For OUTER jointypes, the two are *not* interchangeable;
944 * only joinqual is used to determine whether a match has been found for
945 * the purpose of deciding whether to generate null-extended tuples.
946 * (But plan.qual is still applied before actually returning a tuple.)
947 * For an outer join, only joinquals are allowed to be used as the merge
948 * or hash condition of a merge or hash join.
949 *
950 * inner_unique is set if the joinquals are such that no more than one inner
951 * tuple could match any given outer tuple. This allows the executor to
952 * skip searching for additional matches. (This must be provable from just
953 * the joinquals, ignoring plan.qual, due to where the executor tests it.)
954 * ----------------
955 */
956typedef struct Join
957{
958 pg_node_attr(abstract)
959
960 Plan plan;
963 /* JOIN quals (in addition to plan.qual) */
966
967/* ----------------
968 * nest loop join node
969 *
970 * The nestParams list identifies any executor Params that must be passed
971 * into execution of the inner subplan carrying values from the current row
972 * of the outer subplan. Currently we restrict these values to be simple
973 * Vars, but perhaps someday that'd be worth relaxing. (Note: during plan
974 * creation, the paramval can actually be a PlaceHolderVar expression; but it
975 * must be a Var with varno OUTER_VAR by the time it gets to the executor.)
976 * ----------------
977 */
978typedef struct NestLoop
979{
981 /* list of NestLoopParam nodes */
984
985typedef struct NestLoopParam
986{
987 pg_node_attr(no_equal, no_query_jumble)
988
990 /* number of the PARAM_EXEC Param to set */
992 /* outer-relation Var to assign to Param */
995
996/* ----------------
997 * merge join node
998 *
999 * The expected ordering of each mergeable column is described by a btree
1000 * opfamily OID, a collation OID, a direction (BTLessStrategyNumber or
1001 * BTGreaterStrategyNumber) and a nulls-first flag. Note that the two sides
1002 * of each mergeclause may be of different datatypes, but they are ordered the
1003 * same way according to the common opfamily and collation. The operator in
1004 * each mergeclause must be an equality operator of the indicated opfamily.
1005 * ----------------
1006 */
1007typedef struct MergeJoin
1008{
1010
1011 /* Can we skip mark/restore calls? */
1013
1014 /* mergeclauses as expression trees */
1016
1017 /* these are arrays, but have the same length as the mergeclauses list: */
1018
1019 /* per-clause OIDs of btree opfamilies */
1020 Oid *mergeFamilies pg_node_attr(array_size(mergeclauses));
1021
1022 /* per-clause OIDs of collations */
1023 Oid *mergeCollations pg_node_attr(array_size(mergeclauses));
1024
1025 /* per-clause ordering (ASC or DESC) */
1026 bool *mergeReversals pg_node_attr(array_size(mergeclauses));
1027
1028 /* per-clause nulls ordering */
1029 bool *mergeNullsFirst pg_node_attr(array_size(mergeclauses));
1031
1032/* ----------------
1033 * hash join node
1034 * ----------------
1035 */
1036typedef struct HashJoin
1037{
1042
1043 /*
1044 * List of expressions to be hashed for tuples from the outer plan, to
1045 * perform lookups in the hashtable over the inner plan.
1046 */
1049
1050/* ----------------
1051 * materialization node
1052 * ----------------
1053 */
1054typedef struct Material
1055{
1058
1059/* ----------------
1060 * memoize node
1061 * ----------------
1062 */
1063typedef struct Memoize
1064{
1066
1067 /* size of the two arrays below */
1069
1070 /* hash operators for each key */
1071 Oid *hashOperators pg_node_attr(array_size(numKeys));
1072
1073 /* collations for each key */
1074 Oid *collations pg_node_attr(array_size(numKeys));
1075
1076 /* cache keys in the form of exprs containing parameters */
1078
1079 /*
1080 * true if the cache entry should be marked as complete after we store the
1081 * first tuple in it.
1082 */
1084
1085 /*
1086 * true when cache key should be compared bit by bit, false when using
1087 * hash equality ops
1088 */
1090
1091 /*
1092 * The maximum number of entries that the planner expects will fit in the
1093 * cache, or 0 if unknown
1094 */
1096
1097 /* paramids from param_exprs */
1099
1100 /* Estimated number of rescans, for EXPLAIN */
1102
1103 /* Estimated number of distinct lookup keys, for EXPLAIN */
1105
1106 /* Estimated cache hit ratio, for EXPLAIN */
1108
1110
1111/* ----------------
1112 * sort node
1113 * ----------------
1114 */
1115typedef struct Sort
1116{
1118
1119 /* number of sort-key columns */
1121
1122 /* their indexes in the target list */
1123 AttrNumber *sortColIdx pg_node_attr(array_size(numCols));
1124
1125 /* OIDs of operators to sort them by */
1126 Oid *sortOperators pg_node_attr(array_size(numCols));
1127
1128 /* OIDs of collations */
1129 Oid *collations pg_node_attr(array_size(numCols));
1130
1131 /* NULLS FIRST/LAST directions */
1132 bool *nullsFirst pg_node_attr(array_size(numCols));
1134
1135/* ----------------
1136 * incremental sort node
1137 * ----------------
1138 */
1139typedef struct IncrementalSort
1140{
1142 /* number of presorted columns */
1145
1146/* ---------------
1147 * group node -
1148 * Used for queries with GROUP BY (but no aggregates) specified.
1149 * The input must be presorted according to the grouping columns.
1150 * ---------------
1151 */
1152typedef struct Group
1153{
1155
1156 /* number of grouping columns */
1158
1159 /* their indexes in the target list */
1160 AttrNumber *grpColIdx pg_node_attr(array_size(numCols));
1161
1162 /* equality operators to compare with */
1163 Oid *grpOperators pg_node_attr(array_size(numCols));
1164 Oid *grpCollations pg_node_attr(array_size(numCols));
1166
1167/* ---------------
1168 * aggregate node
1169 *
1170 * An Agg node implements plain or grouped aggregation. For grouped
1171 * aggregation, we can work with presorted input or unsorted input;
1172 * the latter strategy uses an internal hashtable.
1173 *
1174 * Notice the lack of any direct info about the aggregate functions to be
1175 * computed. They are found by scanning the node's tlist and quals during
1176 * executor startup. (It is possible that there are no aggregate functions;
1177 * this could happen if they get optimized away by constant-folding, or if
1178 * we are using the Agg node to implement hash-based grouping.)
1179 * ---------------
1180 */
1181typedef struct Agg
1182{
1184
1185 /* basic strategy, see nodes.h */
1187
1188 /* agg-splitting mode, see nodes.h */
1190
1191 /* number of grouping columns */
1193
1194 /* their indexes in the target list */
1195 AttrNumber *grpColIdx pg_node_attr(array_size(numCols));
1196
1197 /* equality operators to compare with */
1198 Oid *grpOperators pg_node_attr(array_size(numCols));
1199 Oid *grpCollations pg_node_attr(array_size(numCols));
1200
1201 /* estimated number of groups in input */
1203
1204 /* for pass-by-ref transition data */
1206
1207 /* IDs of Params used in Aggref inputs */
1209
1210 /* Note: planner provides numGroups & aggParams only in HASHED/MIXED case */
1211
1212 /* grouping sets to use */
1214
1215 /* chained Agg/Sort nodes */
1218
1219/* ----------------
1220 * window aggregate node
1221 * ----------------
1222 */
1223typedef struct WindowAgg
1224{
1226
1227 /* name of WindowClause implemented by this node */
1228 char *winname;
1229
1230 /* ID referenced by window functions */
1232
1233 /* number of columns in partition clause */
1235
1236 /* their indexes in the target list */
1237 AttrNumber *partColIdx pg_node_attr(array_size(partNumCols));
1238
1239 /* equality operators for partition columns */
1240 Oid *partOperators pg_node_attr(array_size(partNumCols));
1241
1242 /* collations for partition columns */
1243 Oid *partCollations pg_node_attr(array_size(partNumCols));
1244
1245 /* number of columns in ordering clause */
1247
1248 /* their indexes in the target list */
1249 AttrNumber *ordColIdx pg_node_attr(array_size(ordNumCols));
1250
1251 /* equality operators for ordering columns */
1252 Oid *ordOperators pg_node_attr(array_size(ordNumCols));
1253
1254 /* collations for ordering columns */
1255 Oid *ordCollations pg_node_attr(array_size(ordNumCols));
1256
1257 /* frame_clause options, see WindowDef */
1259
1260 /* expression for starting bound, if any */
1262
1263 /* expression for ending bound, if any */
1265
1266 /* qual to help short-circuit execution */
1268
1269 /* runCondition for display in EXPLAIN */
1271
1272 /* these fields are used with RANGE offset PRECEDING/FOLLOWING: */
1273
1274 /* in_range function for startOffset */
1276
1277 /* in_range function for endOffset */
1279
1280 /* collation for in_range tests */
1282
1283 /* use ASC sort order for in_range tests? */
1285
1286 /* nulls sort first for in_range tests? */
1288
1289 /*
1290 * false for all apart from the WindowAgg that's closest to the root of
1291 * the plan
1292 */
1295
1296/* ----------------
1297 * unique node
1298 * ----------------
1299 */
1300typedef struct Unique
1301{
1303
1304 /* number of columns to check for uniqueness */
1306
1307 /* their indexes in the target list */
1308 AttrNumber *uniqColIdx pg_node_attr(array_size(numCols));
1309
1310 /* equality operators to compare with */
1311 Oid *uniqOperators pg_node_attr(array_size(numCols));
1312
1313 /* collations for equality comparisons */
1314 Oid *uniqCollations pg_node_attr(array_size(numCols));
1316
1317/* ------------
1318 * gather node
1319 *
1320 * Note: rescan_param is the ID of a PARAM_EXEC parameter slot. That slot
1321 * will never actually contain a value, but the Gather node must flag it as
1322 * having changed whenever it is rescanned. The child parallel-aware scan
1323 * nodes are marked as depending on that parameter, so that the rescan
1324 * machinery is aware that their output is likely to change across rescans.
1325 * In some cases we don't need a rescan Param, so rescan_param is set to -1.
1326 * ------------
1327 */
1328typedef struct Gather
1329{
1331 /* planned number of worker processes */
1333 /* ID of Param that signals a rescan, or -1 */
1335 /* don't execute plan more than once */
1337 /* suppress EXPLAIN display (for testing)? */
1339
1340 /*
1341 * param id's of initplans which are referred at gather or one of its
1342 * child nodes
1343 */
1346
1347/* ------------
1348 * gather merge node
1349 * ------------
1350 */
1351typedef struct GatherMerge
1352{
1354
1355 /* planned number of worker processes */
1357
1358 /* ID of Param that signals a rescan, or -1 */
1360
1361 /* remaining fields are just like the sort-key info in struct Sort */
1362
1363 /* number of sort-key columns */
1365
1366 /* their indexes in the target list */
1367 AttrNumber *sortColIdx pg_node_attr(array_size(numCols));
1368
1369 /* OIDs of operators to sort them by */
1370 Oid *sortOperators pg_node_attr(array_size(numCols));
1371
1372 /* OIDs of collations */
1373 Oid *collations pg_node_attr(array_size(numCols));
1374
1375 /* NULLS FIRST/LAST directions */
1376 bool *nullsFirst pg_node_attr(array_size(numCols));
1377
1378 /*
1379 * param id's of initplans which are referred at gather merge or one of
1380 * its child nodes
1381 */
1384
1385/* ----------------
1386 * hash build node
1387 *
1388 * If the executor is supposed to try to apply skew join optimization, then
1389 * skewTable/skewColumn/skewInherit identify the outer relation's join key
1390 * column, from which the relevant MCV statistics can be fetched.
1391 * ----------------
1392 */
1393typedef struct Hash
1394{
1396
1397 /*
1398 * List of expressions to be hashed for tuples from Hash's outer plan,
1399 * needed to put them into the hashtable.
1400 */
1401 /* hash keys for the hashjoin condition */
1403 /* outer join key's table OID, or InvalidOid */
1405 /* outer join key's column #, or zero */
1407 /* is outer join rel an inheritance tree? */
1409 /* all other info is in the parent HashJoin node */
1410 /* estimate total rows if parallel_aware */
1413
1414/* ----------------
1415 * setop node
1416 * ----------------
1417 */
1418typedef struct SetOp
1419{
1421
1422 /* what to do, see nodes.h */
1424
1425 /* how to do it, see nodes.h */
1427
1428 /* number of columns to compare */
1430
1431 /* their indexes in the target list */
1432 AttrNumber *cmpColIdx pg_node_attr(array_size(numCols));
1433
1434 /* comparison operators (either equality operators or sort operators) */
1435 Oid *cmpOperators pg_node_attr(array_size(numCols));
1436 Oid *cmpCollations pg_node_attr(array_size(numCols));
1437
1438 /* nulls-first flags if sorting, otherwise not interesting */
1439 bool *cmpNullsFirst pg_node_attr(array_size(numCols));
1440
1441 /* estimated number of groups in left input */
1444
1445/* ----------------
1446 * lock-rows node
1447 *
1448 * rowMarks identifies the rels to be locked by this node; it should be
1449 * a subset of the rowMarks listed in the top-level PlannedStmt.
1450 * epqParam is a Param that all scan nodes below this one must depend on.
1451 * It is used to force re-evaluation of the plan during EvalPlanQual.
1452 * ----------------
1453 */
1454typedef struct LockRows
1455{
1457 /* a list of PlanRowMark's */
1459 /* ID of Param for EvalPlanQual re-eval */
1462
1463/* ----------------
1464 * limit node
1465 *
1466 * Note: as of Postgres 8.2, the offset and count expressions are expected
1467 * to yield int8, rather than int4 as before.
1468 * ----------------
1469 */
1470typedef struct Limit
1471{
1473
1474 /* OFFSET parameter, or NULL if none */
1476
1477 /* COUNT parameter, or NULL if none */
1479
1480 /* limit type */
1482
1483 /* number of columns to check for similarity */
1485
1486 /* their indexes in the target list */
1487 AttrNumber *uniqColIdx pg_node_attr(array_size(uniqNumCols));
1488
1489 /* equality operators to compare with */
1490 Oid *uniqOperators pg_node_attr(array_size(uniqNumCols));
1491
1492 /* collations for equality comparisons */
1493 Oid *uniqCollations pg_node_attr(array_size(uniqNumCols));
1495
1496
1497/*
1498 * RowMarkType -
1499 * enums for types of row-marking operations
1500 *
1501 * The first four of these values represent different lock strengths that
1502 * we can take on tuples according to SELECT FOR [KEY] UPDATE/SHARE requests.
1503 * We support these on regular tables, as well as on foreign tables whose FDWs
1504 * report support for late locking. For other foreign tables, any locking
1505 * that might be done for such requests must happen during the initial row
1506 * fetch; their FDWs provide no mechanism for going back to lock a row later.
1507 * This means that the semantics will be a bit different than for a local
1508 * table; in particular we are likely to lock more rows than would be locked
1509 * locally, since remote rows will be locked even if they then fail
1510 * locally-checked restriction or join quals. However, the prospect of
1511 * doing a separate remote query to lock each selected row is usually pretty
1512 * unappealing, so early locking remains a credible design choice for FDWs.
1513 *
1514 * When doing UPDATE/DELETE/MERGE/SELECT FOR UPDATE/SHARE, we have to uniquely
1515 * identify all the source rows, not only those from the target relations, so
1516 * that we can perform EvalPlanQual rechecking at need. For plain tables we
1517 * can just fetch the TID, much as for a target relation; this case is
1518 * represented by ROW_MARK_REFERENCE. Otherwise (for example for VALUES or
1519 * FUNCTION scans) we have to copy the whole row value. ROW_MARK_COPY is
1520 * pretty inefficient, since most of the time we'll never need the data; but
1521 * fortunately the overhead is usually not performance-critical in practice.
1522 * By default we use ROW_MARK_COPY for foreign tables, but if the FDW has
1523 * a concept of rowid it can request to use ROW_MARK_REFERENCE instead.
1524 * (Again, this probably doesn't make sense if a physical remote fetch is
1525 * needed, but for FDWs that map to local storage it might be credible.)
1526 */
1527typedef enum RowMarkType
1528{
1529 ROW_MARK_EXCLUSIVE, /* obtain exclusive tuple lock */
1530 ROW_MARK_NOKEYEXCLUSIVE, /* obtain no-key exclusive tuple lock */
1531 ROW_MARK_SHARE, /* obtain shared tuple lock */
1532 ROW_MARK_KEYSHARE, /* obtain keyshare tuple lock */
1533 ROW_MARK_REFERENCE, /* just fetch the TID, don't lock it */
1534 ROW_MARK_COPY, /* physically copy the row value */
1536
1537#define RowMarkRequiresRowShareLock(marktype) ((marktype) <= ROW_MARK_KEYSHARE)
1538
1539/*
1540 * PlanRowMark -
1541 * plan-time representation of FOR [KEY] UPDATE/SHARE clauses
1542 *
1543 * When doing UPDATE/DELETE/MERGE/SELECT FOR UPDATE/SHARE, we create a separate
1544 * PlanRowMark node for each non-target relation in the query. Relations that
1545 * are not specified as FOR UPDATE/SHARE are marked ROW_MARK_REFERENCE (if
1546 * regular tables or supported foreign tables) or ROW_MARK_COPY (if not).
1547 *
1548 * Initially all PlanRowMarks have rti == prti and isParent == false.
1549 * When the planner discovers that a relation is the root of an inheritance
1550 * tree, it sets isParent true, and adds an additional PlanRowMark to the
1551 * list for each child relation (including the target rel itself in its role
1552 * as a child, if it is not a partitioned table). Any non-leaf partitioned
1553 * child relations will also have entries with isParent = true. The child
1554 * entries have rti == child rel's RT index and prti == top parent's RT index,
1555 * and can therefore be recognized as children by the fact that prti != rti.
1556 * The parent's allMarkTypes field gets the OR of (1<<markType) across all
1557 * its children (this definition allows children to use different markTypes).
1558 *
1559 * The planner also adds resjunk output columns to the plan that carry
1560 * information sufficient to identify the locked or fetched rows. When
1561 * markType != ROW_MARK_COPY, these columns are named
1562 * tableoid%u OID of table
1563 * ctid%u TID of row
1564 * The tableoid column is only present for an inheritance hierarchy.
1565 * When markType == ROW_MARK_COPY, there is instead a single column named
1566 * wholerow%u whole-row value of relation
1567 * (An inheritance hierarchy could have all three resjunk output columns,
1568 * if some children use a different markType than others.)
1569 * In all three cases, %u represents the rowmark ID number (rowmarkId).
1570 * This number is unique within a plan tree, except that child relation
1571 * entries copy their parent's rowmarkId. (Assigning unique numbers
1572 * means we needn't renumber rowmarkIds when flattening subqueries, which
1573 * would require finding and renaming the resjunk columns as well.)
1574 * Note this means that all tables in an inheritance hierarchy share the
1575 * same resjunk column names.
1576 */
1577typedef struct PlanRowMark
1578{
1579 pg_node_attr(no_equal, no_query_jumble)
1580
1581 NodeTag type;
1582 /* range table index of markable relation */
1584 /* range table index of parent relation */
1586 /* unique identifier for resjunk columns */
1588 /* see enum above */
1590 /* OR of (1<<markType) for all children */
1592 /* LockingClause's strength, or LCS_NONE */
1594 /* NOWAIT and SKIP LOCKED options */
1596 /* true if this is a "dummy" parent entry */
1599
1600
1601/*
1602 * Node types to represent partition pruning information.
1603 */
1604
1605/*
1606 * PartitionPruneInfo - Details required to allow the executor to prune
1607 * partitions.
1608 *
1609 * Here we store mapping details to allow translation of a partitioned table's
1610 * index as returned by the partition pruning code into subplan indexes for
1611 * plan types which support arbitrary numbers of subplans, such as Append.
1612 * We also store various details to tell the executor when it should be
1613 * performing partition pruning.
1614 *
1615 * Each PartitionedRelPruneInfo describes the partitioning rules for a single
1616 * partitioned table (a/k/a level of partitioning). Since a partitioning
1617 * hierarchy could contain multiple levels, we represent it by a List of
1618 * PartitionedRelPruneInfos, where the first entry represents the topmost
1619 * partitioned table and additional entries represent non-leaf child
1620 * partitions, ordered such that parents appear before their children.
1621 * Then, since an Append-type node could have multiple partitioning
1622 * hierarchies among its children, we have an unordered List of those Lists.
1623 *
1624 * relids RelOptInfo.relids of the parent plan node (e.g. Append
1625 * or MergeAppend) to which this PartitionPruneInfo node
1626 * belongs. The pruning logic ensures that this matches
1627 * the parent plan node's apprelids.
1628 * prune_infos List of Lists containing PartitionedRelPruneInfo nodes,
1629 * one sublist per run-time-prunable partition hierarchy
1630 * appearing in the parent plan node's subplans.
1631 * other_subplans Indexes of any subplans that are not accounted for
1632 * by any of the PartitionedRelPruneInfo nodes in
1633 * "prune_infos". These subplans must not be pruned.
1634 */
1636{
1637 pg_node_attr(no_equal, no_query_jumble)
1638
1639 NodeTag type;
1644
1645/*
1646 * PartitionedRelPruneInfo - Details required to allow the executor to prune
1647 * partitions for a single partitioned table.
1648 *
1649 * subplan_map[], subpart_map[], and leafpart_rti_map[] are indexed by partition
1650 * index of the partitioned table referenced by 'rtindex', the partition index
1651 * being the order that the partitions are defined in the table's
1652 * PartitionDesc. For a leaf partition p, subplan_map[p] contains the
1653 * zero-based index of the partition's subplan in the parent plan's subplan
1654 * list; it is -1 if the partition is non-leaf or has been pruned. For a
1655 * non-leaf partition p, subpart_map[p] contains the zero-based index of that
1656 * sub-partition's PartitionedRelPruneInfo in the hierarchy's
1657 * PartitionedRelPruneInfo list; it is -1 if the partition is a leaf or has
1658 * been pruned. leafpart_rti_map[p] contains the RT index of a leaf partition
1659 * if its subplan is in the parent plan' subplan list; it is 0 either if the
1660 * partition is non-leaf or it is leaf but has been pruned during planning.
1661 * Note that subplan indexes, as stored in 'subplan_map', are global across the
1662 * parent plan node, but partition indexes are valid only within a particular
1663 * hierarchy. relid_map[p] contains the partition's OID, or 0 if the partition
1664 * was pruned.
1665 */
1667{
1668 pg_node_attr(no_equal, no_query_jumble)
1669
1670 NodeTag type;
1671
1672 /* RT index of partition rel for this level */
1674
1675 /* Indexes of all partitions which subplans or subparts are present for */
1677
1678 /* Length of the following arrays: */
1680
1681 /* subplan index by partition index, or -1 */
1682 int *subplan_map pg_node_attr(array_size(nparts));
1683
1684 /* subpart index by partition index, or -1 */
1685 int *subpart_map pg_node_attr(array_size(nparts));
1686
1687 /* RT index by partition index, or 0 */
1688 int *leafpart_rti_map pg_node_attr(array_size(nparts));
1689
1690 /* relation OID by partition index, or 0 */
1691 Oid *relid_map pg_node_attr(array_size(nparts));
1692
1693 /*
1694 * initial_pruning_steps shows how to prune during executor startup (i.e.,
1695 * without use of any PARAM_EXEC Params); it is NIL if no startup pruning
1696 * is required. exec_pruning_steps shows how to prune with PARAM_EXEC
1697 * Params; it is NIL if no per-scan pruning is required.
1698 */
1699 /* List of PartitionPruneStep */
1701 /* List of PartitionPruneStep */
1703
1704 /* All PARAM_EXEC Param IDs in exec_pruning_steps */
1707
1708/*
1709 * Abstract Node type for partition pruning steps (there are no concrete
1710 * Nodes of this type).
1711 *
1712 * step_id is the global identifier of the step within its pruning context.
1713 */
1715{
1716 pg_node_attr(abstract, no_equal, no_query_jumble)
1717
1718 NodeTag type;
1721
1722/*
1723 * PartitionPruneStepOp - Information to prune using a set of mutually ANDed
1724 * OpExpr clauses
1725 *
1726 * This contains information extracted from up to partnatts OpExpr clauses,
1727 * where partnatts is the number of partition key columns. 'opstrategy' is the
1728 * strategy of the operator in the clause matched to the last partition key.
1729 * 'exprs' contains expressions which comprise the lookup key to be passed to
1730 * the partition bound search function. 'cmpfns' contains the OIDs of
1731 * comparison functions used to compare aforementioned expressions with
1732 * partition bounds. Both 'exprs' and 'cmpfns' contain the same number of
1733 * items, up to partnatts items.
1734 *
1735 * Once we find the offset of a partition bound using the lookup key, we
1736 * determine which partitions to include in the result based on the value of
1737 * 'opstrategy'. For example, if it were equality, we'd return just the
1738 * partition that would contain that key or a set of partitions if the key
1739 * didn't consist of all partitioning columns. For non-equality strategies,
1740 * we'd need to include other partitions as appropriate.
1741 *
1742 * 'nullkeys' is the set containing the offset of the partition keys (0 to
1743 * partnatts - 1) that were matched to an IS NULL clause. This is only
1744 * considered for hash partitioning as we need to pass which keys are null
1745 * to the hash partition bound search function. It is never possible to
1746 * have an expression be present in 'exprs' for a given partition key and
1747 * the corresponding bit set in 'nullkeys'.
1748 */
1750{
1752
1758
1759/*
1760 * PartitionPruneStepCombine - Information to prune using a BoolExpr clause
1761 *
1762 * For BoolExpr clauses, we combine the set of partitions determined for each
1763 * of the argument clauses.
1764 */
1766{
1770
1772{
1774
1778
1779
1780/*
1781 * Plan invalidation info
1782 *
1783 * We track the objects on which a PlannedStmt depends in two ways:
1784 * relations are recorded as a simple list of OIDs, and everything else
1785 * is represented as a list of PlanInvalItems. A PlanInvalItem is designed
1786 * to be used with the syscache invalidation mechanism, so it identifies a
1787 * system catalog entry by cache ID and hash value.
1788 */
1789typedef struct PlanInvalItem
1790{
1791 pg_node_attr(no_equal, no_query_jumble)
1792
1793 NodeTag type;
1794 /* a syscache ID, see utils/syscache.h */
1796 /* hash value of object's cache lookup key */
1799
1800/*
1801 * MonotonicFunction
1802 *
1803 * Allows the planner to track monotonic properties of functions. A function
1804 * is monotonically increasing if a subsequent call cannot yield a lower value
1805 * than the previous call. A monotonically decreasing function cannot yield a
1806 * higher value on subsequent calls, and a function which is both must return
1807 * the same value on each call.
1808 */
1810{
1816
1817#endif /* PLANNODES_H */
int16 AttrNumber
Definition: attnum.h:21
int64_t int64
Definition: c.h:536
uint64_t uint64
Definition: c.h:540
uint32_t uint32
Definition: c.h:539
unsigned int Index
Definition: c.h:620
LockWaitPolicy
Definition: lockoptions.h:37
LockClauseStrength
Definition: lockoptions.h:22
SetOpCmd
Definition: nodes.h:407
SetOpStrategy
Definition: nodes.h:415
double Cost
Definition: nodes.h:261
OnConflictAction
Definition: nodes.h:427
double Cardinality
Definition: nodes.h:262
CmdType
Definition: nodes.h:273
AggStrategy
Definition: nodes.h:363
NodeTag
Definition: nodes.h:27
AggSplit
Definition: nodes.h:385
LimitOption
Definition: nodes.h:440
int ParseLoc
Definition: nodes.h:250
JoinType
Definition: nodes.h:298
#define plan(x)
Definition: pg_regress.c:161
struct ForeignScan ForeignScan
struct TableFuncScan TableFuncScan
struct IndexScan IndexScan
struct MergeJoin MergeJoin
struct Memoize Memoize
struct Plan Plan
struct SampleScan SampleScan
struct WindowAgg WindowAgg
struct WorkTableScan WorkTableScan
struct ProjectSet ProjectSet
struct Sort Sort
struct PartitionedRelPruneInfo PartitionedRelPruneInfo
struct BitmapIndexScan BitmapIndexScan
struct TidScan TidScan
struct LockRows LockRows
struct TidRangeScan TidRangeScan
struct PartitionPruneStepOp PartitionPruneStepOp
SubqueryScanStatus
Definition: plannodes.h:739
@ SUBQUERY_SCAN_NONTRIVIAL
Definition: plannodes.h:742
@ SUBQUERY_SCAN_UNKNOWN
Definition: plannodes.h:740
@ SUBQUERY_SCAN_TRIVIAL
Definition: plannodes.h:741
struct PlanInvalItem PlanInvalItem
struct SubqueryScan SubqueryScan
PartitionPruneCombineOp
Definition: plannodes.h:1766
@ PARTPRUNE_COMBINE_INTERSECT
Definition: plannodes.h:1768
@ PARTPRUNE_COMBINE_UNION
Definition: plannodes.h:1767
struct IncrementalSort IncrementalSort
struct CteScan CteScan
struct NestLoop NestLoop
struct PlanRowMark PlanRowMark
struct Limit Limit
struct Unique Unique
struct Join Join
struct BitmapOr BitmapOr
struct SeqScan SeqScan
struct HashJoin HashJoin
struct Group Group
struct Scan Scan
struct PartitionPruneInfo PartitionPruneInfo
struct Append Append
struct Material Material
struct BitmapHeapScan BitmapHeapScan
struct NamedTuplestoreScan NamedTuplestoreScan
PlannedStmtOrigin
Definition: plannodes.h:38
@ PLAN_STMT_STANDARD
Definition: plannodes.h:41
@ PLAN_STMT_UNKNOWN
Definition: plannodes.h:39
@ PLAN_STMT_CACHE_CUSTOM
Definition: plannodes.h:43
@ PLAN_STMT_CACHE_GENERIC
Definition: plannodes.h:42
@ PLAN_STMT_INTERNAL
Definition: plannodes.h:40
struct SetOp SetOp
struct NestLoopParam NestLoopParam
struct BitmapAnd BitmapAnd
ResultType
Definition: plannodes.h:261
@ RESULT_TYPE_UPPER
Definition: plannodes.h:265
@ RESULT_TYPE_SCAN
Definition: plannodes.h:263
@ RESULT_TYPE_GATING
Definition: plannodes.h:262
@ RESULT_TYPE_MINMAX
Definition: plannodes.h:266
@ RESULT_TYPE_JOIN
Definition: plannodes.h:264
struct GatherMerge GatherMerge
struct ModifyTable ModifyTable
struct PartitionPruneStep PartitionPruneStep
struct Hash Hash
RowMarkType
Definition: plannodes.h:1528
@ ROW_MARK_COPY
Definition: plannodes.h:1534
@ ROW_MARK_REFERENCE
Definition: plannodes.h:1533
@ ROW_MARK_SHARE
Definition: plannodes.h:1531
@ ROW_MARK_EXCLUSIVE
Definition: plannodes.h:1529
@ ROW_MARK_NOKEYEXCLUSIVE
Definition: plannodes.h:1530
@ ROW_MARK_KEYSHARE
Definition: plannodes.h:1532
MonotonicFunction
Definition: plannodes.h:1810
@ MONOTONICFUNC_NONE
Definition: plannodes.h:1811
@ MONOTONICFUNC_DECREASING
Definition: plannodes.h:1813
@ MONOTONICFUNC_INCREASING
Definition: plannodes.h:1812
@ MONOTONICFUNC_BOTH
Definition: plannodes.h:1814
struct RecursiveUnion RecursiveUnion
struct IndexOnlyScan IndexOnlyScan
struct FunctionScan FunctionScan
struct Result Result
struct MergeAppend MergeAppend
struct PartitionPruneStepCombine PartitionPruneStepCombine
struct CustomScan CustomScan
struct Agg Agg
struct ValuesScan ValuesScan
struct Gather Gather
struct PlannedStmt PlannedStmt
unsigned int Oid
Definition: postgres_ext.h:32
ScanDirection
Definition: sdir.h:25
uint16 StrategyNumber
Definition: stratnum.h:22
AggSplit aggsplit
Definition: plannodes.h:1189
List * chain
Definition: plannodes.h:1216
Oid *grpCollations pg_node_attr(array_size(numCols))
long numGroups
Definition: plannodes.h:1202
List * groupingSets
Definition: plannodes.h:1213
Bitmapset * aggParams
Definition: plannodes.h:1208
Plan plan
Definition: plannodes.h:1183
int numCols
Definition: plannodes.h:1192
Oid *grpOperators pg_node_attr(array_size(numCols))
uint64 transitionSpace
Definition: plannodes.h:1205
AttrNumber *grpColIdx pg_node_attr(array_size(numCols))
AggStrategy aggstrategy
Definition: plannodes.h:1186
int first_partial_plan
Definition: plannodes.h:394
int part_prune_index
Definition: plannodes.h:401
int nasyncplans
Definition: plannodes.h:388
Bitmapset * apprelids
Definition: plannodes.h:385
Plan plan
Definition: plannodes.h:383
List * appendplans
Definition: plannodes.h:386
Plan plan
Definition: plannodes.h:484
List * bitmapplans
Definition: plannodes.h:485
List * bitmapqualorig
Definition: plannodes.h:686
List * indexqualorig
Definition: plannodes.h:670
List * indexqual
Definition: plannodes.h:668
List * bitmapplans
Definition: plannodes.h:500
bool isshared
Definition: plannodes.h:499
Plan plan
Definition: plannodes.h:498
int ctePlanId
Definition: plannodes.h:795
int cteParam
Definition: plannodes.h:797
Scan scan
Definition: plannodes.h:793
uint32 flags
Definition: plannodes.h:908
List * custom_scan_tlist
Definition: plannodes.h:916
Scan scan
Definition: plannodes.h:906
List * custom_private
Definition: plannodes.h:914
Bitmapset * custom_relids
Definition: plannodes.h:918
List * custom_exprs
Definition: plannodes.h:912
const struct CustomScanMethods * methods
Definition: plannodes.h:925
List * custom_plans
Definition: plannodes.h:910
Oid checkAsUser
Definition: plannodes.h:870
CmdType operation
Definition: plannodes.h:866
Oid fs_server
Definition: plannodes.h:872
List * fdw_exprs
Definition: plannodes.h:874
bool fsSystemCol
Definition: plannodes.h:886
Bitmapset * fs_relids
Definition: plannodes.h:882
List * fdw_private
Definition: plannodes.h:876
Bitmapset * fs_base_relids
Definition: plannodes.h:884
Index resultRelation
Definition: plannodes.h:868
List * fdw_recheck_quals
Definition: plannodes.h:880
List * fdw_scan_tlist
Definition: plannodes.h:878
List * functions
Definition: plannodes.h:760
bool funcordinality
Definition: plannodes.h:762
int rescan_param
Definition: plannodes.h:1359
Oid *collations pg_node_attr(array_size(numCols))
Oid *sortOperators pg_node_attr(array_size(numCols))
bool *nullsFirst pg_node_attr(array_size(numCols))
Bitmapset * initParam
Definition: plannodes.h:1382
AttrNumber *sortColIdx pg_node_attr(array_size(numCols))
int num_workers
Definition: plannodes.h:1356
int num_workers
Definition: plannodes.h:1332
bool invisible
Definition: plannodes.h:1338
Bitmapset * initParam
Definition: plannodes.h:1344
bool single_copy
Definition: plannodes.h:1336
Plan plan
Definition: plannodes.h:1330
int rescan_param
Definition: plannodes.h:1334
AttrNumber *grpColIdx pg_node_attr(array_size(numCols))
int numCols
Definition: plannodes.h:1157
Plan plan
Definition: plannodes.h:1154
Oid *grpCollations pg_node_attr(array_size(numCols))
Oid *grpOperators pg_node_attr(array_size(numCols))
List * hashcollations
Definition: plannodes.h:1041
List * hashclauses
Definition: plannodes.h:1039
List * hashoperators
Definition: plannodes.h:1040
Join join
Definition: plannodes.h:1038
List * hashkeys
Definition: plannodes.h:1047
AttrNumber skewColumn
Definition: plannodes.h:1406
List * hashkeys
Definition: plannodes.h:1402
Oid skewTable
Definition: plannodes.h:1404
bool skewInherit
Definition: plannodes.h:1408
Cardinality rows_total
Definition: plannodes.h:1411
Plan plan
Definition: plannodes.h:1395
List * indexqual
Definition: plannodes.h:632
List * recheckqual
Definition: plannodes.h:634
List * indextlist
Definition: plannodes.h:638
ScanDirection indexorderdir
Definition: plannodes.h:640
List * indexorderby
Definition: plannodes.h:636
List * indexorderby
Definition: plannodes.h:586
List * indexorderbyops
Definition: plannodes.h:590
ScanDirection indexorderdir
Definition: plannodes.h:592
Scan scan
Definition: plannodes.h:578
List * indexqualorig
Definition: plannodes.h:584
Oid indexid
Definition: plannodes.h:580
List * indexqual
Definition: plannodes.h:582
List * indexorderbyorig
Definition: plannodes.h:588
pg_node_attr(abstract) Plan plan
List * joinqual
Definition: plannodes.h:964
JoinType jointype
Definition: plannodes.h:961
bool inner_unique
Definition: plannodes.h:962
LimitOption limitOption
Definition: plannodes.h:1481
Oid *uniqOperators pg_node_attr(array_size(uniqNumCols))
Plan plan
Definition: plannodes.h:1472
Node * limitCount
Definition: plannodes.h:1478
AttrNumber *uniqColIdx pg_node_attr(array_size(uniqNumCols))
int uniqNumCols
Definition: plannodes.h:1484
Oid *uniqCollations pg_node_attr(array_size(uniqNumCols))
Node * limitOffset
Definition: plannodes.h:1475
Definition: pg_list.h:54
int epqParam
Definition: plannodes.h:1460
List * rowMarks
Definition: plannodes.h:1458
Plan plan
Definition: plannodes.h:1456
Plan plan
Definition: plannodes.h:1056
Plan plan
Definition: plannodes.h:1065
bool singlerow
Definition: plannodes.h:1083
Cardinality est_calls
Definition: plannodes.h:1101
Bitmapset * keyparamids
Definition: plannodes.h:1098
Oid *hashOperators pg_node_attr(array_size(numKeys))
bool binary_mode
Definition: plannodes.h:1089
int numKeys
Definition: plannodes.h:1068
Cardinality est_unique_keys
Definition: plannodes.h:1104
List * param_exprs
Definition: plannodes.h:1077
double est_hit_ratio
Definition: plannodes.h:1107
uint32 est_entries
Definition: plannodes.h:1095
Oid *collations pg_node_attr(array_size(numKeys))
bool *nullsFirst pg_node_attr(array_size(numCols))
AttrNumber *sortColIdx pg_node_attr(array_size(numCols))
int part_prune_index
Definition: plannodes.h:440
Oid *sortOperators pg_node_attr(array_size(numCols))
Bitmapset * apprelids
Definition: plannodes.h:414
Oid *collations pg_node_attr(array_size(numCols))
List * mergeplans
Definition: plannodes.h:416
List * mergeclauses
Definition: plannodes.h:1015
Join join
Definition: plannodes.h:1009
Oid *mergeFamilies pg_node_attr(array_size(mergeclauses))
bool skip_mark_restore
Definition: plannodes.h:1012
bool *mergeReversals pg_node_attr(array_size(mergeclauses))
bool *mergeNullsFirst pg_node_attr(array_size(mergeclauses))
Oid *mergeCollations pg_node_attr(array_size(mergeclauses))
List * updateColnosLists
Definition: plannodes.h:337
Index nominalRelation
Definition: plannodes.h:329
List * arbiterIndexes
Definition: plannodes.h:357
List * onConflictCols
Definition: plannodes.h:361
List * mergeJoinConditions
Definition: plannodes.h:371
char * returningOldAlias
Definition: plannodes.h:341
char * returningNewAlias
Definition: plannodes.h:343
CmdType operation
Definition: plannodes.h:325
int epqParam
Definition: plannodes.h:353
List * resultRelations
Definition: plannodes.h:335
Bitmapset * fdwDirectModifyPlans
Definition: plannodes.h:349
List * onConflictSet
Definition: plannodes.h:359
List * exclRelTlist
Definition: plannodes.h:367
List * mergeActionLists
Definition: plannodes.h:369
bool canSetTag
Definition: plannodes.h:327
List * fdwPrivLists
Definition: plannodes.h:347
bool partColsUpdated
Definition: plannodes.h:333
List * returningLists
Definition: plannodes.h:345
List * withCheckOptionLists
Definition: plannodes.h:339
Index rootRelation
Definition: plannodes.h:331
Node * onConflictWhere
Definition: plannodes.h:363
List * rowMarks
Definition: plannodes.h:351
OnConflictAction onConflictAction
Definition: plannodes.h:355
Index exclRelRTI
Definition: plannodes.h:365
Var * paramval
Definition: plannodes.h:993
pg_node_attr(no_equal, no_query_jumble) NodeTag type
List * nestParams
Definition: plannodes.h:982
Join join
Definition: plannodes.h:980
Definition: nodes.h:135
Bitmapset * other_subplans
Definition: plannodes.h:1642
Bitmapset * relids
Definition: plannodes.h:1640
pg_node_attr(no_equal, no_query_jumble) NodeTag type
PartitionPruneCombineOp combineOp
Definition: plannodes.h:1775
PartitionPruneStep step
Definition: plannodes.h:1773
PartitionPruneStep step
Definition: plannodes.h:1751
StrategyNumber opstrategy
Definition: plannodes.h:1753
Bitmapset * nullkeys
Definition: plannodes.h:1756
pg_node_attr(abstract, no_equal, no_query_jumble) NodeTag type
Oid *relid_map pg_node_attr(array_size(nparts))
pg_node_attr(no_equal, no_query_jumble) NodeTag type
Bitmapset * present_parts
Definition: plannodes.h:1676
Bitmapset * execparamids
Definition: plannodes.h:1705
int *leafpart_rti_map pg_node_attr(array_size(nparts))
int *subplan_map pg_node_attr(array_size(nparts))
int *subpart_map pg_node_attr(array_size(nparts))
uint32 hashValue
Definition: plannodes.h:1797
pg_node_attr(no_equal, no_query_jumble) NodeTag type
LockClauseStrength strength
Definition: plannodes.h:1593
Index prti
Definition: plannodes.h:1585
RowMarkType markType
Definition: plannodes.h:1589
LockWaitPolicy waitPolicy
Definition: plannodes.h:1595
bool isParent
Definition: plannodes.h:1597
Index rowmarkId
Definition: plannodes.h:1587
int allMarkTypes
Definition: plannodes.h:1591
pg_node_attr(no_equal, no_query_jumble) NodeTag type
Bitmapset * extParam
Definition: plannodes.h:240
struct Plan * lefttree
Definition: plannodes.h:224
bool async_capable
Definition: plannodes.h:212
Cost total_cost
Definition: plannodes.h:190
struct Plan * righttree
Definition: plannodes.h:225
bool parallel_aware
Definition: plannodes.h:204
Cost startup_cost
Definition: plannodes.h:188
List * qual
Definition: plannodes.h:222
int plan_width
Definition: plannodes.h:198
Bitmapset * allParam
Definition: plannodes.h:241
bool parallel_safe
Definition: plannodes.h:206
Cardinality plan_rows
Definition: plannodes.h:196
int plan_node_id
Definition: plannodes.h:218
int disabled_nodes
Definition: plannodes.h:186
List * targetlist
Definition: plannodes.h:220
pg_node_attr(abstract, no_equal, no_query_jumble) NodeTag type
List * initPlan
Definition: plannodes.h:227
struct Plan * planTree
Definition: plannodes.h:101
bool hasModifyingCTE
Definition: plannodes.h:83
List * appendRelations
Definition: plannodes.h:127
List * permInfos
Definition: plannodes.h:120
bool canSetTag
Definition: plannodes.h:86
List * rowMarks
Definition: plannodes.h:138
int64 planId
Definition: plannodes.h:74
int jitFlags
Definition: plannodes.h:98
Bitmapset * rewindPlanIDs
Definition: plannodes.h:135
int64 queryId
Definition: plannodes.h:71
ParseLoc stmt_len
Definition: plannodes.h:156
PlannedStmtOrigin planOrigin
Definition: plannodes.h:77
bool hasReturning
Definition: plannodes.h:80
ParseLoc stmt_location
Definition: plannodes.h:154
List * invalItems
Definition: plannodes.h:144
bool transientPlan
Definition: plannodes.h:89
List * resultRelations
Definition: plannodes.h:124
List * subplans
Definition: plannodes.h:132
List * relationOids
Definition: plannodes.h:141
bool dependsOnRole
Definition: plannodes.h:92
Bitmapset * unprunableRelids
Definition: plannodes.h:115
CmdType commandType
Definition: plannodes.h:68
pg_node_attr(no_equal, no_query_jumble) NodeTag type
Node * utilityStmt
Definition: plannodes.h:150
List * rtable
Definition: plannodes.h:109
List * partPruneInfos
Definition: plannodes.h:106
List * paramExecTypes
Definition: plannodes.h:147
bool parallelModeNeeded
Definition: plannodes.h:95
Plan plan
Definition: plannodes.h:302
AttrNumber *dupColIdx pg_node_attr(array_size(numCols))
Oid *dupOperators pg_node_attr(array_size(numCols))
Oid *dupCollations pg_node_attr(array_size(numCols))
Node * resconstantqual
Definition: plannodes.h:290
ResultType result_type
Definition: plannodes.h:289
Bitmapset * relids
Definition: plannodes.h:291
Plan plan
Definition: plannodes.h:288
struct TableSampleClause * tablesample
Definition: plannodes.h:536
Scan scan
Definition: plannodes.h:534
Index scanrelid
Definition: plannodes.h:516
pg_node_attr(abstract) Plan plan
Scan scan
Definition: plannodes.h:525
SetOpStrategy strategy
Definition: plannodes.h:1426
Oid *cmpOperators pg_node_attr(array_size(numCols))
AttrNumber *cmpColIdx pg_node_attr(array_size(numCols))
SetOpCmd cmd
Definition: plannodes.h:1423
Oid *cmpCollations pg_node_attr(array_size(numCols))
int numCols
Definition: plannodes.h:1429
Plan plan
Definition: plannodes.h:1420
bool *cmpNullsFirst pg_node_attr(array_size(numCols))
long numGroups
Definition: plannodes.h:1442
Oid *collations pg_node_attr(array_size(numCols))
bool *nullsFirst pg_node_attr(array_size(numCols))
Oid *sortOperators pg_node_attr(array_size(numCols))
int numCols
Definition: plannodes.h:1120
AttrNumber *sortColIdx pg_node_attr(array_size(numCols))
Plan plan
Definition: plannodes.h:1117
SubqueryScanStatus scanstatus
Definition: plannodes.h:749
Plan * subplan
Definition: plannodes.h:748
TableFunc * tablefunc
Definition: plannodes.h:784
List * tidrangequals
Definition: plannodes.h:715
Scan scan
Definition: plannodes.h:699
List * tidquals
Definition: plannodes.h:701
AttrNumber *uniqColIdx pg_node_attr(array_size(numCols))
Oid *uniqOperators pg_node_attr(array_size(numCols))
Oid *uniqCollations pg_node_attr(array_size(numCols))
Plan plan
Definition: plannodes.h:1302
int numCols
Definition: plannodes.h:1305
Scan scan
Definition: plannodes.h:771
List * values_lists
Definition: plannodes.h:773
Definition: primnodes.h:262
AttrNumber *ordColIdx pg_node_attr(array_size(ordNumCols))
char * winname
Definition: plannodes.h:1228
int partNumCols
Definition: plannodes.h:1234
Oid endInRangeFunc
Definition: plannodes.h:1278
Node * endOffset
Definition: plannodes.h:1264
Oid *partCollations pg_node_attr(array_size(partNumCols))
bool topWindow
Definition: plannodes.h:1293
Plan plan
Definition: plannodes.h:1225
Oid *ordOperators pg_node_attr(array_size(ordNumCols))
List * runConditionOrig
Definition: plannodes.h:1270
Oid inRangeColl
Definition: plannodes.h:1281
Node * startOffset
Definition: plannodes.h:1261
List * runCondition
Definition: plannodes.h:1267
Oid startInRangeFunc
Definition: plannodes.h:1275
bool inRangeAsc
Definition: plannodes.h:1284
Index winref
Definition: plannodes.h:1231
AttrNumber *partColIdx pg_node_attr(array_size(partNumCols))
bool inRangeNullsFirst
Definition: plannodes.h:1287
Oid *partOperators pg_node_attr(array_size(partNumCols))
int ordNumCols
Definition: plannodes.h:1246
Oid *ordCollations pg_node_attr(array_size(ordNumCols))
int frameOptions
Definition: plannodes.h:1258
const char * type