# UNDF: UNDF-2026-000000219
# postgresql-0007 — `add_new_columns_to_pathtarget`: O(E·T) list_member scan inside loop

## Status
PATCHED

## Severity
HIGH (>10× speedup at E=T=500)

## Location
`src/backend/optimizer/util/tlist.c`, function `add_new_columns_to_pathtarget()`
and its leaf `add_new_column_to_pathtarget()`

## Description
`add_new_columns_to_pathtarget` iterates over `exprs` (E items) and for each
calls `add_new_column_to_pathtarget`, which calls `list_member(target->exprs, expr)` —
a full O(T) linear scan using structural `equal()` over all T existing PathTarget
expressions.

Total cost: O(E·T), same pattern as postgresql-0006 but operating on a
`PathTarget` rather than a flat tlist.

### Hot callers (from planner.c)
```
make_group_input_target()   line 5688
make_partial_grouping_target()  line 5774
make_window_input_target()  line 6330, 6632
```
All are called during the grouping/window-function planning phase of every
aggregated query.

## Patch (conceptual — C)
Before the foreach loop in `add_new_columns_to_pathtarget`, build a pointer set
of `target->exprs` entries.  For each candidate expr, do O(1) pointer lookup
(sufficient for canonical Var nodes); fall back to `list_member` only for
non-canonical nodes.

## Patch file
See `postgresql-0007-add-new-columns-hash.patch`
