node-infrastructurelisted
Install: claude install-skill matejformanek/postgres-claude
# node-infrastructure — the Node type system
PG uses a **tagged union** pattern for every intermediate representation: parse tree, query tree, plan tree, execution state. Each node is a struct starting with `NodeTag type;` (an enum value); code that operates on trees switches on `type` to dispatch.
This is what enables `expression_tree_walker` and `expression_tree_mutator` to traverse and transform trees generically — they use the tag to look up per-node behavior.
## The file map
| File | Role |
|---|---|
| `src/backend/nodes/gen_node_support.pl` | **The code generator.** Reads `parsenodes.h` / `primnodes.h` / `plannodes.h` / etc., parses the Node struct definitions, produces: |
| `src/backend/nodes/copyfuncs.c` (generated) | `copyObjectImpl(node)` — deep-copy every Node struct. Big switch on NodeTag. |
| `src/backend/nodes/equalfuncs.c` (generated) | `equal(a, b)` — deep equality. Big switch. |
| `src/backend/nodes/outfuncs.c` (generated) | Serialize Node tree to text — for `nodeToString` + WAL / stored plans / debug. |
| `src/backend/nodes/readfuncs.c` (generated) | Deserialize text back to Node tree — `stringToNode`. |
| `src/backend/nodes/nodes.c` | Small hand-written companion — `newNode` macro internals. |
| `src/backend/nodes/nodeFuncs.c` | Tree walkers + mutators + type-classification predicates (`exprType`, `IsA`, etc.). |
| `src/include/nodes/nodes.h` (generated) | The `NodeTag` enum — one `T_<TypeName>` per Node. |
## The `T_` enum
`NodeTag` is a big enum:
`