From 48397388e38bf912a50f5e2bdcb34237a3c097f7 Mon Sep 17 00:00:00 2001
From: Bharath Rupireddy <bharath.rupireddy@enterprisedb.com>
Date: Fri, 9 Apr 2021 20:24:37 +0530
Subject: [PATCH v1] Avoid unnecessary table open/close for TRUNCATE foo, foo,
 foo; kind of commands

In ExecuteTruncate, we filter out the duplicate relations specified
in the TRUNCATE command. But before skipping the duplicates,  we
just open the relation, then if it is present in the already seen
relids, then close the relation and continue further.

We can just have the duplicate checking before table_open so that
in the cases like TRUNCATE foo, foo, foo, foo; we could save costs
of table_open and table_close for the relation foo.
---
 src/backend/commands/tablecmds.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 1f19629a94..5a7d6f3954 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -1638,15 +1638,12 @@ ExecuteTruncate(TruncateStmt *stmt)
 										   0, RangeVarCallbackForTruncate,
 										   NULL);
 
-		/* open the relation, we already hold a lock on it */
-		rel = table_open(myrelid, NoLock);
-
 		/* don't throw error for "TRUNCATE foo, foo" */
 		if (list_member_oid(relids, myrelid))
-		{
-			table_close(rel, lockmode);
 			continue;
-		}
+
+		/* open the relation, we already hold a lock on it */
+		rel = table_open(myrelid, NoLock);
 
 		/*
 		 * RangeVarGetRelidExtended() has done most checks with its callback,
-- 
2.25.1

