v1-0001-replication-slots-remove-duplicate-code-for-check.patch

application/octet-stream

Filename: v1-0001-replication-slots-remove-duplicate-code-for-check.patch
Type: application/octet-stream
Part: 0
Message: Remove duplicate static function check_permissions in slotfuncs.c and logicalfuncs.c

Patch

Format: format-patch
Series: patch v1-0001
Subject: replication slots: remove duplicate code for check_permissions
File+
src/backend/replication/logical/logicalfuncs.c 1 10
src/backend/replication/slot.c 12 0
src/backend/replication/slotfuncs.c 5 14
src/include/replication/slot.h 1 0
From ac43dd7661fe68c5d9ed2f56ed22917afea7dc75 Mon Sep 17 00:00:00 2001
From: Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com>
Date: Sat, 11 Sep 2021 08:05:04 +0000
Subject: [PATCH v1] replication slots: remove duplicate code for
 check_permissions

Remove two static check_permissions functions with the same name
and same code for checking the privileges for using replication
slots. This patch adds a single function CheckReplicationSlotPermissions
in slot.c. This way, the patch get rid of redundant code.
---
 .../replication/logical/logicalfuncs.c        | 11 +----------
 src/backend/replication/slot.c                | 12 ++++++++++++
 src/backend/replication/slotfuncs.c           | 19 +++++--------------
 src/include/replication/slot.h                |  1 +
 4 files changed, 19 insertions(+), 24 deletions(-)

diff --git a/src/backend/replication/logical/logicalfuncs.c b/src/backend/replication/logical/logicalfuncs.c
index 1f38c5b33e..df454b1518 100644
--- a/src/backend/replication/logical/logicalfuncs.c
+++ b/src/backend/replication/logical/logicalfuncs.c
@@ -95,15 +95,6 @@ LogicalOutputWrite(LogicalDecodingContext *ctx, XLogRecPtr lsn, TransactionId xi
 	p->returned_rows++;
 }
 
-static void
-check_permissions(void)
-{
-	if (!superuser() && !has_rolreplication(GetUserId()))
-		ereport(ERROR,
-				(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
-				 errmsg("must be superuser or replication role to use replication slots")));
-}
-
 /*
  * Helper function for the various SQL callable logical decoding functions.
  */
@@ -124,7 +115,7 @@ pg_logical_slot_get_changes_guts(FunctionCallInfo fcinfo, bool confirm, bool bin
 	List	   *options = NIL;
 	DecodingOutputState *p;
 
-	check_permissions();
+	CheckReplicationSlotPermissions();
 
 	CheckLogicalDecodingRequirements();
 
diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index 33e9acab4a..7905050e68 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -1059,6 +1059,18 @@ CheckSlotRequirements(void)
 				 errmsg("replication slots can only be used if wal_level >= replica")));
 }
 
+/*
+ * Check whether the user has privilege to use replication slots.
+ */
+void
+CheckReplicationSlotPermissions(void)
+{
+	if (!superuser() && !has_rolreplication(GetUserId()))
+		ereport(ERROR,
+				(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+				 (errmsg("must be superuser or replication role to use replication slots"))));
+}
+
 /*
  * Reserve WAL for the currently active slot.
  *
diff --git a/src/backend/replication/slotfuncs.c b/src/backend/replication/slotfuncs.c
index 31e74d3832..ecbd959cdc 100644
--- a/src/backend/replication/slotfuncs.c
+++ b/src/backend/replication/slotfuncs.c
@@ -25,15 +25,6 @@
 #include "utils/pg_lsn.h"
 #include "utils/resowner.h"
 
-static void
-check_permissions(void)
-{
-	if (!superuser() && !has_rolreplication(GetUserId()))
-		ereport(ERROR,
-				(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
-				 errmsg("must be superuser or replication role to use replication slots")));
-}
-
 /*
  * Helper function for creating a new physical replication slot with
  * given arguments. Note that this function doesn't release the created
@@ -85,7 +76,7 @@ pg_create_physical_replication_slot(PG_FUNCTION_ARGS)
 	if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
 		elog(ERROR, "return type must be a row type");
 
-	check_permissions();
+	CheckReplicationSlotPermissions();
 
 	CheckSlotRequirements();
 
@@ -188,7 +179,7 @@ pg_create_logical_replication_slot(PG_FUNCTION_ARGS)
 	if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
 		elog(ERROR, "return type must be a row type");
 
-	check_permissions();
+	CheckReplicationSlotPermissions();
 
 	CheckLogicalDecodingRequirements();
 
@@ -224,7 +215,7 @@ pg_drop_replication_slot(PG_FUNCTION_ARGS)
 {
 	Name		name = PG_GETARG_NAME(0);
 
-	check_permissions();
+	CheckReplicationSlotPermissions();
 
 	CheckSlotRequirements();
 
@@ -619,7 +610,7 @@ pg_replication_slot_advance(PG_FUNCTION_ARGS)
 
 	Assert(!MyReplicationSlot);
 
-	check_permissions();
+	CheckReplicationSlotPermissions();
 
 	if (XLogRecPtrIsInvalid(moveto))
 		ereport(ERROR,
@@ -718,7 +709,7 @@ copy_replication_slot(FunctionCallInfo fcinfo, bool logical_slot)
 	if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
 		elog(ERROR, "return type must be a row type");
 
-	check_permissions();
+	CheckReplicationSlotPermissions();
 
 	if (logical_slot)
 		CheckLogicalDecodingRequirements();
diff --git a/src/include/replication/slot.h b/src/include/replication/slot.h
index e32fb85db8..f46215a7f9 100644
--- a/src/include/replication/slot.h
+++ b/src/include/replication/slot.h
@@ -222,5 +222,6 @@ extern void StartupReplicationSlots(void);
 extern void CheckPointReplicationSlots(void);
 
 extern void CheckSlotRequirements(void);
+extern void CheckReplicationSlotPermissions(void);
 
 #endif							/* SLOT_H */
-- 
2.25.1