<feed xmlns='http://www.w3.org/2005/Atom'>
<title>postgresql.git, branch REL_19_STABLE</title>
<subtitle>This is the main PostgreSQL git repository.</subtitle>
<id>http://git.postgresql.org/cgit/postgresql.git/atom?h=REL_19_STABLE</id>
<link rel='self' href='http://git.postgresql.org/cgit/postgresql.git/atom?h=REL_19_STABLE'/>
<link rel='alternate' type='text/html' href='http://git.postgresql.org/cgit/postgresql.git/'/>
<updated>2026-09-17T21:04:04Z</updated>
<entry>
<title>Further post-revert cleanup after online checksums</title>
<updated>2026-09-17T21:04:04Z</updated>
<author>
<name>Daniel Gustafsson</name>
</author>
<published>2026-09-17T21:04:04Z</published>
<link rel='alternate' type='text/html' href='http://git.postgresql.org/cgit/postgresql.git/commit/?id=6b0760a10a32f2471c22eed7102f77c18d836423'/>
<id>urn:sha1:6b0760a10a32f2471c22eed7102f77c18d836423</id>
<content type='text'>
When reverting I had missed updating the documentation for tracking data
checksum failures and the checksum version in the REDO record.  The test-
code for enabling and disabling checksums offline was originally kept to
minimize backpatching conflicts, but the amount of testcode backpatching
doesn't really warrant keeping dead code.

Since no version has been shipped since bumping XLOG_PAGE_MAGIC it is
left at the previous bump version.

Reported-by: Fujii Masao &lt;masao.fujii@gmail.com&gt;
Reported-by: Manuel Reyes Bravo &lt;manuelreyesbravo@gmail.com&gt;
Discussion: https://postgr.es/m/CAHGQGwFLNCA9nVHSsC_=G_mvsK_fAFb+QbJAL7=R9cK2PL9ZBQ@mail.gmail.com
</content>
</entry>
<entry>
<title>pg_plan_advice: Fix defects in JOIN_ORDER advice feedback.</title>
<updated>2026-09-17T15:26:46Z</updated>
<author>
<name>Robert Haas</name>
</author>
<published>2026-09-17T15:15:52Z</published>
<link rel='alternate' type='text/html' href='http://git.postgresql.org/cgit/postgresql.git/commit/?id=0f433a6b3576cc9d381c653ba9799960ac2e64c3'/>
<id>urn:sha1:0f433a6b3576cc9d381c653ba9799960ac2e64c3</id>
<content type='text'>
This commit fixes several related problems. All of these problems
escaped testing for the same reason: they do not occur when only
generated advice is supplied, and therefore test_plan_advice was
incapable of detecting these shortcomings.

First, prior to this commit, the advice feedback code never regarded
an unordered sublist of a JOIN_ORDER specification as matching an
unrolled join. As a result, when JOIN_ORDER() advice contained
unordered sublists, the advice feedback tended to be "matched, failed"
even when the advice worked exactly as intended. Only the case where
an unordered sublist was implemented by a plan shape not subject to
unrolling, such as a partitionwise join, worked properly.

Second, prior to this commit, a join order sublist in the initial
position wasn't properly handled. Note that this overlaps with the
problem described in the previous paragraph; JOIN_ORDER({a b} c) was
broken both because of the unordered sublist and because of the
sublist being in the initial position. However, there's more to this
case: JOIN_ORDER((a b) c) means the same as JOIN_ORDER(a b c), but the
advice feedback code didn't know that, and would generate "matched,
failed" for the former case even when everything was working.

Finally, prior to this commit, advice feedback didn't correctly handle
single-element sublists. Those are pretty nonsensical, since by
definition a join involves at least 2 tables, so we could just ban
that case. Instead, at least for now, I've chosen to make advice
feedback handle such cases in the same way that advice enforcement
already does: the extra grouping levels are simply disregarded, so
that JOIN_ORDER({a} ((b))) is enforced in the same way as, and also
gets the same advice feedback as, JOIN_ORDER(a b).

Reported-by: Noah Misch &lt;noah@leadboat.com&gt;
Backpatch-through: 19
Discussion: https://postgr.es/m/CA+TgmoYmXy-jiP5qDhqNEiYFEBzQsArO6O2d9E8szNZqi1bePQ@mail.gmail.com
Reviewed-by: Ayush Tiwari &lt;ayushtiwari.slg01@gmail.com&gt;
</content>
</entry>
<entry>
<title>Change GEQO fitness comparisons to consider disabled_nodes.</title>
<updated>2026-09-17T13:37:09Z</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=d22961bca2c8076c05546bf2fb83fdf5df81e843'/>
<id>urn:sha1:d22961bca2c8076c05546bf2fb83fdf5df81e843</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=1d094904bc76b57fa1fd634b9c49bbb5ab76ece7'/>
<id>urn:sha1:1d094904bc76b57fa1fd634b9c49bbb5ab76ece7</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=746a507a391b7c1d333ff969ab08d60575da9630'/>
<id>urn:sha1:746a507a391b7c1d333ff969ab08d60575da9630</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:21Z</updated>
<author>
<name>Michael Paquier</name>
</author>
<published>2026-09-17T10:25:21Z</published>
<link rel='alternate' type='text/html' href='http://git.postgresql.org/cgit/postgresql.git/commit/?id=fc29deb52106e710e9eba4d0f59ee185c8d200bf'/>
<id>urn:sha1:fc29deb52106e710e9eba4d0f59ee185c8d200bf</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=47b5b23a7800e000adebfd8f718e1302df12a7cb'/>
<id>urn:sha1:47b5b23a7800e000adebfd8f718e1302df12a7cb</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>doc: Say which LSN gives read-your-writes with WAIT</title>
<updated>2026-09-17T06:36:36Z</updated>
<author>
<name>Alexander Korotkov</name>
</author>
<published>2026-09-17T06:33:20Z</published>
<link rel='alternate' type='text/html' href='http://git.postgresql.org/cgit/postgresql.git/commit/?id=a203d20190059ee8a8dd830ecfb7834c704cb53c'/>
<id>urn:sha1:a203d20190059ee8a8dd830ecfb7834c704cb53c</id>
<content type='text'>
The reference page and the read-your-writes section both presented
WAIT in standby_replay mode as enough for read-your-writes, without
saying which LSN to wait for.  Read as written, an LSN taken after the
last statement but before COMMIT would do, and it would not: the standby
position WAIT compares against is the end of the last replayed record, so
a target that falls inside the COMMIT record is satisfied while that
record is still unapplied.

Say that the target must be at or after the end of the write
transaction's COMMIT record, and note in the example that autocommit is
what puts the UPDATE's commit before the call that reads the position.

Author: Sami Imseih &lt;samimseih.pg@gmail.com&gt;
Reviewed-by: Xuneng Zhou &lt;xunengzhou@gmail.com&gt;
Reviewed-by: Alexander Korotkov &lt;aekorotkov@gmail.com&gt;
Discussion: https://postgr.es/m/CAN12%2BYKN7gXb1o9bDWgfA%3D6wjDrqNEgt%2BrXJiAWXgPCXQ5TqpA%40mail.gmail.com
Backpatch-through: 19
</content>
</entry>
<entry>
<title>doc: Explain when to use the WAIT NO_THROW option</title>
<updated>2026-09-17T06:36:36Z</updated>
<author>
<name>Alexander Korotkov</name>
</author>
<published>2026-09-17T06:32:17Z</published>
<link rel='alternate' type='text/html' href='http://git.postgresql.org/cgit/postgresql.git/commit/?id=3f8b8ddea08a110e9f44af2b2e52312fca901eac'/>
<id>urn:sha1:3f8b8ddea08a110e9f44af2b2e52312fca901eac</id>
<content type='text'>
The description of NO_THROW covered what the option does but not when an
application would want it.  Explain that it suits callers that treat
timeout or not in recovery as expected results to be handled as part of
ordinary control flow, note the obligation to check the returned status,
and give the reason to omit the option.

Be precise about the option's scope: it changes only how those two wait
outcomes are reported.  Soften the description's claim that the command
"returns a status string instead of throwing errors" accordingly, and say
that invalid input still raises an error, as does any condition checked
before the wait begins.  Name two of those conditions as examples rather
than listing them, since the set grows.

Author: Rithvika Devisetti &lt;devisettirithvika@gmail.com&gt;
Reported-by: Peter Eisentraut &lt;peter@eisentraut.org&gt;
Reviewed-by: Kiran Kaki &lt;itskkpg@gmail.com&gt;
Reviewed-by: Xuneng Zhou &lt;xunengzhou@gmail.com&gt;
Reviewed-by: Satyanarayana Narlapuram &lt;satyanarlapuram@gmail.com&gt;
Reviewed-by: Alexander Korotkov &lt;aekorotkov@gmail.com&gt;
Discussion: https://postgr.es/m/14415b05-16d0-446f-ba7d-c891db8b3406%40eisentraut.org
Backpatch-through: 19
</content>
</entry>
<entry>
<title>Fix assertion after aborting internal subtransaction at transaction end</title>
<updated>2026-09-17T05:25:09Z</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=0a87bc9ca2494cbc5a41a1ee506dac45c794d060'/>
<id>urn:sha1:0a87bc9ca2494cbc5a41a1ee506dac45c794d060</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>
</feed>
