1
0
mirror of https://github.com/postgres/postgres.git synced 2025-04-20 00:42:27 +03:00

Allow pg_recvlogical --drop-slot to work without --dbname.

When pg_recvlogical was introduced in 9.4, the --dbname option was not
required for --drop-slot. Without it, pg_recvlogical --drop-slot connected
using a replication connection (not tied to a specific database) and
was able to drop both physical and logical replication slots, similar to
pg_receivewal --drop-slot.

However, commit 0c013e08cfb unintentionally changed this behavior in 9.5,
making pg_recvlogical always check whether it's connected to a specific
database and fail if it's not. This change was expected for --create-slot
and --start, which handle logical replication slots and require a database
connection, but it was unnecessary for --drop-slot, which should work with
any replication connection. As a result, --dbname became a required option
for --drop-slot.

This commit removes that restriction, restoring the original behavior and
allowing pg_recvlogical --drop-slot to work without specifying --dbname.

Although this issue originated from an unintended change, it has existed
for a long time without complaints or bug reports, and the documentation
never explicitly stated that --drop-slot should work without --dbname.
Therefore, the change is not treated as a bug fix and is applied only to
master.

Author: Hayato Kuroda <kuroda.hayato@fujitsu.com>
Reviewed-by: Fujii Masao <masao.fujii@gmail.com>
Discussion: https://postgr.es/m/b15ecf4f-e5af-4fbb-82c2-a425f453e0b2@oss.nttdata.com
This commit is contained in:
Fujii Masao 2025-03-25 00:18:27 +09:00
parent dfc13428a9
commit c68100aa43
2 changed files with 14 additions and 3 deletions

View File

@ -944,13 +944,16 @@ main(int argc, char **argv)
#endif #endif
/* /*
* Run IDENTIFY_SYSTEM to make sure we connected using a database specific * Run IDENTIFY_SYSTEM to check the connection type for each action.
* replication connection. * --create-slot and --start actions require a database-specific
* replication connection because they handle logical replication slots.
* --drop-slot can remove replication slots from any replication
* connection without this restriction.
*/ */
if (!RunIdentifySystem(conn, NULL, NULL, NULL, &db_name)) if (!RunIdentifySystem(conn, NULL, NULL, NULL, &db_name))
exit(1); exit(1);
if (db_name == NULL) if (!do_drop_slot && db_name == NULL)
pg_fatal("could not establish database-specific replication connection"); pg_fatal("could not establish database-specific replication connection");
/* /*

View File

@ -127,4 +127,12 @@ $node->command_ok(
], ],
'replayed a two-phase transaction'); 'replayed a two-phase transaction');
$node->command_ok(
[
'pg_recvlogical',
'--slot' => 'test',
'--drop-slot'
],
'drop could work without dbname');
done_testing(); done_testing();