From 6767cebc6fb2932752ebb69127817be7b7a10414 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Tue, 23 Sep 2003 22:48:53 +0000
Subject: [PATCH] pg_dump/pg_restore now always use SET SESSION AUTHORIZATION,
 not \connect, to control object ownership.  The use-set-session-authorization
 and no-reconnect switches are obsolete (still accepted on the command line,
 but they don't do anything).  This is a precursor to fixing handling of
 CREATE SCHEMA, which will be a separate commit.

---
 doc/src/sgml/ref/pg_dump.sgml        |  84 ++++---------
 doc/src/sgml/ref/pg_restore.sgml     |  49 +++-----
 src/bin/pg_dump/pg_backup.h          |   9 +-
 src/bin/pg_dump/pg_backup_archiver.c | 173 +++++++++------------------
 src/bin/pg_dump/pg_dump.c            |  20 +---
 src/bin/pg_dump/pg_dumpall.c         |   5 +-
 src/bin/pg_dump/pg_restore.c         |  14 +--
 7 files changed, 111 insertions(+), 243 deletions(-)

diff --git a/doc/src/sgml/ref/pg_dump.sgml b/doc/src/sgml/ref/pg_dump.sgml
index 80dd35041f9..73ab39cef10 100644
--- a/doc/src/sgml/ref/pg_dump.sgml
+++ b/doc/src/sgml/ref/pg_dump.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/pg_dump.sgml,v 1.64 2003/09/11 21:42:20 momjian Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/pg_dump.sgml,v 1.65 2003/09/23 22:48:53 tgl Exp $
 PostgreSQL documentation
 -->
 
@@ -318,16 +318,16 @@ PostgreSQL documentation
       <term><option>--no-owner</option></term>
       <listitem>
        <para>
-        Do not output commands to set the
-	object ownership to match the original database.  Typically,
-	<application>pg_dump</application> issues
-	(<application>psql</application>-specific) <command>\connect</command>
-	statements to set ownership of schema elements.  See also
-	under <option>-R</option> and <option>-X
-	use-set-session-authorization</option>.  Note that
-	<option>-O</option> does not prevent all reconnections to the
-	database, only the ones that are exclusively used for
-	ownership adjustments.
+        Do not output commands to set
+	ownership of objects to match the original database.
+	By default, <application>pg_dump</application> issues
+	<command>SET SESSION AUTHORIZATION</command>
+	statements to set ownership of created schema elements.
+	These statements
+	will fail when the script is run unless it is started by a superuser
+	(or the same user that owns all of the objects in the script).
+	To make a script that can be restored by any user, but will give
+	that user ownership of all the objects, specify <option>-O</>.
        </para>
 
        <para>
@@ -343,27 +343,8 @@ PostgreSQL documentation
       <term><option>--no-reconnect</option></term>
       <listitem>
        <para>
-	Prohibit <application>pg_dump</application>
-        from outputting a script that would require reconnections to
-        the database while being restored.  An average restoration
-        script usually has to reconnect several times as different
-        users to set the original ownerships of the objects.  This
-        option is a rather blunt instrument because it makes
-        <application>pg_dump</application> lose this ownership information,
-        <emphasis>unless</emphasis> you use the <option>-X
-        use-set-session-authorization</option> option.
-       </para>
-
-       <para>
-        One possible reason why reconnections during restore might not
-        be desired is if the access to the database requires manual
-        interaction (e.g., passwords).
-       </para>
-
-       <para>
-        This option is only meaningful for the plain-text format.  For
-        the other formats, you may specify the option when you
-        call <command>pg_restore</command>.
+        This option is obsolete but still accepted for backwards
+	compatibility.
        </para>
       </listitem>
      </varlistentry>
@@ -385,8 +366,7 @@ PostgreSQL documentation
        <para>
         Specify the superuser user name to use when disabling triggers.
 	This is only relevant if <option>--disable-triggers</> is used.
-	(Usually, it's better to specify
-	<option>--use-set-session-authorization</>, and then start the
+	(Usually, it's better to leave this out, and instead start the
 	resulting script as superuser.)
        </para>
       </listitem>
@@ -444,32 +424,10 @@ PostgreSQL documentation
       <term><option>--use-set-session-authorization</></term>
       <listitem>
        <para>
-        Normally, if a (plain-text mode) script generated by
-        <application>pg_dump</application> must alter the current database
-        user (e.g., to set correct object ownerships), it uses the
-        <application>psql</application> <command>\connect</command> command.
-        This command actually opens a new connection, which might
-        require manual interaction (e.g., passwords).  If you use the
-        <option>-X use-set-session-authorization</option> option, then
-        <application>pg_dump</application> will instead output <xref
-        linkend="sql-set-session-authorization" endterm="sql-set-session-authorization-title"> commands.  This has
-        the same effect, but it requires that the user restoring the
-        database from the generated script be a database superuser.
-        This option effectively overrides the <option>-R</option>
-        option.
-       </para>
-
-       <para>
-        Since <xref linkend="sql-set-session-authorization" endterm="sql-set-session-authorization-title"> is a
-        standard SQL command, whereas <command>\connect</command> only
-        works in <application>psql</application>, this option also enhances
-        the theoretical portability of the output script.
-       </para>
-
-       <para>
-        This option is only meaningful for the plain-text format.  For
-        the other formats, you may specify the option when you
-        call <command>pg_restore</command>.
+        This option is obsolete but still accepted for backwards
+	compatibility.
+        <application>pg_dump</application> now always behaves in the
+	way formerly selected by this option.
        </para>
       </listitem>
      </varlistentry>
@@ -490,10 +448,8 @@ PostgreSQL documentation
        <para>
         Presently, the commands emitted for <option>--disable-triggers</>
 	must be done as superuser.  So, you should also specify
-	a superuser name with <option>-S</>, or preferably specify
-	<option>--use-set-session-authorization</> and then be careful to
-	start the resulting script as a superuser.  If you give neither
-	option, the entire script must be run as superuser.
+	a superuser name with <option>-S</>, or preferably be careful to
+	start the resulting script as a superuser.
        </para>
 
        <para>
diff --git a/doc/src/sgml/ref/pg_restore.sgml b/doc/src/sgml/ref/pg_restore.sgml
index 1600925af84..88319e2e344 100644
--- a/doc/src/sgml/ref/pg_restore.sgml
+++ b/doc/src/sgml/ref/pg_restore.sgml
@@ -1,4 +1,4 @@
-<!-- $Header: /cvsroot/pgsql/doc/src/sgml/ref/pg_restore.sgml,v 1.42 2003/09/11 21:42:20 momjian Exp $ -->
+<!-- $Header: /cvsroot/pgsql/doc/src/sgml/ref/pg_restore.sgml,v 1.43 2003/09/23 22:48:53 tgl Exp $ -->
 
 <refentry id="APP-PGRESTORE">
  <refmeta>
@@ -261,10 +261,16 @@
       <term><option>--no-owner</option></term>
       <listitem>
        <para>
-        Prevent any attempt to restore original object
-        ownership. Objects will be owned by the user name used to
-        attach to the database. See also under <option>-R</option> and
-        <option>-X use-set-session-authorization</option>.
+        Do not output commands to set
+	ownership of objects to match the original database.
+	By default, <application>pg_restore</application> issues
+	<command>SET SESSION AUTHORIZATION</command>
+	statements to set ownership of created schema elements.
+	These statements will fail unless the initial connection to the
+	database is made by a superuser
+	(or the same user that owns all of the objects in the script).
+	With <option>-O</option>, any user name can be used for the
+	initial connection, and this user will own all the created objects.
        </para>
       </listitem>
      </varlistentry>
@@ -311,20 +317,8 @@
       <term><option>--no-reconnect</option></term>
       <listitem>
        <para>
-        While restoring an archive, <application>pg_restore</application>
-        typically has to reconnect to the database several times with
-        different user names to set the correct ownership of the
-        created objects.  If this is undesirable (e.g., because manual
-        interaction (passwords) would be necessary for each
-        reconnection), this option prevents
-        <application>pg_restore</application> from issuing any reconnection
-        requests.  (A connection request while in plain text mode, not
-        connected to a database, is made by putting out a <xref
-        linkend="app-psql"> <command>\connect</command> command.)
-        However, this option is a rather blunt instrument because it
-        makes <application>pg_restore</application> lose all object ownership
-        information, <emphasis>unless</emphasis> you use the
-        <option>-X use-set-session-authorization</option> option.
+        This option is obsolete but still accepted for backwards
+	compatibility.
        </para>
       </listitem>
      </varlistentry>
@@ -397,16 +391,10 @@
       <term><option>--use-set-session-authorization</option></term>
       <listitem>
        <para>
-        Normally, if restoring an archive requires altering the
-        current database user (e.g., to set correct object
-        ownerships), a new connection to the database must be opened,
-        which might require manual interaction (e.g., passwords).  If
-        you use the <option>-X use-set-session-authorization</option> option,
-        then <application>pg_restore</application> will instead use the <xref
-        linkend="sql-set-session-authorization" endterm="sql-set-session-authorization-title"> command.  This has
-        the same effect, but it requires that the user restoring the
-        archive is a database superuser.  This option effectively
-        overrides the <option>-R</option> option.
+        This option is obsolete but still accepted for backwards
+	compatibility.
+        <application>pg_restore</application> now always behaves in the
+	way formerly selected by this option.
        </para>
       </listitem>
      </varlistentry>
@@ -428,8 +416,7 @@
         Presently, the commands emitted for
 	<option>--disable-triggers</> must be done as superuser.  So, you
 	should also specify a superuser name with <option>-S</>, or
-	preferably specify <option>--use-set-session-authorization</> and
-	run <application>pg_restore</application> as a
+	preferably run <application>pg_restore</application> as a
 	<productname>PostgreSQL</> superuser.
        </para>
       </listitem>
diff --git a/src/bin/pg_dump/pg_backup.h b/src/bin/pg_dump/pg_backup.h
index 5bcb1b26227..8e91a6b1f8e 100644
--- a/src/bin/pg_dump/pg_backup.h
+++ b/src/bin/pg_dump/pg_backup.h
@@ -15,7 +15,7 @@
  *
  *
  * IDENTIFICATION
- *		$Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup.h,v 1.25 2003/08/28 20:21:34 tgl Exp $
+ *		$Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup.h,v 1.26 2003/09/23 22:48:53 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -62,12 +62,7 @@ typedef int (*DataDumperPtr) (Archive *AH, char *oid, void *userArg);
 typedef struct _restoreOptions
 {
 	int			create;			/* Issue commands to create the database */
-	int			noOwner;		/* Don't reconnect to database to match
-								 * original object owner */
-	int			noReconnect;	/* Don't reconnect to database under any
-								 * cirsumstances */
-	int			use_setsessauth;/* use SET SESSSION AUTHORIZATION instead
-								 * of \connect */
+	int			noOwner;		/* Don't try to match original object owner */
 	int			disable_triggers;		/* disable triggers during
 										 * data-only restore */
 	char	   *superuser;		/* Username to use as superuser */
diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c
index 6e5914c96e9..cf39972457f 100644
--- a/src/bin/pg_dump/pg_backup_archiver.c
+++ b/src/bin/pg_dump/pg_backup_archiver.c
@@ -15,7 +15,7 @@
  *
  *
  * IDENTIFICATION
- *		$Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.75 2003/08/28 20:21:34 tgl Exp $
+ *		$Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.76 2003/09/23 22:48:53 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -49,8 +49,9 @@ static ArchiveHandle *_allocAH(const char *FileSpec, const ArchiveFormat fmt,
 static int	_printTocEntry(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt, bool isData);
 
 static void _doSetSessionAuth(ArchiveHandle *AH, const char *user);
-static void _reconnectAsOwner(ArchiveHandle *AH, const char *dbname, TocEntry *te);
-static void _reconnectAsUser(ArchiveHandle *AH, const char *dbname, const char *user);
+static void _reconnectToDB(ArchiveHandle *AH, const char *dbname, const char *user);
+static void _becomeUser(ArchiveHandle *AH, const char *user);
+static void _becomeOwner(ArchiveHandle *AH, TocEntry *te);
 static void _selectOutputSchema(ArchiveHandle *AH, const char *schemaName);
 
 static teReqs _tocEntryRequired(TocEntry *te, RestoreOptions *ropt);
@@ -144,10 +145,6 @@ RestoreArchive(Archive *AHX, RestoreOptions *ropt)
 	 * initially connected to, not the one we will create, which is very
 	 * bad...
 	 */
-
-	if (ropt->create && ropt->noReconnect)
-		die_horribly(AH, modulename, "-C and -R are incompatible options\n");
-
 	if (ropt->create && ropt->dropSchema)
 		die_horribly(AH, modulename, "-C and -c are incompatible options\n");
 
@@ -221,7 +218,7 @@ RestoreArchive(Archive *AHX, RestoreOptions *ropt)
 				/* We want the schema */
 				ahlog(AH, 1, "dropping %s %s\n", te->desc, te->tag);
 				/* Select owner and schema as necessary */
-				_reconnectAsOwner(AH, NULL, te);
+				_becomeOwner(AH, te);
 				_selectOutputSchema(AH, te->namespace);
 				/* Drop it */
 				ahprintf(AH, "%s", te->dropStmt);
@@ -260,7 +257,7 @@ RestoreArchive(Archive *AHX, RestoreOptions *ropt)
 			if (strcmp(te->desc, "DATABASE") == 0)
 			{
 				ahlog(AH, 1, "connecting to new database \"%s\" as user \"%s\"\n", te->tag, te->owner);
-				_reconnectAsUser(AH, te->tag, te->owner);
+				_reconnectToDB(AH, te->tag, te->owner);
 			}
 		}
 
@@ -310,11 +307,8 @@ RestoreArchive(Archive *AHX, RestoreOptions *ropt)
 					{
 						_disableTriggersIfNecessary(AH, te, ropt);
 
-						/*
-						 * Reconnect if necessary (_disableTriggers may
-						 * have reconnected)
-						 */
-						_reconnectAsOwner(AH, NULL, te);
+						/* Select owner and schema as necessary */
+						_becomeOwner(AH, te);
 						_selectOutputSchema(AH, te->namespace);
 
 						ahlog(AH, 1, "restoring data for table \"%s\"\n", te->tag);
@@ -347,7 +341,7 @@ RestoreArchive(Archive *AHX, RestoreOptions *ropt)
 			}
 		}
 		te = te->next;
-	}
+	}		/* end loop over TOC entries */
 
 	/*
 	 * Now use blobs_xref (if used) to fixup any refs for tables that we
@@ -439,9 +433,6 @@ _canRestoreBlobs(ArchiveHandle *AH)
 static void
 _disableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt)
 {
-	char	   *oldUser;
-	char	   *oldSchema;
-
 	/* This hack is only needed in a data-only restore */
 	if (!ropt->dataOnly || !ropt->disable_triggers)
 		return;
@@ -450,23 +441,12 @@ _disableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te, RestoreOptions *rop
 	if (te && strcmp(te->desc, "BLOBS") == 0)
 		return;
 
-	oldUser = strdup(AH->currUser);
-	oldSchema = strdup(AH->currSchema);
-
 	/*
 	 * Become superuser if possible, since they are the only ones who can
-	 * update pg_class.  If -S was not given, but we are allowed to use
-	 * SET SESSION AUTHORIZATION, assume the initial user identity is a
-	 * superuser.  Otherwise we just have to bull ahead anyway.
+	 * update pg_class.  If -S was not given, assume the initial user identity
+	 * is a superuser.
 	 */
-	if (ropt->superuser)
-	{
-		_reconnectAsUser(AH, NULL, ropt->superuser);
-		/* be careful to preserve schema setting */
-		_selectOutputSchema(AH, oldSchema);
-	}
-	else if (AH->ropt->use_setsessauth)
-		_doSetSessionAuth(AH, NULL);
+	_becomeUser(AH, ropt->superuser);
 
 	ahlog(AH, 1, "disabling triggers\n");
 
@@ -487,28 +467,11 @@ _disableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te, RestoreOptions *rop
 	else
 		ahprintf(AH, "UPDATE pg_catalog.pg_class SET reltriggers = 0 FROM pg_catalog.pg_namespace "
 				 "WHERE relnamespace = pg_namespace.oid AND nspname !~ '^pg_';\n\n");
-
-	/*
-	 * Restore original user and schema state.
-	 */
-	if (ropt->superuser)
-	{
-		_reconnectAsUser(AH, NULL, oldUser);
-		/* be careful to preserve schema setting */
-		_selectOutputSchema(AH, oldSchema);
-	}
-	else if (AH->ropt->use_setsessauth)
-		_doSetSessionAuth(AH, oldUser);
-	free(oldUser);
-	free(oldSchema);
 }
 
 static void
 _enableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt)
 {
-	char	   *oldUser;
-	char	   *oldSchema;
-
 	/* This hack is only needed in a data-only restore */
 	if (!ropt->dataOnly || !ropt->disable_triggers)
 		return;
@@ -517,23 +480,12 @@ _enableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt
 	if (te && strcmp(te->desc, "BLOBS") == 0)
 		return;
 
-	oldUser = strdup(AH->currUser);
-	oldSchema = strdup(AH->currSchema);
-
 	/*
 	 * Become superuser if possible, since they are the only ones who can
-	 * update pg_class.  If -S was not given, but we are allowed to use
-	 * SET SESSION AUTHORIZATION, assume the initial user identity is a
-	 * superuser.  Otherwise we just have to bull ahead anyway.
+	 * update pg_class.  If -S was not given, assume the initial user identity
+	 * is a superuser.
 	 */
-	if (ropt->superuser)
-	{
-		_reconnectAsUser(AH, NULL, ropt->superuser);
-		/* be careful to preserve schema setting */
-		_selectOutputSchema(AH, oldSchema);
-	}
-	else if (AH->ropt->use_setsessauth)
-		_doSetSessionAuth(AH, NULL);
+	_becomeUser(AH, ropt->superuser);
 
 	ahlog(AH, 1, "enabling triggers\n");
 
@@ -557,20 +509,6 @@ _enableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt
 				 "(SELECT pg_catalog.count(*) FROM pg_catalog.pg_trigger where pg_class.oid = tgrelid) "
 				 "FROM pg_catalog.pg_namespace "
 				 "WHERE relnamespace = pg_namespace.oid AND nspname !~ '^pg_';\n\n");
-
-	/*
-	 * Restore original user and schema state.
-	 */
-	if (ropt->superuser)
-	{
-		_reconnectAsUser(AH, NULL, oldUser);
-		/* be careful to preserve schema setting */
-		_selectOutputSchema(AH, oldSchema);
-	}
-	else if (AH->ropt->use_setsessauth)
-		_doSetSessionAuth(AH, oldUser);
-	free(oldUser);
-	free(oldSchema);
 }
 
 /*
@@ -2087,8 +2025,8 @@ _tocEntryRequired(TocEntry *te, RestoreOptions *ropt)
 
 /*
  * Issue a SET SESSION AUTHORIZATION command.  Caller is responsible
- * for updating state if appropriate.  If user is NULL, the
- * specification DEFAULT will be used.
+ * for updating state if appropriate.  If user is NULL or an empty string,
+ * the specification DEFAULT will be used.
  */
 static void
 _doSetSessionAuth(ArchiveHandle *AH, const char *user)
@@ -2096,11 +2034,11 @@ _doSetSessionAuth(ArchiveHandle *AH, const char *user)
 	PQExpBuffer cmd = createPQExpBuffer();
 
 	appendPQExpBuffer(cmd, "SET SESSION AUTHORIZATION ");
-	if (user)
 
-		/*
-		 * SQL requires a string literal here.	Might as well be correct.
-		 */
+	/*
+	 * SQL requires a string literal here.	Might as well be correct.
+	 */
+	if (user && *user)
 		appendStringLiteral(cmd, user, false);
 	else
 		appendPQExpBuffer(cmd, "DEFAULT");
@@ -2126,34 +2064,17 @@ _doSetSessionAuth(ArchiveHandle *AH, const char *user)
 
 
 /*
- * Issue the commands to connect to the database as the specified user
- * to the specified database.  The database name may be NULL, then the
- * current database is kept.  If reconnects were disallowed by the
- * user, this won't do anything.
+ * Issue the commands to connect to the specified database
+ * as the specified user.
  *
  * If we're currently restoring right into a database, this will
  * actually establish a connection. Otherwise it puts a \connect into
  * the script output.
  */
 static void
-_reconnectAsUser(ArchiveHandle *AH, const char *dbname, const char *user)
+_reconnectToDB(ArchiveHandle *AH, const char *dbname, const char *user)
 {
-	if (!user || strlen(user) == 0
-		|| (strcmp(AH->currUser, user) == 0 && !dbname))
-		return;					/* no need to do anything */
-
-	/*
-	 * Use SET SESSION AUTHORIZATION if allowed and no database change
-	 * needed
-	 */
-	if (!dbname && AH->ropt->use_setsessauth)
-		_doSetSessionAuth(AH, user);
-	else if (AH->ropt && AH->ropt->noReconnect)
-	{
-		/* When -R was given, don't do anything. */
-		return;
-	}
-	else if (RestoringToDB(AH))
+	if (RestoringToDB(AH))
 		ReconnectToServer(AH, dbname, user);
 	else
 	{
@@ -2167,11 +2088,6 @@ _reconnectAsUser(ArchiveHandle *AH, const char *dbname, const char *user)
 		ahprintf(AH, qry->data);
 
 		destroyPQExpBuffer(qry);
-
-		/* don't assume we still know the output schema */
-		if (AH->currSchema)
-			free(AH->currSchema);
-		AH->currSchema = strdup("");
 	}
 
 	/*
@@ -2182,21 +2098,50 @@ _reconnectAsUser(ArchiveHandle *AH, const char *dbname, const char *user)
 		free(AH->currUser);
 
 	AH->currUser = strdup(user);
+
+	/* don't assume we still know the output schema */
+	if (AH->currSchema)
+		free(AH->currSchema);
+	AH->currSchema = strdup("");
 }
 
+/*
+ * Become the specified user, and update state to avoid redundant commands
+ *
+ * NULL or empty argument is taken to mean restoring the session default
+ */
+static void
+_becomeUser(ArchiveHandle *AH, const char *user)
+{
+	if (!user)
+		user = "";				/* avoid null pointers */
+
+	if (AH->currUser && strcmp(AH->currUser, user) == 0)
+		return;					/* no need to do anything */
+
+	_doSetSessionAuth(AH, user);
+
+	/*
+	 * NOTE: currUser keeps track of what the imaginary session user in
+	 * our script is
+	 */
+	if (AH->currUser)
+		free(AH->currUser);
+
+	AH->currUser = strdup(user);
+}
 
 /*
- * Issues the commands to connect to the database (or the current one,
- * if NULL) as the owner of the the given TOC entry object.  If
+ * Become the owner of the the given TOC entry object.  If
  * changes in ownership are not allowed, this doesn't do anything.
  */
 static void
-_reconnectAsOwner(ArchiveHandle *AH, const char *dbname, TocEntry *te)
+_becomeOwner(ArchiveHandle *AH, TocEntry *te)
 {
 	if (AH->ropt && AH->ropt->noOwner)
 		return;
 
-	_reconnectAsUser(AH, dbname, te->owner);
+	_becomeUser(AH, te->owner);
 }
 
 
@@ -2250,7 +2195,7 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt, bool isDat
 	char	   *pfx;
 
 	/* Select owner and schema as necessary */
-	_reconnectAsOwner(AH, NULL, te);
+	_becomeOwner(AH, te);
 	_selectOutputSchema(AH, te->namespace);
 
 	if (isData)
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 010e6753ed7..501cf59f1e4 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -12,7 +12,7 @@
  *	by PostgreSQL
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.348 2003/09/22 00:23:34 petere Exp $
+ *	  $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.349 2003/09/23 22:48:53 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -174,7 +174,6 @@ main(int argc, char **argv)
 	int			outputCreate = 0;
 	int			outputBlobs = 0;
 	int			outputNoOwner = 0;
-	int			outputNoReconnect = 0;
 	static int	use_setsessauth = 0;
 	static int	disable_triggers = 0;
 	char	   *outputSuperuser = NULL;
@@ -322,8 +321,8 @@ main(int argc, char **argv)
 				pgport = optarg;
 				break;
 
-			case 'R':			/* No reconnect */
-				outputNoReconnect = 1;
+			case 'R':
+				/* no-op, still accepted for backwards compatibility */
 				break;
 
 			case 's':			/* dump schema only */
@@ -369,7 +368,7 @@ main(int argc, char **argv)
 				 */
 			case 'X':
 				if (strcmp(optarg, "use-set-session-authorization") == 0)
-					use_setsessauth = 1;
+					/* no-op, still allowed for compatibility */ ;
 				else if (strcmp(optarg, "disable-triggers") == 0)
 					disable_triggers = 1;
 				else
@@ -585,8 +584,6 @@ main(int argc, char **argv)
 		ropt->superuser = outputSuperuser;
 		ropt->create = outputCreate;
 		ropt->noOwner = outputNoOwner;
-		ropt->noReconnect = outputNoReconnect;
-		ropt->use_setsessauth = use_setsessauth;
 		ropt->disable_triggers = disable_triggers;
 
 		if (compressLevel == -1)
@@ -633,18 +630,13 @@ help(const char *progname)
 	printf(_("  -D, --column-inserts     dump data as INSERT commands with column names\n"));
 	printf(_("  -n, --schema=SCHEMA      dump the named schema only\n"));
 	printf(_("  -o, --oids               include OIDs in dump\n"));
-	printf(_("  -O, --no-owner           do not output \\connect commands in plain\n"
-			 "                           text format\n"));
-	printf(_("  -R, --no-reconnect       disable ALL reconnections to the database in\n"
-			 "                           plain text format\n"));
+	printf(_("  -O, --no-owner           do not output commands to set object ownership\n"
+			 "                           in plain text format\n"));
 	printf(_("  -s, --schema-only        dump only the schema, no data\n"));
 	printf(_("  -S, --superuser=NAME     specify the superuser user name to use in\n"
 			 "                           plain text format\n"));
 	printf(_("  -t, --table=TABLE        dump the named table only\n"));
 	printf(_("  -x, --no-privileges      do not dump privileges (grant/revoke)\n"));
-	printf(_("  -X use-set-session-authorization, --use-set-session-authorization\n"
-			 "                           output SET SESSION AUTHORIZATION commands rather\n"
-			 "                           than \\connect commands\n"));
 	printf(_("  -X disable-triggers, --disable-triggers\n"
 			 "                           disable triggers during data-only restore\n"));
 
diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c
index 8c83254c817..e0853690f87 100644
--- a/src/bin/pg_dump/pg_dumpall.c
+++ b/src/bin/pg_dump/pg_dumpall.c
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  *
- * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dumpall.c,v 1.27 2003/08/07 21:11:58 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dumpall.c,v 1.28 2003/09/23 22:48:53 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -659,8 +659,7 @@ runPgDump(const char *dbname)
 	const char *p;
 	int			ret;
 
-	appendPQExpBuffer(cmd, "%s %s -X use-set-session-authorization -Fp '",
-					  pgdumploc, pgdumpopts->data);
+	appendPQExpBuffer(cmd, "%s %s -Fp '", pgdumploc, pgdumpopts->data);
 
 	/* Shell quoting is not quite like SQL quoting, so can't use fmtId */
 	for (p = dbname; *p; p++)
diff --git a/src/bin/pg_dump/pg_restore.c b/src/bin/pg_dump/pg_restore.c
index e2726b88175..2414de8f5c9 100644
--- a/src/bin/pg_dump/pg_restore.c
+++ b/src/bin/pg_dump/pg_restore.c
@@ -34,7 +34,7 @@
  *
  *
  * IDENTIFICATION
- *		$Header: /cvsroot/pgsql/src/bin/pg_dump/pg_restore.c,v 1.51 2003/08/28 20:21:34 tgl Exp $
+ *		$Header: /cvsroot/pgsql/src/bin/pg_dump/pg_restore.c,v 1.52 2003/09/23 22:48:53 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -209,7 +209,7 @@ main(int argc, char **argv)
 				opts->rearrange = 1;
 				break;
 			case 'R':
-				opts->noReconnect = 1;
+				/* no-op, still accepted for backwards compatibility */
 				break;
 			case 'P':			/* Function */
 				opts->selTypes = 1;
@@ -262,7 +262,7 @@ main(int argc, char **argv)
 
 			case 'X':
 				if (strcmp(optarg, "use-set-session-authorization") == 0)
-					use_setsessauth = 1;
+					/* no-op, still allowed for compatibility */ ;
 				else if (strcmp(optarg, "disable-triggers") == 0)
 					disable_triggers = 1;
 				else
@@ -290,7 +290,6 @@ main(int argc, char **argv)
 	else
 		fileSpec = NULL;
 
-	opts->use_setsessauth = use_setsessauth;
 	opts->disable_triggers = disable_triggers;
 
 	if (opts->formatName)
@@ -378,21 +377,16 @@ usage(const char *progname)
 			 "                           output from this file\n"));
 	printf(_("  -N, --orig-order         restore in original dump order\n"));
 	printf(_("  -o, --oid-order          restore in OID order\n"));
-	printf(_("  -O, --no-owner           do not reconnect to database to match\n"
-			 "                           object owner\n"));
+	printf(_("  -O, --no-owner           do not output commands to set object ownership\n"));
 	printf(_("  -P, --function=NAME(args)\n"
 			 "                           restore named function\n"));
 	printf(_("  -r, --rearrange          rearrange output to put indexes etc. at end\n"));
-	printf(_("  -R, --no-reconnect       disallow ALL reconnections to the database\n"));
 	printf(_("  -s, --schema-only        restore only the schema, no data\n"));
 	printf(_("  -S, --superuser=NAME     specify the superuser user name to use for\n"
 			 "                           disabling triggers\n"));
 	printf(_("  -t, --table=NAME         restore named table\n"));
 	printf(_("  -T, --trigger=NAME       restore named trigger\n"));
 	printf(_("  -x, --no-privileges      skip restoration of access privileges (grant/revoke)\n"));
-	printf(_("  -X use-set-session-authorization, --use-set-session-authorization\n"
-			 "                           use SET SESSION AUTHORIZATION commands instead\n"
-		   "                           of reconnecting, if possible\n"));
 	printf(_("  -X disable-triggers, --disable-triggers\n"
 			 "                           disable triggers during data-only restore\n"));
 
-- 
GitLab