From b0228c88490a8dc7824252b3f2f15eeb1640f8fe Mon Sep 17 00:00:00 2001
From: Justin Pryzby <pryzbyj@telsasoft.com>
Date: Tue, 15 Dec 2020 11:43:57 -0600
Subject: [PATCH 2/4] Change vacuum_open_relation/vacuum_is_relation_owner to
 accept booleans rather than VacuumOptions

---
 src/backend/commands/analyze.c |  9 ++++----
 src/backend/commands/vacuum.c  | 39 +++++++++++++++++-----------------
 src/include/commands/vacuum.h  |  5 +++--
 3 files changed, 27 insertions(+), 26 deletions(-)

diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c
index 884bfeee21..14c436b8c0 100644
--- a/src/backend/commands/analyze.c
+++ b/src/backend/commands/analyze.c
@@ -124,7 +124,6 @@ analyze_rel(Oid relid, RangeVar *relation,
 	int			elevel;
 	AcquireSampleRowsFunc acquirefunc = NULL;
 	BlockNumber relpages = 0;
-	VacuumOptions	newoptions;
 
 	/* Select logging level */
 	if (params->options.verbose)
@@ -149,10 +148,10 @@ analyze_rel(Oid relid, RangeVar *relation,
 	 *
 	 * Make sure to generate only logs for ANALYZE in this case.
 	 */
-	newoptions = params->options;
-	newoptions.vacuum = false;
-	onerel = vacuum_open_relation(relid, relation, &newoptions,
+	Assert(params->options.analyze);
+	onerel = vacuum_open_relation(relid, relation, false, true,
 								  params->log_min_duration >= 0,
+								  params->options.skip_locked,
 								  ShareUpdateExclusiveLock);
 
 	/* leave if relation could not be opened or locked */
@@ -169,7 +168,7 @@ analyze_rel(Oid relid, RangeVar *relation,
 	 */
 	if (!vacuum_is_relation_owner(RelationGetRelid(onerel),
 								  onerel->rd_rel,
-								  &newoptions))
+								  false, true))
 	{
 		relation_close(onerel, ShareUpdateExclusiveLock);
 		return;
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index 99b0345338..2652880474 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -519,11 +519,12 @@ vacuum(List *relations, VacuumParams *params,
  * ANALYZE.
  */
 bool
-vacuum_is_relation_owner(Oid relid, Form_pg_class reltuple, VacuumOptions *options)
+vacuum_is_relation_owner(Oid relid, Form_pg_class reltuple, bool do_vacuum,
+		bool do_analyze)
 {
 	char	   *relname;
 
-	Assert(options->vacuum || options->analyze);
+	Assert(do_vacuum || do_analyze);
 
 	/*
 	 * Check permissions.
@@ -542,7 +543,7 @@ vacuum_is_relation_owner(Oid relid, Form_pg_class reltuple, VacuumOptions *optio
 
 	relname = NameStr(reltuple->relname);
 
-	if (options->vacuum)
+	if (do_vacuum)
 	{
 		if (reltuple->relisshared)
 			ereport(WARNING,
@@ -565,7 +566,7 @@ vacuum_is_relation_owner(Oid relid, Form_pg_class reltuple, VacuumOptions *optio
 		return false;
 	}
 
-	if (options->analyze)
+	if (do_analyze)
 	{
 		if (reltuple->relisshared)
 			ereport(WARNING,
@@ -593,14 +594,15 @@ vacuum_is_relation_owner(Oid relid, Form_pg_class reltuple, VacuumOptions *optio
  * or locked, a log is emitted if possible.
  */
 Relation
-vacuum_open_relation(Oid relid, RangeVar *relation, VacuumOptions *options,
-					 bool verbose, LOCKMODE lmode)
+vacuum_open_relation(Oid relid, RangeVar *relation, bool do_vacuum,
+					bool do_analyze, bool verbose, bool skip_locked,
+					LOCKMODE lmode)
 {
 	Relation	onerel;
 	bool		rel_lock = true;
 	int			elevel;
 
-	Assert(options->vacuum || options->analyze);
+	Assert(do_vacuum || do_analyze);
 
 	/*
 	 * Open the relation and get the appropriate lock on it.
@@ -611,7 +613,7 @@ vacuum_open_relation(Oid relid, RangeVar *relation, VacuumOptions *options,
 	 * If we've been asked not to wait for the relation lock, acquire it first
 	 * in non-blocking mode, before calling try_relation_open().
 	 */
-	if (!options->skip_locked)
+	if (!skip_locked)
 		onerel = try_relation_open(relid, lmode);
 	else if (ConditionalLockRelationOid(relid, lmode))
 		onerel = try_relation_open(relid, NoLock);
@@ -651,7 +653,7 @@ vacuum_open_relation(Oid relid, RangeVar *relation, VacuumOptions *options,
 	else
 		return NULL;
 
-	if (options->vacuum)
+	if (do_vacuum)
 	{
 		if (!rel_lock)
 			ereport(elevel,
@@ -672,7 +674,7 @@ vacuum_open_relation(Oid relid, RangeVar *relation, VacuumOptions *options,
 		return NULL;
 	}
 
-	if (options->analyze)
+	if (do_analyze)
 	{
 		if (!rel_lock)
 			ereport(elevel,
@@ -775,7 +777,8 @@ expand_vacuum_rel(VacuumRelation *vrel, VacuumOptions *options)
 		 * Make a returnable VacuumRelation for this rel if user is a proper
 		 * owner.
 		 */
-		if (vacuum_is_relation_owner(relid, classForm, options))
+		if (vacuum_is_relation_owner(relid, classForm, options->vacuum,
+					options->analyze))
 		{
 			oldcontext = MemoryContextSwitchTo(vac_context);
 			vacrels = lappend(vacrels, makeVacuumRelation(vrel->relation,
@@ -862,7 +865,8 @@ get_all_vacuum_rels(VacuumOptions *options)
 		Oid			relid = classForm->oid;
 
 		/* check permissions of relation */
-		if (!vacuum_is_relation_owner(relid, classForm, options))
+		if (!vacuum_is_relation_owner(relid, classForm, options->vacuum,
+					options->analyze))
 			continue;
 
 		/*
@@ -1711,7 +1715,6 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params)
 	Oid			save_userid;
 	int			save_sec_context;
 	int			save_nestlevel;
-	VacuumOptions	newoptions;
 
 	Assert(params != NULL);
 
@@ -1772,8 +1775,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params)
 		AccessExclusiveLock : ShareUpdateExclusiveLock;
 
 	/* open the relation and get the appropriate lock on it */
-	onerel = vacuum_open_relation(relid, relation, &params->options,
-								  params->log_min_duration >= 0, lmode);
+	Assert(params->options.vacuum);
+	onerel = vacuum_open_relation(relid, relation, true, false,
+			params->log_min_duration >= 0, params->options.skip_locked, lmode);
 
 	/* leave if relation could not be opened or locked */
 	if (!onerel)
@@ -1791,11 +1795,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params)
 	 * changed in-between.  Make sure to only generate logs for VACUUM in this
 	 * case.
 	 */
-	newoptions = params->options;
-	newoptions.analyze = false;
 	if (!vacuum_is_relation_owner(RelationGetRelid(onerel),
-								  onerel->rd_rel,
-								  &newoptions))
+								  onerel->rd_rel, true, false))
 	{
 		relation_close(onerel, lmode);
 		PopActiveSnapshot();
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index d9e5485a1e..740fa7aaa1 100644
--- a/src/include/commands/vacuum.h
+++ b/src/include/commands/vacuum.h
@@ -275,9 +275,10 @@ extern void vacuum_set_xid_limits(Relation rel,
 extern void vac_update_datfrozenxid(void);
 extern void vacuum_delay_point(void);
 extern bool vacuum_is_relation_owner(Oid relid, Form_pg_class reltuple,
-									 VacuumOptions *options);
+									 bool do_vacuum, bool do_analyze);
 extern Relation vacuum_open_relation(Oid relid, RangeVar *relation,
-									 VacuumOptions *options, bool verbose,
+									 bool do_vacuum, bool do_analyze,
+									 bool verbose, bool skip_locked,
 									 LOCKMODE lmode);
 
 /* in commands/analyze.c */
-- 
2.17.0

