Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
4599 commits
Select commit Hold shift + click to select a range
e299a81
Don't let tablespace-drop replay kill the startup process (PG14)
dimoffon Jun 10, 2026
6f599ea
Fix invalid EXPLAIN (FORMAT JSON/XML/YAML) output: unbalanced Plannin…
dimoffon Jun 10, 2026
390ef56
Fix planner AO UPDATE on tables with dropped columns (PG14)
dimoffon Jun 10, 2026
2eaff97
copydir: tolerate source files vanishing during WAL replay (PG14)
dimoffon Jun 10, 2026
70de8aa
Recreate missing tablespace location during WAL replay (PG14)
dimoffon Jun 10, 2026
6e6b395
ORCA: fix UPDATE on tables with dropped columns (PG14)
dimoffon Jun 10, 2026
584c2b9
Fix pg_class.reltype = 0 for all append-optimized tables (PG14)
dimoffon Jun 10, 2026
84125fc
Dispatch SQL-standard function bodies: serialize sql_body + raw-stmt …
dimoffon Jun 10, 2026
fd01220
Don't prefetch in ANALYZE block sampling of append-optimized tables (…
dimoffon Jun 10, 2026
fb67773
Align pg_terminate_backend catalog entry with PG14 (pid, timeout)
dimoffon Jun 10, 2026
8c2c4ab
Fix REFRESH MATERIALIZED VIEW CONCURRENTLY for distributed matviews (…
dimoffon Jun 10, 2026
3252402
Accept heap reloptions on partitioned roots (GPDB semantics) (PG14)
dimoffon Jun 10, 2026
09632e3
Execute CREATE FUNCTION on a copy so the dispatched tree stays raw (P…
dimoffon Jun 10, 2026
a5a0d90
Fix SQL-body function dispatch mutation + five more binary reader gap…
dimoffon Jun 10, 2026
676d883
Fall back to planner for partition keys with non-default opclasses (P…
dimoffon Jun 10, 2026
f3b3b46
gporca: survive task-less execution and nested gpos_exec
dimoffon Jun 10, 2026
22a9efb
Regenerate stale regress expected files from verified output (batch 1)
dimoffon Jun 10, 2026
a802b32
Regenerate stale regress expected files (batch 2a: subdir suites)
dimoffon Jun 10, 2026
1b7b44c
Fix pg_trigger relcache leak and double OID burn in CreateTrigger (PG14)
dimoffon Jun 10, 2026
497cd1c
regress: mask run-varying oids in AO auxiliary relation names
dimoffon Jun 10, 2026
5be9f16
Regenerate stale regress expected files (batch 2b: hand-vetted)
dimoffon Jun 10, 2026
bd37693
Regenerate expected files that had baked-in pg_trigger leak warnings
dimoffon Jun 11, 2026
db3c4c6
Restore lost guard: no AO UPDATE/DELETE under snapshot isolation (PG14)
dimoffon Jun 11, 2026
f64e188
CREATE TABLE LIKE ... INCLUDING STORAGE copies AM and reloptions agai…
dimoffon Jun 11, 2026
96f34e2
Track plain DETACH PARTITION in pg_stat_last_operation (PG14)
dimoffon Jun 11, 2026
9f650f0
Fix duplicate sequence values after dispatching a block to a QE (PG14)
dimoffon Jun 11, 2026
a43feda
Use the dispatched fast-default value on QEs (PG14)
dimoffon Jun 11, 2026
939daa6
Regenerate partition_join expected: PG14 single-subplan UPDATE shape
dimoffon Jun 11, 2026
529b603
Don't poison dispatched fast-default for partitioned ADD COLUMN (PG14)
dimoffon Jun 11, 2026
2f3adbd
Close the input file after COPY FROM (PG14)
dimoffon Jun 11, 2026
774a31d
Let VACUUM process AO auxiliary relations again (PG14)
dimoffon Jun 11, 2026
47fd9bd
Fix pg_class relcache leak in ALTER TABLE SET TABLESPACE (PG14)
dimoffon Jun 11, 2026
e9e3020
Close trigger result relations after GPDB CopyFrom (PG14)
dimoffon Jun 11, 2026
fbfa97c
Route split-update inserts to the source table for inheritance (PG14)
dimoffon Jun 11, 2026
26bbdf8
Clean baked warnings from expected files; mask PG14 libpq error prefix
dimoffon Jun 11, 2026
ab5dad5
gp_foreign_data: drop leftover FDW objects that break fast_default
dimoffon Jun 11, 2026
0f4c1ac
Update expected error wording to PG14 (strings, limit, rowtypes)
dimoffon Jun 11, 2026
af8fd47
Restore IS [NOT] OF syntax dropped in the PG14 merge
dimoffon Jun 11, 2026
53ddbc0
Dispatch CTE SEARCH/CYCLE clauses to segments (PG14)
dimoffon Jun 11, 2026
a9faf9d
Carry the old tuple for inheritance UPDATEs that need it (PG14)
dimoffon Jun 11, 2026
aafaab4
Fix recursive CTE losing rows beyond the first iteration (PG14)
dimoffon Jun 11, 2026
afaf747
Dispatch pristine CREATE/ALTER POLICY statements (PG14)
dimoffon Jun 11, 2026
a07700e
Refuse REINDEX CONCURRENTLY on system catalogs like upstream (PG14)
dimoffon Jun 11, 2026
f5e4e0b
create_function_0: drop helpers that create_function_1 defines itself
dimoffon Jun 11, 2026
c3e4024
Renumber each Agg node's aggregates densely at executor init (PG14)
dimoffon Jun 11, 2026
0418e43
Regenerate 59 stale expected files from verified run19 output (batch 3)
dimoffon Jun 11, 2026
4f73c1c
Exclude dropped columns from split-update update_colnos (PG14)
dimoffon Jun 11, 2026
6d2a6d5
Regress: finish create_function_0 dedup; mask temp-object names
dimoffon Jun 11, 2026
620fcec
Regenerate 7 more expected files from run20 (batch 4)
dimoffon Jun 11, 2026
63934dd
limit_optimizer: PG14 WITH TIES error wording (variant missed earlier)
dimoffon Jun 11, 2026
fbe7313
returning_gp: un-bake the cross-partition UPDATE RETURNING failure
dimoffon Jun 11, 2026
84d50ea
select_into: mask per-segment actual row counts in EXPLAIN ANALYZE
dimoffon Jun 11, 2026
c03669d
copy/tablespace: port GPDB divergences into the .source outputs
dimoffon Jun 11, 2026
3cab355
Fix all multi-DQA aggregates returning NULL/0 (PG14)
dimoffon Jun 11, 2026
76c2688
Regenerate DQA-era expected files from corrected output (batch 5)
dimoffon Jun 11, 2026
8af6a1f
incremental_analyze: mask root-partition merged-stat estimates
dimoffon Jun 11, 2026
b3adb17
Stabilize the remaining flapping regress assertions
dimoffon Jun 11, 2026
269e342
Honor per-Aggref aggsplit for combine and skipfinal decisions (PG14)
dimoffon Jun 11, 2026
8d09b07
Regress: clear the last fix-era bakes and tie-order flaps
dimoffon Jun 11, 2026
97027bf
Number Aggrefs in SCATTER BY expressions (PG14)
dimoffon Jun 11, 2026
b8266fa
Restore the input motion for window functions (PG14)
dimoffon Jun 11, 2026
9a30d12
Restore CREATE FUNCTION ... WITH (attribute list) syntax (PG14)
dimoffon Jun 11, 2026
ed2b242
create_index: align expected with the f1[0] tiebreak ordering
dimoffon Jun 11, 2026
6abfb5e
Register the DESCRIBE callback at CREATE FUNCTION again (PG14)
dimoffon Jun 11, 2026
67c396e
Regenerate window-function expected files post motion fix (batch 6)
dimoffon Jun 11, 2026
8e6aba0
Regress: final stabilizations for table_functions and incremental_ana…
dimoffon Jun 11, 2026
274f784
Set tts_tableOid in AO/AOCS bitmap fetches (PG14)
dimoffon Jun 11, 2026
9aa93e7
uao_catalog_tables: refresh AO auxiliary-name masking tokens
dimoffon Jun 11, 2026
f1ccc14
Revert "uao_catalog_tables: refresh AO auxiliary-name masking tokens"
dimoffon Jun 11, 2026
553d221
Row identity for DML on append-optimized auxiliary relations (PG14)
dimoffon Jun 11, 2026
1d83bef
Regen uao/uaocs_catalog_tables expecteds; fix init_file $1 perl warning
dimoffon Jun 11, 2026
2e58fed
pageinspect: install 1.9 script and compile gistfuncs.c (PG14)
dimoffon Jun 11, 2026
f78b83b
Fix PG14 API drift in test harnesses: isolation2, heap_checksum, work…
dimoffon Jun 11, 2026
bae773e
ORCA: treat PG14 reltuples=-1 as empty in cdb_estimate_partitioned_nu…
dimoffon Jun 11, 2026
9c3ed35
pg_dump: repair merge-stitched PREPARE queries (dumpFunc, dumpRangeTy…
dimoffon Jun 11, 2026
3305daf
Restore GPDB error-location suffix for internal errors (PG14)
dimoffon Jun 11, 2026
0b94843
Fix OpenSSL build gating for PG14: with_openssl -> with_ssl
dimoffon Jun 11, 2026
54b6c61
gppc: translate GppcReportLevel to/from PG14 elog levels
dimoffon Jun 11, 2026
a318efb
gpfdist regress: PG14 TRUNCATE-on-foreign-table message
dimoffon Jun 11, 2026
baf97ab
plpgsql_array test: rename "complex" type; collides with GPDB builtin
dimoffon Jun 11, 2026
cf3d387
gpload: finish the PyGreSQL -> psycopg2 port
dimoffon Jun 11, 2026
fcfd0b5
isolation: accept unquoted session/step names in spec files (PG14)
dimoffon Jun 11, 2026
e8baadc
Restore GPDB wait events lost in the PG14 pgstat split
dimoffon Jun 11, 2026
bc9b4a9
Treat PG14's reltuples=-1 as "never analyzed" in leaf stats merge gate
dimoffon Jun 11, 2026
ca1a935
Regenerate 17 regress expecteds for restored elog suffixes and reltup…
dimoffon Jun 11, 2026
faafc7a
Fix checkCpuSetByRole semicolon scan reading past the cpuset string
dimoffon Jun 11, 2026
14dd2d0
pg_rewind: run crash-recovery postgres against DB_FOR_COMMON_ACCESS a…
dimoffon Jun 11, 2026
3ee3aec
Serialize StatsElem in binary node functions (PG14)
dimoffon Jun 11, 2026
a9238fd
Close latent raw-statement binary dispatch gaps: ON CONFLICT, WindowD…
dimoffon Jun 11, 2026
a2ed657
pg_upgrade test: create the new cluster with the inherited locale
dimoffon Jun 11, 2026
372af6e
Regenerate isolation2 lockmodes_optimizer for PG14 partition DML locking
dimoffon Jun 11, 2026
a368562
isolation2: autovacuum-analyze expects reltuples=-1 for never-analyze…
dimoffon Jun 11, 2026
074ef5c
external_table: per-branch LIMIT scans may stop before reaching the r…
dimoffon Jun 11, 2026
0cfef15
Do not dispatch AT_ReAddStatistics; read CreateStatsStmt in binary re…
dimoffon Jun 11, 2026
d4347cd
gpload: match PyGreSQL error text and default notice printing
dimoffon Jun 11, 2026
f8648f0
Run clang-format over earlier ORCA fixes
dimoffon Jun 11, 2026
b2a77fc
Regenerate analyze/vacuum_gp/bfv_partition for restored leaf stats merge
dimoffon Jun 11, 2026
808817a
Regenerate gpsd/dpe_optimizer for restored leaf stats merge
dimoffon Jun 11, 2026
3a92b2c
Restore libpq errorMessage reset on connection success (PG14)
dimoffon Jun 12, 2026
4700ef9
pg_dump: emit GPDB 3-arg binary-upgrade calls for pg_type OIDs (PG14)
dimoffon Jun 12, 2026
58eafe0
Dispatch ALTER TYPE ... SET (...) to segments (PG14)
dimoffon Jun 12, 2026
f054f2e
Fix lost QE dispatch in ReindexMultipleInternal: shadowed result (PG14)
dimoffon Jun 12, 2026
df7123e
Do not set PROC_IN_VACUUM: GPDB vacuums write data (PG14)
dimoffon Jun 12, 2026
3a8be6c
Test baselines and harness fixes for PG14 (run3 triage)
dimoffon Jun 12, 2026
7acb7ae
Regenerate decode_expr/as_alias expecteds under en_US.UTF-8
dimoffon Jun 12, 2026
2254fdf
ssl test suite: survive stale client certs and always tear down
dimoffon Jun 12, 2026
ce1a82d
prevent_ao_wal: do not leave the standby coordinator broken (PG14)
dimoffon Jun 12, 2026
0852a60
Restore base_backup_post_create_checkpoint fault point (PG14)
dimoffon Jun 14, 2026
c4dfe4f
Fix coordinator SyncRep: exempt QD from sync_standbys_defined fast-ex…
dimoffon Jun 14, 2026
542296d
Restore bg_quickdie SIGQUIT handler in bgwriter (PG14)
dimoffon Jun 14, 2026
6e363e8
JIT: register GPDB fast ScalarArrayOp evaluators in llvmjit_types.c
dimoffon Jun 15, 2026
d967c24
Initialize subplans nested across Motions in deeply-nested Init Plans
dimoffon Jun 15, 2026
36f871f
behave/gpcheckcat: use a prefix operator (PG14 removed postfix operat…
dimoffon Jun 15, 2026
b049563
behave/gpexpand: use a locally-provided dump.sql if present
dimoffon Jun 15, 2026
840d136
Hold interrupts around wait_for_mirror() in the gxact-not-found path …
dimoffon Jun 15, 2026
afb865e
Label only real columns of a Split Update subplan in ModifyTable (PG14)
dimoffon Jun 15, 2026
6c05caa
Accept ROWID_VAR in set_plan_references_input_asserts (PG14)
dimoffon Jun 15, 2026
9891131
Fix invalid SingleQE locus when gathering General non-recursive term …
dimoffon Jun 15, 2026
a5ae771
Remove orphaned pq_endmsgread() at end of COPY FROM (PG14)
dimoffon Jun 15, 2026
db8ab39
Hold interrupts around the replication-lag throttle's SyncRepWaitForL…
dimoffon Jun 15, 2026
4750526
Allow NULL index_delete_tuples for append-only table AMs (PG14)
dimoffon Jun 15, 2026
1adbcfb
Don't assert s1 untouched when extended stats seed it (PG14)
dimoffon Jun 15, 2026
1e62c62
Don't assert no open write buffers in LogicalTapeSetBlocks (assert bu…
dimoffon Jun 15, 2026
fd514a3
Exempt cursor readers from the GetCmin/GetCmax current-xid assert (MP…
dimoffon Jun 15, 2026
d12bd66
Give AO UPDATE a non-empty old slot for ExecGetUpdateNewTuple (assert…
dimoffon Jun 15, 2026
9213254
Avoid mirror PANIC on AO truncate redo of a segfile missing post-cons…
dimoffon Jun 16, 2026
906ec48
Restore pg_rewind preservation of internal.auto.conf (segment gp_dbid)
dimoffon Jun 16, 2026
277e019
Revert "Avoid mirror PANIC on AO truncate redo of a segfile missing p…
dimoffon Jun 16, 2026
fa65034
Don't assert non-NULL expr in extract_nodes_expression (ORCA assert b…
dimoffon Jun 16, 2026
524960d
resgroup_cpuset: use factorial() not the removed postfix ! operator (…
dimoffon Jun 16, 2026
629e87c
regress: bump stale elog line numbers in matview/gp_dqa optimizer ans…
dimoffon Jun 16, 2026
7e50338
matview: fix REFRESH ... CONCURRENTLY column ref to prefixed transien…
dimoffon Jun 16, 2026
8a289bd
Fix multi-DQA FILTER planning: strip aggfilter from plan targets (PG14)
dimoffon Jun 16, 2026
1484411
Fix ExecTupleSplit infinite loop on a DQA without a FILTER
dimoffon Jun 16, 2026
1166d4c
Interpose a Result when a Motion's input is itself a Motion
dimoffon Jun 16, 2026
bf5697a
Match a distribution-key Aggref ignoring PG14 aggno/aggtransno
dimoffon Jun 16, 2026
4fee059
matview: qualify whole-row refs with .* in REFRESH ... CONCURRENTLY
dimoffon Jun 16, 2026
7e909f5
Skip MIN/MAX index optimization when planner state is already populated
dimoffon Jun 16, 2026
d0b7298
regress: add PG14 \d+ Compression column to matview.out
dimoffon Jun 16, 2026
7892d7e
regress: adopt PG14 geometric operator rename in create_index
dimoffon Jun 17, 2026
6b6e7bf
regress: regenerate optimizer=off baseline answer files (PG14 cosmetic)
dimoffon Jun 17, 2026
ad649ea
regress: regenerate join/portals/subselect optimizer=off answers
dimoffon Jun 17, 2026
2e9261c
docs: add project skills and point CLAUDE.md at greengage-internals
dimoffon Jun 17, 2026
21b9ab6
docs: rename GPDB -> GGDB in skills and CLAUDE.md
dimoffon Jun 17, 2026
b4275d4
regress: un-break ORCA job after cosmetic regen + code-fix line shifts
dimoffon Jun 17, 2026
2f388c9
regress: regenerate opt=off base answers from CI results (un-contamin…
dimoffon Jun 17, 2026
e3c9618
regress: refresh opt=off table_functions base for PG14 upstream text …
dimoffon Jun 17, 2026
23db61b
regress: stabilize explain under the JIT jobs via SET jit = off
dimoffon Jun 17, 2026
d0f8d9f
skills: fold CI-result regen rules + explain jit fix into answer-file…
dimoffon Jun 17, 2026
27a6421
regress: add _optimizer variants for create_function_3/select_into/ti…
dimoffon Jun 17, 2026
541269c
regress: fix opt=off table_functions plan-shape + extract trailing space
dimoffon Jun 17, 2026
87b0fcd
regress: normalize now()-derived date in direct_dispatch plan (daily …
dimoffon Jun 17, 2026
ef32d10
regress: add gp_pg14_merge_regress lock-in test for the PG14 merge MP…
dimoffon Jun 17, 2026
4dd440a
orca: fall back to the planner for GROUP BY DISTINCT (PG14)
dimoffon Jun 17, 2026
371acbb
regress: add gp_pg14_features MPP/ORCA coverage for PG14 features
dimoffon Jun 17, 2026
677e3ae
skills: note that _optimizer.out coverage is self-balancing (don't ba…
dimoffon Jun 17, 2026
a235ac4
orca: fall back to the planner for multirange-returning aggregates (P…
dimoffon Jun 17, 2026
58a00a9
regress: extend gp_pg14_features with subscripting/extract/range_agg …
dimoffon Jun 17, 2026
1ab69ad
skills: add greengage-pg-merge; retire the GG_PG_13_14_MERGE_* docs
dimoffon Jun 17, 2026
67c0b3d
Merge PostgreSQL 15 (adadae45816) into GreengageDB
dimoffon Jun 19, 2026
74f3865
Fix two PG15-merge crashers in partitioned/CREATE DATABASE paths
dimoffon Jun 19, 2026
0609651
Fix REFRESH MATERIALIZED VIEW security-context leak
dimoffon Jun 19, 2026
912dd14
Fix SET <float GUC> crash (DispatchSetPGVariable A_Const)
dimoffon Jun 19, 2026
b7d31f9
Fix EXPLAIN ANALYZE crash on Sort with a Generation child context
dimoffon Jun 19, 2026
eafde81
Fix dispatch desync for CREATE TABLE with PRIMARY KEY / UNIQUE
dimoffon Jun 19, 2026
49cc1a3
Fix assert crash building AO auxiliary-table indexes (GlobalVisHorizo…
dimoffon Jun 19, 2026
18c9f9b
Fix segment crash creating an in-place tablespace (LOCATION '')
dimoffon Jun 19, 2026
37d4509
Fix DTX PANIC on COMMIT/ROLLBACK AND CHAIN
dimoffon Jun 19, 2026
a4b270e
Dispatch PG15 SQL/JSON nodes (JSON_TABLE/JSON_VALUE/IS JSON/…)
dimoffon Jun 19, 2026
11ec71b
Dispatch PG15 untransformed SQL/JSON and publication parse nodes
dimoffon Jun 19, 2026
a2f3ead
Support MERGE on distributed tables (MPP)
dimoffon Jun 19, 2026
d473667
Fix "unexpected end of tape" in external merge sort
dimoffon Jun 19, 2026
169d590
Fix DROP DATABASE assert crash from stale dshash find_locked flag
dimoffon Jun 19, 2026
9a30074
Bring up PG15 backend: build, link, and initdb
dimoffon Jun 19, 2026
3d15387
Adopt PG15 regress test_setup; drop GGDB duplicate object creation
dimoffon Jun 19, 2026
324004d
Fix segment PANIC on CREATE/ALTER PUBLICATION FOR ALL TABLES IN SCHEMA
dimoffon Jun 19, 2026
437ad65
Fix segment SIGSEGV on MERGE with a subquery in a WHEN action
dimoffon Jun 19, 2026
a454887
Allow UNBOUNDED as an unreserved keyword (usable as a name)
dimoffon Jun 20, 2026
f04d525
Fix wrong error altering type of a column used by a generated column
dimoffon Jun 20, 2026
783145a
Neutralize JSON_TABLE nested-PLAN crash in jsonb_sqljson
dimoffon Jun 20, 2026
b6acf15
Make gp_gin_index self-contained (create its own testjsonb/test_tsvec…
dimoffon Jun 20, 2026
bdf57fb
Fix PANIC 'can only drop stats once' on DROP DATABASE
dimoffon Jun 20, 2026
053f952
Add text serialization for GpPolicy nodes (outfuncs/readfuncs)
dimoffon Jun 20, 2026
b54557e
regress: fix point double-load, spgist unlogged, regen geometry/spgist
dimoffon Jun 20, 2026
f4d9424
regress: regen 23 answer files for PG15/MPP cosmetic drift
dimoffon Jun 20, 2026
d6e6fc3
regress: regen join/aggregates/window cluster; fix flaky MPP window f…
dimoffon Jun 20, 2026
701235c
regress: regen 12 more answer files; fix lock per-segment multiplicity
dimoffon Jun 20, 2026
92d2ceb
regress: fix create_misc cascade; regen 13 GGDB-restriction answer files
dimoffon Jun 20, 2026
659b28b
regress: regen 5 more GGDB-restriction/behavior answer files
dimoffon Jun 20, 2026
4cca0cf
regress: regen with (recursive-CTE MPP plans) + create_table_like
dimoffon Jun 20, 2026
6c9aabe
Fix CLUSTER on a partitioned table dispatching the parent index to ch…
dimoffon Jun 20, 2026
ea46817
Fix 'type X is not composite' for whole-row ref to a function returni…
dimoffon Jun 20, 2026
e56610f
regress: fix cluster MPP residuals (per-segment ctid check + ptnowner…
dimoffon Jun 20, 2026
26e649f
regress: stabilize misc_functions flaky cost-tie join plan
dimoffon Jun 20, 2026
9b9ea2a
regress: stabilize join flaky cost-tie merge-join plan
dimoffon Jun 20, 2026
7780f76
regress: stabilize aggregates/portals/misc flaky output
dimoffon Jun 20, 2026
eedce9f
regress: fix tenk2 double-population (create_misc leftover); regen po…
dimoffon Jun 20, 2026
d15af16
psql: validate \dt/\di/\dv/... patterns for cross-db & over-qualified…
dimoffon Jun 20, 2026
93a1ffb
gpopt: port ORCA translator to PG15 node changes (Value split, SeqSca…
dimoffon Jun 20, 2026
4adab08
regress: regenerate 39 _optimizer.out for PG15 ORCA matrix
dimoffon Jun 20, 2026
a58a033
regress: stabilize ORCA-flaky tests at the root (CTAS random distribu…
dimoffon Jun 20, 2026
f2c92bc
regress: regen partition_prune/subselect/explain for EXPLAIN-ANALYZE …
dimoffon Jun 20, 2026
05595ea
Default recovery_prefetch=off to avoid the PG15 WAL-prefetcher assert
dimoffon Jun 20, 2026
fd3a89a
test: restore dropped convert_sourcefiles() + port isolation2 logtape…
dimoffon Jun 20, 2026
677b716
Fix CREATE EXTENSION of any extension with shell operators/types (PG1…
dimoffon Jun 21, 2026
fa46228
orafce: request shared memory from shmem_request_hook (PG15)
dimoffon Jun 21, 2026
543096f
Restore DTX checkpoint processing during crash recovery (PG15 merge)
dimoffon Jun 21, 2026
faa29fe
isolation2: regen export_distributed_snapshot for psql -c command-tag…
dimoffon Jun 21, 2026
e5fa297
Fix VACUUM FULL assert crash on append-optimized aux relations (PG15 …
dimoffon Jun 21, 2026
70339ad
Fix TRUNCATE leaving AO aux relations with invalid relfrozenxid (PG15…
dimoffon Jun 21, 2026
85822f6
isolation2: restore CREATE on public schema in setup (PG15)
dimoffon Jun 21, 2026
4614e40
isolation2: fix py3 bytes/str crash in pg_basebackup test helper
dimoffon Jun 21, 2026
f6e3c69
pg_basebackup: restore writing internal.auto.conf with target dbid (P…
dimoffon Jun 21, 2026
3345bd1
pg_basebackup: honor --force-overwrite for existing directories (PG15…
dimoffon Jun 21, 2026
e1fe95b
test: drop stale RequestNamedLWLockTranche mocks in sharedsnapshot un…
dimoffon Jun 21, 2026
1cfb7db
test: zero-init PGPROC in varsup xid_warn_limit unittest (PG15 SIGSEGV)
dimoffon Jun 21, 2026
49c75b4
test: adapt cdbappendonlyxlog unittest to PG15 xlogreader decode (com…
dimoffon Jun 21, 2026
caf5fd6
test: settle-waits for segwalrep in-order failover/recovery flakiness…
dimoffon Jun 21, 2026
3871c74
test: drop duplicate binary_coercible() from create_function_0 (PG15)
dimoffon Jun 21, 2026
c39c5b0
test: drop more PG15-merge duplicates breaking installcheck (test_enc…
dimoffon Jun 21, 2026
844a59d
fix(PG15): deparse gp_partition_template without pull_varnos crash
dimoffon Jun 22, 2026
065e4e4
fix(PG15): name EXPAND TABLE in alter_table_type_to_string
dimoffon Jun 22, 2026
5b8340b
fix(PG15): remove duplicate getTables() query in pg_dump
dimoffon Jun 22, 2026
e1947b9
fix(PG15): restore CREATE DATABASE failure cleanup + fault points
dimoffon Jun 22, 2026
565f490
fix(PG15): don't report temp-file stats during process exit
dimoffon Jun 22, 2026
b4ba4c9
fix(PG15): keep live_parts in sync when skipping external partitions
dimoffon Jun 22, 2026
40ad3da
fix(PG15): guard mppExecutorCleanup against a NULL executor state
dimoffon Jun 22, 2026
8730f81
fix(PG15): re-evaluate non-constant window frame offsets per row
dimoffon Jun 22, 2026
b70e009
fix(PG15): re-graft describeRoles GPDB columns; fix psql \du
dimoffon Jun 22, 2026
e3d1a02
fix(PG15): gp_owner_permission — grant public in new DB + reindex-as-…
dimoffon Jun 22, 2026
01e581e
fix(PG15): clone partition-inherited row triggers to sub-partitions
dimoffon Jun 22, 2026
1ccd8e4
test(PG15): pgstat_qd_tabstat — force stat flush instead of racing pg…
dimoffon Jun 22, 2026
fa7df36
fix(PG15): restore resource-queue stats via PGSTAT_KIND_RESQUEUE
dimoffon Jun 22, 2026
ba34f9c
test(PG15): gp_toolkit — grant CREATE on public in toolkit_testdb
dimoffon Jun 22, 2026
e0b745a
fix(PG15): don't re-clone FK/RI constraint triggers to sub-partitions
dimoffon Jun 22, 2026
6b27f72
test(PG15): regen triggers.out for GGDB grandchild trigger propagation
dimoffon Jun 22, 2026
a848eb3
test(PG15): regen 6 deterministic cosmetic answer-file drifts
dimoffon Jun 22, 2026
a5323eb
test(PG15): regen 3 more cosmetic drifts + fix pg_resetwal version
dimoffon Jun 22, 2026
9832412
test(PG15): rework freeze_aux_tables age classification for PG15 freeze
dimoffon Jun 22, 2026
7486ee2
test(PG15): uao_dml — force stat flush instead of racing pg_sleep
dimoffon Jun 22, 2026
2c6981b
test(PG15): misc — repair merge-damaged inheritance/postquel/tmp sect…
dimoffon Jun 22, 2026
ce76989
test(PG15): misc — re-graft order-by in hobbies_by_name for MPP deter…
dimoffon Jun 23, 2026
abc8963
fix(PG15): nodeAgg — use aggref->aggsplit (not aggstate) for combine-…
dimoffon Jun 23, 2026
4678778
fix(PG15): leaf_parts_analyzed — skip the root in the colstats loop too
dimoffon Jun 23, 2026
27e4171
test(PG15): gpcopy — accept upstream error for NEWLINE-mismatched COP…
dimoffon Jun 23, 2026
4f196f9
test(PG15): resgroup_name_convention — PG15 numeric-literal lexer err…
dimoffon Jun 23, 2026
db23af6
test(PG15): generated_optimizer.out — sync elog source line (14810->1…
dimoffon Jun 23, 2026
a79149f
test(PG15): portals_optimizer.out — add the new NO SCROLL cursor blocks
dimoffon Jun 23, 2026
fce7189
test(PG15): explain — strip work_mem memory accounting (varies by jit…
dimoffon Jun 23, 2026
1a5d8d3
fix(PG15): FTS handler crash during mirror promotion (ALTER SYSTEM ac…
dimoffon Jun 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
605 changes: 605 additions & 0 deletions .cirrus.yml

Large diffs are not rendered by default.

18 changes: 18 additions & 0 deletions .claude/skills/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Project skills

Reusable skills distilled from the PG14 → GGDB merge, fix, and
regression-reconciliation work. Each is a Claude Code skill
(`.claude/skills/<name>/SKILL.md`, auto-discovered); a human can also just read it.

| Skill | Use it when |
|---|---|
| [greengage-build](greengage-build/SKILL.md) | A source change must become a running binary; avoiding the stale-binary trap |
| [greengage-regress-tests](greengage-regress-tests/SKILL.md) | Running a regress/isolation2 test under optimizer on/off, with setup deps |
| [greengage-answer-file-regen](greengage-answer-file-regen/SKILL.md) | A test's diff is cosmetic drift — regenerate `.out` without masking a real bug |
| [greengage-cluster-ops](greengage-cluster-ops/SKILL.md) | Monitoring a long run, disk/health/OOM, recovering a degraded/crashed cluster |
| [greengage-debug](greengage-debug/SKILL.md) | A crash/assert/hang/wrong-result — logs, repro, instrumentation, gdb |
| [greengage-internals](greengage-internals/SKILL.md) | Writing/reviewing a backend fix — MPP planner/executor, merge re-graft method |
| [greengage-pg-merge](greengage-pg-merge/SKILL.md) | Merging an upstream PG major version — conflict resolution + phased bring-up (compile → unit-test → initdb → regress) |

These complement `CLAUDE.md` (build/test/style) and the
major-version-merge workflow it references.
113 changes: 113 additions & 0 deletions .claude/skills/greengage-answer-file-regen/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
---
name: greengage-answer-file-regen
description: Regenerate optimizer=off (and other) regression answer files for cosmetic PG14/GGDB drift WITHOUT masking a real bug. Use when a failing test's diff is deparse/plan-shape/psql-format/error-message drift rather than a behavior change. Includes the success->error safety gate, noise stripping, and verification.
---

# Regenerating answer files safely

After a PG major-version merge, many optimizer=off base `.out` files drift
cosmetically: PG14 psql adds a `\d+` Compression column; `AT TIME ZONE`
deparses as `(x AT TIME ZONE z)` not `timezone(z,x)`; grammar/error text changes
(CREATE STATISTICS on expressions, `EXTRACT`); MPP plan shapes and slice numbers
shift; upstream adds new test queries. These are answer-file regens, not bugs —
but a real bug can hide in the same pile (e.g. a query that returned data now
ERRORs). Never bulk-copy blindly.

## The SAFETY GATE: success->error scan (the most important step)

The signature of a real bug hiding in a "cosmetic" pass is a removed result row /
`(N rows)` replaced by an added `+ERROR`. Scan for it **on the gpdiff
`regression.diffs`, NOT the raw `git diff`**:

- `regression.diffs` already honors `--start_ignore/--end_ignore` blocks and
atmsort row-sorting, so its success->error hits are real.
- A raw `git diff` scan FALSE-POSITIVES: ignore-block content (the .out lines
aren't always individually `GP_IGNORE:`-prefixed) and row-reordering context
shifts a `(N rows)` next to an unrelated `+ERROR`. This burned an entire pass —
join/portals/subselect were flagged but were actually cosmetic (errors inside
`--start_ignore` blocks documenting accepted GGDB limits + `error->error`
stale-line drift like `pathnode.c:485 -> :275`).
- **A clean re-run that reports `ok` is the definitive proof** there is no
non-ignored success->error (it would otherwise FAIL the test).

Real bugs this gate caught (do NOT regen — fix them): gp_dqa multi-DQA+FILTER
`variable not found in subplan target list`; matview `DISTRIBUTED BY` an
aggregate `could not find hash distribution key expressions`; matview REFRESH
CONCURRENTLY `text *= text`.

## Source of truth: the CI result tarball, not a local run

The CI matrix runs the SAME `expected/*.out` across FOUR jobs — {JIT, non-JIT} ×
{ORCA `optimizer=on`, Postgres `optimizer=off`} — so a regen that greens one can
break another. Three rules learned by breaking them:

- **Regenerate from the failing job's CI result tarball** (`*_results.tar.gz` →
`gpdb_src/src/test/regress/results/<t>.out`), NOT a local gpdemo run — *unless*
the test's output is fully normalized by `explain_filter`/atmsort. A local run
bakes environment-specific text that CI then rejects: a fresh db name folded into
`current_database()` literals (e.g. `'jps2'` vs `'regression'`), `1 segment`
instead of the normalized `n segments`, local row-ordering. (Fully-normalized
tests like `explain`, where numbers map to `N`, ARE safe to regen locally.)
Correctness check for a big reorder diff: the sorted DATA-ROW SET must equal the
known-good `_optimizer.out` set (e.g. qp_misc_jiras opt=off == ORCA, 0 set diff).
- **A shared base `<t>.out` (no `<t>_optimizer.out`) is used by ORCA too** (ORCA
falls back to base). Regenerating it to the Postgres-planner output BREAKS the
ORCA jobs. Only regen a base file if a separate `_optimizer.out` exists.
- **`_optimizer.out` coverage is self-balancing — do NOT "backfill" it.** A test
without one passes under ORCA only because its *non-ignored* output already
matches the base (data-only, ORCA-falls-back, or the plans are in `--start_ignore`
blocks). Any test whose asserted output genuinely diverges under ORCA already has
an `_optimizer.out` or it would be red. Adding one to a passing shared-base test
asserts nothing new (verified for delete/insert_conflict/with). Real ORCA gaps are
*untested features* (find them by exercising the feature under both optimizers, cf.
the GROUP BY DISTINCT bug 4dd440a4e69), not missing `_optimizer.out` files.
- **Never bake JIT-only output into a file a non-JIT job compares.** Under jit,
EXPLAIN adds a ` Settings: jit = ...` line (init_file-ignored) and inflated
`Executor memory:` (atmsort-normalized) — so they don't diff — but the wide
Settings row still perturbs `explain_filter`'s column width. See "What NOT" below.

## Procedure

1. **Prefer the CI result tarball** (above). Only when regenerating locally is
appropriate, run the test(s) under `optimizer=off` in a FRESH db with full setup
(see [greengage-regress-tests]); the polluted `regression` db gives
`already exists` cascades.
2. Scan `regression.diffs` for success->error. Investigate any hit (is the new
ERROR inside a `--start_ignore` block? is it `error->error` with only a line
number change? does a `--FAIL with ERROR` comment in the `.sql` document it?).
3. For confirmed-cosmetic tests, `cp results/<t>.out expected/<t>.out`.
4. **Strip gpdiff-ignored noise** so the diff is real content only — `init_file`
drops these but the raw copy keeps them:
```
drop lines matching ^(HINT|NOTICE):\s+.+'DISTRIBUTED BY' clause
and Distributed by: \(
```
(omitting this adds dozens of NOTICE lines of git noise per file).
5. **Verify**: re-run on a fresh db → `ok` / empty `regression.diffs`. If the
same-db re-run fails only with `<test>_tbl already exists`, that's a re-run
artifact (drop the table and re-run).
6. `docker cp` lands files root-owned on the host — `chown` before editing.

## What NOT to regen

- **Flaky** tests: `truncate_gp` (AO segfile-stats vary 3 rows vs 0). Regenerating
captures one run and flakes on the next. (`explain` LOOKS jit-flaky but is NOT —
the jit `Settings:` line widens the `explain_filter` output column, which atmsort
doesn't normalize; the real fix is to pin the jit GUCs to their boot defaults at
the top of explain.sql — `set jit=off; set jit_above_cost=100000; set
optimizer_jit_above_cost=7500;` — so EXPLAIN(SETTINGS), which reports only
modified-from-boot-default GUCs, drops them. Then regen both expected files.)
- **OOM victims**: the gpdemo is too small for the full concurrent schedule;
qp_olap_window/qp_with_clause/etc. hit `Out of memory`/`failed to acquire
resources` and their results are corrupt — they pass on CI's bigger runner.
- **Environment-specific**: gp_toolkit (live replication conninfo), gp_connections
(`$COORDINATOR_DATA_DIRECTORY` unset), createdb (fault injection didn't fire).

## Inherent reorder noise

For data-returning tests the git diff is large (thousands of lines) because
unordered MPP results come back in segment order; gpdiff sorts them, so the test
is clean, but git shows every moved row. Commit it as an isolated, clearly-labeled
regen commit; the success->error gate (not the visual diff) is the correctness check.

See also: [greengage-regress-tests], [greengage-internals].
66 changes: 66 additions & 0 deletions .claude/skills/greengage-build/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
---
name: greengage-build
description: Build and install the GGDB backend (and ORCA) inside the docker test container, and avoid the stale-binary trap where committed source fixes silently don't take effect. Use whenever a C/C++ source change needs to become a running binary, before re-testing.
---

# Building GGDB in the container

Builds run in the `gpdb_clean` docker container (not natively), as `gpadmin`,
with `sudo`. The source tree the build compiles is `/home/gpadmin/gpdb_src`
inside the container — **this is a plain copy, not a git checkout** — while the
git working tree is on the host at `/home/dvoronkov/ws/gpdb`. You must copy
edited files in before building.

## Edit → build → install → run loop

```bash
# 1. copy the edited file into the container source tree
sudo docker cp src/backend/<path>.c gpdb_clean:/home/gpadmin/gpdb_src/src/backend/<path>.c

# 2. CRITICAL: touch after docker cp — docker cp preserves the host mtime, which
# is often OLDER than the .o, so make would NOT recompile (the "stale" trap).
sudo docker exec -u gpadmin gpdb_clean bash -lc 'touch /home/gpadmin/gpdb_src/src/backend/<path>.c'

# 3. rebuild the backend and (re)link + install
sudo docker exec -u gpadmin gpdb_clean bash -lc \
'cd /home/gpadmin/gpdb_src/src/backend && make >/tmp/bld.log 2>&1 && make install >>/tmp/bld.log 2>&1 && echo BUILD_OK || (echo BUILD_FAIL; grep -iE "error:" /tmp/bld.log | head)'

# 4. the running cluster only picks up the new postgres binary after a restart
sudo docker exec -e USER=gpadmin -u gpadmin gpdb_clean bash -lc \
'source /usr/local/greenplum-db-devel/greenplum_path.sh; export PGPORT=7000 \
MASTER_DATA_DIRECTORY=/home/gpadmin/gpdb_src/gpAux/gpdemo/datadirs/qddir/demoDataDir-1; \
gpstop -ar'
```

`GPHOME=/usr/local/greenplum-db-devel`. `docker exec` does NOT set `$USER`;
pass `-e USER=gpadmin` or `gpstop`/`gprecoverseg`/`gpconfig` abort with
"USER environment variable must be set".

## The stale-binary trap (read this before concluding "my fix doesn't work")

The installed `/usr/local/greenplum-db-devel/bin/postgres` can be timestamp-
stale relative to the source: a committed fix is in the `.c` but NOT in the
running binary, so behavior looks unfixed and pass-counts are measured against
stale code. Symptoms: a fix you can read in the source does not change runtime
behavior. Verify with `ls -la --time-style=+%Y-%m-%d_%H:%M` on the `.o`, the
`.c`, and `bin/postgres`; the binary must be newer than the source.

## ORCA vs assert builds (two different binaries surface different bugs)

- The assert campaign builds `--enable-cassert --disable-orca` (optimizer=off);
`set optimizer=on` then errors "ORCA is not supported by this build".
- The ORCA jobs build `--enable-orca` (optimizer on works).
- The **assert∩ORCA intersection** (cassert + ORCA) was historically never
tested and finds real crashes ("jit/regression tests with orca").
- To switch a container to ORCA+assert: drop `--disable-orca` from the configure
line and rebuild. The gporca `.o` are usually already in-tree, so the rebuild
is ~3 min (not from scratch).

## Don't `make clean`

`make clean` is destructive: it nukes the ORCA build (`src/backend/gporca/`),
forcing a long from-scratch rebuild and `-j` link races. Prefer `touch` + `make`
for targeted rebuilds. If you must rebuild ORCA, build `gporca` before linking.

See also: [greengage-cluster-ops] (restart/recovery), [greengage-debug]
(instrumentation rebuilds), [greengage-internals] (what to change).
67 changes: 67 additions & 0 deletions .claude/skills/greengage-cluster-ops/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
---
name: greengage-cluster-ops
description: Operate the gpdemo MPP cluster during long test/build cycles - read segment health correctly, monitor disk and long-running jobs, detect OOM, and recover a degraded/crashed cluster with gprecoverseg. Use when a run hangs/crashes, a segment goes down, "Cluster validation failed" appears, or disk fills.
---

# Operating & recovering the gpdemo cluster

## Segment layout (gpdemo, 3 primaries + mirrors + standby)

- Coordinator: content **-1**, dbid1, port **7000**, `MASTER_DATA_DIRECTORY=.../qddir/demoDataDir-1`. Standby: dbid8/7001.
- content 0: primary dbid2/7002, mirror dbid5/7005. content 1: dbid3/7003 + dbid6/7006. content 2: dbid4/7004 + dbid7/7007.

## Read health correctly

```sql
select role,preferred_role,mode,status,count(*) from gp_segment_configuration group by 1,2,3,4 order by 1,2;
```
Healthy looks like `m|m|s|u|4`, `p|p|s|u|3`, **`p|p|n|u|1`**. The last is the
coordinator (content -1) — **mode `n` for content -1 is NORMAL** (its standby is
tracked via `pg_stat_replication`, `gp_walreceiver streaming sync`), do not treat
it as degraded. Trouble = `status=d` (down) or `role<>preferred_role` (failed over).

## Disk hygiene (regress workflows leak disk)

- `df -h` between runs. Cores, 13 GB datadirs, and docker images fill the disk;
a full disk can truncate host source files (restore from container/HEAD).
- Set `core_pattern=|/bin/true` so assert cores don't pile up.
- Clean `regression.diffs`, `results/`, leftover temp dbs, and `/tmp/*.log` promptly.

## Monitor a long run (build or full schedule, 20-40 min)

Run it detached and poll its log; don't block one command on the whole run:
```bash
# launch detached inside the container
nohup env PGOPTIONS="-c optimizer=off" make installcheck-good > /tmp/run.log 2>&1 &
# poll for completion markers (until-loop; cache-friendly 6s ticks)
for i in $(seq 1 90); do grep -qE "tests passed|tests, .* failed|make.*Error" /tmp/run.log && break; sleep 6; done
grep -c "\.\.\. FAILED" /tmp/run.log
```

## OOM under load (small gpdemo)

The full concurrent schedule OOMs the small gpdemo: `ERROR: Out of memory` /
`failed to acquire resources on one or more segments`, and a heavy parallel group
can **crash a segment** (it flips to `m|p|n|d`), after which `pg_regress` prints
`Cluster validation failed` and runs 0 tests. Mitigate with `--max-connections=3`
(or `MAX_CONNECTIONS=3 make ...`), or run a lighter schedule prefix that excludes
the OOM-heavy `qp_*` (those are in greenplum_schedule, not parallel_schedule).

## Recover a degraded/crashed cluster

```bash
source greenplum_path.sh; export PGPORT=7000 MASTER_DATA_DIRECTORY=.../qddir/demoDataDir-1
gprecoverseg -a # recover the down segment (as a mirror)
# wait for WAL resync: poll until count(mode<>'s' and content>=0)=0
gprecoverseg -ar # rebalance: restore preferred primary/mirror roles
# if the coordinator itself is down:
gpstart -a # or gpstop -ar to restart
```

Restart fragility: `gpstop -ar` on a cluster with a hung motion-IPC QE FAILS to
shut down cleanly (sends SIGQUIT then SIGABRT), crashing it — then `gpstart -a`
to bring it back, `gprecoverseg` to re-sync. An uninterruptible motion-IPC hang
(e.g. an executor infinite loop) cannot be killed by `statement_timeout`; you must
`pg_terminate_backend` the stuck pid, and it may leave a degraded segment.

See also: [greengage-build] (restart after install), [greengage-debug].
65 changes: 65 additions & 0 deletions .claude/skills/greengage-debug/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
---
name: greengage-debug
description: Diagnose GGDB crashes, asserts, and wrong-results - find the crash in the segment/QD logs, reproduce reliably (base64 SQL, forced heisenbug conditions), instrument with temporary elog, and read structs live with gdb on a no-DWARF binary. Use when a query crashes a backend, hits a FailedAssertion, hangs, or returns wrong data.
---

# Debugging GGDB

## Find the crash in the logs

QD/segment logs are CSV at
`gpAux/gpdemo/datadirs/qddir/demoDataDir-1/log/*.csv` (and `dbfast*/.../log/*.csv`
for segments). Signatures:
- `TRAP: FailedAssertion("<cond>", File: "<f>.c", Line: N)` — assert build crash.
- `server process ... was terminated by signal 6/11` + `Failed process was running: <SQL>` — abort/segfault; grep the crashing PID's lines.
- `PANIC`, `Out of memory`, `failed to acquire resources` (see [greengage-cluster-ops] for the OOM/crash recovery).
Take the failing statement from the CSV, then narrow it to a minimal query.

## Reproduce reliably

- **base64 the SQL** to avoid nested-quote mangling: building SQL inside
`bash -lc '...'` eats inner single quotes (so `'x'` becomes `x` and string
literals break, or `$abc$` dollar-quoting expands `$` to the PID). Write the
`.sql` on the host, `base64 -w0`, pass via `-e B64=...`, `base64 -d` in-container.
- Match the EXACT failing shape: column types, GROUP BY, FILTER, optimizer
on/off, even JIT (`set jit=on; set jit_above_cost=0`) — small differences flip
the code path (e.g. multi-DQA needs `FILTER` to fail, not just DISTINCT).

## Force a heisenbug condition

When a bug depends on transient state (e.g. a relcache descriptor that is mutated
in place and only bites once an invalidation reloads it), inject the condition to
make it deterministic. Example used for the matview REFRESH bug:
```c
CacheInvalidateRelcacheByRelid(relid); /* temporary, in the suspect function */
AcceptInvalidationMessages();
```
Rebuild, reproduce (now the unfixed code fails every time), apply the real fix,
confirm it passes WITH the forced condition still active, then remove the
injection. This converts "passes locally, fails in CI" into a real local repro.

## Instrument with temporary elog

Add `elog(LOG, "DBG ... %s", ...)` at the suspect point, rebuild
([greengage-build]), run, and read it back from the QD CSV log
(`grep "DBG" $QDLOG`). Print the concrete values you can't infer — e.g. the
generated SQL string and the actual column names of a transient relation — to
settle "what does the code really see". Remove all instrumentation before
committing; verify `git diff` is exactly the one-line fix.

## Live gdb (ptrace container, no DWARF)

Commit + re-run the container with `--cap-add=SYS_PTRACE --security-opt
seccomp=unconfined` (yama ptrace_scope=1 → attach as root). Add a `pg_sleep(30)`
in the query to open a window, find the per-query QE pid, `gdb -p`. The release
binary has no DWARF: read structs by **byte offset** and resolve addresses with
`addr2line`/`objdump`. Avoids the ereport-probe rebuild loop.

## Blast-radius triage

A single root cause often produces many `regression.diffs` (e.g. one missing
libpq command-queue entry broke COPY/sequences MPP-wide). Group failures by the
common error string/PID, fix the one root cause, re-measure — don't chase each
diff. Beware measuring against a [stale binary](greengage-build).

See also: [greengage-internals] (what the fix should be), [greengage-build].
Loading