Hi Hackers, The PG19-optimized slot catchup query uses a CTE that filters on invalidation_reason IS NULL, then cross-joins it with the main slot query. When ALL logical slots in a database are invalid, the CTE returns zero rows, and the cross join produces an empty result set. This causes pg_upgrade to silently skip those slots entirely -- neither detecting them as invalid (which should block the upgrade) nor attempting to migrate them.
The pre-PG19 query path does not have this problem because it queries pg_replication_slots directly without a cross join. This may not impact upgrade to PG19 but will change the behavior for PG20 upgrade. Fix by changing the cross join to a LEFT JOIN, so that invalid slots still appear in the result set with NULL caught_up values. Regards, Lakshmi
0001-Fix-pg_upgrade-to-detect-invalid-logical-replication.patch
Description: Binary data
