Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions .clangd
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
Diagnostics:
MissingIncludes: None
Comment on lines +1 to +2

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This .clangd file is personal editor/LSP tooling configuration and should not be part of a patch destined for pgsql-hackers/commitfest. Per PostgreSQL patch hygiene, a patch must be a minimal diff containing only what the stated change requires; committing local IDE/tooling config (this file, plus .gdbinit and pg-aliases.sh in this same change) is unrelated churn and a reliable rejection reason. The PostgreSQL tree does not carry .clangd. If you need it locally, put it in .git/info/exclude or your global gitignore rather than committing it. Remove this file from the patch.

Also note the hardcoded relative include path -I../../../../src/include (line 43) is brittle and workstation/subdirectory-specific, which further confirms this is a local artifact, not a tree-wide config.

Comment on lines +1 to +2

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file should not be committed to the repository. The project's root .gitignore explicitly states: "Auxiliary files from local workflows, your preferred editor, etc. should be ignored locally using $GIT_DIR/info/exclude or ~/.gitexclude." .clangd is a personal, editor/tooling-local config for the clangd language server and is unrelated to the actual code change in this patch (the buffer/vacuum work). Including it (along with the other added local files .gdbinit and pg-aliases.sh) violates the minimal-diff discipline and will be rejected on pgsql-hackers. Remove it from the patch and add it to your local git exclude instead.

Additionally, note the paths are developer-specific: CompilationDatabase: build/ and -I../../../../src/include assume a particular out-of-tree build layout that will not hold for other contributors, further confirming this is not a shareable, tree-wide file.

Comment on lines +1 to +2

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This .clangd file (along with .gdbinit and pg-aliases.sh added in this change) is a developer-local IDE/editor artifact and must not be committed to the tree. In a patch destined for pgsql-hackers/commitfest, personal tooling config is unrelated to the stated purpose (the HOT indexed updates work) and will be an immediate rejection: it is not minimal, it pollutes the repo root, and it encodes one contributor's environment (paths, compiler flags, project-specific breakpoint line numbers). PostgreSQL keeps editor config out of the tree and leaves it to each developer's dotfiles. Remove this file from the patch.

Comment on lines +1 to +2

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This .clangd file, along with .gdbinit and pg-aliases.sh, is a personal developer-environment artifact and does not belong in a PostgreSQL patch. Committing editor/LSP configuration into the source tree violates the minimal-diff discipline: the patch should contain only the changes required for the stated purpose (the HOT indexed updates work). These files will cause needless conflicts, pollute every developer's tree, and would be immediately rejected on pgsql-hackers. Remove it from the commit (and add it to your local git excludes / .git/info/exclude instead).

Comment on lines +1 to +2

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This entire file should not be committed. It is a personal editor/LSP configuration, not part of PostgreSQL's build or source. The project's own top-level .gitignore documents this policy explicitly: "Auxiliary files from local workflows, your preferred editor, etc. should be ignored locally using $GIT_DIR/info/exclude or ~/.gitexclude." A patch destined for pgsql-hackers/commitfest must be a minimal diff; unrelated tooling/config files like this are a top rejection reason. Please drop this file from the patch and ignore it locally instead. (high confidence)

Comment on lines +1 to +2

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This .clangd file is per-developer editor/LSP tooling and should not be committed to the tree. Upstream PostgreSQL does not carry .clangd, and this same PR git-ignores .vscode/ and .idea/ in .github/.gitignore for exactly this reason. A patch posted to pgsql-hackers carrying personal editor config will be rejected. Add .clangd to .gitignore instead of committing it. (high confidence)

InlayHints:
Enabled: true
ParameterNames: true
DeducedTypes: true
CompileFlags:
CompilationDatabase: build/ # Search build/ directory for compile_commands.json
Remove: [ -Werror ]
Add:
- -DDEBUG
- -DLOCAL
- -DPGDLLIMPORT=
- -DPIC
- -O2
- -Wall
- -Wcast-function-type
- -Wconversion
- -Wdeclaration-after-statement
- -Wendif-labels
- -Werror=vla
- -Wextra
- -Wfloat-equal
- -Wformat-security
- -Wimplicit-fallthrough=3
- -Wmissing-format-attribute
- -Wmissing-prototypes
- -Wno-format-truncation
- -Wno-sign-conversion
- -Wno-stringop-truncation
- -Wno-unused-const-variable
- -Wpointer-arith
- -Wshadow
- -Wshadow=compatible-local
- -fPIC
- -fexcess-precision=standard
- -fno-strict-aliasing
- -fvisibility=hidden
- -fwrapv
- -g
- -std=c11
- -I.
- -I../../../../src/include

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This include path is almost certainly wrong for a .clangd placed at the repository root. Relative -I flags added via CompileFlags.Add are resolved relative to the compile command's directory (the build/ dir set above) or the source file's directory, not the repo root. Going up four levels (../../../../) from anywhere at/under the repo root lands outside the tree and never resolves to <repo>/src/include. The ../../../../ prefix looks copy-pasted from a deeply nested subdirectory's build flags. Since src/include sits directly under the root, use a root-relative path instead. (Impact is limited to the author's own clangd header resolution, and MissingIncludes: None suppresses the resulting diagnostics, hence low severity.)

Suggested change
- -I../../../../src/include
- -Isrc/include

Comment on lines +42 to +43

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These -I paths are resolved by clangd relative to each translation unit's own directory, not the repo root. -I../../../../src/include only points at <repo>/src/include for source files that happen to sit exactly four directories deep (e.g. src/backend/storage/buffer/*.c). For files at other depths — e.g. contrib/pg_buffercache/*.c (two deep) or top-level files — it resolves to a non-existent directory, so clangd will fail to find core headers and produce spurious diagnostics for those TUs. Since CompilationDatabase: build/ already supplies correct per-file -I flags from compile_commands.json, these hardcoded relative includes are both fragile and redundant; consider dropping them (or using an absolute/${workspaceFolder}-style path) so the fallback works uniformly across the tree.

Comment on lines +42 to +43

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The -I paths here are hard-coded to a single fixed source layout. -I. plus a fixed -I../../../../src/include only resolves correctly when clangd is invoked from a directory exactly four levels below src/include (e.g. a specific per-file build subdir), and is wrong for files at the repo root or at other depths. Since a compile_commands.json from the meson build/ directory (already referenced via CompilationDatabase: build/) provides the correct per-file include flags, these manual -I entries are both incorrect and redundant. This is another reason this file should not be committed.

Comment on lines +42 to +43

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The include path -I../../../../src/include is hardcoded relative to a specific nested subdirectory depth. Combined with -I., this only resolves correctly from a directory exactly four levels deep in the tree, so it is broken for a repo-root .clangd and is inherently non-portable across the tree layout. This reinforces that the file is a machine-specific artifact that should not be committed.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hardcoded relative include path -I../../../../src/include only resolves for source files nested exactly four directories deep (e.g. contrib/foo/); it is wrong for top-level src/backend/... files and breaks clangd indexing there. Since CompilationDatabase: build/ already supplies per-file compile flags from compile_commands.json, this fragile manual -I is both redundant and incorrect and should be dropped. (moderate confidence)

156 changes: 156 additions & 0 deletions .gdbinit
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
# HOT Indexed Updates — GDB breakpoints for code review

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This entire file is a personal debugging aid and must be removed from the patch. Committing a .gdbinit violates PostgreSQL patch hygiene (minimal diff) and will be an automatic rejection on -hackers. It is also a real footgun: GDB auto-loads .gdbinit from the current working directory, so shipping one in the repository root causes arbitrary debugger commands to execute for anyone who launches gdb in a checkout (local code-execution vector). This is not tracked in .gitignore, so it should not be committed at all. The co-added .clangd and pg-aliases.sh are the same class of out-of-scope developer artifacts and should likewise be dropped from the patch.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This entire file (.gdbinit), together with the sibling additions .clangd and pg-aliases.sh, is a personal developer debugging/environment artifact and does not belong in a PostgreSQL patch. Patches destined for pgsql-hackers/commitfest must be minimal and contain only the changes required by the stated purpose; per-developer scratch files are a top rejection reason and cause needless merge conflicts. The project's .gitignore explicitly states such auxiliary files 'should be ignored locally using $GIT_DIR/info/exclude or ~/.gitexclude', not committed. Additionally, a .gdbinit in the repo root is a footgun: GDB auto-loads ./.gdbinit from the working directory, so any developer launching gdb in the checkout silently executes these commands. Please drop this file (and its siblings) from the patch.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The header (and several other comment lines) use a non-ASCII em-dash character ('—'), which violates the project's ASCII-only rule for source and diffs. Use a plain ASCII hyphen/dash instead.

Suggested change
# HOT Indexed Updates GDB breakpoints for code review
+# HOT Indexed Updates - GDB breakpoints for code review

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The em-dash (U+2014) violates the ASCII-only rule for source and diffs. If this file were to be kept at all, use an ASCII hyphen. (More fundamentally, the whole file should not be committed.)

Confidence: high.

Suggested change
# HOT Indexed Updates GDB breakpoints for code review
# HOT Indexed Updates - GDB breakpoints for code review

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This entire .gdbinit is a personal debugging artifact and must not be committed. For a patch destined for pgsql-hackers/commitfest, the minimal-diff rule is a hard gate: the tree should contain only changes required for the stated functional purpose. A debugger config in the repository root is a top rejection reason and pollutes the root for every other developer. I confirmed .gitignore does not ignore it, so it would actually be committed. The co-added .clangd and pg-aliases.sh are the same class of personal tooling and should likewise be dropped (gitignore them locally instead). (high confidence)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Non-ASCII characters (em dash U+2014) appear in the header and inline comments, violating the ASCII-only rule for source and diffs. If any of this were retained it would fail hygiene checks; use a plain hyphen - instead. (high confidence)

Suggested change
# HOT Indexed Updates GDB breakpoints for code review
+# HOT Indexed Updates - GDB breakpoints for code review

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This repository-root .gdbinit is a personal debugging artifact and does not belong in a patch destined for pgsql-hackers/commitfest (minimal-diff / YAGNI hygiene). Beyond the unrelated-tooling problem (it is bundled with pg-aliases.sh), it is a real footgun: gdb auto-sources a .gdbinit in the current directory when launched from the project root (subject to auto-load safe-path settings), so committing this can silently alter another developer's debugging session by setting 30+ breakpoints they never asked for. Remove it from the patch and add .gdbinit to .gitignore instead.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ASCII-only is required in source/diffs. This line (and the section headers below, e.g. lines 15, 38, 52, ...) use a Unicode em-dash (U+2014 —) rather than a plain hyphen. Replace every em-dash with - / --.

Suggested change
# HOT Indexed Updates GDB breakpoints for code review
# HOT Indexed Updates -- GDB breakpoints for code review

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This .gdbinit is a personal developer debugging artifact and should not be committed. It violates the minimal-diff discipline (unrelated scaffolding with no functional value to the patch), and it is a footgun: GDB auto-loads a .gdbinit from the current working directory, so shipping one in the repo root can silently alter debugging behavior for anyone who runs gdb from the checkout. Note that .github/docs/pristine-master-policy.md and pg-aliases.sh already treat .gdbinit as local debugger config, yet it is not in the root .gitignore. Remove it from the patch and keep it local/untracked (add to .gitignore if needed).

#
# Usage: gdb -x .gdbinit <postgres-binary>
Comment on lines +1 to +3

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This .gdbinit is a developer-local debugging artifact and does not belong in a PostgreSQL source patch. It is added alongside two other personal tooling files (.clangd, pg-aliases.sh), none of which are part of any functional change. Committing them violates the minimal-diff discipline (unrelated files are the top rejection reason on pgsql-hackers) and will pollute the tree root. Remove all three from the patch.

Worse, the file is orphaned from the feature it targets: the breakpoints reference a "HOT indexed updates" implementation that is NOT present in this tree. Symbols such as heap_hot_indexed_create_tuple, heap_hot_indexed_serialize_bitmap, heap_hot_indexed_tuple_size, heap_hot_indexed_read_bitmap, heap_xlog_indexed_update, and macros HEAP_INDEXED_UPDATED / XLOG_HEAP2_INDEXED_UPDATE exist ONLY inside this .gdbinit — a codebase search finds them nowhere else. GDB would reject those break commands at load time. This indicates a mis-scoped commit: the debug file was committed without (or ahead of) the feature it targets, which also breaks the atomic/bisectable-commit rule.

Comment on lines +1 to +3

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This entire file is a personal debugging artifact and must not be committed to the PostgreSQL tree. GDB auto-loads .gdbinit from the working directory, so committing it is also a footgun (auto-executed setup for anyone building in this dir). Along with the sibling .clangd and pg-aliases.sh, this violates the minimal-diff rule: a patch destined for pgsql-hackers/commitfest must contain only the changes required by the stated feature. This file (and its siblings) should be moved to a personal/global ignore list or removed from the change set entirely.

Confidence: high.

# Or from gdb: source .gdbinit
Comment on lines +1 to +4

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This entire file is a personal developer-tooling artifact (a GDB breakpoint script) and must not be committed to the PostgreSQL tree. It is added alongside two other local scratch files in this same change (.clangd, pg-aliases.sh), so the patch does more than one thing and pollutes the repository root -- an instant rejection on pgsql-hackers under the minimal-diff rule. Confirmed: .gdbinit is not listed in any .gitignore, so it was actively tracked rather than ignored. Worse, none of the code this file targets exists in the tree: a search for the referenced helpers (heap_hot_indexed_*) and the HEAP_INDEXED_UPDATED / XLOG_HEAP2_INDEXED_UPDATE symbols finds no matches anywhere except inside this file, and none of the files it references (heapam.c, heapam_indexscan.c, indexam.c, execIndexing.c, pruneheap.c, heapam_xlog.c) are part of this change. The file should be dropped from the commit entirely; if it must exist locally, put it in a personal global gitignore, not the repo. (high confidence)

#
# These breakpoints cover the major code paths introduced or modified by

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ASCII-only is required in PostgreSQL source and diffs. This comment block uses non-ASCII em-dashes (e.g., "HOT Indexed Updates —", "returns Bitmapset" lines and the "—" separators throughout). Another reason this file cannot be committed as-is.

# the HOT indexed updates patch series. They are organized by subsystem
Comment on lines +6 to +7

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Topic mismatch: this file's stated purpose is a "HOT Indexed Updates" feature, but that feature is not present in this change set (the actual modified files are buffer-manager code: bufmgr.c, freelist.c, localbuf.c, buf_internals.h, pg_buffercache). A search of the heap access code found none of the symbols referenced below (heap_hot_indexed_create_tuple, heap_xlog_indexed_update, heap_hot_indexed_serialize_bitmap, HEAP_INDEXED_UPDATED). The commit therefore bundles unrelated content and is neither atomic nor bisectable.

Confidence: high.

# to make it easy to enable/disable groups during debugging.
#
# Tip: to skip to a specific subsystem, disable all then enable selectively:
# disable breakpoints
# enable 1 2 3 # just the update-decision group

# =========================================================================
# 1. UPDATE DECISION — heap_update() HOT/HOT-indexed/non-HOT choice

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Non-ASCII em-dash (U+2014) characters appear throughout the section headers (e.g. "HOT Indexed Updates — GDB breakpoints", "UPDATE DECISION — heap_update()"). PostgreSQL sources and diffs are required to be ASCII-only; use a plain hyphen/dash instead. Minor relative to the file not belonging in the tree at all, but noted for completeness. (high confidence)

Suggested change
# 1. UPDATE DECISION heap_update() HOT/HOT-indexed/non-HOT choice
+# 1. UPDATE DECISION -- heap_update() HOT/HOT-indexed/non-HOT choice

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Non-ASCII em-dash characters (U+2014) are used throughout the header comments (lines 1, 15, 38, 52, 81, 98, 106, 117, 140, 148). PostgreSQL sources must be ASCII-only - no em-dashes, smart quotes, or ellipsis characters. Replace with an ASCII hyphen/dash. (Moot if the file is removed entirely, as recommended above.)

Suggested change
# 1. UPDATE DECISION heap_update() HOT/HOT-indexed/non-HOT choice
+# 1. UPDATE DECISION - heap_update() HOT/HOT-indexed/non-HOT choice

# src/backend/access/heap/heapam.c
# =========================================================================

# Main entry: heap_update
break heapam.c:3210
Comment on lines +19 to +20

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hardcoded file:line breakpoints are inaccurate and brittle. For example, heapam.c:3210 is labeled "Main entry: heap_update", but line 3210 is actually the variable declaration bool all_visible_cleared_new = false; inside the function body — not the function entry. Since heapam.c is heavily modified in this very change set, all such line-based breakpoints (4019, 4024, 4033, 4101, 4147, etc.) are already stale. Prefer function-name breakpoints; but ultimately this file should not be tracked in the repository at all.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Breakpoints anchored to hardcoded source line numbers (heapam.c:3210/4019/4024/4033/4101/4147, heapam_indexscan.c:182/250/297, indexam.c:299, execIndexing.c:370, pruneheap.c:1287/1802/1836/1863/2936) are inherently fragile: they silently drift as surrounding code changes and will land on the wrong statements. Since this file should not be committed at all (see above), this is moot, but even as a private aid, function-name breakpoints are far more robust than line-number ones.

Comment on lines +19 to +20

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Line-number breakpoints are inherently fragile: they silently drift the moment any adjacent code changes. In fact heapam.c:3210 is not heap_update at all — in the current tree line 3210 is case TM_Ok: inside simple_heap_update's result switch. The embedded per-line annotations (e.g. 'Line 4019: pure HOT') are self-invalidating documentation of exactly the kind the project discourages. If this file were to be kept at all, breakpoints should be set by function name only.

Comment on lines +19 to +20

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hardcoded file:line breakpoints are extremely fragile: they silently point at the wrong statement (or fail to resolve) after any edit to these files. Worse, these specific lines/symbols do not exist in the current tree - the referenced HOT-indexed functions and flag (heap_hot_indexed_*, heap_xlog_indexed_update, HEAP_INDEXED_UPDATED) were not found in src/backend/access/heap. These breakpoints reference code outside this change and are stale/meaningless here.

Confidence: high.

Comment on lines +19 to +20

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Line-number breakpoints (e.g. heapam.c:3210, heapam.c:4019/4024/4033/4101/4147, heapam_indexscan.c:182/250/297, indexam.c:299, execIndexing.c:370, pruneheap.c:1287/1802/1836/1863/2936) are inherently fragile: any edit to those files silently shifts every line, so the comments asserting specific semantics ("Line 4019: pure HOT", "Line 4024: HOT indexed path") are unverifiable and become stale immediately. Since the target source files are not in this change and the referenced functions do not exist in the tree, these breakpoints cannot even be confirmed to be meaningful today. This reinforces that the file does not belong in version control. (high confidence)

Comment on lines +19 to +20

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These breakpoints reference HOT-indexed logic (heapam.c HOT-indexed decision, the heap_hot_indexed_* helpers, heapam_indexscan.c, pruneheap.c redirect-with-data) that is not present in this changeset. I searched the tree and the heap_hot_indexed_* helpers do not exist. Combined with the fact that the files actually modified here are buffer-manager/regress/pgindent files, the debug config is inconsistent with the change's real scope: it points at code that isn't in the diff. (high confidence)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hardcoded line-number breakpoints are fragile: they drift the moment any line above them is edited, so gdb will silently stop at the wrong location without warning. The file already uses the maintainable form (function-name breakpoints like break heap_hot_search_buffer); prefer that everywhere, or break file:function where a specific function is meant. If a mid-function stop is truly needed, anchor it to a nearby unique symbol/label rather than an absolute line number.


# HOT decision block: pure HOT vs HOT indexed vs non-HOT
# Line 4019: pure HOT (no indexed columns changed)
# Line 4024: HOT indexed path (non-catalog, some indexed columns changed)
# Line 4031: predict augmented tuple size
# Line 4033: size+space check before creating augmented tuple
break heapam.c:4019

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hardcoded file:line breakpoints (heapam.c:3210/4019/4024/4033/4101/4147, heapam_indexscan.c:182/250/297, indexam.c:299, execIndexing.c:370, pruneheap.c:1802/1836/1863/1287/2936) are extremely brittle: they drift with any unrelated edit and are meaningless outside one exact commit. The accompanying comments assert specific semantics per line (e.g. "Line 4019: pure HOT"), which become misleading documentation as the source evolves. None of these files even exist in this tree for this feature, so these references cannot be validated. This reinforces that the file does not belong in the patch.

break heapam.c:4024
break heapam.c:4033
Comment on lines +27 to +29

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All break <file>:<line> directives depend on hardcoded absolute line numbers (heapam.c:3210/4019/4024/4033/4101/4147, heapam_indexscan.c:182/250/297, indexam.c:299, execIndexing.c:370, pruneheap.c:1802/1836/1863/1287/2936). These go stale the instant any referenced file shifts by a line, making the file misleading even as a private debugging aid. Prefer function-name breakpoints (as done elsewhere in this file) over line numbers. This is moot if the file is dropped, which it should be. (high confidence)


# Set HEAP_INDEXED_UPDATED flag on new tuple before page insertion
break heapam.c:4101

# Restore HEAP_INDEXED_UPDATED on old tuple (only if it previously had it)
break heapam.c:4147

# =========================================================================
# 2. TUPLE CREATION — building the augmented tuple with embedded bitmap
# src/backend/access/heap/heapam.c
# =========================================================================

# Predict augmented tuple size (returns 0 if t_hoff would overflow)
break heap_hot_indexed_tuple_size

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file targets a HOT-indexed-updates feature (heap_hot_indexed_* helpers, HEAP_INDEXED_UPDATED, heap_xlog_indexed_update, XLOG_HEAP2_INDEXED_UPDATE) that does not exist anywhere in the tree - these symbols appear only inside .gdbinit. The actual changes in this series are limited to buffer management, pg_buffercache, pg_regress, and CI tooling. This is orphaned scaffolding for code not present in the changeset (YAGNI); if the feature commit is genuinely intended, its absence makes the series non-bisectable. Either way, this debug file should not be committed.


# Create augmented tuple with embedded modified-column bitmap
break heap_hot_indexed_create_tuple
Comment on lines +45 to +46

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These breakpoints reference symbols that do not exist anywhere in this change: heap_hot_indexed_create_tuple, heap_hot_indexed_serialize_bitmap, heap_hot_indexed_tuple_size, heap_hot_indexed_bitmap_raw_size, heap_hot_indexed_read_bitmap, heap_hot_indexed_bitmap_overlaps_raw, heap_hot_indexed_merge_bitmaps_raw, heap_hot_indexed_deserialize_bitmap, and heap_xlog_indexed_update (there is no XLOG_HEAP2_INDEXED_UPDATE WAL record either). A search of the tree returns matches only inside .gdbinit itself. When sourced, GDB will error on every unresolvable symbol, and the file documents a code structure (new helper functions, a new WAL record, a HEAP_INDEXED_UPDATED flag) that is absent from the actual diff. This indicates the debug file is stale/aspirational relative to the patch content.


# Serialize Bitmapset into raw bytes in tuple header
break heap_hot_indexed_serialize_bitmap

# =========================================================================
# 3. BITMAP UTILITIES — raw bitmap operations for chain following
# src/backend/access/heap/heapam.c
# =========================================================================

# Compute raw bitmap byte size from natts
break heap_hot_indexed_bitmap_raw_size

# Check if tuple header has room for bitmap between null bitmap and data
break heap_hot_indexed_has_bitmap_space

# Read HOT indexed bitmap from tuple header (returns Bitmapset)
break heap_hot_indexed_read_bitmap

# Fast overlap check: does tuple's raw bitmap overlap with indexed_attrs?
break heap_hot_indexed_bitmap_overlaps_raw

# OR a tuple's raw bitmap into an accumulator buffer
break heap_hot_indexed_bitmap_or_raw

# Check if accumulated raw bitmap overlaps with indexed_attrs
break heap_hot_indexed_accum_overlaps

# Merge bitmaps from dead tuples into a target tuple on the page
break heap_hot_indexed_merge_bitmaps_raw

# Deserialize raw bytes back to Bitmapset
break heap_hot_indexed_deserialize_bitmap

# =========================================================================
# 4. INDEX SCAN — HOT chain following with stale-entry detection
# src/backend/access/heap/heapam_indexscan.c
# =========================================================================

# Main HOT chain search with indexed update awareness
break heap_hot_search_buffer

# Redirect-with-data: initialize bitmap accumulator from collapsed redirect
break heapam_indexscan.c:182

# Accumulate bitmap from INDEXED_UPDATED tuple in chain
break heapam_indexscan.c:250

# Stale entry detection: accumulated bitmap overlaps this index's attrs
break heapam_indexscan.c:297

# =========================================================================
# 5. INDEX SCAN SETUP — indexed_attrs bitmap computation
# src/backend/access/index/indexam.c
# =========================================================================

# Compute indexed_attrs for HOT indexed update chain following
break indexam.c:299

# =========================================================================
# 6. INDEX INSERTION — skip unchanged indexes for HOT indexed updates
# src/backend/executor/execIndexing.c
# =========================================================================

# Entry: insert/update index tuples
break ExecInsertIndexTuples

# Index skip decision: skip indexes whose attrs don't overlap modified set
break execIndexing.c:370

# =========================================================================
# 7. PRUNING — chain collapsing and redirect-with-data
# src/backend/access/heap/pruneheap.c
# =========================================================================

# Main prune function
break heap_page_prune_and_freeze

# Per-chain pruning entry
break heap_prune_chain

# Chain collapsing: collect bitmaps from dead INDEXED_UPDATED intermediates
break pruneheap.c:1802

# OR dead tuple bitmaps into combined bitmap
break pruneheap.c:1836

# Record redirect-with-data for execute phase
break pruneheap.c:1863

# Execute phase: apply redirect-with-data entries on the page
break pruneheap.c:1287

# =========================================================================
# 8. WAL REPLAY — recovery of HOT indexed updates
# src/backend/access/heap/heapam_xlog.c
# =========================================================================

# WAL replay for XLOG_HEAP2_INDEXED_UPDATE
break heap_xlog_indexed_update

# =========================================================================
# 9. WAL LOGGING — writing HOT indexed update records
# src/backend/access/heap/heapam.c
# =========================================================================

# WAL logging for heap updates (handles indexed_update flag)
break log_heap_update

# Serialize redirect-with-data into WAL record (pruneheap.c)
break pruneheap.c:2936
18 changes: 18 additions & 0 deletions .github/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Node modules
scripts/ai-review/node_modules/
# Note: package-lock.json should be committed for reproducible CI/CD builds

# Logs
scripts/ai-review/cost-log-*.json
scripts/ai-review/*.log

# OS files
.DS_Store
Thumbs.db

# Editor files
*.swp
*.swo
*~
.vscode/
.idea/
Loading