execnodes.h
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:23k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * execnodes.h
  4.  *   definitions for executor state nodes
  5.  *
  6.  *
  7.  * Copyright (c) 1994, Regents of the University of California
  8.  *
  9.  * $Id: execnodes.h,v 1.30 1999/05/25 22:42:54 momjian Exp $
  10.  *
  11.  *-------------------------------------------------------------------------
  12.  */
  13. #ifndef EXECNODES_H
  14. #define EXECNODES_H
  15. #include <nodes/memnodes.h>
  16. #include <nodes/primnodes.h>
  17. #include <executor/hashjoin.h>
  18. #include <access/relscan.h>
  19. #include <access/sdir.h>
  20. #include <nodes/params.h>
  21. #include <executor/tuptable.h>
  22. #include <access/funcindex.h>
  23. /* ----------------
  24.  *   IndexInfo information
  25.  *
  26.  * this class holds the information saying what attributes
  27.  * are the key attributes for this index. -cim 10/15/89
  28.  *
  29.  * NumKeyAttributes number of key attributes for this index
  30.  * KeyAttributeNumbers array of attribute numbers used as keys
  31.  * Predicate partial-index predicate for this index
  32.  * ----------------
  33.  */
  34. typedef struct IndexInfo
  35. {
  36. NodeTag type;
  37. int ii_NumKeyAttributes;
  38. AttrNumber *ii_KeyAttributeNumbers;
  39. FuncIndexInfoPtr ii_FuncIndexInfo;
  40. Node    *ii_Predicate;
  41. } IndexInfo;
  42. /* ----------------
  43.  *   RelationInfo information
  44.  *
  45.  * whenever we update an existing relation, we have to
  46.  * update indices on the relation.  The RelationInfo class
  47.  * is used to hold all the information on result relations,
  48.  * including indices.. -cim 10/15/89
  49.  *
  50.  * RangeTableIndex result relation's range table index
  51.  * RelationDesc relation descriptor for result relation
  52.  * NumIndices number indices existing on result relation
  53.  * IndexRelationDescs array of relation descriptors for indices
  54.  * IndexRelationInfo array of key/attr info for indices
  55.  * ----------------
  56.  */
  57. typedef struct RelationInfo
  58. {
  59. NodeTag type;
  60. Index ri_RangeTableIndex;
  61. Relation ri_RelationDesc;
  62. int ri_NumIndices;
  63. RelationPtr ri_IndexRelationDescs;
  64. IndexInfo **ri_IndexRelationInfo;
  65. } RelationInfo;
  66. /* ----------------
  67.  *   ExprContext
  68.  *
  69.  * This class holds the "current context" information
  70.  * needed to evaluate expressions for doing tuple qualifications
  71.  * and tuple projections. For example, if an expression refers
  72.  * to an attribute in the current inner tuple then we need to know
  73.  * what the current inner tuple is and so we look at the expression
  74.  * context.
  75.  * ----------------
  76.  */
  77. typedef struct ExprContext
  78. {
  79. NodeTag type;
  80. TupleTableSlot *ecxt_scantuple;
  81. TupleTableSlot *ecxt_innertuple;
  82. TupleTableSlot *ecxt_outertuple;
  83. Relation ecxt_relation;
  84. Index ecxt_relid;
  85. ParamListInfo ecxt_param_list_info;
  86. ParamExecData *ecxt_param_exec_vals; /* this is for subselects */
  87. List    *ecxt_range_table;
  88. Datum    *ecxt_values; /* precomputed values for aggreg */
  89. char    *ecxt_nulls; /* null flags for aggreg  values */
  90. } ExprContext;
  91. /* ----------------
  92.  * ProjectionInfo node information
  93.  *
  94.  * This is all the information needed to preform projections
  95.  * on a tuple.  Nodes which need to do projections create one
  96.  * of these.  In theory, when a node wants to preform a projection
  97.  * it should just update this information as necessary and then
  98.  * call ExecProject().  -cim 6/3/91
  99.  *
  100.  * targetlist target list for projection
  101.  * len length of target list
  102.  * tupValue array of pointers to projection results
  103.  * exprContext expression context for ExecTargetList
  104.  * slot slot to place projection result in
  105.  * ----------------
  106.  */
  107. typedef struct ProjectionInfo
  108. {
  109. NodeTag type;
  110. List    *pi_targetlist;
  111. int pi_len;
  112. Datum    *pi_tupValue;
  113. ExprContext *pi_exprContext;
  114. TupleTableSlot *pi_slot;
  115. } ProjectionInfo;
  116. /* ----------------
  117.  *   JunkFilter
  118.  *
  119.  *   this class is used to store information regarding junk attributes.
  120.  *   A junk attribute is an attribute in a tuple that is needed only for
  121.  *   storing intermediate information in the executor, and does not belong
  122.  *   in the tuple proper. For example, when we do a delete or replace
  123.  *   query, the planner adds an entry to the targetlist so that the tuples
  124.  *   returned to ExecutePlan() contain an extra attribute: the t_ctid of
  125.  *   the tuple to be deleted/replaced.  This is needed for amdelete() and
  126.  *   amreplace(). In doing a delete this does not make much of a
  127.  *   difference, but in doing a replace we have to make sure we disgard
  128.  *   all the junk in a tuple before calling amreplace().  Otherwise the
  129.  *   inserted tuple will not have the correct schema. This solves a
  130.  *   problem with hash-join and merge-sort replace plans. -cim 10/10/90
  131.  *
  132.  *   targetList: the original target list (including junk attributes).
  133.  *   length: the length of 'targetList'.
  134.  *   tupType: the tuple descriptor for the "original" tuple
  135.  * (including the junk attributes).
  136.  *   cleanTargetList: the "clean" target list (junk attributes removed).
  137.  *   cleanLength: the length of 'cleanTargetList'
  138.  *   cleanTupTyp: the tuple descriptor of the "clean" tuple (with
  139.  * junk attributes removed).
  140.  *   cleanMap: A map with the correspondance between the non junk
  141.  * attributes of the "original" tuple and the
  142.  * attributes of the "clean" tuple.
  143.  * ----------------
  144.  */
  145. typedef struct JunkFilter
  146. {
  147. NodeTag type;
  148. List    *jf_targetList;
  149. int jf_length;
  150. TupleDesc jf_tupType;
  151. List    *jf_cleanTargetList;
  152. int jf_cleanLength;
  153. TupleDesc jf_cleanTupType;
  154. AttrNumber *jf_cleanMap;
  155. } JunkFilter;
  156. /* ----------------
  157.  *   EState information
  158.  *
  159.  * direction direction of the scan
  160.  *
  161.  * range_table array of scan relation information
  162.  *
  163.  * result_relation_information for update queries
  164.  *
  165.  * into_relation_descriptor relation being retrieved "into"
  166.  *
  167.  * param_list_info information needed to transform
  168.  * Param nodes into Const nodes
  169.  *
  170.  * BaseId during InitPlan(), each node is
  171.  * given a number.  this is the next
  172.  * number to be assigned.
  173.  *
  174.  * tupleTable this is a pointer to an array
  175.  * of pointers to tuples used by
  176.  * the executor at any given moment.
  177.  *
  178.  * junkFilter contains information used to
  179.  * extract junk attributes from a tuple.
  180.  * (see JunkFilter above)
  181.  *
  182.  * refcount local buffer refcounts used in
  183.  * an ExecMain cycle. this is introduced
  184.  * to avoid ExecStart's unpinning each
  185.  * other's buffers when called recursively
  186.  * ----------------
  187.  */
  188. typedef struct EState
  189. {
  190. NodeTag type;
  191. ScanDirection es_direction;
  192. Snapshot es_snapshot;
  193. List    *es_range_table;
  194. RelationInfo *es_result_relation_info;
  195. List   **es_result_relation_constraints;
  196. Relation es_into_relation_descriptor;
  197. ParamListInfo es_param_list_info;
  198. ParamExecData *es_param_exec_vals; /* this is for subselects */
  199. int es_BaseId;
  200. TupleTable es_tupleTable;
  201. JunkFilter *es_junkFilter;
  202. int    *es_refcount;
  203. uint32 es_processed; /* # of tuples processed */
  204. Oid es_lastoid; /* last oid processed (by INSERT) */
  205. List    *es_rowMark; /* not good place, but there is no other */
  206. /* Below is to re-evaluate plan qual in READ COMMITTED mode */
  207. struct Plan *es_origPlan;
  208. Pointer es_evalPlanQual;
  209. bool    *es_evTupleNull;
  210. HeapTuple  *es_evTuple;
  211. bool es_useEvalPlan;
  212. } EState;
  213. /* ----------------
  214.  * Executor Type information needed by plannodes.h
  215.  *
  216.  *| Note: the bogus classes CommonState and CommonScanState exist only
  217.  *|   because our inheritance system only allows single inheritance
  218.  *|   and we have to have unique slot names.  Hence two or more
  219.  *|   classes which want to have a common slot must ALL inherit
  220.  *|   the slot from some other class.  (This is a big hack to
  221.  *|   allow our classes to share slot names..)
  222.  *|
  223.  *| Example:
  224.  *|   the class Result and the class NestLoop nodes both want
  225.  *|   a slot called "OuterTuple" so they both have to inherit
  226.  *|   it from some other class.  In this case they inherit
  227.  *|   it from CommonState. "CommonState" and "CommonScanState" are
  228.  *|   the best names I could come up with for this sort of
  229.  *|   stuff.
  230.  *|
  231.  *|   As a result, many classes have extra slots which they
  232.  *|   don't use.  These slots are denoted (unused) in the
  233.  *|   comment preceeding the class definition. If you
  234.  *|   comes up with a better idea of a way of doing things
  235.  *|   along these lines, then feel free to make your idea
  236.  *|   known to me.. -cim 10/15/89
  237.  * ----------------
  238.  */
  239. /* ----------------------------------------------------------------
  240.  *  Common Executor State Information
  241.  * ----------------------------------------------------------------
  242.  */
  243. /* BaseNode removed -- base_id moved into CommonState - jolly */
  244. /* ----------------
  245.  *  CommonState information
  246.  *
  247.  *| this is a bogus class used to hold slots so other
  248.  *| nodes can inherit them...
  249.  *
  250.  * OuterTupleSlot    pointer to slot containing current "outer" tuple
  251.  * ResultTupleSlot    pointer to slot in tuple table for projected tuple
  252.  * ExprContext    node's current expression context
  253.  * ProjInfo    info this node uses to form tuple projections
  254.  * NumScanAttributes  size of ScanAttributes array
  255.  * ScanAttributes    attribute numbers of interest in this tuple
  256.  *
  257.  * ----------------
  258.  */
  259. typedef struct CommonState
  260. {
  261. NodeTag type; /* its first field is NodeTag */
  262. int cs_base_id;
  263. TupleTableSlot *cs_OuterTupleSlot;
  264. TupleTableSlot *cs_ResultTupleSlot;
  265. ExprContext *cs_ExprContext;
  266. ProjectionInfo *cs_ProjInfo;
  267. bool cs_TupFromTlist;
  268. } CommonState;
  269. /* ----------------------------------------------------------------
  270.  *  Control Node State Information
  271.  * ----------------------------------------------------------------
  272.  */
  273. /* ----------------
  274.  *  ResultState information
  275.  *
  276.  * done    flag which tells us to quit when we
  277.  *    have already returned a constant tuple.
  278.  *
  279.  *  CommonState information
  280.  *
  281.  * OuterTupleSlot    pointer to slot containing current "outer" tuple
  282.  * ResultTupleSlot    pointer to slot in tuple table for projected tuple
  283.  * ExprContext    node's current expression context
  284.  * ProjInfo    info this node uses to form tuple projections
  285.  * NumScanAttributes  size of ScanAttributes array
  286.  * ScanAttributes    attribute numbers of interest in this tuple
  287.  * ----------------
  288.  */
  289. typedef struct ResultState
  290. {
  291. CommonState cstate; /* its first field is NodeTag */
  292. bool rs_done;
  293. bool rs_checkqual;
  294. } ResultState;
  295. /* ----------------
  296.  *  AppendState information
  297.  *
  298.  * append nodes have this field "unionplans" which is this
  299.  * list of plans to execute in sequence.. these variables
  300.  * keep track of things..
  301.  *
  302.  * whichplan which plan is being executed
  303.  * nplans how many plans are in the list
  304.  * initialized array of ExecInitNode() results
  305.  * rtentries range table for the current plan
  306.  * result_relation_info_list  array of each subplan's result relation info
  307.  * junkFilter_list  array of each subplan's junk filter
  308.  *
  309.  *  CommonState information
  310.  *
  311.  * OuterTupleSlot    pointer to slot containing current "outer" tuple
  312.  * ResultTupleSlot    pointer to slot in tuple table for projected tuple
  313.  * ExprContext    node's current expression context
  314.  * ProjInfo    info this node uses to form tuple projections
  315.  * NumScanAttributes  size of ScanAttributes array
  316.  * ScanAttributes    attribute numbers of interest in this tuple
  317.  * ----------------
  318.  */
  319. typedef struct AppendState
  320. {
  321. CommonState cstate; /* its first field is NodeTag */
  322. int as_whichplan;
  323. int as_nplans;
  324. bool    *as_initialized;
  325. List    *as_rtentries;
  326. List    *as_result_relation_info_list;
  327. List    *as_junkFilter_list;
  328. } AppendState;
  329. /* ----------------------------------------------------------------
  330.  *  Scan State Information
  331.  * ----------------------------------------------------------------
  332.  */
  333. /* ----------------
  334.  *  CommonScanState information
  335.  *
  336.  * CommonScanState is a class like CommonState, but is used more
  337.  * by the nodes like SeqScan and Sort which want to
  338.  * keep track of an underlying relation.
  339.  *
  340.  * currentRelation    relation being scanned
  341.  * currentScanDesc    current scan descriptor for scan
  342.  * ScanTupleSlot    pointer to slot in tuple table holding scan tuple
  343.  *
  344.  *  CommonState information
  345.  *
  346.  * OuterTupleSlot    pointer to slot containing current "outer" tuple
  347.  * ResultTupleSlot    pointer to slot in tuple table for projected tuple
  348.  * ExprContext    node's current expression context
  349.  * ProjInfo    info this node uses to form tuple projections
  350.  * NumScanAttributes  size of ScanAttributes array
  351.  * ScanAttributes    attribute numbers of interest in this tuple
  352.  * ----------------
  353.  */
  354. typedef struct CommonScanState
  355. {
  356. CommonState cstate; /* its first field is NodeTag */
  357. Relation css_currentRelation;
  358. HeapScanDesc css_currentScanDesc;
  359. TupleTableSlot *css_ScanTupleSlot;
  360. } CommonScanState;
  361. /* ----------------
  362.  *  IndexScanState information
  363.  *
  364.  *| index scans don't use CommonScanState because
  365.  *| the underlying AM abstractions for heap scans and
  366.  *| index scans are too different..  It would be nice
  367.  *| if the current abstraction was more useful but ... -cim 10/15/89
  368.  *
  369.  * IndexPtr    current index in use
  370.  * NumIndices    number of indices in this scan
  371.  * ScanKeys    Skey structures to scan index rels
  372.  * NumScanKeys    array of no of keys in each Skey struct
  373.  * RuntimeKeyInfo    array of array of flags for Skeys evaled at runtime
  374.  * RelationDescs    ptr to array of relation descriptors
  375.  * ScanDescs    ptr to array of scan descriptors
  376.  *
  377.  *  CommonState information
  378.  *
  379.  * OuterTupleSlot    pointer to slot containing current "outer" tuple
  380.  * ResultTupleSlot    pointer to slot in tuple table for projected tuple
  381.  * ExprContext    node's current expression context
  382.  * ProjInfo    info this node uses to form tuple projections
  383.  * NumScanAttributes  size of ScanAttributes array
  384.  * ScanAttributes    attribute numbers of interest in this tuple
  385.  * ----------------
  386.  */
  387. typedef struct IndexScanState
  388. {
  389. CommonState cstate; /* its first field is NodeTag */
  390. int iss_NumIndices;
  391. int iss_IndexPtr;
  392. int iss_MarkIndexPtr;
  393. ScanKey    *iss_ScanKeys;
  394. int    *iss_NumScanKeys;
  395. Pointer iss_RuntimeKeyInfo;
  396. RelationPtr iss_RelationDescs;
  397. IndexScanDescPtr iss_ScanDescs;
  398. HeapTupleData iss_htup;
  399. } IndexScanState;
  400. /* ----------------------------------------------------------------
  401.  *  Join State Information
  402.  * ----------------------------------------------------------------
  403.  */
  404. /* ----------------
  405.  *  JoinState information
  406.  *
  407.  *  CommonState information
  408.  *
  409.  * OuterTupleSlot    pointer to slot containing current "outer" tuple
  410.  * ResultTupleSlot    pointer to slot in tuple table for projected tuple
  411.  * ExprContext    node's current expression context
  412.  * ProjInfo    info this node uses to form tuple projections
  413.  * NumScanAttributes  size of ScanAttributes array
  414.  * ScanAttributes    attribute numbers of interest in this tuple
  415.  * ----------------
  416.  */
  417. typedef CommonState JoinState;
  418. /* ----------------
  419.  *  NestLoopState information
  420.  *
  421.  * PortalFlag    Set to enable portals to work.
  422.  *
  423.  *  JoinState information
  424.  *
  425.  *  CommonState information
  426.  *
  427.  * OuterTupleSlot    pointer to slot containing current "outer" tuple
  428.  * ResultTupleSlot    pointer to slot in tuple table for projected tuple
  429.  * ExprContext    node's current expression context
  430.  * ProjInfo    info this node uses to form tuple projections
  431.  * NumScanAttributes  size of ScanAttributes array
  432.  * ScanAttributes    attribute numbers of interest in this tuple
  433.  * ----------------
  434.  */
  435. typedef struct NestLoopState
  436. {
  437. JoinState jstate; /* its first field is NodeTag */
  438. bool nl_PortalFlag;
  439. } NestLoopState;
  440. /* ----------------
  441.  *  MergeJoinState information
  442.  *
  443.  * OuterSkipQual    outerKey1 < innerKey1 ...
  444.  * InnerSkipQual    outerKey1 > innerKey1 ...
  445.  * JoinState    current "state" of join. see executor.h
  446.  * MarkedTupleSlot    pointer to slot in tuple table for marked tuple
  447.  *
  448.  *  JoinState information
  449.  *
  450.  *  CommonState information
  451.  *
  452.  * OuterTupleSlot    pointer to slot containing current "outer" tuple
  453.  * ResultTupleSlot    pointer to slot in tuple table for projected tuple
  454.  * ExprContext    node's current expression context
  455.  * ProjInfo    info this node uses to form tuple projections
  456.  * NumScanAttributes  size of ScanAttributes array
  457.  * ScanAttributes    attribute numbers of interest in this tuple
  458.  * ----------------
  459.  */
  460. typedef struct MergeJoinState
  461. {
  462. JoinState jstate; /* its first field is NodeTag */
  463. List    *mj_OuterSkipQual;
  464. List    *mj_InnerSkipQual;
  465. int mj_JoinState;
  466. TupleTableSlot *mj_MarkedTupleSlot;
  467. } MergeJoinState;
  468. /* ----------------
  469.  *  HashJoinState information
  470.  *
  471.  * hj_HashTable hash table for the hashjoin
  472.  * hj_CurBucketNo bucket# for current outer tuple
  473.  * hj_CurTuple last inner tuple matched to current outer
  474.  * tuple, or NULL if starting search
  475.  * (CurBucketNo and CurTuple are meaningless
  476.  *  unless OuterTupleSlot is nonempty!)
  477.  * hj_InnerHashKey the inner hash key in the hashjoin condition
  478.  * hj_OuterTupleSlot tuple slot for outer tuples
  479.  * hj_HashTupleSlot tuple slot for hashed tuples
  480.  *
  481.  *  JoinState information
  482.  *
  483.  *  CommonState information
  484.  *
  485.  * OuterTupleSlot    pointer to slot containing current "outer" tuple
  486.  * ResultTupleSlot    pointer to slot in tuple table for projected tuple
  487.  * ExprContext    node's current expression context
  488.  * ProjInfo    info this node uses to form tuple projections
  489.  * NumScanAttributes  size of ScanAttributes array
  490.  * ScanAttributes    attribute numbers of interest in this tuple
  491.  * ----------------
  492.  */
  493. typedef struct HashJoinState
  494. {
  495. JoinState jstate; /* its first field is NodeTag */
  496. HashJoinTable hj_HashTable;
  497. int hj_CurBucketNo;
  498. HashJoinTuple hj_CurTuple;
  499. Var    *hj_InnerHashKey;
  500. TupleTableSlot *hj_OuterTupleSlot;
  501. TupleTableSlot *hj_HashTupleSlot;
  502. } HashJoinState;
  503. /* ----------------------------------------------------------------
  504.  *  Materialization State Information
  505.  * ----------------------------------------------------------------
  506.  */
  507. /* ----------------
  508.  *  MaterialState information
  509.  *
  510.  * materialize nodes are used to materialize the results
  511.  * of a subplan into a temporary relation.
  512.  *
  513.  * Flag indicated whether subplan has been materialized
  514.  * TempRelation temporary relation containing result of executing
  515.  * the subplan.
  516.  *
  517.  *  CommonScanState information
  518.  *
  519.  * currentRelation    relation descriptor of sorted relation
  520.  * currentScanDesc    current scan descriptor for scan
  521.  * ScanTupleSlot    pointer to slot in tuple table holding scan tuple
  522.  *
  523.  *  CommonState information
  524.  *
  525.  * OuterTupleSlot    pointer to slot containing current "outer" tuple
  526.  * ResultTupleSlot    pointer to slot in tuple table for projected tuple
  527.  * ExprContext    node's current expression context
  528.  * ProjInfo    info this node uses to form tuple projections
  529.  * NumScanAttributes  size of ScanAttributes array
  530.  * ScanAttributes    attribute numbers of interest in this tuple
  531.  * ----------------
  532.  */
  533. typedef struct MaterialState
  534. {
  535. CommonScanState csstate; /* its first field is NodeTag */
  536. bool mat_Flag;
  537. Relation mat_TempRelation;
  538. } MaterialState;
  539. /* ---------------------
  540.  * AggregateState information
  541.  *
  542.  * done indicated whether aggregate has been materialized
  543.  * -------------------------
  544.  */
  545. typedef struct AggState
  546. {
  547. CommonScanState csstate; /* its first field is NodeTag */
  548. bool agg_done;
  549. } AggState;
  550. /* ---------------------
  551.  * GroupState information
  552.  *
  553.  * -------------------------
  554.  */
  555. typedef struct GroupState
  556. {
  557. CommonScanState csstate; /* its first field is NodeTag */
  558. bool grp_useFirstTuple; /* first tuple not processed yet */
  559. bool grp_done;
  560. HeapTuple grp_firstTuple;
  561. } GroupState;
  562. /* ----------------
  563.  *  SortState information
  564.  *
  565.  *| sort nodes are really just a kind of a scan since
  566.  *| we implement sorts by retrieving the entire subplan
  567.  *| into a temp relation, sorting the temp relation into
  568.  *| another sorted relation, and then preforming a simple
  569.  *| unqualified sequential scan on the sorted relation..
  570.  *| -cim 10/15/89
  571.  *
  572.  * Flag indicated whether relation has been sorted
  573.  * Keys scan key structures used to keep info on sort keys
  574.  * TempRelation temporary relation containing result of executing
  575.  * the subplan.
  576.  *
  577.  *  CommonScanState information
  578.  *
  579.  * currentRelation    relation descriptor of sorted relation
  580.  * currentScanDesc    current scan descriptor for scan
  581.  * ScanTupleSlot    pointer to slot in tuple table holding scan tuple
  582.  *
  583.  *  CommonState information
  584.  *
  585.  * OuterTupleSlot    pointer to slot containing current "outer" tuple
  586.  * ResultTupleSlot    pointer to slot in tuple table for projected tuple
  587.  * ExprContext    node's current expression context
  588.  * ProjInfo    info this node uses to form tuple projections
  589.  * NumScanAttributes  size of ScanAttributes array
  590.  * ScanAttributes    attribute numbers of interest in this tuple
  591.  * ----------------
  592.  */
  593. typedef struct SortState
  594. {
  595. CommonScanState csstate; /* its first field is NodeTag */
  596. bool sort_Flag;
  597. ScanKey sort_Keys;
  598. bool cleaned;
  599. } SortState;
  600. /* ----------------
  601.  *  UniqueState information
  602.  *
  603.  * Unique nodes are used "on top of" sort nodes to discard
  604.  * duplicate tuples returned from the sort phase. Basically
  605.  * all it does is compare the current tuple from the subplan
  606.  * with the previously fetched tuple stored in OuterTuple and
  607.  * if the two are identical, then we just fetch another tuple
  608.  * from the sort and try again.
  609.  *
  610.  *  CommonState information
  611.  *
  612.  * OuterTupleSlot    pointer to slot containing current "outer" tuple
  613.  * ResultTupleSlot    pointer to slot in tuple table for projected tuple
  614.  * ExprContext    node's current expression context
  615.  * ProjInfo    info this node uses to form tuple projections
  616.  * NumScanAttributes  size of ScanAttributes array
  617.  * ScanAttributes    attribute numbers of interest in this tuple
  618.  * ----------------
  619.  */
  620. typedef CommonState UniqueState;
  621. /* ----------------
  622.  *  HashState information
  623.  *
  624.  * hashtable hash table for the hashjoin
  625.  *
  626.  *  CommonState information
  627.  *
  628.  * OuterTupleSlot    pointer to slot containing current "outer" tuple
  629.  * ResultTupleSlot    pointer to slot in tuple table for projected tuple
  630.  * ExprContext    node's current expression context
  631.  * ProjInfo    info this node uses to form tuple projections
  632.  * NumScanAttributes  size of ScanAttributes array
  633.  * ScanAttributes    attribute numbers of interest in this tuple
  634.  * ----------------
  635.  */
  636. typedef struct HashState
  637. {
  638. CommonState cstate; /* its first field is NodeTag */
  639. HashJoinTable hashtable;
  640. } HashState;
  641. #ifdef NOT_USED
  642. /* -----------------------
  643.  * TeeState information
  644.  *   leftPlace  :   next item in the queue unseen by the left parent
  645.  *   rightPlace :   next item in the queue unseen by the right parent
  646.  *   lastPlace  :   last item in the queue
  647.  *   bufferRelname :  name of the relation used as the buffer queue
  648.  *   bufferRel :  the relation used as the buffer queue
  649.  *   mcxt :  for now, tee's have their own memory context
  650.  *    may be cleaned up later if portals are cleaned up
  651.  *
  652.  * initially, a Tee starts with [left/right]Place variables set to -1.
  653.  * on cleanup, queue is free'd when both leftPlace and rightPlace = -1
  654.  * -------------------------
  655. */
  656. typedef struct TeeState
  657. {
  658. CommonState cstate; /* its first field is NodeTag */
  659. int tee_leftPlace,
  660. tee_rightPlace,
  661. tee_lastPlace;
  662. char    *tee_bufferRelname;
  663. Relation tee_bufferRel;
  664. MemoryContext tee_mcxt;
  665. HeapScanDesc tee_leftScanDesc,
  666. tee_rightScanDesc;
  667. } TeeState;
  668. #endif
  669. #endif  /* EXECNODES_H */