From f85136106d87f54e87635736dfe1b8227b6803ad Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Fri, 28 Jun 2013 19:11:51 -0400
Subject: [PATCH] pg_upgrade:  pass username to analyze script If -U (user) is
 specified, pass the username into the created analyze script. Per request
 from Ray Stell

---
 contrib/pg_upgrade/check.c      | 22 ++++++++++++++++++----
 contrib/pg_upgrade/option.c     |  1 +
 contrib/pg_upgrade/pg_upgrade.h |  1 +
 3 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/contrib/pg_upgrade/check.c b/contrib/pg_upgrade/check.c
index 1f67e602def..0376fcbefc1 100644
--- a/contrib/pg_upgrade/check.c
+++ b/contrib/pg_upgrade/check.c
@@ -459,6 +459,13 @@ void
 create_script_for_cluster_analyze(char **analyze_script_file_name)
 {
 	FILE	   *script = NULL;
+	char	   *user_specification = "";
+
+	if (os_info.user_specified)
+	{
+		user_specification = pg_malloc(strlen(os_info.user) + 7);
+		sprintf(user_specification, "-U \"%s\" ", os_info.user);
+	}
 
 	*analyze_script_file_name = pg_malloc(MAXPGPATH);
 
@@ -501,7 +508,8 @@ create_script_for_cluster_analyze(char **analyze_script_file_name)
 			ECHO_QUOTE, ECHO_QUOTE);
 	fprintf(script, "echo %sthis script and run:%s\n",
 			ECHO_QUOTE, ECHO_QUOTE);
-	fprintf(script, "echo %s    \"%s/vacuumdb\" --all %s%s\n", ECHO_QUOTE, new_cluster.bindir,
+	fprintf(script, "echo %s    \"%s/vacuumdb\" %s--all %s%s\n", ECHO_QUOTE,
+			new_cluster.bindir, user_specification,
 	/* Did we copy the free space files? */
 			(GET_MAJOR_VERSION(old_cluster.major_version) >= 804) ?
 			"--analyze-only" : "--analyze", ECHO_QUOTE);
@@ -522,7 +530,8 @@ create_script_for_cluster_analyze(char **analyze_script_file_name)
 			ECHO_QUOTE, ECHO_QUOTE);
 	fprintf(script, "echo %s--------------------------------------------------%s\n",
 			ECHO_QUOTE, ECHO_QUOTE);
-	fprintf(script, "\"%s/vacuumdb\" --all --analyze-only\n", new_cluster.bindir);
+	fprintf(script, "\"%s/vacuumdb\" %s--all --analyze-only\n",
+			new_cluster.bindir, user_specification);
 	fprintf(script, "echo%s\n", ECHO_BLANK);
 	fprintf(script, "echo %sThe server is now available with minimal optimizer statistics.%s\n",
 			ECHO_QUOTE, ECHO_QUOTE);
@@ -543,7 +552,8 @@ create_script_for_cluster_analyze(char **analyze_script_file_name)
 			ECHO_QUOTE, ECHO_QUOTE);
 	fprintf(script, "echo %s---------------------------------------------------%s\n",
 			ECHO_QUOTE, ECHO_QUOTE);
-	fprintf(script, "\"%s/vacuumdb\" --all --analyze-only\n", new_cluster.bindir);
+	fprintf(script, "\"%s/vacuumdb\" %s--all --analyze-only\n",
+			new_cluster.bindir, user_specification);
 	fprintf(script, "echo%s\n\n", ECHO_BLANK);
 
 #ifndef WIN32
@@ -556,7 +566,8 @@ create_script_for_cluster_analyze(char **analyze_script_file_name)
 			ECHO_QUOTE, ECHO_QUOTE);
 	fprintf(script, "echo %s-------------------------------------------------------------%s\n",
 			ECHO_QUOTE, ECHO_QUOTE);
-	fprintf(script, "\"%s/vacuumdb\" --all %s\n", new_cluster.bindir,
+	fprintf(script, "\"%s/vacuumdb\" %s--all %s\n", new_cluster.bindir,
+			user_specification,
 	/* Did we copy the free space files? */
 			(GET_MAJOR_VERSION(old_cluster.major_version) >= 804) ?
 			"--analyze-only" : "--analyze");
@@ -573,6 +584,9 @@ create_script_for_cluster_analyze(char **analyze_script_file_name)
 			   *analyze_script_file_name, getErrorText(errno));
 #endif
 
+	if (os_info.user_specified)
+		pg_free(user_specification);
+
 	check_ok();
 }
 
diff --git a/contrib/pg_upgrade/option.c b/contrib/pg_upgrade/option.c
index dee58ee28fc..2774b1e2114 100644
--- a/contrib/pg_upgrade/option.c
+++ b/contrib/pg_upgrade/option.c
@@ -172,6 +172,7 @@ parseCommandLine(int argc, char *argv[])
 			case 'U':
 				pg_free(os_info.user);
 				os_info.user = pg_strdup(optarg);
+				os_info.user_specified = true;
 
 				/*
 				 * Push the user name into the environment so pre-9.1
diff --git a/contrib/pg_upgrade/pg_upgrade.h b/contrib/pg_upgrade/pg_upgrade.h
index 0d44f4e4477..0b3ad200786 100644
--- a/contrib/pg_upgrade/pg_upgrade.h
+++ b/contrib/pg_upgrade/pg_upgrade.h
@@ -291,6 +291,7 @@ typedef struct
 	const char *progname;		/* complete pathname for this program */
 	char	   *exec_path;		/* full path to my executable */
 	char	   *user;			/* username for clusters */
+	bool		user_specified; /* user specified on command-line */
 	char	  **old_tablespaces;	/* tablespaces */
 	int			num_old_tablespaces;
 	char	  **libraries;		/* loadable libraries */
-- 
GitLab