ce7470d5f5
Change 1 — Columnar Snapshot Internal: - Add ColumnSnapshot struct (type + str_ids/i64/f64 per column) in data_table_internal.h - Add SnapshotCache struct with pointer-identity sentinel (last_cells_ptr) - Add SnapshotCache field to UiState singleton - In render(): rebuild snapshot after join materialization when cells ptr changes Uses same pointer-identity pattern as existing stats_last_cells in State Int/Float columns parsed once via parse_number; String/Auto interned Change 2 — String Interning: - Add StringPool struct (strings + unordered_map<string_view, uint32_t>) to data_table_types.h - StringPool is per-State (NOT global) for table isolation - intern(sv) inserts if absent, returns stable uint32_t index - Cleared + rebuilt on each snapshot rebuild for index coherence - Add string_pool field to State struct Documentation: - Extended header comment in data_table_internal.h describing design, StringPool API, invariants (pointer-identity, row→snapshot_row), and how stats_last_cells and snapshot coexist independently Build: fn_module_data_table + tables_qa pass, no new errors (only pre-existing -Wformat-truncation warnings unrelated to this change). Public API (data_table.h, TableInput, render() signature) unchanged. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>