← ClaudeAtlas

node-infrastructurelisted

PostgreSQL's Node type system — the tagged-union polymorphism used for parser output (Query, RangeTblEntry), planner output (Path, Plan), executor state (PlanState, ExprState), and every intermediate representation. Covers `src/backend/nodes/gen_node_support.pl` (the code generator) + `src/include/nodes/*.h` + the copy/equal/out/read function families + walker/mutator support (`nodeFuncs.c`). Loads when the user asks about `NodeTag`, adding a new Node type (has scenario `add-new-node-type`), `expression_tree_walker` / `expression_tree_mutator`, why grammar changes require regenerating `nodes.h`, the `T_Foo` enum, or `castNode` / `nodeTag` macros. Skip when the ask is about a specific Node (e.g. SeqScan, HashJoin) — those live under executor/optimizer skills.
matejformanek/postgres-claude · ★ 0 · DevOps & Infrastructure · score 70
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: `