gooderp18绿色标准版
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

1232 行
45KB

  1. /*-------------------------------------------------------------------------
  2. *
  3. * plannodes.h
  4. * definitions for query plan nodes
  5. *
  6. *
  7. * Portions Copyright (c) 1996-2019, 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. #include "access/sdir.h"
  17. #include "access/stratnum.h"
  18. #include "lib/stringinfo.h"
  19. #include "nodes/bitmapset.h"
  20. #include "nodes/lockoptions.h"
  21. #include "nodes/primnodes.h"
  22. /* ----------------------------------------------------------------
  23. * node definitions
  24. * ----------------------------------------------------------------
  25. */
  26. /* ----------------
  27. * PlannedStmt node
  28. *
  29. * The output of the planner is a Plan tree headed by a PlannedStmt node.
  30. * PlannedStmt holds the "one time" information needed by the executor.
  31. *
  32. * For simplicity in APIs, we also wrap utility statements in PlannedStmt
  33. * nodes; in such cases, commandType == CMD_UTILITY, the statement itself
  34. * is in the utilityStmt field, and the rest of the struct is mostly dummy.
  35. * (We do use canSetTag, stmt_location, stmt_len, and possibly queryId.)
  36. * ----------------
  37. */
  38. typedef struct PlannedStmt
  39. {
  40. NodeTag type;
  41. CmdType commandType; /* select|insert|update|delete|utility */
  42. uint64 queryId; /* query identifier (copied from Query) */
  43. bool hasReturning; /* is it insert|update|delete RETURNING? */
  44. bool hasModifyingCTE; /* has insert|update|delete in WITH? */
  45. bool canSetTag; /* do I set the command result tag? */
  46. bool transientPlan; /* redo plan when TransactionXmin changes? */
  47. bool dependsOnRole; /* is plan specific to current role? */
  48. bool parallelModeNeeded; /* parallel mode required to execute? */
  49. int jitFlags; /* which forms of JIT should be performed */
  50. struct Plan *planTree; /* tree of Plan nodes */
  51. List *rtable; /* list of RangeTblEntry nodes */
  52. /* rtable indexes of target relations for INSERT/UPDATE/DELETE */
  53. List *resultRelations; /* integer list of RT indexes, or NIL */
  54. /*
  55. * rtable indexes of partitioned table roots that are UPDATE/DELETE
  56. * targets; needed for trigger firing.
  57. */
  58. List *rootResultRelations;
  59. List *subplans; /* Plan trees for SubPlan expressions; note
  60. * that some could be NULL */
  61. Bitmapset *rewindPlanIDs; /* indices of subplans that require REWIND */
  62. List *rowMarks; /* a list of PlanRowMark's */
  63. List *relationOids; /* OIDs of relations the plan depends on */
  64. List *invalItems; /* other dependencies, as PlanInvalItems */
  65. List *paramExecTypes; /* type OIDs for PARAM_EXEC Params */
  66. Node *utilityStmt; /* non-null if this is utility stmt */
  67. /* statement location in source string (copied from Query) */
  68. int stmt_location; /* start location, or -1 if unknown */
  69. int stmt_len; /* length in bytes; 0 means "rest of string" */
  70. } PlannedStmt;
  71. /* macro for fetching the Plan associated with a SubPlan node */
  72. #define exec_subplan_get_plan(plannedstmt, subplan) \
  73. ((Plan *) list_nth((plannedstmt)->subplans, (subplan)->plan_id - 1))
  74. /* ----------------
  75. * Plan node
  76. *
  77. * All plan nodes "derive" from the Plan structure by having the
  78. * Plan structure as the first field. This ensures that everything works
  79. * when nodes are cast to Plan's. (node pointers are frequently cast to Plan*
  80. * when passed around generically in the executor)
  81. *
  82. * We never actually instantiate any Plan nodes; this is just the common
  83. * abstract superclass for all Plan-type nodes.
  84. * ----------------
  85. */
  86. typedef struct Plan
  87. {
  88. NodeTag type;
  89. /*
  90. * estimated execution costs for plan (see costsize.c for more info)
  91. */
  92. Cost startup_cost; /* cost expended before fetching any tuples */
  93. Cost total_cost; /* total cost (assuming all tuples fetched) */
  94. /*
  95. * planner's estimate of result size of this plan step
  96. */
  97. double plan_rows; /* number of rows plan is expected to emit */
  98. int plan_width; /* average row width in bytes */
  99. /*
  100. * information needed for parallel query
  101. */
  102. bool parallel_aware; /* engage parallel-aware logic? */
  103. bool parallel_safe; /* OK to use as part of parallel plan? */
  104. /*
  105. * Common structural data for all Plan types.
  106. */
  107. int plan_node_id; /* unique across entire final plan tree */
  108. List *targetlist; /* target list to be computed at this node */
  109. List *qual; /* implicitly-ANDed qual conditions */
  110. struct Plan *lefttree; /* input plan tree(s) */
  111. struct Plan *righttree;
  112. List *initPlan; /* Init Plan nodes (un-correlated expr
  113. * subselects) */
  114. /*
  115. * Information for management of parameter-change-driven rescanning
  116. *
  117. * extParam includes the paramIDs of all external PARAM_EXEC params
  118. * affecting this plan node or its children. setParam params from the
  119. * node's initPlans are not included, but their extParams are.
  120. *
  121. * allParam includes all the extParam paramIDs, plus the IDs of local
  122. * params that affect the node (i.e., the setParams of its initplans).
  123. * These are _all_ the PARAM_EXEC params that affect this node.
  124. */
  125. Bitmapset *extParam;
  126. Bitmapset *allParam;
  127. } Plan;
  128. /* ----------------
  129. * these are defined to avoid confusion problems with "left"
  130. * and "right" and "inner" and "outer". The convention is that
  131. * the "left" plan is the "outer" plan and the "right" plan is
  132. * the inner plan, but these make the code more readable.
  133. * ----------------
  134. */
  135. #define innerPlan(node) (((Plan *)(node))->righttree)
  136. #define outerPlan(node) (((Plan *)(node))->lefttree)
  137. /* ----------------
  138. * Result node -
  139. * If no outer plan, evaluate a variable-free targetlist.
  140. * If outer plan, return tuples from outer plan (after a level of
  141. * projection as shown by targetlist).
  142. *
  143. * If resconstantqual isn't NULL, it represents a one-time qualification
  144. * test (i.e., one that doesn't depend on any variables from the outer plan,
  145. * so needs to be evaluated only once).
  146. * ----------------
  147. */
  148. typedef struct Result
  149. {
  150. Plan plan;
  151. Node *resconstantqual;
  152. } Result;
  153. /* ----------------
  154. * ProjectSet node -
  155. * Apply a projection that includes set-returning functions to the
  156. * output tuples of the outer plan.
  157. * ----------------
  158. */
  159. typedef struct ProjectSet
  160. {
  161. Plan plan;
  162. } ProjectSet;
  163. /* ----------------
  164. * ModifyTable node -
  165. * Apply rows produced by subplan(s) to result table(s),
  166. * by inserting, updating, or deleting.
  167. *
  168. * If the originally named target table is a partitioned table, both
  169. * nominalRelation and rootRelation contain the RT index of the partition
  170. * root, which is not otherwise mentioned in the plan. Otherwise rootRelation
  171. * is zero. However, nominalRelation will always be set, as it's the rel that
  172. * EXPLAIN should claim is the INSERT/UPDATE/DELETE target.
  173. *
  174. * Note that rowMarks and epqParam are presumed to be valid for all the
  175. * subplan(s); they can't contain any info that varies across subplans.
  176. * ----------------
  177. */
  178. typedef struct ModifyTable
  179. {
  180. Plan plan;
  181. CmdType operation; /* INSERT, UPDATE, or DELETE */
  182. bool canSetTag; /* do we set the command tag/es_processed? */
  183. Index nominalRelation; /* Parent RT index for use of EXPLAIN */
  184. Index rootRelation; /* Root RT index, if target is partitioned */
  185. bool partColsUpdated; /* some part key in hierarchy updated */
  186. List *resultRelations; /* integer list of RT indexes */
  187. int resultRelIndex; /* index of first resultRel in plan's list */
  188. int rootResultRelIndex; /* index of the partitioned table root */
  189. List *plans; /* plan(s) producing source data */
  190. List *withCheckOptionLists; /* per-target-table WCO lists */
  191. List *returningLists; /* per-target-table RETURNING tlists */
  192. List *fdwPrivLists; /* per-target-table FDW private data lists */
  193. Bitmapset *fdwDirectModifyPlans; /* indices of FDW DM plans */
  194. List *rowMarks; /* PlanRowMarks (non-locking only) */
  195. int epqParam; /* ID of Param for EvalPlanQual re-eval */
  196. OnConflictAction onConflictAction; /* ON CONFLICT action */
  197. List *arbiterIndexes; /* List of ON CONFLICT arbiter index OIDs */
  198. List *onConflictSet; /* SET for INSERT ON CONFLICT DO UPDATE */
  199. Node *onConflictWhere; /* WHERE for ON CONFLICT UPDATE */
  200. Index exclRelRTI; /* RTI of the EXCLUDED pseudo relation */
  201. List *exclRelTlist; /* tlist of the EXCLUDED pseudo relation */
  202. } ModifyTable;
  203. struct PartitionPruneInfo; /* forward reference to struct below */
  204. /* ----------------
  205. * Append node -
  206. * Generate the concatenation of the results of sub-plans.
  207. * ----------------
  208. */
  209. typedef struct Append
  210. {
  211. Plan plan;
  212. List *appendplans;
  213. /*
  214. * All 'appendplans' preceding this index are non-partial plans. All
  215. * 'appendplans' from this index onwards are partial plans.
  216. */
  217. int first_partial_plan;
  218. /* Info for run-time subplan pruning; NULL if we're not doing that */
  219. struct PartitionPruneInfo *part_prune_info;
  220. } Append;
  221. /* ----------------
  222. * MergeAppend node -
  223. * Merge the results of pre-sorted sub-plans to preserve the ordering.
  224. * ----------------
  225. */
  226. typedef struct MergeAppend
  227. {
  228. Plan plan;
  229. List *mergeplans;
  230. /* these fields are just like the sort-key info in struct Sort: */
  231. int numCols; /* number of sort-key columns */
  232. AttrNumber *sortColIdx; /* their indexes in the target list */
  233. Oid *sortOperators; /* OIDs of operators to sort them by */
  234. Oid *collations; /* OIDs of collations */
  235. bool *nullsFirst; /* NULLS FIRST/LAST directions */
  236. /* Info for run-time subplan pruning; NULL if we're not doing that */
  237. struct PartitionPruneInfo *part_prune_info;
  238. } MergeAppend;
  239. /* ----------------
  240. * RecursiveUnion node -
  241. * Generate a recursive union of two subplans.
  242. *
  243. * The "outer" subplan is always the non-recursive term, and the "inner"
  244. * subplan is the recursive term.
  245. * ----------------
  246. */
  247. typedef struct RecursiveUnion
  248. {
  249. Plan plan;
  250. int wtParam; /* ID of Param representing work table */
  251. /* Remaining fields are zero/null in UNION ALL case */
  252. int numCols; /* number of columns to check for
  253. * duplicate-ness */
  254. AttrNumber *dupColIdx; /* their indexes in the target list */
  255. Oid *dupOperators; /* equality operators to compare with */
  256. Oid *dupCollations;
  257. long numGroups; /* estimated number of groups in input */
  258. } RecursiveUnion;
  259. /* ----------------
  260. * BitmapAnd node -
  261. * Generate the intersection of the results of sub-plans.
  262. *
  263. * The subplans must be of types that yield tuple bitmaps. The targetlist
  264. * and qual fields of the plan are unused and are always NIL.
  265. * ----------------
  266. */
  267. typedef struct BitmapAnd
  268. {
  269. Plan plan;
  270. List *bitmapplans;
  271. } BitmapAnd;
  272. /* ----------------
  273. * BitmapOr node -
  274. * Generate the union of the results of sub-plans.
  275. *
  276. * The subplans must be of types that yield tuple bitmaps. The targetlist
  277. * and qual fields of the plan are unused and are always NIL.
  278. * ----------------
  279. */
  280. typedef struct BitmapOr
  281. {
  282. Plan plan;
  283. bool isshared;
  284. List *bitmapplans;
  285. } BitmapOr;
  286. /*
  287. * ==========
  288. * Scan nodes
  289. * ==========
  290. */
  291. typedef struct Scan
  292. {
  293. Plan plan;
  294. Index scanrelid; /* relid is index into the range table */
  295. } Scan;
  296. /* ----------------
  297. * sequential scan node
  298. * ----------------
  299. */
  300. typedef Scan SeqScan;
  301. /* ----------------
  302. * table sample scan node
  303. * ----------------
  304. */
  305. typedef struct SampleScan
  306. {
  307. Scan scan;
  308. /* use struct pointer to avoid including parsenodes.h here */
  309. struct TableSampleClause *tablesample;
  310. } SampleScan;
  311. /* ----------------
  312. * index scan node
  313. *
  314. * indexqualorig is an implicitly-ANDed list of index qual expressions, each
  315. * in the same form it appeared in the query WHERE condition. Each should
  316. * be of the form (indexkey OP comparisonval) or (comparisonval OP indexkey).
  317. * The indexkey is a Var or expression referencing column(s) of the index's
  318. * base table. The comparisonval might be any expression, but it won't use
  319. * any columns of the base table. The expressions are ordered by index
  320. * column position (but items referencing the same index column can appear
  321. * in any order). indexqualorig is used at runtime only if we have to recheck
  322. * a lossy indexqual.
  323. *
  324. * indexqual has the same form, but the expressions have been commuted if
  325. * necessary to put the indexkeys on the left, and the indexkeys are replaced
  326. * by Var nodes identifying the index columns (their varno is INDEX_VAR and
  327. * their varattno is the index column number).
  328. *
  329. * indexorderbyorig is similarly the original form of any ORDER BY expressions
  330. * that are being implemented by the index, while indexorderby is modified to
  331. * have index column Vars on the left-hand side. Here, multiple expressions
  332. * must appear in exactly the ORDER BY order, and this is not necessarily the
  333. * index column order. Only the expressions are provided, not the auxiliary
  334. * sort-order information from the ORDER BY SortGroupClauses; it's assumed
  335. * that the sort ordering is fully determinable from the top-level operators.
  336. * indexorderbyorig is used at runtime to recheck the ordering, if the index
  337. * cannot calculate an accurate ordering. It is also needed for EXPLAIN.
  338. *
  339. * indexorderbyops is a list of the OIDs of the operators used to sort the
  340. * ORDER BY expressions. This is used together with indexorderbyorig to
  341. * recheck ordering at run time. (Note that indexorderby, indexorderbyorig,
  342. * and indexorderbyops are used for amcanorderbyop cases, not amcanorder.)
  343. *
  344. * indexorderdir specifies the scan ordering, for indexscans on amcanorder
  345. * indexes (for other indexes it should be "don't care").
  346. * ----------------
  347. */
  348. typedef struct IndexScan
  349. {
  350. Scan scan;
  351. Oid indexid; /* OID of index to scan */
  352. List *indexqual; /* list of index quals (usually OpExprs) */
  353. List *indexqualorig; /* the same in original form */
  354. List *indexorderby; /* list of index ORDER BY exprs */
  355. List *indexorderbyorig; /* the same in original form */
  356. List *indexorderbyops; /* OIDs of sort ops for ORDER BY exprs */
  357. ScanDirection indexorderdir; /* forward or backward or don't care */
  358. } IndexScan;
  359. /* ----------------
  360. * index-only scan node
  361. *
  362. * IndexOnlyScan is very similar to IndexScan, but it specifies an
  363. * index-only scan, in which the data comes from the index not the heap.
  364. * Because of this, *all* Vars in the plan node's targetlist, qual, and
  365. * index expressions reference index columns and have varno = INDEX_VAR.
  366. * Hence we do not need separate indexqualorig and indexorderbyorig lists,
  367. * since their contents would be equivalent to indexqual and indexorderby.
  368. *
  369. * To help EXPLAIN interpret the index Vars for display, we provide
  370. * indextlist, which represents the contents of the index as a targetlist
  371. * with one TLE per index column. Vars appearing in this list reference
  372. * the base table, and this is the only field in the plan node that may
  373. * contain such Vars.
  374. * ----------------
  375. */
  376. typedef struct IndexOnlyScan
  377. {
  378. Scan scan;
  379. Oid indexid; /* OID of index to scan */
  380. List *indexqual; /* list of index quals (usually OpExprs) */
  381. List *indexorderby; /* list of index ORDER BY exprs */
  382. List *indextlist; /* TargetEntry list describing index's cols */
  383. ScanDirection indexorderdir; /* forward or backward or don't care */
  384. } IndexOnlyScan;
  385. /* ----------------
  386. * bitmap index scan node
  387. *
  388. * BitmapIndexScan delivers a bitmap of potential tuple locations;
  389. * it does not access the heap itself. The bitmap is used by an
  390. * ancestor BitmapHeapScan node, possibly after passing through
  391. * intermediate BitmapAnd and/or BitmapOr nodes to combine it with
  392. * the results of other BitmapIndexScans.
  393. *
  394. * The fields have the same meanings as for IndexScan, except we don't
  395. * store a direction flag because direction is uninteresting.
  396. *
  397. * In a BitmapIndexScan plan node, the targetlist and qual fields are
  398. * not used and are always NIL. The indexqualorig field is unused at
  399. * run time too, but is saved for the benefit of EXPLAIN.
  400. * ----------------
  401. */
  402. typedef struct BitmapIndexScan
  403. {
  404. Scan scan;
  405. Oid indexid; /* OID of index to scan */
  406. bool isshared; /* Create shared bitmap if set */
  407. List *indexqual; /* list of index quals (OpExprs) */
  408. List *indexqualorig; /* the same in original form */
  409. } BitmapIndexScan;
  410. /* ----------------
  411. * bitmap sequential scan node
  412. *
  413. * This needs a copy of the qual conditions being used by the input index
  414. * scans because there are various cases where we need to recheck the quals;
  415. * for example, when the bitmap is lossy about the specific rows on a page
  416. * that meet the index condition.
  417. * ----------------
  418. */
  419. typedef struct BitmapHeapScan
  420. {
  421. Scan scan;
  422. List *bitmapqualorig; /* index quals, in standard expr form */
  423. } BitmapHeapScan;
  424. /* ----------------
  425. * tid scan node
  426. *
  427. * tidquals is an implicitly OR'ed list of qual expressions of the form
  428. * "CTID = pseudoconstant", or "CTID = ANY(pseudoconstant_array)",
  429. * or a CurrentOfExpr for the relation.
  430. * ----------------
  431. */
  432. typedef struct TidScan
  433. {
  434. Scan scan;
  435. List *tidquals; /* qual(s) involving CTID = something */
  436. } TidScan;
  437. /* ----------------
  438. * subquery scan node
  439. *
  440. * SubqueryScan is for scanning the output of a sub-query in the range table.
  441. * We often need an extra plan node above the sub-query's plan to perform
  442. * expression evaluations (which we can't push into the sub-query without
  443. * risking changing its semantics). Although we are not scanning a physical
  444. * relation, we make this a descendant of Scan anyway for code-sharing
  445. * purposes.
  446. *
  447. * Note: we store the sub-plan in the type-specific subplan field, not in
  448. * the generic lefttree field as you might expect. This is because we do
  449. * not want plan-tree-traversal routines to recurse into the subplan without
  450. * knowing that they are changing Query contexts.
  451. * ----------------
  452. */
  453. typedef struct SubqueryScan
  454. {
  455. Scan scan;
  456. Plan *subplan;
  457. } SubqueryScan;
  458. /* ----------------
  459. * FunctionScan node
  460. * ----------------
  461. */
  462. typedef struct FunctionScan
  463. {
  464. Scan scan;
  465. List *functions; /* list of RangeTblFunction nodes */
  466. bool funcordinality; /* WITH ORDINALITY */
  467. } FunctionScan;
  468. /* ----------------
  469. * ValuesScan node
  470. * ----------------
  471. */
  472. typedef struct ValuesScan
  473. {
  474. Scan scan;
  475. List *values_lists; /* list of expression lists */
  476. } ValuesScan;
  477. /* ----------------
  478. * TableFunc scan node
  479. * ----------------
  480. */
  481. typedef struct TableFuncScan
  482. {
  483. Scan scan;
  484. TableFunc *tablefunc; /* table function node */
  485. } TableFuncScan;
  486. /* ----------------
  487. * CteScan node
  488. * ----------------
  489. */
  490. typedef struct CteScan
  491. {
  492. Scan scan;
  493. int ctePlanId; /* ID of init SubPlan for CTE */
  494. int cteParam; /* ID of Param representing CTE output */
  495. } CteScan;
  496. /* ----------------
  497. * NamedTuplestoreScan node
  498. * ----------------
  499. */
  500. typedef struct NamedTuplestoreScan
  501. {
  502. Scan scan;
  503. char *enrname; /* Name given to Ephemeral Named Relation */
  504. } NamedTuplestoreScan;
  505. /* ----------------
  506. * WorkTableScan node
  507. * ----------------
  508. */
  509. typedef struct WorkTableScan
  510. {
  511. Scan scan;
  512. int wtParam; /* ID of Param representing work table */
  513. } WorkTableScan;
  514. /* ----------------
  515. * ForeignScan node
  516. *
  517. * fdw_exprs and fdw_private are both under the control of the foreign-data
  518. * wrapper, but fdw_exprs is presumed to contain expression trees and will
  519. * be post-processed accordingly by the planner; fdw_private won't be.
  520. * Note that everything in both lists must be copiable by copyObject().
  521. * One way to store an arbitrary blob of bytes is to represent it as a bytea
  522. * Const. Usually, though, you'll be better off choosing a representation
  523. * that can be dumped usefully by nodeToString().
  524. *
  525. * fdw_scan_tlist is a targetlist describing the contents of the scan tuple
  526. * returned by the FDW; it can be NIL if the scan tuple matches the declared
  527. * rowtype of the foreign table, which is the normal case for a simple foreign
  528. * table scan. (If the plan node represents a foreign join, fdw_scan_tlist
  529. * is required since there is no rowtype available from the system catalogs.)
  530. * When fdw_scan_tlist is provided, Vars in the node's tlist and quals must
  531. * have varno INDEX_VAR, and their varattnos correspond to resnos in the
  532. * fdw_scan_tlist (which are also column numbers in the actual scan tuple).
  533. * fdw_scan_tlist is never actually executed; it just holds expression trees
  534. * describing what is in the scan tuple's columns.
  535. *
  536. * fdw_recheck_quals should contain any quals which the core system passed to
  537. * the FDW but which were not added to scan.plan.qual; that is, it should
  538. * contain the quals being checked remotely. This is needed for correct
  539. * behavior during EvalPlanQual rechecks.
  540. *
  541. * When the plan node represents a foreign join, scan.scanrelid is zero and
  542. * fs_relids must be consulted to identify the join relation. (fs_relids
  543. * is valid for simple scans as well, but will always match scan.scanrelid.)
  544. * ----------------
  545. */
  546. typedef struct ForeignScan
  547. {
  548. Scan scan;
  549. CmdType operation; /* SELECT/INSERT/UPDATE/DELETE */
  550. Oid fs_server; /* OID of foreign server */
  551. List *fdw_exprs; /* expressions that FDW may evaluate */
  552. List *fdw_private; /* private data for FDW */
  553. List *fdw_scan_tlist; /* optional tlist describing scan tuple */
  554. List *fdw_recheck_quals; /* original quals not in scan.plan.qual */
  555. Bitmapset *fs_relids; /* RTIs generated by this scan */
  556. bool fsSystemCol; /* true if any "system column" is needed */
  557. } ForeignScan;
  558. /* ----------------
  559. * CustomScan node
  560. *
  561. * The comments for ForeignScan's fdw_exprs, fdw_private, fdw_scan_tlist,
  562. * and fs_relids fields apply equally to CustomScan's custom_exprs,
  563. * custom_private, custom_scan_tlist, and custom_relids fields. The
  564. * convention of setting scan.scanrelid to zero for joins applies as well.
  565. *
  566. * Note that since Plan trees can be copied, custom scan providers *must*
  567. * fit all plan data they need into those fields; embedding CustomScan in
  568. * a larger struct will not work.
  569. * ----------------
  570. */
  571. struct CustomScanMethods;
  572. typedef struct CustomScan
  573. {
  574. Scan scan;
  575. uint32 flags; /* mask of CUSTOMPATH_* flags, see
  576. * nodes/extensible.h */
  577. List *custom_plans; /* list of Plan nodes, if any */
  578. List *custom_exprs; /* expressions that custom code may evaluate */
  579. List *custom_private; /* private data for custom code */
  580. List *custom_scan_tlist; /* optional tlist describing scan tuple */
  581. Bitmapset *custom_relids; /* RTIs generated by this scan */
  582. const struct CustomScanMethods *methods;
  583. } CustomScan;
  584. /*
  585. * ==========
  586. * Join nodes
  587. * ==========
  588. */
  589. /* ----------------
  590. * Join node
  591. *
  592. * jointype: rule for joining tuples from left and right subtrees
  593. * inner_unique each outer tuple can match to no more than one inner tuple
  594. * joinqual: qual conditions that came from JOIN/ON or JOIN/USING
  595. * (plan.qual contains conditions that came from WHERE)
  596. *
  597. * When jointype is INNER, joinqual and plan.qual are semantically
  598. * interchangeable. For OUTER jointypes, the two are *not* interchangeable;
  599. * only joinqual is used to determine whether a match has been found for
  600. * the purpose of deciding whether to generate null-extended tuples.
  601. * (But plan.qual is still applied before actually returning a tuple.)
  602. * For an outer join, only joinquals are allowed to be used as the merge
  603. * or hash condition of a merge or hash join.
  604. *
  605. * inner_unique is set if the joinquals are such that no more than one inner
  606. * tuple could match any given outer tuple. This allows the executor to
  607. * skip searching for additional matches. (This must be provable from just
  608. * the joinquals, ignoring plan.qual, due to where the executor tests it.)
  609. * ----------------
  610. */
  611. typedef struct Join
  612. {
  613. Plan plan;
  614. JoinType jointype;
  615. bool inner_unique;
  616. List *joinqual; /* JOIN quals (in addition to plan.qual) */
  617. } Join;
  618. /* ----------------
  619. * nest loop join node
  620. *
  621. * The nestParams list identifies any executor Params that must be passed
  622. * into execution of the inner subplan carrying values from the current row
  623. * of the outer subplan. Currently we restrict these values to be simple
  624. * Vars, but perhaps someday that'd be worth relaxing. (Note: during plan
  625. * creation, the paramval can actually be a PlaceHolderVar expression; but it
  626. * must be a Var with varno OUTER_VAR by the time it gets to the executor.)
  627. * ----------------
  628. */
  629. typedef struct NestLoop
  630. {
  631. Join join;
  632. List *nestParams; /* list of NestLoopParam nodes */
  633. } NestLoop;
  634. typedef struct NestLoopParam
  635. {
  636. NodeTag type;
  637. int paramno; /* number of the PARAM_EXEC Param to set */
  638. Var *paramval; /* outer-relation Var to assign to Param */
  639. } NestLoopParam;
  640. /* ----------------
  641. * merge join node
  642. *
  643. * The expected ordering of each mergeable column is described by a btree
  644. * opfamily OID, a collation OID, a direction (BTLessStrategyNumber or
  645. * BTGreaterStrategyNumber) and a nulls-first flag. Note that the two sides
  646. * of each mergeclause may be of different datatypes, but they are ordered the
  647. * same way according to the common opfamily and collation. The operator in
  648. * each mergeclause must be an equality operator of the indicated opfamily.
  649. * ----------------
  650. */
  651. typedef struct MergeJoin
  652. {
  653. Join join;
  654. bool skip_mark_restore; /* Can we skip mark/restore calls? */
  655. List *mergeclauses; /* mergeclauses as expression trees */
  656. /* these are arrays, but have the same length as the mergeclauses list: */
  657. Oid *mergeFamilies; /* per-clause OIDs of btree opfamilies */
  658. Oid *mergeCollations; /* per-clause OIDs of collations */
  659. int *mergeStrategies; /* per-clause ordering (ASC or DESC) */
  660. bool *mergeNullsFirst; /* per-clause nulls ordering */
  661. } MergeJoin;
  662. /* ----------------
  663. * hash join node
  664. * ----------------
  665. */
  666. typedef struct HashJoin
  667. {
  668. Join join;
  669. List *hashclauses;
  670. List *hashoperators;
  671. List *hashcollations;
  672. /*
  673. * List of expressions to be hashed for tuples from the outer plan, to
  674. * perform lookups in the hashtable over the inner plan.
  675. */
  676. List *hashkeys;
  677. } HashJoin;
  678. /* ----------------
  679. * materialization node
  680. * ----------------
  681. */
  682. typedef struct Material
  683. {
  684. Plan plan;
  685. } Material;
  686. /* ----------------
  687. * sort node
  688. * ----------------
  689. */
  690. typedef struct Sort
  691. {
  692. Plan plan;
  693. int numCols; /* number of sort-key columns */
  694. AttrNumber *sortColIdx; /* their indexes in the target list */
  695. Oid *sortOperators; /* OIDs of operators to sort them by */
  696. Oid *collations; /* OIDs of collations */
  697. bool *nullsFirst; /* NULLS FIRST/LAST directions */
  698. } Sort;
  699. /* ---------------
  700. * group node -
  701. * Used for queries with GROUP BY (but no aggregates) specified.
  702. * The input must be presorted according to the grouping columns.
  703. * ---------------
  704. */
  705. typedef struct Group
  706. {
  707. Plan plan;
  708. int numCols; /* number of grouping columns */
  709. AttrNumber *grpColIdx; /* their indexes in the target list */
  710. Oid *grpOperators; /* equality operators to compare with */
  711. Oid *grpCollations;
  712. } Group;
  713. /* ---------------
  714. * aggregate node
  715. *
  716. * An Agg node implements plain or grouped aggregation. For grouped
  717. * aggregation, we can work with presorted input or unsorted input;
  718. * the latter strategy uses an internal hashtable.
  719. *
  720. * Notice the lack of any direct info about the aggregate functions to be
  721. * computed. They are found by scanning the node's tlist and quals during
  722. * executor startup. (It is possible that there are no aggregate functions;
  723. * this could happen if they get optimized away by constant-folding, or if
  724. * we are using the Agg node to implement hash-based grouping.)
  725. * ---------------
  726. */
  727. typedef struct Agg
  728. {
  729. Plan plan;
  730. AggStrategy aggstrategy; /* basic strategy, see nodes.h */
  731. AggSplit aggsplit; /* agg-splitting mode, see nodes.h */
  732. int numCols; /* number of grouping columns */
  733. AttrNumber *grpColIdx; /* their indexes in the target list */
  734. Oid *grpOperators; /* equality operators to compare with */
  735. Oid *grpCollations;
  736. long numGroups; /* estimated number of groups in input */
  737. Bitmapset *aggParams; /* IDs of Params used in Aggref inputs */
  738. /* Note: planner provides numGroups & aggParams only in HASHED/MIXED case */
  739. List *groupingSets; /* grouping sets to use */
  740. List *chain; /* chained Agg/Sort nodes */
  741. } Agg;
  742. /* ----------------
  743. * window aggregate node
  744. * ----------------
  745. */
  746. typedef struct WindowAgg
  747. {
  748. Plan plan;
  749. Index winref; /* ID referenced by window functions */
  750. int partNumCols; /* number of columns in partition clause */
  751. AttrNumber *partColIdx; /* their indexes in the target list */
  752. Oid *partOperators; /* equality operators for partition columns */
  753. Oid *partCollations; /* collations for partition columns */
  754. int ordNumCols; /* number of columns in ordering clause */
  755. AttrNumber *ordColIdx; /* their indexes in the target list */
  756. Oid *ordOperators; /* equality operators for ordering columns */
  757. Oid *ordCollations; /* collations for ordering columns */
  758. int frameOptions; /* frame_clause options, see WindowDef */
  759. Node *startOffset; /* expression for starting bound, if any */
  760. Node *endOffset; /* expression for ending bound, if any */
  761. /* these fields are used with RANGE offset PRECEDING/FOLLOWING: */
  762. Oid startInRangeFunc; /* in_range function for startOffset */
  763. Oid endInRangeFunc; /* in_range function for endOffset */
  764. Oid inRangeColl; /* collation for in_range tests */
  765. bool inRangeAsc; /* use ASC sort order for in_range tests? */
  766. bool inRangeNullsFirst; /* nulls sort first for in_range tests? */
  767. } WindowAgg;
  768. /* ----------------
  769. * unique node
  770. * ----------------
  771. */
  772. typedef struct Unique
  773. {
  774. Plan plan;
  775. int numCols; /* number of columns to check for uniqueness */
  776. AttrNumber *uniqColIdx; /* their indexes in the target list */
  777. Oid *uniqOperators; /* equality operators to compare with */
  778. Oid *uniqCollations; /* collations for equality comparisons */
  779. } Unique;
  780. /* ------------
  781. * gather node
  782. *
  783. * Note: rescan_param is the ID of a PARAM_EXEC parameter slot. That slot
  784. * will never actually contain a value, but the Gather node must flag it as
  785. * having changed whenever it is rescanned. The child parallel-aware scan
  786. * nodes are marked as depending on that parameter, so that the rescan
  787. * machinery is aware that their output is likely to change across rescans.
  788. * In some cases we don't need a rescan Param, so rescan_param is set to -1.
  789. * ------------
  790. */
  791. typedef struct Gather
  792. {
  793. Plan plan;
  794. int num_workers; /* planned number of worker processes */
  795. int rescan_param; /* ID of Param that signals a rescan, or -1 */
  796. bool single_copy; /* don't execute plan more than once */
  797. bool invisible; /* suppress EXPLAIN display (for testing)? */
  798. Bitmapset *initParam; /* param id's of initplans which are referred
  799. * at gather or one of it's child node */
  800. } Gather;
  801. /* ------------
  802. * gather merge node
  803. * ------------
  804. */
  805. typedef struct GatherMerge
  806. {
  807. Plan plan;
  808. int num_workers; /* planned number of worker processes */
  809. int rescan_param; /* ID of Param that signals a rescan, or -1 */
  810. /* remaining fields are just like the sort-key info in struct Sort */
  811. int numCols; /* number of sort-key columns */
  812. AttrNumber *sortColIdx; /* their indexes in the target list */
  813. Oid *sortOperators; /* OIDs of operators to sort them by */
  814. Oid *collations; /* OIDs of collations */
  815. bool *nullsFirst; /* NULLS FIRST/LAST directions */
  816. Bitmapset *initParam; /* param id's of initplans which are referred
  817. * at gather merge or one of it's child node */
  818. } GatherMerge;
  819. /* ----------------
  820. * hash build node
  821. *
  822. * If the executor is supposed to try to apply skew join optimization, then
  823. * skewTable/skewColumn/skewInherit identify the outer relation's join key
  824. * column, from which the relevant MCV statistics can be fetched.
  825. * ----------------
  826. */
  827. typedef struct Hash
  828. {
  829. Plan plan;
  830. /*
  831. * List of expressions to be hashed for tuples from Hash's outer plan,
  832. * needed to put them into the hashtable.
  833. */
  834. List *hashkeys; /* hash keys for the hashjoin condition */
  835. Oid skewTable; /* outer join key's table OID, or InvalidOid */
  836. AttrNumber skewColumn; /* outer join key's column #, or zero */
  837. bool skewInherit; /* is outer join rel an inheritance tree? */
  838. /* all other info is in the parent HashJoin node */
  839. double rows_total; /* estimate total rows if parallel_aware */
  840. } Hash;
  841. /* ----------------
  842. * setop node
  843. * ----------------
  844. */
  845. typedef struct SetOp
  846. {
  847. Plan plan;
  848. SetOpCmd cmd; /* what to do, see nodes.h */
  849. SetOpStrategy strategy; /* how to do it, see nodes.h */
  850. int numCols; /* number of columns to check for
  851. * duplicate-ness */
  852. AttrNumber *dupColIdx; /* their indexes in the target list */
  853. Oid *dupOperators; /* equality operators to compare with */
  854. Oid *dupCollations;
  855. AttrNumber flagColIdx; /* where is the flag column, if any */
  856. int firstFlag; /* flag value for first input relation */
  857. long numGroups; /* estimated number of groups in input */
  858. } SetOp;
  859. /* ----------------
  860. * lock-rows node
  861. *
  862. * rowMarks identifies the rels to be locked by this node; it should be
  863. * a subset of the rowMarks listed in the top-level PlannedStmt.
  864. * epqParam is a Param that all scan nodes below this one must depend on.
  865. * It is used to force re-evaluation of the plan during EvalPlanQual.
  866. * ----------------
  867. */
  868. typedef struct LockRows
  869. {
  870. Plan plan;
  871. List *rowMarks; /* a list of PlanRowMark's */
  872. int epqParam; /* ID of Param for EvalPlanQual re-eval */
  873. } LockRows;
  874. /* ----------------
  875. * limit node
  876. *
  877. * Note: as of Postgres 8.2, the offset and count expressions are expected
  878. * to yield int8, rather than int4 as before.
  879. * ----------------
  880. */
  881. typedef struct Limit
  882. {
  883. Plan plan;
  884. Node *limitOffset; /* OFFSET parameter, or NULL if none */
  885. Node *limitCount; /* COUNT parameter, or NULL if none */
  886. } Limit;
  887. /*
  888. * RowMarkType -
  889. * enums for types of row-marking operations
  890. *
  891. * The first four of these values represent different lock strengths that
  892. * we can take on tuples according to SELECT FOR [KEY] UPDATE/SHARE requests.
  893. * We support these on regular tables, as well as on foreign tables whose FDWs
  894. * report support for late locking. For other foreign tables, any locking
  895. * that might be done for such requests must happen during the initial row
  896. * fetch; their FDWs provide no mechanism for going back to lock a row later.
  897. * This means that the semantics will be a bit different than for a local
  898. * table; in particular we are likely to lock more rows than would be locked
  899. * locally, since remote rows will be locked even if they then fail
  900. * locally-checked restriction or join quals. However, the prospect of
  901. * doing a separate remote query to lock each selected row is usually pretty
  902. * unappealing, so early locking remains a credible design choice for FDWs.
  903. *
  904. * When doing UPDATE, DELETE, or SELECT FOR UPDATE/SHARE, we have to uniquely
  905. * identify all the source rows, not only those from the target relations, so
  906. * that we can perform EvalPlanQual rechecking at need. For plain tables we
  907. * can just fetch the TID, much as for a target relation; this case is
  908. * represented by ROW_MARK_REFERENCE. Otherwise (for example for VALUES or
  909. * FUNCTION scans) we have to copy the whole row value. ROW_MARK_COPY is
  910. * pretty inefficient, since most of the time we'll never need the data; but
  911. * fortunately the overhead is usually not performance-critical in practice.
  912. * By default we use ROW_MARK_COPY for foreign tables, but if the FDW has
  913. * a concept of rowid it can request to use ROW_MARK_REFERENCE instead.
  914. * (Again, this probably doesn't make sense if a physical remote fetch is
  915. * needed, but for FDWs that map to local storage it might be credible.)
  916. */
  917. typedef enum RowMarkType
  918. {
  919. ROW_MARK_EXCLUSIVE, /* obtain exclusive tuple lock */
  920. ROW_MARK_NOKEYEXCLUSIVE, /* obtain no-key exclusive tuple lock */
  921. ROW_MARK_SHARE, /* obtain shared tuple lock */
  922. ROW_MARK_KEYSHARE, /* obtain keyshare tuple lock */
  923. ROW_MARK_REFERENCE, /* just fetch the TID, don't lock it */
  924. ROW_MARK_COPY /* physically copy the row value */
  925. } RowMarkType;
  926. #define RowMarkRequiresRowShareLock(marktype) ((marktype) <= ROW_MARK_KEYSHARE)
  927. /*
  928. * PlanRowMark -
  929. * plan-time representation of FOR [KEY] UPDATE/SHARE clauses
  930. *
  931. * When doing UPDATE, DELETE, or SELECT FOR UPDATE/SHARE, we create a separate
  932. * PlanRowMark node for each non-target relation in the query. Relations that
  933. * are not specified as FOR UPDATE/SHARE are marked ROW_MARK_REFERENCE (if
  934. * regular tables or supported foreign tables) or ROW_MARK_COPY (if not).
  935. *
  936. * Initially all PlanRowMarks have rti == prti and isParent == false.
  937. * When the planner discovers that a relation is the root of an inheritance
  938. * tree, it sets isParent true, and adds an additional PlanRowMark to the
  939. * list for each child relation (including the target rel itself in its role
  940. * as a child). isParent is also set to true for the partitioned child
  941. * relations, which are not scanned just like the root parent. The child
  942. * entries have rti == child rel's RT index and prti == parent's RT index,
  943. * and can therefore be recognized as children by the fact that prti != rti.
  944. * The parent's allMarkTypes field gets the OR of (1<<markType) across all
  945. * its children (this definition allows children to use different markTypes).
  946. *
  947. * The planner also adds resjunk output columns to the plan that carry
  948. * information sufficient to identify the locked or fetched rows. When
  949. * markType != ROW_MARK_COPY, these columns are named
  950. * tableoid%u OID of table
  951. * ctid%u TID of row
  952. * The tableoid column is only present for an inheritance hierarchy.
  953. * When markType == ROW_MARK_COPY, there is instead a single column named
  954. * wholerow%u whole-row value of relation
  955. * (An inheritance hierarchy could have all three resjunk output columns,
  956. * if some children use a different markType than others.)
  957. * In all three cases, %u represents the rowmark ID number (rowmarkId).
  958. * This number is unique within a plan tree, except that child relation
  959. * entries copy their parent's rowmarkId. (Assigning unique numbers
  960. * means we needn't renumber rowmarkIds when flattening subqueries, which
  961. * would require finding and renaming the resjunk columns as well.)
  962. * Note this means that all tables in an inheritance hierarchy share the
  963. * same resjunk column names. However, in an inherited UPDATE/DELETE the
  964. * columns could have different physical column numbers in each subplan.
  965. */
  966. typedef struct PlanRowMark
  967. {
  968. NodeTag type;
  969. Index rti; /* range table index of markable relation */
  970. Index prti; /* range table index of parent relation */
  971. Index rowmarkId; /* unique identifier for resjunk columns */
  972. RowMarkType markType; /* see enum above */
  973. int allMarkTypes; /* OR of (1<<markType) for all children */
  974. LockClauseStrength strength; /* LockingClause's strength, or LCS_NONE */
  975. LockWaitPolicy waitPolicy; /* NOWAIT and SKIP LOCKED options */
  976. bool isParent; /* true if this is a "dummy" parent entry */
  977. } PlanRowMark;
  978. /*
  979. * Node types to represent partition pruning information.
  980. */
  981. /*
  982. * PartitionPruneInfo - Details required to allow the executor to prune
  983. * partitions.
  984. *
  985. * Here we store mapping details to allow translation of a partitioned table's
  986. * index as returned by the partition pruning code into subplan indexes for
  987. * plan types which support arbitrary numbers of subplans, such as Append.
  988. * We also store various details to tell the executor when it should be
  989. * performing partition pruning.
  990. *
  991. * Each PartitionedRelPruneInfo describes the partitioning rules for a single
  992. * partitioned table (a/k/a level of partitioning). Since a partitioning
  993. * hierarchy could contain multiple levels, we represent it by a List of
  994. * PartitionedRelPruneInfos, where the first entry represents the topmost
  995. * partitioned table and additional entries represent non-leaf child
  996. * partitions, ordered such that parents appear before their children.
  997. * Then, since an Append-type node could have multiple partitioning
  998. * hierarchies among its children, we have an unordered List of those Lists.
  999. *
  1000. * prune_infos List of Lists containing PartitionedRelPruneInfo nodes,
  1001. * one sublist per run-time-prunable partition hierarchy
  1002. * appearing in the parent plan node's subplans.
  1003. * other_subplans Indexes of any subplans that are not accounted for
  1004. * by any of the PartitionedRelPruneInfo nodes in
  1005. * "prune_infos". These subplans must not be pruned.
  1006. */
  1007. typedef struct PartitionPruneInfo
  1008. {
  1009. NodeTag type;
  1010. List *prune_infos;
  1011. Bitmapset *other_subplans;
  1012. } PartitionPruneInfo;
  1013. /*
  1014. * PartitionedRelPruneInfo - Details required to allow the executor to prune
  1015. * partitions for a single partitioned table.
  1016. *
  1017. * subplan_map[] and subpart_map[] are indexed by partition index of the
  1018. * partitioned table referenced by 'rtindex', the partition index being the
  1019. * order that the partitions are defined in the table's PartitionDesc. For a
  1020. * leaf partition p, subplan_map[p] contains the zero-based index of the
  1021. * partition's subplan in the parent plan's subplan list; it is -1 if the
  1022. * partition is non-leaf or has been pruned. For a non-leaf partition p,
  1023. * subpart_map[p] contains the zero-based index of that sub-partition's
  1024. * PartitionedRelPruneInfo in the hierarchy's PartitionedRelPruneInfo list;
  1025. * it is -1 if the partition is a leaf or has been pruned. Note that subplan
  1026. * indexes, as stored in 'subplan_map', are global across the parent plan
  1027. * node, but partition indexes are valid only within a particular hierarchy.
  1028. * relid_map[p] contains the partition's OID, or 0 if the partition was pruned.
  1029. */
  1030. typedef struct PartitionedRelPruneInfo
  1031. {
  1032. NodeTag type;
  1033. Index rtindex; /* RT index of partition rel for this level */
  1034. Bitmapset *present_parts; /* Indexes of all partitions which subplans or
  1035. * subparts are present for */
  1036. int nparts; /* Length of the following arrays: */
  1037. int *subplan_map; /* subplan index by partition index, or -1 */
  1038. int *subpart_map; /* subpart index by partition index, or -1 */
  1039. Oid *relid_map; /* relation OID by partition index, or 0 */
  1040. /*
  1041. * initial_pruning_steps shows how to prune during executor startup (i.e.,
  1042. * without use of any PARAM_EXEC Params); it is NIL if no startup pruning
  1043. * is required. exec_pruning_steps shows how to prune with PARAM_EXEC
  1044. * Params; it is NIL if no per-scan pruning is required.
  1045. */
  1046. List *initial_pruning_steps; /* List of PartitionPruneStep */
  1047. List *exec_pruning_steps; /* List of PartitionPruneStep */
  1048. Bitmapset *execparamids; /* All PARAM_EXEC Param IDs in
  1049. * exec_pruning_steps */
  1050. } PartitionedRelPruneInfo;
  1051. /*
  1052. * Abstract Node type for partition pruning steps (there are no concrete
  1053. * Nodes of this type).
  1054. *
  1055. * step_id is the global identifier of the step within its pruning context.
  1056. */
  1057. typedef struct PartitionPruneStep
  1058. {
  1059. NodeTag type;
  1060. int step_id;
  1061. } PartitionPruneStep;
  1062. /*
  1063. * PartitionPruneStepOp - Information to prune using a set of mutually AND'd
  1064. * OpExpr clauses
  1065. *
  1066. * This contains information extracted from up to partnatts OpExpr clauses,
  1067. * where partnatts is the number of partition key columns. 'opstrategy' is the
  1068. * strategy of the operator in the clause matched to the last partition key.
  1069. * 'exprs' contains expressions which comprise the lookup key to be passed to
  1070. * the partition bound search function. 'cmpfns' contains the OIDs of
  1071. * comparison functions used to compare aforementioned expressions with
  1072. * partition bounds. Both 'exprs' and 'cmpfns' contain the same number of
  1073. * items, up to partnatts items.
  1074. *
  1075. * Once we find the offset of a partition bound using the lookup key, we
  1076. * determine which partitions to include in the result based on the value of
  1077. * 'opstrategy'. For example, if it were equality, we'd return just the
  1078. * partition that would contain that key or a set of partitions if the key
  1079. * didn't consist of all partitioning columns. For non-equality strategies,
  1080. * we'd need to include other partitions as appropriate.
  1081. *
  1082. * 'nullkeys' is the set containing the offset of the partition keys (0 to
  1083. * partnatts - 1) that were matched to an IS NULL clause. This is only
  1084. * considered for hash partitioning as we need to pass which keys are null
  1085. * to the hash partition bound search function. It is never possible to
  1086. * have an expression be present in 'exprs' for a given partition key and
  1087. * the corresponding bit set in 'nullkeys'.
  1088. */
  1089. typedef struct PartitionPruneStepOp
  1090. {
  1091. PartitionPruneStep step;
  1092. StrategyNumber opstrategy;
  1093. List *exprs;
  1094. List *cmpfns;
  1095. Bitmapset *nullkeys;
  1096. } PartitionPruneStepOp;
  1097. /*
  1098. * PartitionPruneStepCombine - Information to prune using a BoolExpr clause
  1099. *
  1100. * For BoolExpr clauses, we combine the set of partitions determined for each
  1101. * of the argument clauses.
  1102. */
  1103. typedef enum PartitionPruneCombineOp
  1104. {
  1105. PARTPRUNE_COMBINE_UNION,
  1106. PARTPRUNE_COMBINE_INTERSECT
  1107. } PartitionPruneCombineOp;
  1108. typedef struct PartitionPruneStepCombine
  1109. {
  1110. PartitionPruneStep step;
  1111. PartitionPruneCombineOp combineOp;
  1112. List *source_stepids;
  1113. } PartitionPruneStepCombine;
  1114. /*
  1115. * Plan invalidation info
  1116. *
  1117. * We track the objects on which a PlannedStmt depends in two ways:
  1118. * relations are recorded as a simple list of OIDs, and everything else
  1119. * is represented as a list of PlanInvalItems. A PlanInvalItem is designed
  1120. * to be used with the syscache invalidation mechanism, so it identifies a
  1121. * system catalog entry by cache ID and hash value.
  1122. */
  1123. typedef struct PlanInvalItem
  1124. {
  1125. NodeTag type;
  1126. int cacheId; /* a syscache ID, see utils/syscache.h */
  1127. uint32 hashValue; /* hash value of object's cache lookup key */
  1128. } PlanInvalItem;
  1129. #endif /* PLANNODES_H */
上海开阖软件有限公司 沪ICP备12045867号-1