pg_automergev0.1.0

Appendix: benchmarks

Recorded 2026-09-28 with mise run bench-expanded (release build, warm cache, mean of two runs, milliseconds), before and after expanded values were introduced (commit 6a5f40f). "Before" is the flat path: every merge result saved, and loaded again by the next operation.

Workload3.0 MB beforeafter877 kB beforeafter83 kB beforeafter
UPDATE .. SET doc = merge(doc, c1)543554523883794342
automerge_heads(merge(doc, c1))525826423581804023
merge(doc, c1)::jsonb->>'status'814128957844488148
automerge_heads(merge(merge(merge(doc, c1), c2), c3))157582645103418711224
PL/pgSQL d := merge(d, c), 20 change sets1057722697685221769131
the same, each merge in a BEGIN .. EXCEPTION block1058272693686822968630
the same, then UPDATE .. SET doc = d1061365584689042569952
2 merges into d, then 10 reads d->>'status'38960515449872805494271
merge_agg(doc)::jsonb over 9 versions264882411120061759210179

Heads fast path, recorded the same day on the 3 MB document (before: a full load for every call): automerge_heads 2745 ms → 0.3 ms; automerge_contains(doc, ''::bytea::automerge) 2738 ms → 0.5 ms; merge(doc, ''::bytea::automerge) 2743 ms → 16 ms; merge of the document with a newer version of it 5.3 s → 2.6 s.