<feed xmlns='http://www.w3.org/2005/Atom'>
<title>postgresql.git/src/backend, branch master</title>
<subtitle>This is the main PostgreSQL git repository.</subtitle>
<id>http://git.postgresql.org/cgit/postgresql.git/atom?h=master</id>
<link rel='self' href='http://git.postgresql.org/cgit/postgresql.git/atom?h=master'/>
<link rel='alternate' type='text/html' href='http://git.postgresql.org/cgit/postgresql.git/'/>
<updated>2026-09-17T13:28:31Z</updated>
<entry>
<title>Change GEQO fitness comparisons to consider disabled_nodes.</title>
<updated>2026-09-17T13:28:31Z</updated>
<author>
<name>Robert Haas</name>
</author>
<published>2026-09-17T13:28:31Z</published>
<link rel='alternate' type='text/html' href='http://git.postgresql.org/cgit/postgresql.git/commit/?id=c9c660e6ae03027615adff90cf4b26da5f8f97c1'/>
<id>urn:sha1:c9c660e6ae03027615adff90cf4b26da5f8f97c1</id>
<content type='text'>
Prior to v18, the total cost of a plan was just one number, a
floating-point value. Commit e22253467942fdb100087787c3e1e3a8620c54b2
introduced a second component, the number of disabled_nodes at or
below that level of the plan tree. Unfortunately, I (rhaas) failed
to realize that GEQO extracts the cost from each candidate plan and
compares it directly as a measure of fitness.

This means that, at least in principle, it's possible for GEQO to
prefer a plan with more disabled_nodes and lower cost over one with
fewer disabled_nodes and higher cost, which is incorrect. It may be
possible for that to become a practical issue in v18, but it's much
more likely to become an issue in v19 due to pg_plan_advice. Hence,
since the straightforward fix breaks ABI compatibility, back-patch
only to v19.

Backpatch-through: 19
Discussion: https://postgr.es/m/CA+TgmoYmXy-jiP5qDhqNEiYFEBzQsArO6O2d9E8szNZqi1bePQ@mail.gmail.com
</content>
</entry>
<entry>
<title>Fix postmaster crash on whitespace-only oauth_validator_libraries</title>
<updated>2026-09-17T12:52:30Z</updated>
<author>
<name>Daniel Gustafsson</name>
</author>
<published>2026-09-17T12:52:30Z</published>
<link rel='alternate' type='text/html' href='http://git.postgresql.org/cgit/postgresql.git/commit/?id=bca67e5a33b07180c2f1703faf4443f2a1b92134'/>
<id>urn:sha1:bca67e5a33b07180c2f1703faf4443f2a1b92134</id>
<content type='text'>
The check_oauth_validator check for an empty validator list didn't test
for a string with only whitespace, which would cause the postmaster to
crash.  Instead of testing for the empty string cases, pass the config
value to SplitDirectoriesString unconditionally.  If an empty list is
returned then the input string was empty.  Since pstrdup cannot handle
NULL, assert that the string ie set.  While users cannot set the string
to NULL, it is initialized to NULL so guard against programmer error.

Check the parsed list instead.  Assert that the GUC string is non-NULL
before pstrdup(); users cannot set it to NULL, but the C variable is
initialized that way.

This also adds a TAP test that reloads a whitespace-only setting after
pg_hba_file_rules and waits until the existing backend sees the restored
GUC.

Author: Grigorev Jurij &lt;ju.grigorev@ftdata.ru&gt;
Reviewed-by: Jacob Champion &lt;jacob.champion@enterprisedb.com&gt;
Reviewed-by: Daniel Gustafsson &lt;daniel@yesql.se&gt;
Discussion: https://postgr.es/m/04fa84f6ebbe400f940e179ebe1070e9@localhost.localdomain
Backpatch-through: 18
</content>
</entry>
<entry>
<title>Have the REPACK decoding worker use timeout values from the steering backend</title>
<updated>2026-09-17T10:46:43Z</updated>
<author>
<name>Álvaro Herrera</name>
</author>
<published>2026-09-17T10:46:43Z</published>
<link rel='alternate' type='text/html' href='http://git.postgresql.org/cgit/postgresql.git/commit/?id=a62ff0829d6b151a7107f6ae7f7f90b52405a247'/>
<id>urn:sha1:a62ff0829d6b151a7107f6ae7f7f90b52405a247</id>
<content type='text'>
The worker connects as the table owner in a new session, so a role- or
database-level lock_timeout and transaction_timeout unhelpfully apply to
it, possibly canceling the wait for older transactions.  This cannot be
overridden by the REPACK calling session.  Fix by passing the timeout
values from the steering backend via the DecodingWorkerShared struct and
adopting these values in the worker; this way, values from session-local
SET reach the worker too.

In passing, remove a pointless member from the same struct.

Author: Shihao Zhong &lt;zhong950419@gmail.com&gt;
Backpatch-through: 19
Discussion: https://postgr.es/m/CAGRkXqTYaBjFvjtjPb1+=sZWvt93=2c472bmM+xdG7w9ZvAydA@mail.gmail.com
</content>
</entry>
<entry>
<title>Tolerate partial pgstats entries in pgstat_gc_entry_refs()</title>
<updated>2026-09-17T10:25:12Z</updated>
<author>
<name>Michael Paquier</name>
</author>
<published>2026-09-17T10:25:12Z</published>
<link rel='alternate' type='text/html' href='http://git.postgresql.org/cgit/postgresql.git/commit/?id=16706f1f4dc202d502f07f7b14bb600eb0daef92'/>
<id>urn:sha1:16706f1f4dc202d502f07f7b14bb600eb0daef92</id>
<content type='text'>
pgstat_get_entry_ref_cached() inserts a local entry_ref with
shmem-related fields set to NULL, expecting pgstat_get_entry_ref() (its
sole caller) to fill them up before returning.  If an ERROR happens
while pgstat_get_entry_ref() runs, it could be possible to finish with a
local pgstats entry partially filled.

This could lead to a crash of pgstat_gc_entry_refs(), which tolerates a
NULL shared_stats in an assertion but unconditionally dereferenced its
"dropped" and "generation" fields.

This extends 4069df21beb8, being a cheap insurance against NULL pointer
dereference, if some code paths of pgstat_get_entry_ref() are not able
to perform any cleanup actions (for example after a dsm_create()
throwing an ERROR).

Reviewed-by: Grigorev Jurij &lt;ju.grigorev@ftdata.ru&gt;
Discussion: https://postgr.es/m/aqtiKTvl519bu8-V@paquier.xyz
Backpatch-through: 15
</content>
</entry>
<entry>
<title>Fix REPACK worker startup and shutdown sequences</title>
<updated>2026-09-17T09:44:57Z</updated>
<author>
<name>Álvaro Herrera</name>
</author>
<published>2026-09-17T09:44:57Z</published>
<link rel='alternate' type='text/html' href='http://git.postgresql.org/cgit/postgresql.git/commit/?id=16735af3e39eeb6e3a2c2bcc1e4a17eabc74d377'/>
<id>urn:sha1:16735af3e39eeb6e3a2c2bcc1e4a17eabc74d377</id>
<content type='text'>
A REPACK background worker can fail to start for various reasons, but
the REPACK steering process was not handling them correctly.  For
instance, the steering process waits on a condition variable, but it
would simply hang if the worker doesn't send the signal.  (A signal
would be sent by postmaster, but it would wake up the process only to be
ignored and continue sleeping.)  Fix this by splitting the wait in two:
first wait for the worker to attach to the error queue, and then wait on
the condition variable as before.

The shutdown sequence can also get stuck, if the message queue gets full
while trying to shut down (this can apparently happen if the log level
is set to very noisy).  Previously the worker would send a signal and
then detach; but the steering process can receive that signal, act on
it, then fail to wake up to handle the detach, sleeping indefinitely.
Fix this by having the worker send a Terminate message, which the
steering process can react to.

Author: Bharath Rupireddy &lt;bharath.rupireddyforpostgres@gmail.com&gt;
Author: Shihao Zhong &lt;zhong950419@gmail.com&gt;
Author: Álvaro Herrera &lt;alvherre@kurilemu.de&gt;
Reviewed-by: Antonin Houska &lt;ah@cybertec.at&gt;
Reviewed-by: Masahiko Sawada &lt;sawada.mshk@gmail.com&gt;
Reviewed-by: Shihao Zhong &lt;zhong950419@gmail.com&gt;
Reported-by: Nathan Bossart &lt;nathandbossart@gmail.com&gt;
Reported-by: Bharath Rupireddy &lt;bharath.rupireddyforpostgres@gmail.com&gt;
Reported-by: Nikolay Samokhvalov &lt;nik@postgres.ai&gt;
Backpatch-through: 19
Discussion: https://postgr.es/m/CALj2ACVAxA9HxvFe8HSspTJ-UO4Aoz%3DkuQdZBeLrod0gqUxH3g%40mail.gmail.com
Discussion: https://postgr.es/m/apBpOVZOyqrakEr_@nathan
</content>
</entry>
<entry>
<title>Fix typos and grammar of some comments</title>
<updated>2026-09-17T07:50:44Z</updated>
<author>
<name>Michael Paquier</name>
</author>
<published>2026-09-17T07:50:31Z</published>
<link rel='alternate' type='text/html' href='http://git.postgresql.org/cgit/postgresql.git/commit/?id=be00f041a331d5e6a49f21f139c9518542bdf9b3'/>
<id>urn:sha1:be00f041a331d5e6a49f21f139c9518542bdf9b3</id>
<content type='text'>
These errors have been reported to the mailing lists in the last few
weeks.  Some of the spots fixed have been noticed by myself during
independent code reviews, but not all.
</content>
</entry>
<entry>
<title>Fix assertion after aborting internal subtransaction at transaction end</title>
<updated>2026-09-17T05:24:22Z</updated>
<author>
<name>Fujii Masao</name>
</author>
<published>2026-09-17T05:24:22Z</published>
<link rel='alternate' type='text/html' href='http://git.postgresql.org/cgit/postgresql.git/commit/?id=999ce9bcd80890c3d723e113bb0337c900f9f249'/>
<id>urn:sha1:999ce9bcd80890c3d723e113bb0337c900f9f249</id>
<content type='text'>
Previously, aborting an internal subtransaction during COMMIT or
PREPARE TRANSACTION could cause the following assertion failure.
This could happen, for example, when a deferred constraint trigger fired
at COMMIT and its PL/pgSQL exception block caught an error raised
while executing the trigger function.

    TRAP: failed Assert("s-&gt;blockState == TBLOCK_SUBINPROGRESS || s-&gt;blockState
    == TBLOCK_INPROGRESS || s-&gt;blockState == TBLOCK_IMPLICIT_INPROGRESS ||
    s-&gt;blockState == TBLOCK_PARALLEL_INPROGRESS || s-&gt;blockState ==
    TBLOCK_STARTED"), File: "xact.c", Line: 4851, PID: 73455

An internal subtransaction should be able to be aborted while the parent
transaction is in the COMMIT or PREPARE TRANSACTION phase. However,
RollbackAndReleaseCurrentSubTransaction()'s assertion check previously
did not allow TBLOCK_END and TBLOCK_PREPARE as parent transaction
states, causing the assertion failure.

This commit fixes the assertion check by allowing those two parent
transaction states.

Backpatch to all supported versions.

Reported-by: Fabrízio de Royes Mello &lt;fabrizio@planetscale.com&gt;
Author: Patrick Reynolds &lt;piki@planetscale.com&gt;
Reviewed-by: Fujii Masao &lt;masao.fujii@gmail.com&gt;
Reviewed-by: Chao Li &lt;li.evan.chao@gmail.com&gt;
Reviewed-by: Fabrízio de Royes Mello &lt;fabrizio@planetscale.com&gt;
Discussion: https://postgr.es/m/CABo-N97AeMbWuYTWg-3%3D2DkTR3EkvS%2BFt%3DyEaWB181STsR1mBg%40mail.gmail.com
Backpatch-through: 14
</content>
</entry>
<entry>
<title>Distinguish publication exclusions in object addresses.</title>
<updated>2026-09-17T03:44:21Z</updated>
<author>
<name>Amit Kapila</name>
</author>
<published>2026-09-17T03:44:21Z</published>
<link rel='alternate' type='text/html' href='http://git.postgresql.org/cgit/postgresql.git/commit/?id=94670ba6d560b0738992b9bb7d0313d7d90af1d1'/>
<id>urn:sha1:94670ba6d560b0738992b9bb7d0313d7d90af1d1</id>
<content type='text'>
A pg_publication_rel entry can represent either an explicitly published
relation or a table excluded from a FOR ALL TABLES publication, but the
object address code treated every entry as a published relation without
checking prexcept. EXCEPT entries thus appeared as ordinary
published-table mappings in dependency messages, pg_identify_object(),
and pg_identify_object_as_address().

Report such entries as "publication excluded relation" instead, with
object identities indicating that the table is excluded from the
publication. pg_get_object_address() also accepts this new object type,
so that the output of pg_identify_object_as_address() can still be
passed back to it to look up the same object. "publication relation"
now resolves only non-EXCEPT entries, and "publication excluded
relation" only EXCEPT entries.

Oversight in commit fd366065e06.

Author: Fujii Masao &lt;masao.fujii@gmail.com&gt;
Author: Vignesh C &lt;vignesh21@gmail.com&gt;
Reviewed-by: shveta malik &lt;shveta.malik@gmail.com&gt;
Reviewed-by: Peter Smith &lt;smithpb2250@gmail.com&gt;
Reviewed-by: Zhijie Hou &lt;houzj.fnst@fujitsu.com&gt;
Reviewed-by: Nisha Moond &lt;nisha.moond412@gmail.com&gt;
Reviewed-by: Amit Kapila &lt;amit.kapila16@gmail.com&gt;
Reviewed-by: Chao Li &lt;li.evan.chao@gmail.com&gt;
Reviewed-by: Manuel Reyes Bravo &lt;manuelreyesbravo@gmail.com&gt;
Discussion: https://postgr.es/m/CAHGQGwHfESBexa7fq99EvFCf31av=O9h9udnw22ymxmm6LMZzw@mail.gmail.com
Backpatch-through: 19, where it was introduced
</content>
</entry>
<entry>
<title>Fix multixact members truncation at page boundary</title>
<updated>2026-09-16T11:52:12Z</updated>
<author>
<name>Heikki Linnakangas</name>
</author>
<published>2026-09-16T11:52:12Z</published>
<link rel='alternate' type='text/html' href='http://git.postgresql.org/cgit/postgresql.git/commit/?id=fcc0e27f45e2d8dc6046435908a48626c91d3d84'/>
<id>urn:sha1:fcc0e27f45e2d8dc6046435908a48626c91d3d84</id>
<content type='text'>
Like in PerformOffsetsTruncation() and e.g. in TruncateSUBTRANS(),
need to step back to previous page at page boundary, to avoid passing
a cutoff page to SimpleLruTruncate() that hasn't been created
yet. Otherwise you can get a bogus 'LOG: could not truncate directory
"pg_multixact/members": apparent wraparound' message in the log.

Reported-by: Noah Misch &lt;noah@leadboat.com&gt;
Discussion: https://www.postgresql.org/message-id/20260827231757.78.noahmisch@microsoft.com
Backpatch-through: 19
</content>
</entry>
<entry>
<title>Say in the FSM README why its hint writes still need full page images</title>
<updated>2026-09-16T10:49:59Z</updated>
<author>
<name>Alexander Korotkov</name>
</author>
<published>2026-09-16T10:49:59Z</published>
<link rel='alternate' type='text/html' href='http://git.postgresql.org/cgit/postgresql.git/commit/?id=a4f18fd8f2800084304844060fe5564136e6b3e5'/>
<id>urn:sha1:a4f18fd8f2800084304844060fe5564136e6b3e5</id>
<content type='text'>
The Recovery section said we would "operate correctly without the full page
images that MarkBufferDirtyHint() provides", offering them only as a way to
lose less slot knowledge to RBM_ZERO_ON_ERROR.  That is true of freespace.c,
which passes RBM_ZERO_ON_ERROR on every read, and false of the system around
it, which reads the same files and does verify checksums.  Reading it as a
licence to dirty FSM pages without a full page image is what led to
c06d1a4ba6b, since reverted.

Say instead that RBM_ZERO_ON_ERROR is a property of this directory rather
than of the fork, and name the readers that do not share it:
RelationCopyStorage(), RelationCopyStorageUsingBuffer(), base backups and
pg_checksums.  Rather than presenting today's behavior as the only one
possible, note that the alternative is for all of that code to skip checksum
validation of the FSM.

Reported-by: Noah Misch &lt;noah@leadboat.com&gt;
Reviewed-by: Noah Misch &lt;noah@leadboat.com&gt;
Reviewed-by: Andrey Borodin &lt;x4mmm@yandex-team.ru&gt;
Discussion: https://postgr.es/m/20260901211837.f6.noahmisch%40microsoft.com
</content>
</entry>
</feed>
