LCOV - code coverage report
Current view: top level - src/include/nodes - nodes.h (source / functions) Coverage Total Hit
Test: PostgreSQL 19beta1 Lines: 100.0 % 4 4
Test Date: 2026-06-21 22:16:41 Functions: 100.0 % 1 1
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /*-------------------------------------------------------------------------
       2              :  *
       3              :  * nodes.h
       4              :  *    Definitions for tagged nodes.
       5              :  *
       6              :  *
       7              :  * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
       8              :  * Portions Copyright (c) 1994, Regents of the University of California
       9              :  *
      10              :  * src/include/nodes/nodes.h
      11              :  *
      12              :  *-------------------------------------------------------------------------
      13              :  */
      14              : #ifndef NODES_H
      15              : #define NODES_H
      16              : 
      17              : /*
      18              :  * The first field of every node is NodeTag. Each node created (with makeNode)
      19              :  * will have one of the following tags as the value of its first field.
      20              :  *
      21              :  * Note that inserting or deleting node types changes the numbers of other
      22              :  * node types later in the list.  This is no problem during development, since
      23              :  * the node numbers are never stored on disk.  But don't do it in a released
      24              :  * branch, because that would represent an ABI break for extensions.
      25              :  */
      26              : typedef enum NodeTag
      27              : {
      28              :     T_Invalid = 0,
      29              : 
      30              : #include "nodes/nodetags.h"
      31              : } NodeTag;
      32              : 
      33              : /*
      34              :  * pg_node_attr() - Used in node definitions to set extra information for
      35              :  * gen_node_support.pl
      36              :  *
      37              :  * Attributes can be attached to a node as a whole (place the attribute
      38              :  * specification on the first line after the struct's opening brace)
      39              :  * or to a specific field (place it at the end of that field's line).  The
      40              :  * argument is a comma-separated list of attributes.  Unrecognized attributes
      41              :  * cause an error.
      42              :  *
      43              :  * Valid node attributes:
      44              :  *
      45              :  * - abstract: Abstract types are types that cannot be instantiated but that
      46              :  *   can be supertypes of other types.  We track their fields, so that
      47              :  *   subtypes can use them, but we don't emit a node tag, so you can't
      48              :  *   instantiate them.
      49              :  *
      50              :  * - custom_copy_equal: Has custom implementations in copyfuncs.c and
      51              :  *   equalfuncs.c.
      52              :  *
      53              :  * - custom_read_write: Has custom implementations in outfuncs.c and
      54              :  *   readfuncs.c.
      55              :  *
      56              :  * - custom_query_jumble: Has custom implementation in queryjumblefuncs.c.
      57              :  *   Also available as a node field attribute.
      58              :  *
      59              :  * - no_copy: Does not support copyObject() at all.
      60              :  *
      61              :  * - no_equal: Does not support equal() at all.
      62              :  *
      63              :  * - no_copy_equal: Shorthand for both no_copy and no_equal.
      64              :  *
      65              :  * - no_query_jumble: Does not support JumbleQuery() at all.
      66              :  *
      67              :  * - no_read: Does not support nodeRead() at all.
      68              :  *
      69              :  * - nodetag_only: Does not support copyObject(), equal(), jumbleQuery()
      70              :  *   outNode() or nodeRead().
      71              :  *
      72              :  * - special_read_write: Has special treatment in outNode() and nodeRead().
      73              :  *
      74              :  * - nodetag_number(VALUE): assign the specified nodetag number instead of
      75              :  *   an auto-generated number.  Typically this would only be used in stable
      76              :  *   branches, to give a newly-added node type a number without breaking ABI
      77              :  *   by changing the numbers of existing node types.
      78              :  *
      79              :  * Node types can be supertypes of other types whether or not they are marked
      80              :  * abstract: if a node struct appears as the first field of another struct
      81              :  * type, then it is the supertype of that type.  The no_copy, no_equal,
      82              :  * no_query_jumble and no_read node attributes are automatically inherited
      83              :  * from the supertype.  (Notice that nodetag_only does not inherit, so it's
      84              :  * not quite equivalent to a combination of other attributes.)
      85              :  *
      86              :  * Valid node field attributes:
      87              :  *
      88              :  * - array_size(OTHERFIELD): This field is a dynamically allocated array with
      89              :  *   size indicated by the mentioned other field.  The other field is either a
      90              :  *   scalar or a list, in which case the length of the list is used.
      91              :  *
      92              :  * - copy_as(VALUE): In copyObject(), replace the field's value with VALUE.
      93              :  *
      94              :  * - copy_as_scalar: In copyObject(), copy the field as a scalar value
      95              :  *   (e.g. a pointer) even if it is a node-type pointer.
      96              :  *
      97              :  * - equal_as_scalar: In equal(), compare the field as a scalar value
      98              :  *   even if it is a node-type pointer.
      99              :  *
     100              :  * - equal_ignore: Ignore the field for equality.
     101              :  *
     102              :  * - equal_ignore_if_zero: Ignore the field for equality if it is zero.
     103              :  *   (Otherwise, compare normally.)
     104              :  *
     105              :  * - custom_query_jumble: Has custom implementation in queryjumblefuncs.c
     106              :  *   for the field of a node.  Also available as a node attribute.
     107              :  *
     108              :  * - query_jumble_ignore: Ignore the field for query jumbling.
     109              :  *
     110              :  * - query_jumble_squash: Squash multiple values during query jumbling.
     111              :  *
     112              :  * - query_jumble_location: Mark the field as a location to track.  This is
     113              :  *   only used for fields of type ParseLoc, which otherwise are not jumbled.
     114              :  *
     115              :  * - read_as(VALUE): In nodeRead(), replace the field's value with VALUE.
     116              :  *
     117              :  * - read_write_ignore: Ignore the field for read/write.  This is only allowed
     118              :  *   if the node type is marked no_read or read_as() is also specified.
     119              :  *
     120              :  * - write_only_relids, write_only_nondefault_pathtarget, write_only_req_outer:
     121              :  *   Special handling for Path struct; see there.
     122              :  *
     123              :  */
     124              : #define pg_node_attr(...)
     125              : 
     126              : /*
     127              :  * The first field of a node of any type is guaranteed to be the NodeTag.
     128              :  * Hence the type of any node can be gotten by casting it to Node. Declaring
     129              :  * a variable to be of Node * (instead of void *) can also facilitate
     130              :  * debugging.
     131              :  */
     132              : typedef struct Node
     133              : {
     134              :     NodeTag     type;
     135              : } Node;
     136              : 
     137              : #define nodeTag(nodeptr)        (((const Node*)(nodeptr))->type)
     138              : 
     139              : /*
     140              :  * newNode -
     141              :  *    create a new node of the specified size and tag the node with the
     142              :  *    specified tag.
     143              :  *
     144              :  * !WARNING!: Avoid using newNode directly. You should be using the
     145              :  *    macro makeNode.  eg. to create a Query node, use makeNode(Query)
     146              :  */
     147              : static inline Node *
     148    186256265 : newNode(size_t size, NodeTag tag)
     149              : {
     150              :     Node       *result;
     151              : 
     152              :     Assert(size >= sizeof(Node));    /* need the tag, at least */
     153    186256265 :     result = (Node *) palloc0(size);
     154    186256265 :     result->type = tag;
     155              : 
     156    186256265 :     return result;
     157              : }
     158              : 
     159              : #define makeNode(_type_)        ((_type_ *) newNode(sizeof(_type_),T_##_type_))
     160              : #define NodeSetTag(nodeptr,t)   (((Node*)(nodeptr))->type = (t))
     161              : 
     162              : #define IsA(nodeptr,_type_)     (nodeTag(nodeptr) == T_##_type_)
     163              : 
     164              : /*
     165              :  * castNode(type, ptr) casts ptr to "type *", and if assertions are enabled,
     166              :  * verifies that the node has the appropriate type (using its nodeTag()).
     167              :  *
     168              :  * Use an inline function when assertions are enabled, to avoid multiple
     169              :  * evaluations of the ptr argument (which could e.g. be a function call).
     170              :  */
     171              : #ifdef USE_ASSERT_CHECKING
     172              : static inline Node *
     173              : castNodeImpl(NodeTag type, void *ptr)
     174              : {
     175              :     Assert(ptr == NULL || nodeTag(ptr) == type);
     176              :     return (Node *) ptr;
     177              : }
     178              : #define castNode(_type_, nodeptr) ((_type_ *) castNodeImpl(T_##_type_, nodeptr))
     179              : #else
     180              : #define castNode(_type_, nodeptr) ((_type_ *) (nodeptr))
     181              : #endif                          /* USE_ASSERT_CHECKING */
     182              : 
     183              : 
     184              : /* ----------------------------------------------------------------
     185              :  *                    extern declarations follow
     186              :  * ----------------------------------------------------------------
     187              :  */
     188              : 
     189              : #ifndef FRONTEND
     190              : 
     191              : /*
     192              :  * nodes/{outfuncs.c,print.c}
     193              :  */
     194              : struct Bitmapset;               /* not to include bitmapset.h here */
     195              : struct StringInfoData;          /* not to include stringinfo.h here */
     196              : 
     197              : extern void outNode(struct StringInfoData *str, const void *obj);
     198              : extern void outToken(struct StringInfoData *str, const char *s);
     199              : extern void outBitmapset(struct StringInfoData *str,
     200              :                          const struct Bitmapset *bms);
     201              : extern void outDatum(struct StringInfoData *str, Datum value,
     202              :                      int typlen, bool typbyval);
     203              : extern char *nodeToString(const void *obj);
     204              : extern char *nodeToStringWithLocations(const void *obj);
     205              : extern char *bmsToString(const struct Bitmapset *bms);
     206              : 
     207              : /*
     208              :  * nodes/{readfuncs.c,read.c}
     209              :  */
     210              : extern void *stringToNode(const char *str);
     211              : #ifdef DEBUG_NODE_TESTS_ENABLED
     212              : extern void *stringToNodeWithLocations(const char *str);
     213              : #endif
     214              : extern struct Bitmapset *readBitmapset(void);
     215              : extern Datum readDatum(bool typbyval);
     216              : extern bool *readBoolCols(int numCols);
     217              : extern int *readIntCols(int numCols);
     218              : extern Oid *readOidCols(int numCols);
     219              : extern int16 *readAttrNumberCols(int numCols);
     220              : 
     221              : /*
     222              :  * nodes/copyfuncs.c
     223              :  */
     224              : extern void *copyObjectImpl(const void *from);
     225              : 
     226              : /* cast result back to argument type, if supported by compiler */
     227              : #ifdef HAVE_TYPEOF_UNQUAL
     228              : #define copyObject(obj) ((typeof_unqual(*(obj)) *) copyObjectImpl(obj))
     229              : #else
     230              : #define copyObject(obj) copyObjectImpl(obj)
     231              : #endif
     232              : 
     233              : /*
     234              :  * nodes/equalfuncs.c
     235              :  */
     236              : extern bool equal(const void *a, const void *b);
     237              : 
     238              : #endif                          /* !FRONTEND */
     239              : 
     240              : 
     241              : /*
     242              :  * Typedef for parse location.  This is just an int, but this way
     243              :  * gen_node_support.pl knows which fields should get special treatment for
     244              :  * location values.
     245              :  *
     246              :  * -1 is used for unknown.
     247              :  */
     248              : typedef int ParseLoc;
     249              : 
     250              : /*
     251              :  * Typedefs for identifying qualifier selectivities, plan costs, and row
     252              :  * counts as such.  These are just plain "double"s, but declaring a variable
     253              :  * as Selectivity, Cost, or Cardinality makes the intent more obvious.
     254              :  *
     255              :  * These could have gone into plannodes.h or some such, but many files
     256              :  * depend on them...
     257              :  */
     258              : typedef double Selectivity;     /* fraction of tuples a qualifier will pass */
     259              : typedef double Cost;            /* execution cost (in page-access units) */
     260              : typedef double Cardinality;     /* (estimated) number of rows or other integer
     261              :                                  * count */
     262              : 
     263              : 
     264              : /*
     265              :  * CmdType -
     266              :  *    enums for type of operation represented by a Query or PlannedStmt
     267              :  *
     268              :  * This is needed in both parsenodes.h and plannodes.h, so put it here...
     269              :  */
     270              : typedef enum CmdType
     271              : {
     272              :     CMD_UNKNOWN,
     273              :     CMD_SELECT,                 /* select stmt */
     274              :     CMD_UPDATE,                 /* update stmt */
     275              :     CMD_INSERT,                 /* insert stmt */
     276              :     CMD_DELETE,                 /* delete stmt */
     277              :     CMD_MERGE,                  /* merge stmt */
     278              :     CMD_UTILITY,                /* cmds like create, destroy, copy, vacuum,
     279              :                                  * etc. */
     280              :     CMD_NOTHING,                /* dummy command for instead nothing rules
     281              :                                  * with qual */
     282              : } CmdType;
     283              : 
     284              : 
     285              : /*
     286              :  * JoinType -
     287              :  *    enums for types of relation joins
     288              :  *
     289              :  * JoinType determines the exact semantics of joining two relations using
     290              :  * a matching qualification.  For example, it tells what to do with a tuple
     291              :  * that has no match in the other relation.
     292              :  *
     293              :  * This is needed in both parsenodes.h and plannodes.h, so put it here...
     294              :  */
     295              : typedef enum JoinType
     296              : {
     297              :     /*
     298              :      * The canonical kinds of joins according to the SQL JOIN syntax. Only
     299              :      * these codes can appear in parser output (e.g., JoinExpr nodes).
     300              :      */
     301              :     JOIN_INNER,                 /* matching tuple pairs only */
     302              :     JOIN_LEFT,                  /* pairs + unmatched LHS tuples */
     303              :     JOIN_FULL,                  /* pairs + unmatched LHS + unmatched RHS */
     304              :     JOIN_RIGHT,                 /* pairs + unmatched RHS tuples */
     305              : 
     306              :     /*
     307              :      * Semijoins and anti-semijoins (as defined in relational theory) do not
     308              :      * appear in the SQL JOIN syntax, but there are standard idioms for
     309              :      * representing them (e.g., using EXISTS).  The planner recognizes these
     310              :      * cases and converts them to joins.  So the planner and executor must
     311              :      * support these codes.  NOTE: in JOIN_SEMI output, it is unspecified
     312              :      * which matching RHS row is joined to.  In JOIN_ANTI output, the row is
     313              :      * guaranteed to be null-extended.
     314              :      */
     315              :     JOIN_SEMI,                  /* 1 copy of each LHS row that has match(es) */
     316              :     JOIN_ANTI,                  /* 1 copy of each LHS row that has no match */
     317              :     JOIN_RIGHT_SEMI,            /* 1 copy of each RHS row that has match(es) */
     318              :     JOIN_RIGHT_ANTI,            /* 1 copy of each RHS row that has no match */
     319              : 
     320              :     /*
     321              :      * These codes are used internally in the planner, but are not supported
     322              :      * by the executor (nor, indeed, by most of the planner).
     323              :      */
     324              :     JOIN_UNIQUE_OUTER,          /* LHS has be made unique */
     325              :     JOIN_UNIQUE_INNER,          /* RHS has be made unique */
     326              : 
     327              :     /*
     328              :      * We might need additional join types someday.
     329              :      */
     330              : } JoinType;
     331              : 
     332              : /*
     333              :  * OUTER joins are those for which pushed-down quals must behave differently
     334              :  * from the join's own quals.  This is in fact everything except INNER, SEMI
     335              :  * and RIGHT_SEMI joins.  However, this macro must also exclude the
     336              :  * JOIN_UNIQUE symbols since those are temporary proxies for what will
     337              :  * eventually be an INNER join.
     338              :  *
     339              :  * Note: semijoins are a hybrid case, but we choose to treat them as not
     340              :  * being outer joins.  This is okay principally because the SQL syntax makes
     341              :  * it impossible to have a pushed-down qual that refers to the inner relation
     342              :  * of a semijoin; so there is no strong need to distinguish join quals from
     343              :  * pushed-down quals.  This is convenient because for almost all purposes,
     344              :  * quals attached to a semijoin can be treated the same as innerjoin quals.
     345              :  */
     346              : #define IS_OUTER_JOIN(jointype) \
     347              :     (((1 << (jointype)) & \
     348              :       ((1 << JOIN_LEFT) | \
     349              :        (1 << JOIN_FULL) | \
     350              :        (1 << JOIN_RIGHT) | \
     351              :        (1 << JOIN_ANTI) | \
     352              :        (1 << JOIN_RIGHT_ANTI))) != 0)
     353              : 
     354              : /*
     355              :  * AggStrategy -
     356              :  *    overall execution strategies for Agg plan nodes
     357              :  *
     358              :  * This is needed in both pathnodes.h and plannodes.h, so put it here...
     359              :  */
     360              : typedef enum AggStrategy
     361              : {
     362              :     AGG_PLAIN,                  /* simple agg across all input rows */
     363              :     AGG_SORTED,                 /* grouped agg, input must be sorted */
     364              :     AGG_HASHED,                 /* grouped agg, use internal hashtable */
     365              :     AGG_MIXED,                  /* grouped agg, hash and sort both used */
     366              : } AggStrategy;
     367              : 
     368              : /*
     369              :  * AggSplit -
     370              :  *    splitting (partial aggregation) modes for Agg plan nodes
     371              :  *
     372              :  * This is needed in both pathnodes.h and plannodes.h, so put it here...
     373              :  */
     374              : 
     375              : /* Primitive options supported by nodeAgg.c: */
     376              : #define AGGSPLITOP_COMBINE      0x01    /* substitute combinefn for transfn */
     377              : #define AGGSPLITOP_SKIPFINAL    0x02    /* skip finalfn, return state as-is */
     378              : #define AGGSPLITOP_SERIALIZE    0x04    /* apply serialfn to output */
     379              : #define AGGSPLITOP_DESERIALIZE  0x08    /* apply deserialfn to input */
     380              : 
     381              : /* Supported operating modes (i.e., useful combinations of these options): */
     382              : typedef enum AggSplit
     383              : {
     384              :     /* Basic, non-split aggregation: */
     385              :     AGGSPLIT_SIMPLE = 0,
     386              :     /* Initial phase of partial aggregation, with serialization: */
     387              :     AGGSPLIT_INITIAL_SERIAL = AGGSPLITOP_SKIPFINAL | AGGSPLITOP_SERIALIZE,
     388              :     /* Final phase of partial aggregation, with deserialization: */
     389              :     AGGSPLIT_FINAL_DESERIAL = AGGSPLITOP_COMBINE | AGGSPLITOP_DESERIALIZE,
     390              : } AggSplit;
     391              : 
     392              : /* Test whether an AggSplit value selects each primitive option: */
     393              : #define DO_AGGSPLIT_COMBINE(as)     (((as) & AGGSPLITOP_COMBINE) != 0)
     394              : #define DO_AGGSPLIT_SKIPFINAL(as)   (((as) & AGGSPLITOP_SKIPFINAL) != 0)
     395              : #define DO_AGGSPLIT_SERIALIZE(as)   (((as) & AGGSPLITOP_SERIALIZE) != 0)
     396              : #define DO_AGGSPLIT_DESERIALIZE(as) (((as) & AGGSPLITOP_DESERIALIZE) != 0)
     397              : 
     398              : /*
     399              :  * SetOpCmd and SetOpStrategy -
     400              :  *    overall semantics and execution strategies for SetOp plan nodes
     401              :  *
     402              :  * This is needed in both pathnodes.h and plannodes.h, so put it here...
     403              :  */
     404              : typedef enum SetOpCmd
     405              : {
     406              :     SETOPCMD_INTERSECT,
     407              :     SETOPCMD_INTERSECT_ALL,
     408              :     SETOPCMD_EXCEPT,
     409              :     SETOPCMD_EXCEPT_ALL,
     410              : } SetOpCmd;
     411              : 
     412              : typedef enum SetOpStrategy
     413              : {
     414              :     SETOP_SORTED,               /* input must be sorted */
     415              :     SETOP_HASHED,               /* use internal hashtable */
     416              : } SetOpStrategy;
     417              : 
     418              : /*
     419              :  * OnConflictAction -
     420              :  *    "ON CONFLICT" clause type of query
     421              :  *
     422              :  * This is needed in both parsenodes.h and plannodes.h, so put it here...
     423              :  */
     424              : typedef enum OnConflictAction
     425              : {
     426              :     ONCONFLICT_NONE,            /* No "ON CONFLICT" clause */
     427              :     ONCONFLICT_NOTHING,         /* ON CONFLICT ... DO NOTHING */
     428              :     ONCONFLICT_UPDATE,          /* ON CONFLICT ... DO UPDATE */
     429              :     ONCONFLICT_SELECT,          /* ON CONFLICT ... DO SELECT */
     430              : } OnConflictAction;
     431              : 
     432              : /*
     433              :  * LimitOption -
     434              :  *  LIMIT option of query
     435              :  *
     436              :  * This is needed in both parsenodes.h and plannodes.h, so put it here...
     437              :  */
     438              : typedef enum LimitOption
     439              : {
     440              :     LIMIT_OPTION_COUNT,         /* FETCH FIRST... ONLY */
     441              :     LIMIT_OPTION_WITH_TIES,     /* FETCH FIRST... WITH TIES */
     442              : } LimitOption;
     443              : 
     444              : #endif                          /* NODES_H */
        

Generated by: LCOV version 2.0-1