diff --git a/src/bin/pg_dump/common.c b/src/bin/pg_dump/common.c
index 7869ee9..3b4e478 100644
*** a/src/bin/pg_dump/common.c
--- b/src/bin/pg_dump/common.c
*************** static int	strInArray(const char *patter
*** 81,87 ****
   *	  Collect information about all potentially dumpable objects
   */
  TableInfo *
! getSchemaData(Archive *fout, DumpOptions *dopt, int *numTablesPtr)
  {
  	ExtensionInfo *extinfo;
  	InhInfo    *inhinfo;
--- 81,87 ----
   *	  Collect information about all potentially dumpable objects
   */
  TableInfo *
! getSchemaData(Archive *fout, int *numTablesPtr)
  {
  	ExtensionInfo *extinfo;
  	InhInfo    *inhinfo;
*************** getSchemaData(Archive *fout, DumpOptions
*** 118,124 ****
  	 */
  	if (g_verbose)
  		write_msg(NULL, "reading user-defined tables\n");
! 	tblinfo = getTables(fout, dopt, &numTables);
  	tblinfoindex = buildIndexArray(tblinfo, numTables, sizeof(TableInfo));
  
  	/* Do this after we've built tblinfoindex */
--- 118,124 ----
  	 */
  	if (g_verbose)
  		write_msg(NULL, "reading user-defined tables\n");
! 	tblinfo = getTables(fout, &numTables);
  	tblinfoindex = buildIndexArray(tblinfo, numTables, sizeof(TableInfo));
  
  	/* Do this after we've built tblinfoindex */
*************** getSchemaData(Archive *fout, DumpOptions
*** 126,136 ****
  
  	if (g_verbose)
  		write_msg(NULL, "reading extensions\n");
! 	extinfo = getExtensions(fout, dopt, &numExtensions);
  
  	if (g_verbose)
  		write_msg(NULL, "reading user-defined functions\n");
! 	funinfo = getFuncs(fout, dopt, &numFuncs);
  	funinfoindex = buildIndexArray(funinfo, numFuncs, sizeof(FuncInfo));
  
  	/* this must be after getTables and getFuncs */
--- 126,136 ----
  
  	if (g_verbose)
  		write_msg(NULL, "reading extensions\n");
! 	extinfo = getExtensions(fout, &numExtensions);
  
  	if (g_verbose)
  		write_msg(NULL, "reading user-defined functions\n");
! 	funinfo = getFuncs(fout, &numFuncs);
  	funinfoindex = buildIndexArray(funinfo, numFuncs, sizeof(FuncInfo));
  
  	/* this must be after getTables and getFuncs */
*************** getSchemaData(Archive *fout, DumpOptions
*** 146,152 ****
  
  	if (g_verbose)
  		write_msg(NULL, "reading user-defined aggregate functions\n");
! 	getAggregates(fout, dopt, &numAggregates);
  
  	if (g_verbose)
  		write_msg(NULL, "reading user-defined operators\n");
--- 146,152 ----
  
  	if (g_verbose)
  		write_msg(NULL, "reading user-defined aggregate functions\n");
! 	getAggregates(fout, &numAggregates);
  
  	if (g_verbose)
  		write_msg(NULL, "reading user-defined operators\n");
*************** getSchemaData(Archive *fout, DumpOptions
*** 187,193 ****
  
  	if (g_verbose)
  		write_msg(NULL, "reading default privileges\n");
! 	getDefaultACLs(fout, dopt, &numDefaultACLs);
  
  	if (g_verbose)
  		write_msg(NULL, "reading user-defined collations\n");
--- 187,193 ----
  
  	if (g_verbose)
  		write_msg(NULL, "reading default privileges\n");
! 	getDefaultACLs(fout, &numDefaultACLs);
  
  	if (g_verbose)
  		write_msg(NULL, "reading user-defined collations\n");
*************** getSchemaData(Archive *fout, DumpOptions
*** 200,206 ****
  
  	if (g_verbose)
  		write_msg(NULL, "reading type casts\n");
! 	getCasts(fout, dopt, &numCasts);
  
  	if (g_verbose)
  		write_msg(NULL, "reading transforms\n");
--- 200,206 ----
  
  	if (g_verbose)
  		write_msg(NULL, "reading type casts\n");
! 	getCasts(fout, &numCasts);
  
  	if (g_verbose)
  		write_msg(NULL, "reading transforms\n");
*************** getSchemaData(Archive *fout, DumpOptions
*** 221,227 ****
  	 */
  	if (g_verbose)
  		write_msg(NULL, "finding extension members\n");
! 	getExtensionMembership(fout, dopt, extinfo, numExtensions);
  
  	/* Link tables to parents, mark parents of target tables interesting */
  	if (g_verbose)
--- 221,227 ----
  	 */
  	if (g_verbose)
  		write_msg(NULL, "finding extension members\n");
! 	getExtensionMembership(fout, extinfo, numExtensions);
  
  	/* Link tables to parents, mark parents of target tables interesting */
  	if (g_verbose)
*************** getSchemaData(Archive *fout, DumpOptions
*** 230,240 ****
  
  	if (g_verbose)
  		write_msg(NULL, "reading column info for interesting tables\n");
! 	getTableAttrs(fout, dopt, tblinfo, numTables);
  
  	if (g_verbose)
  		write_msg(NULL, "flagging inherited columns in subtables\n");
! 	flagInhAttrs(dopt, tblinfo, numTables);
  
  	if (g_verbose)
  		write_msg(NULL, "reading indexes\n");
--- 230,240 ----
  
  	if (g_verbose)
  		write_msg(NULL, "reading column info for interesting tables\n");
! 	getTableAttrs(fout, tblinfo, numTables);
  
  	if (g_verbose)
  		write_msg(NULL, "flagging inherited columns in subtables\n");
! 	flagInhAttrs(fout->dopt, tblinfo, numTables);
  
  	if (g_verbose)
  		write_msg(NULL, "reading indexes\n");
diff --git a/src/bin/pg_dump/parallel.c b/src/bin/pg_dump/parallel.c
index ce5e472..d8bd9a9 100644
*** a/src/bin/pg_dump/parallel.c
--- b/src/bin/pg_dump/parallel.c
*************** static int	piperead(int s, char *buf, in
*** 46,53 ****
  typedef struct
  {
  	ArchiveHandle *AH;
- 	RestoreOptions *ropt;
- 	DumpOptions *dopt;
  	int			worker;
  	int			pipeRead;
  	int			pipeWrite;
--- 46,51 ----
*************** static void WaitForTerminatingWorkers(Pa
*** 87,99 ****
  #ifndef WIN32
  static void sigTermHandler(int signum);
  #endif
! static void SetupWorker(ArchiveHandle *AH, int pipefd[2], int worker,
! 			DumpOptions *dopt,
! 			RestoreOptions *ropt);
  static bool HasEveryWorkerTerminated(ParallelState *pstate);
  
  static void lockTableNoWait(ArchiveHandle *AH, TocEntry *te);
! static void WaitForCommands(ArchiveHandle *AH, DumpOptions *dopt, int pipefd[2]);
  static char *getMessageFromMaster(int pipefd[2]);
  static void sendMessageToMaster(int pipefd[2], const char *str);
  static int	select_loop(int maxFd, fd_set *workerset);
--- 85,95 ----
  #ifndef WIN32
  static void sigTermHandler(int signum);
  #endif
! static void SetupWorker(ArchiveHandle *AH, int pipefd[2], int worker);
  static bool HasEveryWorkerTerminated(ParallelState *pstate);
  
  static void lockTableNoWait(ArchiveHandle *AH, TocEntry *te);
! static void WaitForCommands(ArchiveHandle *AH, int pipefd[2]);
  static char *getMessageFromMaster(int pipefd[2]);
  static void sendMessageToMaster(int pipefd[2], const char *str);
  static int	select_loop(int maxFd, fd_set *workerset);
*************** sigTermHandler(int signum)
*** 435,443 ****
   * worker process.
   */
  static void
! SetupWorker(ArchiveHandle *AH, int pipefd[2], int worker,
! 			DumpOptions *dopt,
! 			RestoreOptions *ropt)
  {
  	/*
  	 * Call the setup worker function that's defined in the ArchiveHandle.
--- 431,437 ----
   * worker process.
   */
  static void
! SetupWorker(ArchiveHandle *AH, int pipefd[2], int worker)
  {
  	/*
  	 * Call the setup worker function that's defined in the ArchiveHandle.
*************** SetupWorker(ArchiveHandle *AH, int pipef
*** 446,456 ****
  	 * properly when we shut down. This happens only that way when it is
  	 * brought down because of an error.
  	 */
! 	(AH->SetupWorkerPtr) ((Archive *) AH, dopt, ropt);
  
  	Assert(AH->connection != NULL);
  
! 	WaitForCommands(AH, dopt, pipefd);
  
  	closesocket(pipefd[PIPE_READ]);
  	closesocket(pipefd[PIPE_WRITE]);
--- 440,450 ----
  	 * properly when we shut down. This happens only that way when it is
  	 * brought down because of an error.
  	 */
! 	(AH->SetupWorkerPtr) ((Archive *) AH);
  
  	Assert(AH->connection != NULL);
  
! 	WaitForCommands(AH, pipefd);
  
  	closesocket(pipefd[PIPE_READ]);
  	closesocket(pipefd[PIPE_WRITE]);
*************** init_spawned_worker_win32(WorkerInfo *wi
*** 463,475 ****
  	ArchiveHandle *AH;
  	int			pipefd[2] = {wi->pipeRead, wi->pipeWrite};
  	int			worker = wi->worker;
- 	DumpOptions *dopt = wi->dopt;
- 	RestoreOptions *ropt = wi->ropt;
  
  	AH = CloneArchive(wi->AH);
  
  	free(wi);
! 	SetupWorker(AH, pipefd, worker, dopt, ropt);
  
  	DeCloneArchive(AH);
  	_endthreadex(0);
--- 457,467 ----
  	ArchiveHandle *AH;
  	int			pipefd[2] = {wi->pipeRead, wi->pipeWrite};
  	int			worker = wi->worker;
  
  	AH = CloneArchive(wi->AH);
  
  	free(wi);
! 	SetupWorker(AH, pipefd, worker);
  
  	DeCloneArchive(AH);
  	_endthreadex(0);
*************** init_spawned_worker_win32(WorkerInfo *wi
*** 483,489 ****
   * of threads while it does a fork() on Unix.
   */
  ParallelState *
! ParallelBackupStart(ArchiveHandle *AH, DumpOptions *dopt, RestoreOptions *ropt)
  {
  	ParallelState *pstate;
  	int			i;
--- 475,481 ----
   * of threads while it does a fork() on Unix.
   */
  ParallelState *
! ParallelBackupStart(ArchiveHandle *AH)
  {
  	ParallelState *pstate;
  	int			i;
*************** ParallelBackupStart(ArchiveHandle *AH, D
*** 545,552 ****
  		/* Allocate a new structure for every worker */
  		wi = (WorkerInfo *) pg_malloc(sizeof(WorkerInfo));
  
- 		wi->ropt = ropt;
- 		wi->dopt = dopt;
  		wi->worker = i;
  		wi->AH = AH;
  		wi->pipeRead = pstate->parallelSlot[i].pipeRevRead = pipeMW[PIPE_READ];
--- 537,542 ----
*************** ParallelBackupStart(ArchiveHandle *AH, D
*** 601,607 ****
  				closesocket(pstate->parallelSlot[j].pipeWrite);
  			}
  
! 			SetupWorker(pstate->parallelSlot[i].args->AH, pipefd, i, dopt, ropt);
  
  			exit(0);
  		}
--- 591,597 ----
  				closesocket(pstate->parallelSlot[j].pipeWrite);
  			}
  
! 			SetupWorker(pstate->parallelSlot[i].args->AH, pipefd, i);
  
  			exit(0);
  		}
*************** lockTableNoWait(ArchiveHandle *AH, TocEn
*** 859,865 ****
   * exit.
   */
  static void
! WaitForCommands(ArchiveHandle *AH, DumpOptions *dopt, int pipefd[2])
  {
  	char	   *command;
  	DumpId		dumpId;
--- 849,855 ----
   * exit.
   */
  static void
! WaitForCommands(ArchiveHandle *AH, int pipefd[2])
  {
  	char	   *command;
  	DumpId		dumpId;
*************** WaitForCommands(ArchiveHandle *AH, DumpO
*** 899,905 ****
  			 * The message we return here has been pg_malloc()ed and we are
  			 * responsible for free()ing it.
  			 */
! 			str = (AH->WorkerJobDumpPtr) (AH, dopt, te);
  			Assert(AH->connection != NULL);
  			sendMessageToMaster(pipefd, str);
  			free(str);
--- 889,895 ----
  			 * The message we return here has been pg_malloc()ed and we are
  			 * responsible for free()ing it.
  			 */
! 			str = (AH->WorkerJobDumpPtr) (AH, te);
  			Assert(AH->connection != NULL);
  			sendMessageToMaster(pipefd, str);
  			free(str);
diff --git a/src/bin/pg_dump/parallel.h b/src/bin/pg_dump/parallel.h
index ecceb4e..591653b 100644
*** a/src/bin/pg_dump/parallel.h
--- b/src/bin/pg_dump/parallel.h
*************** extern int	ReapWorkerStatus(ParallelStat
*** 76,84 ****
  extern void EnsureIdleWorker(ArchiveHandle *AH, ParallelState *pstate);
  extern void EnsureWorkersFinished(ArchiveHandle *AH, ParallelState *pstate);
  
! extern ParallelState *ParallelBackupStart(ArchiveHandle *AH,
! 					DumpOptions *dopt,
! 					RestoreOptions *ropt);
  extern void DispatchJobForTocEntry(ArchiveHandle *AH,
  					   ParallelState *pstate,
  					   TocEntry *te, T_Action act);
--- 76,82 ----
  extern void EnsureIdleWorker(ArchiveHandle *AH, ParallelState *pstate);
  extern void EnsureWorkersFinished(ArchiveHandle *AH, ParallelState *pstate);
  
! extern ParallelState *ParallelBackupStart(ArchiveHandle *AH);
  extern void DispatchJobForTocEntry(ArchiveHandle *AH,
  					   ParallelState *pstate,
  					   TocEntry *te, T_Action act);
diff --git a/src/bin/pg_dump/pg_backup.h b/src/bin/pg_dump/pg_backup.h
index 7126749..26061e7 100644
*** a/src/bin/pg_dump/pg_backup.h
--- b/src/bin/pg_dump/pg_backup.h
*************** typedef enum _teSection
*** 58,92 ****
  	SECTION_POST_DATA			/* stuff to be processed after data */
  } teSection;
  
- /*
-  *	We may want to have some more user-readable data, but in the mean
-  *	time this gives us some abstraction and type checking.
-  */
- typedef struct Archive
- {
- 	int			verbose;
- 	char	   *remoteVersionStr;		/* server's version string */
- 	int			remoteVersion;	/* same in numeric form */
- 
- 	int			minRemoteVersion;		/* allowable range */
- 	int			maxRemoteVersion;
- 
- 	int			numWorkers;		/* number of parallel processes */
- 	char	   *sync_snapshot_id;		/* sync snapshot id for parallel
- 										 * operation */
- 
- 	/* info needed for string escaping */
- 	int			encoding;		/* libpq code for client_encoding */
- 	bool		std_strings;	/* standard_conforming_strings */
- 	char	   *use_role;		/* Issue SET ROLE to this */
- 
- 	/* error handling */
- 	bool		exit_on_error;	/* whether to exit on SQL errors... */
- 	int			n_errors;		/* number of errors (if no die) */
- 
- 	/* The rest is private */
- } Archive;
- 
  typedef struct _restoreOptions
  {
  	int			createDB;		/* Issue commands to create the database */
--- 58,63 ----
*************** typedef struct _dumpOptions
*** 190,195 ****
--- 161,198 ----
  	char	   *outputSuperuser;
  } DumpOptions;
  
+ /*
+  *	We may want to have some more user-readable data, but in the mean
+  *	time this gives us some abstraction and type checking.
+  */
+ typedef struct Archive
+ {
+ 	DumpOptions *dopt;			/* options, if dumping */
+ 	RestoreOptions *ropt;		/* options, if restoring */
+ 
+ 	int			verbose;
+ 	char	   *remoteVersionStr;		/* server's version string */
+ 	int			remoteVersion;	/* same in numeric form */
+ 
+ 	int			minRemoteVersion;		/* allowable range */
+ 	int			maxRemoteVersion;
+ 
+ 	int			numWorkers;		/* number of parallel processes */
+ 	char	   *sync_snapshot_id;		/* sync snapshot id for parallel
+ 										 * operation */
+ 
+ 	/* info needed for string escaping */
+ 	int			encoding;		/* libpq code for client_encoding */
+ 	bool		std_strings;	/* standard_conforming_strings */
+ 	char	   *use_role;		/* Issue SET ROLE to this */
+ 
+ 	/* error handling */
+ 	bool		exit_on_error;	/* whether to exit on SQL errors... */
+ 	int			n_errors;		/* number of errors (if no die) */
+ 
+ 	/* The rest is private */
+ } Archive;
+ 
  
  /*
   * pg_dump uses two different mechanisms for identifying database objects:
*************** typedef struct
*** 215,223 ****
  
  typedef int DumpId;
  
! typedef int (*DataDumperPtr) (Archive *AH, DumpOptions *dopt, void *userArg);
  
! typedef void (*SetupWorkerPtr) (Archive *AH, DumpOptions *dopt, RestoreOptions *ropt);
  
  /*
   * Main archiver interface.
--- 218,226 ----
  
  typedef int DumpId;
  
! typedef int (*DataDumperPtr) (Archive *AH, void *userArg);
  
! typedef void (*SetupWorkerPtr) (Archive *AH);
  
  /*
   * Main archiver interface.
*************** extern void WriteData(Archive *AH, const
*** 250,258 ****
  extern int	StartBlob(Archive *AH, Oid oid);
  extern int	EndBlob(Archive *AH, Oid oid);
  
! extern void CloseArchive(Archive *AH, DumpOptions *dopt);
  
! extern void SetArchiveRestoreOptions(Archive *AH, RestoreOptions *ropt);
  
  extern void RestoreArchive(Archive *AH);
  
--- 253,263 ----
  extern int	StartBlob(Archive *AH, Oid oid);
  extern int	EndBlob(Archive *AH, Oid oid);
  
! extern void CloseArchive(Archive *AH);
  
! extern void SetArchiveOptions(Archive *AH, DumpOptions *dopt, RestoreOptions *ropt);
! 
! extern void ProcessArchiveRestoreOptions(Archive *AH);
  
  extern void RestoreArchive(Archive *AH);
  
*************** extern Archive *CreateArchive(const char
*** 265,271 ****
  			  SetupWorkerPtr setupDumpWorker);
  
  /* The --list option */
! extern void PrintTOCSummary(Archive *AH, RestoreOptions *ropt);
  
  extern RestoreOptions *NewRestoreOptions(void);
  
--- 270,276 ----
  			  SetupWorkerPtr setupDumpWorker);
  
  /* The --list option */
! extern void PrintTOCSummary(Archive *AH);
  
  extern RestoreOptions *NewRestoreOptions(void);
  
*************** extern void InitDumpOptions(DumpOptions 
*** 274,280 ****
  extern DumpOptions *dumpOptionsFromRestoreOptions(RestoreOptions *ropt);
  
  /* Rearrange and filter TOC entries */
! extern void SortTocFromFile(Archive *AHX, RestoreOptions *ropt);
  
  /* Convenience functions used only when writing DATA */
  extern void archputs(const char *s, Archive *AH);
--- 279,285 ----
  extern DumpOptions *dumpOptionsFromRestoreOptions(RestoreOptions *ropt);
  
  /* Rearrange and filter TOC entries */
! extern void SortTocFromFile(Archive *AHX);
  
  /* Convenience functions used only when writing DATA */
  extern void archputs(const char *s, Archive *AH);
diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c
index c33df4d..33e500e 100644
*** a/src/bin/pg_dump/pg_backup_archiver.c
--- b/src/bin/pg_dump/pg_backup_archiver.c
*************** static ArchiveHandle *_allocAH(const cha
*** 57,63 ****
  	 const int compression, ArchiveMode mode, SetupWorkerPtr setupWorkerPtr);
  static void _getObjectDescription(PQExpBuffer buf, TocEntry *te,
  					  ArchiveHandle *AH);
! static void _printTocEntry(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt, bool isData, bool acl_pass);
  static char *replace_line_endings(const char *str);
  static void _doSetFixedOutputState(ArchiveHandle *AH);
  static void _doSetSessionAuth(ArchiveHandle *AH, const char *user);
--- 57,63 ----
  	 const int compression, ArchiveMode mode, SetupWorkerPtr setupWorkerPtr);
  static void _getObjectDescription(PQExpBuffer buf, TocEntry *te,
  					  ArchiveHandle *AH);
! static void _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData, bool acl_pass);
  static char *replace_line_endings(const char *str);
  static void _doSetFixedOutputState(ArchiveHandle *AH);
  static void _doSetSessionAuth(ArchiveHandle *AH, const char *user);
*************** static void processEncodingEntry(Archive
*** 71,78 ****
  static void processStdStringsEntry(ArchiveHandle *AH, TocEntry *te);
  static teReqs _tocEntryRequired(TocEntry *te, teSection curSection, RestoreOptions *ropt);
  static bool _tocEntryIsACL(TocEntry *te);
! static void _disableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt);
! static void _enableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt);
  static void buildTocEntryArrays(ArchiveHandle *AH);
  static void _moveBefore(ArchiveHandle *AH, TocEntry *pos, TocEntry *te);
  static int	_discoverArchiveFormat(ArchiveHandle *AH);
--- 71,78 ----
  static void processStdStringsEntry(ArchiveHandle *AH, TocEntry *te);
  static teReqs _tocEntryRequired(TocEntry *te, teSection curSection, RestoreOptions *ropt);
  static bool _tocEntryIsACL(TocEntry *te);
! static void _disableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te);
! static void _enableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te);
  static void buildTocEntryArrays(ArchiveHandle *AH);
  static void _moveBefore(ArchiveHandle *AH, TocEntry *pos, TocEntry *te);
  static int	_discoverArchiveFormat(ArchiveHandle *AH);
*************** static void SetOutput(ArchiveHandle *AH,
*** 84,91 ****
  static OutputContext SaveOutput(ArchiveHandle *AH);
  static void RestoreOutput(ArchiveHandle *AH, OutputContext savedContext);
  
! static int restore_toc_entry(ArchiveHandle *AH, TocEntry *te,
! 				  RestoreOptions *ropt, bool is_parallel);
  static void restore_toc_entries_prefork(ArchiveHandle *AH);
  static void restore_toc_entries_parallel(ArchiveHandle *AH, ParallelState *pstate,
  							 TocEntry *pending_list);
--- 84,90 ----
  static OutputContext SaveOutput(ArchiveHandle *AH);
  static void RestoreOutput(ArchiveHandle *AH, OutputContext savedContext);
  
! static int restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel);
  static void restore_toc_entries_prefork(ArchiveHandle *AH);
  static void restore_toc_entries_parallel(ArchiveHandle *AH, ParallelState *pstate,
  							 TocEntry *pending_list);
*************** dumpOptionsFromRestoreOptions(RestoreOpt
*** 184,190 ****
   * setup doesn't need to know anything much, so it's defined here.
   */
  static void
! setupRestoreWorker(Archive *AHX, DumpOptions *dopt, RestoreOptions *ropt)
  {
  	ArchiveHandle *AH = (ArchiveHandle *) AHX;
  
--- 183,189 ----
   * setup doesn't need to know anything much, so it's defined here.
   */
  static void
! setupRestoreWorker(Archive *AHX)
  {
  	ArchiveHandle *AH = (ArchiveHandle *) AHX;
  
*************** OpenArchive(const char *FileSpec, const 
*** 216,227 ****
  
  /* Public */
  void
! CloseArchive(Archive *AHX, DumpOptions *dopt)
  {
  	int			res = 0;
  	ArchiveHandle *AH = (ArchiveHandle *) AHX;
  
! 	(*AH->ClosePtr) (AH, dopt);
  
  	/* Close the output */
  	if (AH->gzOut)
--- 215,226 ----
  
  /* Public */
  void
! CloseArchive(Archive *AHX)
  {
  	int			res = 0;
  	ArchiveHandle *AH = (ArchiveHandle *) AHX;
  
! 	(*AH->ClosePtr) (AH);
  
  	/* Close the output */
  	if (AH->gzOut)
*************** CloseArchive(Archive *AHX, DumpOptions *
*** 236,249 ****
  
  /* Public */
  void
! SetArchiveRestoreOptions(Archive *AHX, RestoreOptions *ropt)
  {
! 	ArchiveHandle *AH = (ArchiveHandle *) AHX;
! 	TocEntry   *te;
! 	teSection	curSection;
  
  	/* Save options for later access */
  	AH->ropt = ropt;
  
  	/* Decide which TOC entries will be dumped/restored, and mark them */
  	curSection = SECTION_PRE_DATA;
--- 235,259 ----
  
  /* Public */
  void
! SetArchiveOptions(Archive *AH, DumpOptions *dopt, RestoreOptions *ropt)
  {
! 	/* Caller can omit dump options, in which case we synthesize them */
! 	if (dopt == NULL && ropt != NULL)
! 		dopt = dumpOptionsFromRestoreOptions(ropt);
  
  	/* Save options for later access */
+ 	AH->dopt = dopt;
  	AH->ropt = ropt;
+ }
+ 
+ /* Public */
+ void
+ ProcessArchiveRestoreOptions(Archive *AHX)
+ {
+ 	ArchiveHandle *AH = (ArchiveHandle *) AHX;
+ 	RestoreOptions *ropt = AH->public.ropt;
+ 	TocEntry   *te;
+ 	teSection	curSection;
  
  	/* Decide which TOC entries will be dumped/restored, and mark them */
  	curSection = SECTION_PRE_DATA;
*************** void
*** 298,304 ****
  RestoreArchive(Archive *AHX)
  {
  	ArchiveHandle *AH = (ArchiveHandle *) AHX;
! 	RestoreOptions *ropt = AH->ropt;
  	bool		parallel_mode;
  	TocEntry   *te;
  	OutputContext sav;
--- 308,314 ----
  RestoreArchive(Archive *AHX)
  {
  	ArchiveHandle *AH = (ArchiveHandle *) AHX;
! 	RestoreOptions *ropt = AH->public.ropt;
  	bool		parallel_mode;
  	TocEntry   *te;
  	OutputContext sav;
*************** RestoreArchive(Archive *AHX)
*** 605,611 ****
  		Assert(AH->connection == NULL);
  
  		/* ParallelBackupStart() will actually fork the processes */
! 		pstate = ParallelBackupStart(AH, NULL, ropt);
  		restore_toc_entries_parallel(AH, pstate, &pending_list);
  		ParallelBackupEnd(AH, pstate);
  
--- 615,621 ----
  		Assert(AH->connection == NULL);
  
  		/* ParallelBackupStart() will actually fork the processes */
! 		pstate = ParallelBackupStart(AH);
  		restore_toc_entries_parallel(AH, pstate, &pending_list);
  		ParallelBackupEnd(AH, pstate);
  
*************** RestoreArchive(Archive *AHX)
*** 616,622 ****
  	else
  	{
  		for (te = AH->toc->next; te != AH->toc; te = te->next)
! 			(void) restore_toc_entry(AH, te, ropt, false);
  	}
  
  	/*
--- 626,632 ----
  	else
  	{
  		for (te = AH->toc->next; te != AH->toc; te = te->next)
! 			(void) restore_toc_entry(AH, te, false);
  	}
  
  	/*
*************** RestoreArchive(Archive *AHX)
*** 636,642 ****
  			else
  				ahlog(AH, 1, "setting owner and privileges for %s \"%s\"\n",
  					  te->desc, te->tag);
! 			_printTocEntry(AH, te, ropt, false, true);
  		}
  	}
  
--- 646,652 ----
  			else
  				ahlog(AH, 1, "setting owner and privileges for %s \"%s\"\n",
  					  te->desc, te->tag);
! 			_printTocEntry(AH, te, false, true);
  		}
  	}
  
*************** RestoreArchive(Archive *AHX)
*** 673,681 ****
   * the parallel parent has to make the corresponding status update.
   */
  static int
! restore_toc_entry(ArchiveHandle *AH, TocEntry *te,
! 				  RestoreOptions *ropt, bool is_parallel)
  {
  	int			status = WORKER_OK;
  	teReqs		reqs;
  	bool		defnDumped;
--- 683,691 ----
   * the parallel parent has to make the corresponding status update.
   */
  static int
! restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel)
  {
+ 	RestoreOptions *ropt = AH->public.ropt;
  	int			status = WORKER_OK;
  	teReqs		reqs;
  	bool		defnDumped;
*************** restore_toc_entry(ArchiveHandle *AH, Toc
*** 717,723 ****
  			ahlog(AH, 1, "creating %s \"%s\"\n", te->desc, te->tag);
  
  
! 		_printTocEntry(AH, te, ropt, false, false);
  		defnDumped = true;
  
  		if (strcmp(te->desc, "TABLE") == 0)
--- 727,733 ----
  			ahlog(AH, 1, "creating %s \"%s\"\n", te->desc, te->tag);
  
  
! 		_printTocEntry(AH, te, false, false);
  		defnDumped = true;
  
  		if (strcmp(te->desc, "TABLE") == 0)
*************** restore_toc_entry(ArchiveHandle *AH, Toc
*** 782,788 ****
  			 */
  			if (AH->PrintTocDataPtr !=NULL)
  			{
! 				_printTocEntry(AH, te, ropt, true, false);
  
  				if (strcmp(te->desc, "BLOBS") == 0 ||
  					strcmp(te->desc, "BLOB COMMENTS") == 0)
--- 792,798 ----
  			 */
  			if (AH->PrintTocDataPtr !=NULL)
  			{
! 				_printTocEntry(AH, te, true, false);
  
  				if (strcmp(te->desc, "BLOBS") == 0 ||
  					strcmp(te->desc, "BLOB COMMENTS") == 0)
*************** restore_toc_entry(ArchiveHandle *AH, Toc
*** 795,807 ****
  					if (strcmp(te->desc, "BLOB COMMENTS") == 0)
  						AH->outputKind = OUTPUT_OTHERDATA;
  
! 					(*AH->PrintTocDataPtr) (AH, te, ropt);
  
  					AH->outputKind = OUTPUT_SQLCMDS;
  				}
  				else
  				{
! 					_disableTriggersIfNecessary(AH, te, ropt);
  
  					/* Select owner and schema as necessary */
  					_becomeOwner(AH, te);
--- 805,817 ----
  					if (strcmp(te->desc, "BLOB COMMENTS") == 0)
  						AH->outputKind = OUTPUT_OTHERDATA;
  
! 					(*AH->PrintTocDataPtr) (AH, te);
  
  					AH->outputKind = OUTPUT_SQLCMDS;
  				}
  				else
  				{
! 					_disableTriggersIfNecessary(AH, te);
  
  					/* Select owner and schema as necessary */
  					_becomeOwner(AH, te);
*************** restore_toc_entry(ArchiveHandle *AH, Toc
*** 848,854 ****
  					else
  						AH->outputKind = OUTPUT_OTHERDATA;
  
! 					(*AH->PrintTocDataPtr) (AH, te, ropt);
  
  					/*
  					 * Terminate COPY if needed.
--- 858,864 ----
  					else
  						AH->outputKind = OUTPUT_OTHERDATA;
  
! 					(*AH->PrintTocDataPtr) (AH, te);
  
  					/*
  					 * Terminate COPY if needed.
*************** restore_toc_entry(ArchiveHandle *AH, Toc
*** 862,868 ****
  					if (is_parallel && te->created)
  						CommitTransaction(&AH->public);
  
! 					_enableTriggersIfNecessary(AH, te, ropt);
  				}
  			}
  		}
--- 872,878 ----
  					if (is_parallel && te->created)
  						CommitTransaction(&AH->public);
  
! 					_enableTriggersIfNecessary(AH, te);
  				}
  			}
  		}
*************** restore_toc_entry(ArchiveHandle *AH, Toc
*** 870,876 ****
  		{
  			/* If we haven't already dumped the defn part, do so now */
  			ahlog(AH, 1, "executing %s %s\n", te->desc, te->tag);
! 			_printTocEntry(AH, te, ropt, false, false);
  		}
  	}
  
--- 880,886 ----
  		{
  			/* If we haven't already dumped the defn part, do so now */
  			ahlog(AH, 1, "executing %s %s\n", te->desc, te->tag);
! 			_printTocEntry(AH, te, false, false);
  		}
  	}
  
*************** NewRestoreOptions(void)
*** 900,907 ****
  }
  
  static void
! _disableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt)
  {
  	/* This hack is only needed in a data-only restore */
  	if (!ropt->dataOnly || !ropt->disable_triggers)
  		return;
--- 910,919 ----
  }
  
  static void
! _disableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te)
  {
+ 	RestoreOptions *ropt = AH->public.ropt;
+ 
  	/* This hack is only needed in a data-only restore */
  	if (!ropt->dataOnly || !ropt->disable_triggers)
  		return;
*************** _disableTriggersIfNecessary(ArchiveHandl
*** 926,933 ****
  }
  
  static void
! _enableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt)
  {
  	/* This hack is only needed in a data-only restore */
  	if (!ropt->dataOnly || !ropt->disable_triggers)
  		return;
--- 938,947 ----
  }
  
  static void
! _enableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te)
  {
+ 	RestoreOptions *ropt = AH->public.ropt;
+ 
  	/* This hack is only needed in a data-only restore */
  	if (!ropt->dataOnly || !ropt->disable_triggers)
  		return;
*************** ArchiveEntry(Archive *AHX,
*** 1040,1048 ****
  
  /* Public */
  void
! PrintTOCSummary(Archive *AHX, RestoreOptions *ropt)
  {
  	ArchiveHandle *AH = (ArchiveHandle *) AHX;
  	TocEntry   *te;
  	teSection	curSection;
  	OutputContext sav;
--- 1054,1063 ----
  
  /* Public */
  void
! PrintTOCSummary(Archive *AHX)
  {
  	ArchiveHandle *AH = (ArchiveHandle *) AHX;
+ 	RestoreOptions *ropt = AH->public.ropt;
  	TocEntry   *te;
  	teSection	curSection;
  	OutputContext sav;
*************** EndBlob(Archive *AHX, Oid oid)
*** 1159,1165 ****
  void
  StartRestoreBlobs(ArchiveHandle *AH)
  {
! 	if (!AH->ropt->single_txn)
  	{
  		if (AH->connection)
  			StartTransaction(&AH->public);
--- 1174,1182 ----
  void
  StartRestoreBlobs(ArchiveHandle *AH)
  {
! 	RestoreOptions *ropt = AH->public.ropt;
! 
! 	if (!ropt->single_txn)
  	{
  		if (AH->connection)
  			StartTransaction(&AH->public);
*************** StartRestoreBlobs(ArchiveHandle *AH)
*** 1176,1182 ****
  void
  EndRestoreBlobs(ArchiveHandle *AH)
  {
! 	if (!AH->ropt->single_txn)
  	{
  		if (AH->connection)
  			CommitTransaction(&AH->public);
--- 1193,1201 ----
  void
  EndRestoreBlobs(ArchiveHandle *AH)
  {
! 	RestoreOptions *ropt = AH->public.ropt;
! 
! 	if (!ropt->single_txn)
  	{
  		if (AH->connection)
  			CommitTransaction(&AH->public);
*************** EndRestoreBlob(ArchiveHandle *AH, Oid oi
*** 1265,1273 ****
   ***********/
  
  void
! SortTocFromFile(Archive *AHX, RestoreOptions *ropt)
  {
  	ArchiveHandle *AH = (ArchiveHandle *) AHX;
  	FILE	   *fh;
  	char		buf[100];
  	bool		incomplete_line;
--- 1284,1293 ----
   ***********/
  
  void
! SortTocFromFile(Archive *AHX)
  {
  	ArchiveHandle *AH = (ArchiveHandle *) AHX;
+ 	RestoreOptions *ropt = AH->public.ropt;
  	FILE	   *fh;
  	char		buf[100];
  	bool		incomplete_line;
*************** ahlog(ArchiveHandle *AH, int level, cons
*** 1550,1556 ****
  static int
  RestoringToDB(ArchiveHandle *AH)
  {
! 	return (AH->ropt && AH->ropt->useDB && AH->connection);
  }
  
  /*
--- 1570,1578 ----
  static int
  RestoringToDB(ArchiveHandle *AH)
  {
! 	RestoreOptions *ropt = AH->public.ropt;
! 
! 	return (ropt && ropt->useDB && AH->connection);
  }
  
  /*
*************** _allocAH(const char *FileSpec, const Arc
*** 2303,2309 ****
  }
  
  void
! WriteDataChunks(ArchiveHandle *AH, DumpOptions *dopt, ParallelState *pstate)
  {
  	TocEntry   *te;
  
--- 2325,2331 ----
  }
  
  void
! WriteDataChunks(ArchiveHandle *AH, ParallelState *pstate)
  {
  	TocEntry   *te;
  
*************** WriteDataChunks(ArchiveHandle *AH, DumpO
*** 2326,2338 ****
  			DispatchJobForTocEntry(AH, pstate, te, ACT_DUMP);
  		}
  		else
! 			WriteDataChunksForTocEntry(AH, dopt, te);
  	}
  	EnsureWorkersFinished(AH, pstate);
  }
  
  void
! WriteDataChunksForTocEntry(ArchiveHandle *AH, DumpOptions *dopt, TocEntry *te)
  {
  	StartDataPtr startPtr;
  	EndDataPtr	endPtr;
--- 2348,2360 ----
  			DispatchJobForTocEntry(AH, pstate, te, ACT_DUMP);
  		}
  		else
! 			WriteDataChunksForTocEntry(AH, te);
  	}
  	EnsureWorkersFinished(AH, pstate);
  }
  
  void
! WriteDataChunksForTocEntry(ArchiveHandle *AH, TocEntry *te)
  {
  	StartDataPtr startPtr;
  	EndDataPtr	endPtr;
*************** WriteDataChunksForTocEntry(ArchiveHandle
*** 2356,2362 ****
  	/*
  	 * The user-provided DataDumper routine needs to call AH->WriteData
  	 */
! 	(*te->dataDumper) ((Archive *) AH, dopt, te->dataDumperArg);
  
  	if (endPtr != NULL)
  		(*endPtr) (AH, te);
--- 2378,2384 ----
  	/*
  	 * The user-provided DataDumper routine needs to call AH->WriteData
  	 */
! 	(*te->dataDumper) ((Archive *) AH, te->dataDumperArg);
  
  	if (endPtr != NULL)
  		(*endPtr) (AH, te);
*************** _tocEntryIsACL(TocEntry *te)
*** 2827,2832 ****
--- 2849,2856 ----
  static void
  _doSetFixedOutputState(ArchiveHandle *AH)
  {
+ 	RestoreOptions *ropt = AH->public.ropt;
+ 
  	/* Disable statement_timeout since restore is probably slow */
  	ahprintf(AH, "SET statement_timeout = 0;\n");
  
*************** _doSetFixedOutputState(ArchiveHandle *AH
*** 2842,2849 ****
  			 AH->public.std_strings ? "on" : "off");
  
  	/* Select the role to be used during restore */
! 	if (AH->ropt && AH->ropt->use_role)
! 		ahprintf(AH, "SET ROLE %s;\n", fmtId(AH->ropt->use_role));
  
  	/* Make sure function checking is disabled */
  	ahprintf(AH, "SET check_function_bodies = false;\n");
--- 2866,2873 ----
  			 AH->public.std_strings ? "on" : "off");
  
  	/* Select the role to be used during restore */
! 	if (ropt && ropt->use_role)
! 		ahprintf(AH, "SET ROLE %s;\n", fmtId(ropt->use_role));
  
  	/* Make sure function checking is disabled */
  	ahprintf(AH, "SET check_function_bodies = false;\n");
*************** _doSetFixedOutputState(ArchiveHandle *AH
*** 2854,2860 ****
  		ahprintf(AH, "SET escape_string_warning = off;\n");
  
  	/* Adjust row-security state */
! 	if (AH->ropt && AH->ropt->enable_row_security)
  		ahprintf(AH, "SET row_security = on;\n");
  	else
  		ahprintf(AH, "SET row_security = off;\n");
--- 2878,2884 ----
  		ahprintf(AH, "SET escape_string_warning = off;\n");
  
  	/* Adjust row-security state */
! 	if (ropt && ropt->enable_row_security)
  		ahprintf(AH, "SET row_security = on;\n");
  	else
  		ahprintf(AH, "SET row_security = off;\n");
*************** _becomeUser(ArchiveHandle *AH, const cha
*** 3012,3018 ****
  static void
  _becomeOwner(ArchiveHandle *AH, TocEntry *te)
  {
! 	if (AH->ropt && (AH->ropt->noOwner || !AH->ropt->use_setsessauth))
  		return;
  
  	_becomeUser(AH, te->owner);
--- 3036,3044 ----
  static void
  _becomeOwner(ArchiveHandle *AH, TocEntry *te)
  {
! 	RestoreOptions *ropt = AH->public.ropt;
! 
! 	if (ropt && (ropt->noOwner || !ropt->use_setsessauth))
  		return;
  
  	_becomeUser(AH, te->owner);
*************** _selectOutputSchema(ArchiveHandle *AH, c
*** 3083,3094 ****
  static void
  _selectTablespace(ArchiveHandle *AH, const char *tablespace)
  {
  	PQExpBuffer qry;
  	const char *want,
  			   *have;
  
  	/* do nothing in --no-tablespaces mode */
! 	if (AH->ropt->noTablespace)
  		return;
  
  	have = AH->currTablespace;
--- 3109,3121 ----
  static void
  _selectTablespace(ArchiveHandle *AH, const char *tablespace)
  {
+ 	RestoreOptions *ropt = AH->public.ropt;
  	PQExpBuffer qry;
  	const char *want,
  			   *have;
  
  	/* do nothing in --no-tablespaces mode */
! 	if (ropt->noTablespace)
  		return;
  
  	have = AH->currTablespace;
*************** _getObjectDescription(PQExpBuffer buf, T
*** 3214,3221 ****
  }
  
  static void
! _printTocEntry(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt, bool isData, bool acl_pass)
  {
  	/* ACLs are dumped only during acl pass */
  	if (acl_pass)
  	{
--- 3241,3250 ----
  }
  
  static void
! _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData, bool acl_pass)
  {
+ 	RestoreOptions *ropt = AH->public.ropt;
+ 
  	/* ACLs are dumped only during acl pass */
  	if (acl_pass)
  	{
*************** dumpTimestamp(ArchiveHandle *AH, const c
*** 3624,3630 ****
  static void
  restore_toc_entries_prefork(ArchiveHandle *AH)
  {
- 	RestoreOptions *ropt = AH->ropt;
  	bool		skipped_some;
  	TocEntry   *next_work_item;
  
--- 3653,3658 ----
*************** restore_toc_entries_prefork(ArchiveHandl
*** 3676,3682 ****
  			  next_work_item->dumpId,
  			  next_work_item->desc, next_work_item->tag);
  
! 		(void) restore_toc_entry(AH, next_work_item, ropt, false);
  
  		/* there should be no touch of ready_list here, so pass NULL */
  		reduce_dependencies(AH, next_work_item, NULL);
--- 3704,3710 ----
  			  next_work_item->dumpId,
  			  next_work_item->desc, next_work_item->tag);
  
! 		(void) restore_toc_entry(AH, next_work_item, false);
  
  		/* there should be no touch of ready_list here, so pass NULL */
  		reduce_dependencies(AH, next_work_item, NULL);
*************** restore_toc_entries_parallel(ArchiveHand
*** 3857,3863 ****
  static void
  restore_toc_entries_postfork(ArchiveHandle *AH, TocEntry *pending_list)
  {
! 	RestoreOptions *ropt = AH->ropt;
  	TocEntry   *te;
  
  	ahlog(AH, 2, "entering restore_toc_entries_postfork\n");
--- 3885,3891 ----
  static void
  restore_toc_entries_postfork(ArchiveHandle *AH, TocEntry *pending_list)
  {
! 	RestoreOptions *ropt = AH->public.ropt;
  	TocEntry   *te;
  
  	ahlog(AH, 2, "entering restore_toc_entries_postfork\n");
*************** restore_toc_entries_postfork(ArchiveHand
*** 3880,3886 ****
  	{
  		ahlog(AH, 1, "processing missed item %d %s %s\n",
  			  te->dumpId, te->desc, te->tag);
! 		(void) restore_toc_entry(AH, te, ropt, false);
  	}
  
  	/* The ACLs will be handled back in RestoreArchive. */
--- 3908,3914 ----
  	{
  		ahlog(AH, 1, "processing missed item %d %s %s\n",
  			  te->dumpId, te->desc, te->tag);
! 		(void) restore_toc_entry(AH, te, false);
  	}
  
  	/* The ACLs will be handled back in RestoreArchive. */
*************** parallel_restore(ParallelArgs *args)
*** 4045,4051 ****
  {
  	ArchiveHandle *AH = args->AH;
  	TocEntry   *te = args->te;
- 	RestoreOptions *ropt = AH->ropt;
  	int			status;
  
  	_doSetFixedOutputState(AH);
--- 4073,4078 ----
*************** parallel_restore(ParallelArgs *args)
*** 4055,4061 ****
  	AH->public.n_errors = 0;
  
  	/* Restore the TOC item */
! 	status = restore_toc_entry(AH, te, ropt, true);
  
  	return status;
  }
--- 4082,4088 ----
  	AH->public.n_errors = 0;
  
  	/* Restore the TOC item */
! 	status = restore_toc_entry(AH, te, true);
  
  	return status;
  }
*************** CloneArchive(ArchiveHandle *AH)
*** 4417,4423 ****
  	 */
  	if (AH->mode == archModeRead)
  	{
! 		RestoreOptions *ropt = AH->ropt;
  
  		Assert(AH->connection == NULL);
  		/* this also sets clone->connection */
--- 4444,4450 ----
  	 */
  	if (AH->mode == archModeRead)
  	{
! 		RestoreOptions *ropt = AH->public.ropt;
  
  		Assert(AH->connection == NULL);
  		/* this also sets clone->connection */
diff --git a/src/bin/pg_dump/pg_backup_archiver.h b/src/bin/pg_dump/pg_backup_archiver.h
index 620ada5..4aa7190 100644
*** a/src/bin/pg_dump/pg_backup_archiver.h
--- b/src/bin/pg_dump/pg_backup_archiver.h
*************** typedef enum T_Action
*** 136,142 ****
  	ACT_RESTORE
  } T_Action;
  
! typedef void (*ClosePtr) (ArchiveHandle *AH, DumpOptions *dopt);
  typedef void (*ReopenPtr) (ArchiveHandle *AH);
  typedef void (*ArchiveEntryPtr) (ArchiveHandle *AH, TocEntry *te);
  
--- 136,142 ----
  	ACT_RESTORE
  } T_Action;
  
! typedef void (*ClosePtr) (ArchiveHandle *AH);
  typedef void (*ReopenPtr) (ArchiveHandle *AH);
  typedef void (*ArchiveEntryPtr) (ArchiveHandle *AH, TocEntry *te);
  
*************** typedef void (*SaveArchivePtr) (ArchiveH
*** 157,169 ****
  typedef void (*WriteExtraTocPtr) (ArchiveHandle *AH, TocEntry *te);
  typedef void (*ReadExtraTocPtr) (ArchiveHandle *AH, TocEntry *te);
  typedef void (*PrintExtraTocPtr) (ArchiveHandle *AH, TocEntry *te);
! typedef void (*PrintTocDataPtr) (ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt);
  
  typedef void (*ClonePtr) (ArchiveHandle *AH);
  typedef void (*DeClonePtr) (ArchiveHandle *AH);
  
  typedef char *(*WorkerJobRestorePtr) (ArchiveHandle *AH, TocEntry *te);
! typedef char *(*WorkerJobDumpPtr) (ArchiveHandle *AH, DumpOptions *dopt, TocEntry *te);
  typedef char *(*MasterStartParallelItemPtr) (ArchiveHandle *AH, TocEntry *te,
  														 T_Action act);
  typedef int (*MasterEndParallelItemPtr) (ArchiveHandle *AH, TocEntry *te,
--- 157,169 ----
  typedef void (*WriteExtraTocPtr) (ArchiveHandle *AH, TocEntry *te);
  typedef void (*ReadExtraTocPtr) (ArchiveHandle *AH, TocEntry *te);
  typedef void (*PrintExtraTocPtr) (ArchiveHandle *AH, TocEntry *te);
! typedef void (*PrintTocDataPtr) (ArchiveHandle *AH, TocEntry *te);
  
  typedef void (*ClonePtr) (ArchiveHandle *AH);
  typedef void (*DeClonePtr) (ArchiveHandle *AH);
  
  typedef char *(*WorkerJobRestorePtr) (ArchiveHandle *AH, TocEntry *te);
! typedef char *(*WorkerJobDumpPtr) (ArchiveHandle *AH, TocEntry *te);
  typedef char *(*MasterStartParallelItemPtr) (ArchiveHandle *AH, TocEntry *te,
  														 T_Action act);
  typedef int (*MasterEndParallelItemPtr) (ArchiveHandle *AH, TocEntry *te,
*************** struct _archiveHandle
*** 315,323 ****
  	ArchiveMode mode;			/* File mode - r or w */
  	void	   *formatData;		/* Header data specific to file format */
  
- 	RestoreOptions *ropt;		/* Used to check restore options in ahwrite
- 								 * etc */
- 
  	/* these vars track state to avoid sending redundant SET commands */
  	char	   *currUser;		/* current username, or NULL if unknown */
  	char	   *currSchema;		/* current schema, or NULL */
--- 315,320 ----
*************** extern void WriteHead(ArchiveHandle *AH)
*** 386,393 ****
  extern void ReadHead(ArchiveHandle *AH);
  extern void WriteToc(ArchiveHandle *AH);
  extern void ReadToc(ArchiveHandle *AH);
! extern void WriteDataChunks(ArchiveHandle *AH, DumpOptions *dopt, struct ParallelState *pstate);
! extern void WriteDataChunksForTocEntry(ArchiveHandle *AH, DumpOptions *dopt, TocEntry *te);
  extern ArchiveHandle *CloneArchive(ArchiveHandle *AH);
  extern void DeCloneArchive(ArchiveHandle *AH);
  
--- 383,390 ----
  extern void ReadHead(ArchiveHandle *AH);
  extern void WriteToc(ArchiveHandle *AH);
  extern void ReadToc(ArchiveHandle *AH);
! extern void WriteDataChunks(ArchiveHandle *AH, struct ParallelState *pstate);
! extern void WriteDataChunksForTocEntry(ArchiveHandle *AH, TocEntry *te);
  extern ArchiveHandle *CloneArchive(ArchiveHandle *AH);
  extern void DeCloneArchive(ArchiveHandle *AH);
  
diff --git a/src/bin/pg_dump/pg_backup_custom.c b/src/bin/pg_dump/pg_backup_custom.c
index ee05380..be6dbca 100644
*** a/src/bin/pg_dump/pg_backup_custom.c
--- b/src/bin/pg_dump/pg_backup_custom.c
*************** static int	_WriteByte(ArchiveHandle *AH,
*** 42,50 ****
  static int	_ReadByte(ArchiveHandle *);
  static void _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len);
  static void _ReadBuf(ArchiveHandle *AH, void *buf, size_t len);
! static void _CloseArchive(ArchiveHandle *AH, DumpOptions *dopt);
  static void _ReopenArchive(ArchiveHandle *AH);
! static void _PrintTocData(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt);
  static void _WriteExtraToc(ArchiveHandle *AH, TocEntry *te);
  static void _ReadExtraToc(ArchiveHandle *AH, TocEntry *te);
  static void _PrintExtraToc(ArchiveHandle *AH, TocEntry *te);
--- 42,50 ----
  static int	_ReadByte(ArchiveHandle *);
  static void _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len);
  static void _ReadBuf(ArchiveHandle *AH, void *buf, size_t len);
! static void _CloseArchive(ArchiveHandle *AH);
  static void _ReopenArchive(ArchiveHandle *AH);
! static void _PrintTocData(ArchiveHandle *AH, TocEntry *te);
  static void _WriteExtraToc(ArchiveHandle *AH, TocEntry *te);
  static void _ReadExtraToc(ArchiveHandle *AH, TocEntry *te);
  static void _PrintExtraToc(ArchiveHandle *AH, TocEntry *te);
*************** _EndBlobs(ArchiveHandle *AH, TocEntry *t
*** 419,425 ****
   * Print data for a given TOC entry
   */
  static void
! _PrintTocData(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt)
  {
  	lclContext *ctx = (lclContext *) AH->formatData;
  	lclTocEntry *tctx = (lclTocEntry *) te->formatData;
--- 419,425 ----
   * Print data for a given TOC entry
   */
  static void
! _PrintTocData(ArchiveHandle *AH, TocEntry *te)
  {
  	lclContext *ctx = (lclContext *) AH->formatData;
  	lclTocEntry *tctx = (lclTocEntry *) te->formatData;
*************** _PrintTocData(ArchiveHandle *AH, TocEntr
*** 500,506 ****
  			break;
  
  		case BLK_BLOBS:
! 			_LoadBlobs(AH, ropt->dropSchema);
  			break;
  
  		default:				/* Always have a default */
--- 500,506 ----
  			break;
  
  		case BLK_BLOBS:
! 			_LoadBlobs(AH, AH->public.ropt->dropSchema);
  			break;
  
  		default:				/* Always have a default */
*************** _ReadBuf(ArchiveHandle *AH, void *buf, s
*** 695,701 ****
   *
   */
  static void
! _CloseArchive(ArchiveHandle *AH, DumpOptions *dopt)
  {
  	lclContext *ctx = (lclContext *) AH->formatData;
  	pgoff_t		tpos;
--- 695,701 ----
   *
   */
  static void
! _CloseArchive(ArchiveHandle *AH)
  {
  	lclContext *ctx = (lclContext *) AH->formatData;
  	pgoff_t		tpos;
*************** _CloseArchive(ArchiveHandle *AH, DumpOpt
*** 710,716 ****
  						  strerror(errno));
  		WriteToc(AH);
  		ctx->dataStart = _getFilePos(AH, ctx);
! 		WriteDataChunks(AH, dopt, NULL);
  
  		/*
  		 * If possible, re-write the TOC in order to update the data offset
--- 710,716 ----
  						  strerror(errno));
  		WriteToc(AH);
  		ctx->dataStart = _getFilePos(AH, ctx);
! 		WriteDataChunks(AH, NULL);
  
  		/*
  		 * If possible, re-write the TOC in order to update the data offset
diff --git a/src/bin/pg_dump/pg_backup_directory.c b/src/bin/pg_dump/pg_backup_directory.c
index 4ebdf04..727a7fe 100644
*** a/src/bin/pg_dump/pg_backup_directory.c
--- b/src/bin/pg_dump/pg_backup_directory.c
*************** static int	_WriteByte(ArchiveHandle *AH,
*** 72,80 ****
  static int	_ReadByte(ArchiveHandle *);
  static void _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len);
  static void _ReadBuf(ArchiveHandle *AH, void *buf, size_t len);
! static void _CloseArchive(ArchiveHandle *AH, DumpOptions *dopt);
  static void _ReopenArchive(ArchiveHandle *AH);
! static void _PrintTocData(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt);
  
  static void _WriteExtraToc(ArchiveHandle *AH, TocEntry *te);
  static void _ReadExtraToc(ArchiveHandle *AH, TocEntry *te);
--- 72,80 ----
  static int	_ReadByte(ArchiveHandle *);
  static void _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len);
  static void _ReadBuf(ArchiveHandle *AH, void *buf, size_t len);
! static void _CloseArchive(ArchiveHandle *AH);
  static void _ReopenArchive(ArchiveHandle *AH);
! static void _PrintTocData(ArchiveHandle *AH, TocEntry *te);
  
  static void _WriteExtraToc(ArchiveHandle *AH, TocEntry *te);
  static void _ReadExtraToc(ArchiveHandle *AH, TocEntry *te);
*************** static void _StartBlobs(ArchiveHandle *A
*** 84,90 ****
  static void _StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid);
  static void _EndBlob(ArchiveHandle *AH, TocEntry *te, Oid oid);
  static void _EndBlobs(ArchiveHandle *AH, TocEntry *te);
! static void _LoadBlobs(ArchiveHandle *AH, RestoreOptions *ropt);
  
  static void _Clone(ArchiveHandle *AH);
  static void _DeClone(ArchiveHandle *AH);
--- 84,90 ----
  static void _StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid);
  static void _EndBlob(ArchiveHandle *AH, TocEntry *te, Oid oid);
  static void _EndBlobs(ArchiveHandle *AH, TocEntry *te);
! static void _LoadBlobs(ArchiveHandle *AH);
  
  static void _Clone(ArchiveHandle *AH);
  static void _DeClone(ArchiveHandle *AH);
*************** static char *_MasterStartParallelItem(Ar
*** 93,99 ****
  static int _MasterEndParallelItem(ArchiveHandle *AH, TocEntry *te,
  					   const char *str, T_Action act);
  static char *_WorkerJobRestoreDirectory(ArchiveHandle *AH, TocEntry *te);
! static char *_WorkerJobDumpDirectory(ArchiveHandle *AH, DumpOptions *dopt, TocEntry *te);
  
  static void setFilePath(ArchiveHandle *AH, char *buf,
  			const char *relativeFilename);
--- 93,99 ----
  static int _MasterEndParallelItem(ArchiveHandle *AH, TocEntry *te,
  					   const char *str, T_Action act);
  static char *_WorkerJobRestoreDirectory(ArchiveHandle *AH, TocEntry *te);
! static char *_WorkerJobDumpDirectory(ArchiveHandle *AH, TocEntry *te);
  
  static void setFilePath(ArchiveHandle *AH, char *buf,
  			const char *relativeFilename);
*************** _EndData(ArchiveHandle *AH, TocEntry *te
*** 386,392 ****
   * Print data for a given file (can be a BLOB as well)
   */
  static void
! _PrintFileData(ArchiveHandle *AH, char *filename, RestoreOptions *ropt)
  {
  	size_t		cnt;
  	char	   *buf;
--- 386,392 ----
   * Print data for a given file (can be a BLOB as well)
   */
  static void
! _PrintFileData(ArchiveHandle *AH, char *filename)
  {
  	size_t		cnt;
  	char	   *buf;
*************** _PrintFileData(ArchiveHandle *AH, char *
*** 418,424 ****
   * Print data for a given TOC entry
  */
  static void
! _PrintTocData(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt)
  {
  	lclTocEntry *tctx = (lclTocEntry *) te->formatData;
  
--- 418,424 ----
   * Print data for a given TOC entry
  */
  static void
! _PrintTocData(ArchiveHandle *AH, TocEntry *te)
  {
  	lclTocEntry *tctx = (lclTocEntry *) te->formatData;
  
*************** _PrintTocData(ArchiveHandle *AH, TocEntr
*** 426,443 ****
  		return;
  
  	if (strcmp(te->desc, "BLOBS") == 0)
! 		_LoadBlobs(AH, ropt);
  	else
  	{
  		char		fname[MAXPGPATH];
  
  		setFilePath(AH, fname, tctx->filename);
! 		_PrintFileData(AH, fname, ropt);
  	}
  }
  
  static void
! _LoadBlobs(ArchiveHandle *AH, RestoreOptions *ropt)
  {
  	Oid			oid;
  	lclContext *ctx = (lclContext *) AH->formatData;
--- 426,443 ----
  		return;
  
  	if (strcmp(te->desc, "BLOBS") == 0)
! 		_LoadBlobs(AH);
  	else
  	{
  		char		fname[MAXPGPATH];
  
  		setFilePath(AH, fname, tctx->filename);
! 		_PrintFileData(AH, fname);
  	}
  }
  
  static void
! _LoadBlobs(ArchiveHandle *AH)
  {
  	Oid			oid;
  	lclContext *ctx = (lclContext *) AH->formatData;
*************** _LoadBlobs(ArchiveHandle *AH, RestoreOpt
*** 465,473 ****
  			exit_horribly(modulename, "invalid line in large object TOC file \"%s\": \"%s\"\n",
  						  fname, line);
  
! 		StartRestoreBlob(AH, oid, ropt->dropSchema);
  		snprintf(path, MAXPGPATH, "%s/%s", ctx->directory, fname);
! 		_PrintFileData(AH, path, ropt);
  		EndRestoreBlob(AH, oid);
  	}
  	if (!cfeof(ctx->blobsTocFH))
--- 465,473 ----
  			exit_horribly(modulename, "invalid line in large object TOC file \"%s\": \"%s\"\n",
  						  fname, line);
  
! 		StartRestoreBlob(AH, oid, AH->public.ropt->dropSchema);
  		snprintf(path, MAXPGPATH, "%s/%s", ctx->directory, fname);
! 		_PrintFileData(AH, path);
  		EndRestoreBlob(AH, oid);
  	}
  	if (!cfeof(ctx->blobsTocFH))
*************** _ReadBuf(ArchiveHandle *AH, void *buf, s
*** 567,573 ****
   *		WriteDataChunks		to save all DATA & BLOBs.
   */
  static void
! _CloseArchive(ArchiveHandle *AH, DumpOptions *dopt)
  {
  	lclContext *ctx = (lclContext *) AH->formatData;
  
--- 567,573 ----
   *		WriteDataChunks		to save all DATA & BLOBs.
   */
  static void
! _CloseArchive(ArchiveHandle *AH)
  {
  	lclContext *ctx = (lclContext *) AH->formatData;
  
*************** _CloseArchive(ArchiveHandle *AH, DumpOpt
*** 579,585 ****
  		setFilePath(AH, fname, "toc.dat");
  
  		/* this will actually fork the processes for a parallel backup */
! 		ctx->pstate = ParallelBackupStart(AH, dopt, NULL);
  
  		/* The TOC is always created uncompressed */
  		tocFH = cfopen_write(fname, PG_BINARY_W, 0);
--- 579,585 ----
  		setFilePath(AH, fname, "toc.dat");
  
  		/* this will actually fork the processes for a parallel backup */
! 		ctx->pstate = ParallelBackupStart(AH);
  
  		/* The TOC is always created uncompressed */
  		tocFH = cfopen_write(fname, PG_BINARY_W, 0);
*************** _CloseArchive(ArchiveHandle *AH, DumpOpt
*** 600,606 ****
  		if (cfclose(tocFH) != 0)
  			exit_horribly(modulename, "could not close TOC file: %s\n",
  						  strerror(errno));
! 		WriteDataChunks(AH, dopt, ctx->pstate);
  
  		ParallelBackupEnd(AH, ctx->pstate);
  	}
--- 600,606 ----
  		if (cfclose(tocFH) != 0)
  			exit_horribly(modulename, "could not close TOC file: %s\n",
  						  strerror(errno));
! 		WriteDataChunks(AH, ctx->pstate);
  
  		ParallelBackupEnd(AH, ctx->pstate);
  	}
*************** _MasterStartParallelItem(ArchiveHandle *
*** 791,797 ****
   * function of the respective dump format.
   */
  static char *
! _WorkerJobDumpDirectory(ArchiveHandle *AH, DumpOptions *dopt, TocEntry *te)
  {
  	/*
  	 * short fixed-size string + some ID so far, this needs to be malloc'ed
--- 791,797 ----
   * function of the respective dump format.
   */
  static char *
! _WorkerJobDumpDirectory(ArchiveHandle *AH, TocEntry *te)
  {
  	/*
  	 * short fixed-size string + some ID so far, this needs to be malloc'ed
*************** _WorkerJobDumpDirectory(ArchiveHandle *A
*** 810,816 ****
  	 * succeed... A failure will be detected by the parent when the child dies
  	 * unexpectedly.
  	 */
! 	WriteDataChunksForTocEntry(AH, dopt, te);
  
  	snprintf(buf, buflen, "OK DUMP %d", te->dumpId);
  
--- 810,816 ----
  	 * succeed... A failure will be detected by the parent when the child dies
  	 * unexpectedly.
  	 */
! 	WriteDataChunksForTocEntry(AH, te);
  
  	snprintf(buf, buflen, "OK DUMP %d", te->dumpId);
  
diff --git a/src/bin/pg_dump/pg_backup_null.c b/src/bin/pg_dump/pg_backup_null.c
index 77cf3fd..848eed4 100644
*** a/src/bin/pg_dump/pg_backup_null.c
--- b/src/bin/pg_dump/pg_backup_null.c
*************** static void _WriteBlobData(ArchiveHandle
*** 33,40 ****
  static void _EndData(ArchiveHandle *AH, TocEntry *te);
  static int	_WriteByte(ArchiveHandle *AH, const int i);
  static void _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len);
! static void _CloseArchive(ArchiveHandle *AH, DumpOptions *dopt);
! static void _PrintTocData(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt);
  static void _StartBlobs(ArchiveHandle *AH, TocEntry *te);
  static void _StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid);
  static void _EndBlob(ArchiveHandle *AH, TocEntry *te, Oid oid);
--- 33,40 ----
  static void _EndData(ArchiveHandle *AH, TocEntry *te);
  static int	_WriteByte(ArchiveHandle *AH, const int i);
  static void _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len);
! static void _CloseArchive(ArchiveHandle *AH);
! static void _PrintTocData(ArchiveHandle *AH, TocEntry *te);
  static void _StartBlobs(ArchiveHandle *AH, TocEntry *te);
  static void _StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid);
  static void _EndBlob(ArchiveHandle *AH, TocEntry *te, Oid oid);
*************** _StartBlob(ArchiveHandle *AH, TocEntry *
*** 149,155 ****
  		exit_horribly(NULL, "invalid OID for large object\n");
  
  	/* With an old archive we must do drop and create logic here */
! 	if (old_blob_style && AH->ropt->dropSchema)
  		DropBlobIfExists(AH, oid);
  
  	if (old_blob_style)
--- 149,155 ----
  		exit_horribly(NULL, "invalid OID for large object\n");
  
  	/* With an old archive we must do drop and create logic here */
! 	if (old_blob_style && AH->public.ropt->dropSchema)
  		DropBlobIfExists(AH, oid);
  
  	if (old_blob_style)
*************** _EndBlobs(ArchiveHandle *AH, TocEntry *t
*** 192,211 ****
   *------
   */
  static void
! _PrintTocData(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt)
  {
  	if (te->dataDumper)
  	{
- 		DumpOptions *dopt;
- 
  		AH->currToc = te;
  
  		if (strcmp(te->desc, "BLOBS") == 0)
  			_StartBlobs(AH, te);
  
! 		dopt = dumpOptionsFromRestoreOptions(ropt);
! 		(*te->dataDumper) ((Archive *) AH, dopt, te->dataDumperArg);
! 		pg_free(dopt);
  
  		if (strcmp(te->desc, "BLOBS") == 0)
  			_EndBlobs(AH, te);
--- 192,207 ----
   *------
   */
  static void
! _PrintTocData(ArchiveHandle *AH, TocEntry *te)
  {
  	if (te->dataDumper)
  	{
  		AH->currToc = te;
  
  		if (strcmp(te->desc, "BLOBS") == 0)
  			_StartBlobs(AH, te);
  
! 		(*te->dataDumper) ((Archive *) AH, te->dataDumperArg);
  
  		if (strcmp(te->desc, "BLOBS") == 0)
  			_EndBlobs(AH, te);
*************** _WriteBuf(ArchiveHandle *AH, const void 
*** 229,235 ****
  }
  
  static void
! _CloseArchive(ArchiveHandle *AH, DumpOptions *dopt)
  {
  	/* Nothing to do */
  }
--- 225,231 ----
  }
  
  static void
! _CloseArchive(ArchiveHandle *AH)
  {
  	/* Nothing to do */
  }
diff --git a/src/bin/pg_dump/pg_backup_tar.c b/src/bin/pg_dump/pg_backup_tar.c
index c40dfe5..eb5bcbb 100644
*** a/src/bin/pg_dump/pg_backup_tar.c
--- b/src/bin/pg_dump/pg_backup_tar.c
*************** static int	_WriteByte(ArchiveHandle *AH,
*** 47,54 ****
  static int	_ReadByte(ArchiveHandle *);
  static void _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len);
  static void _ReadBuf(ArchiveHandle *AH, void *buf, size_t len);
! static void _CloseArchive(ArchiveHandle *AH, DumpOptions *dopt);
! static void _PrintTocData(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt);
  static void _WriteExtraToc(ArchiveHandle *AH, TocEntry *te);
  static void _ReadExtraToc(ArchiveHandle *AH, TocEntry *te);
  static void _PrintExtraToc(ArchiveHandle *AH, TocEntry *te);
--- 47,54 ----
  static int	_ReadByte(ArchiveHandle *);
  static void _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len);
  static void _ReadBuf(ArchiveHandle *AH, void *buf, size_t len);
! static void _CloseArchive(ArchiveHandle *AH);
! static void _PrintTocData(ArchiveHandle *AH, TocEntry *te);
  static void _WriteExtraToc(ArchiveHandle *AH, TocEntry *te);
  static void _ReadExtraToc(ArchiveHandle *AH, TocEntry *te);
  static void _PrintExtraToc(ArchiveHandle *AH, TocEntry *te);
*************** typedef struct
*** 100,106 ****
  /* translator: this is a module name */
  static const char *modulename = gettext_noop("tar archiver");
  
! static void _LoadBlobs(ArchiveHandle *AH, RestoreOptions *ropt);
  
  static TAR_MEMBER *tarOpen(ArchiveHandle *AH, const char *filename, char mode);
  static void tarClose(ArchiveHandle *AH, TAR_MEMBER *TH);
--- 100,106 ----
  /* translator: this is a module name */
  static const char *modulename = gettext_noop("tar archiver");
  
! static void _LoadBlobs(ArchiveHandle *AH);
  
  static TAR_MEMBER *tarOpen(ArchiveHandle *AH, const char *filename, char mode);
  static void tarClose(ArchiveHandle *AH, TAR_MEMBER *TH);
*************** _EndData(ArchiveHandle *AH, TocEntry *te
*** 632,638 ****
   * Print data for a given file
   */
  static void
! _PrintFileData(ArchiveHandle *AH, char *filename, RestoreOptions *ropt)
  {
  	lclContext *ctx = (lclContext *) AH->formatData;
  	char		buf[4096];
--- 632,638 ----
   * Print data for a given file
   */
  static void
! _PrintFileData(ArchiveHandle *AH, char *filename)
  {
  	lclContext *ctx = (lclContext *) AH->formatData;
  	char		buf[4096];
*************** _PrintFileData(ArchiveHandle *AH, char *
*** 659,665 ****
   * Print data for a given TOC entry
  */
  static void
! _PrintTocData(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt)
  {
  	lclContext *ctx = (lclContext *) AH->formatData;
  	lclTocEntry *tctx = (lclTocEntry *) te->formatData;
--- 659,665 ----
   * Print data for a given TOC entry
  */
  static void
! _PrintTocData(ArchiveHandle *AH, TocEntry *te)
  {
  	lclContext *ctx = (lclContext *) AH->formatData;
  	lclTocEntry *tctx = (lclTocEntry *) te->formatData;
*************** _PrintTocData(ArchiveHandle *AH, TocEntr
*** 708,720 ****
  	}
  
  	if (strcmp(te->desc, "BLOBS") == 0)
! 		_LoadBlobs(AH, ropt);
  	else
! 		_PrintFileData(AH, tctx->filename, ropt);
  }
  
  static void
! _LoadBlobs(ArchiveHandle *AH, RestoreOptions *ropt)
  {
  	Oid			oid;
  	lclContext *ctx = (lclContext *) AH->formatData;
--- 708,720 ----
  	}
  
  	if (strcmp(te->desc, "BLOBS") == 0)
! 		_LoadBlobs(AH);
  	else
! 		_PrintFileData(AH, tctx->filename);
  }
  
  static void
! _LoadBlobs(ArchiveHandle *AH)
  {
  	Oid			oid;
  	lclContext *ctx = (lclContext *) AH->formatData;
*************** _LoadBlobs(ArchiveHandle *AH, RestoreOpt
*** 737,743 ****
  			{
  				ahlog(AH, 1, "restoring large object with OID %u\n", oid);
  
! 				StartRestoreBlob(AH, oid, ropt->dropSchema);
  
  				while ((cnt = tarRead(buf, 4095, th)) > 0)
  				{
--- 737,743 ----
  			{
  				ahlog(AH, 1, "restoring large object with OID %u\n", oid);
  
! 				StartRestoreBlob(AH, oid, AH->public.ropt->dropSchema);
  
  				while ((cnt = tarRead(buf, 4095, th)) > 0)
  				{
*************** _ReadBuf(ArchiveHandle *AH, void *buf, s
*** 824,835 ****
  }
  
  static void
! _CloseArchive(ArchiveHandle *AH, DumpOptions *dopt)
  {
  	lclContext *ctx = (lclContext *) AH->formatData;
  	TAR_MEMBER *th;
  	RestoreOptions *ropt;
  	RestoreOptions *savRopt;
  	int			savVerbose,
  				i;
  
--- 824,836 ----
  }
  
  static void
! _CloseArchive(ArchiveHandle *AH)
  {
  	lclContext *ctx = (lclContext *) AH->formatData;
  	TAR_MEMBER *th;
  	RestoreOptions *ropt;
  	RestoreOptions *savRopt;
+ 	DumpOptions *savDopt;
  	int			savVerbose,
  				i;
  
*************** _CloseArchive(ArchiveHandle *AH, DumpOpt
*** 847,853 ****
  		/*
  		 * Now send the data (tables & blobs)
  		 */
! 		WriteDataChunks(AH, dopt, NULL);
  
  		/*
  		 * Now this format wants to append a script which does a full restore
--- 848,854 ----
  		/*
  		 * Now send the data (tables & blobs)
  		 */
! 		WriteDataChunks(AH, NULL);
  
  		/*
  		 * Now this format wants to append a script which does a full restore
*************** _CloseArchive(ArchiveHandle *AH, DumpOpt
*** 869,890 ****
  		ctx->scriptTH = th;
  
  		ropt = NewRestoreOptions();
! 		memcpy(ropt, AH->ropt, sizeof(RestoreOptions));
  		ropt->filename = NULL;
  		ropt->dropSchema = 1;
  		ropt->compression = 0;
  		ropt->superuser = NULL;
  		ropt->suppressDumpWarnings = true;
  
! 		savRopt = AH->ropt;
! 		AH->ropt = ropt;
  
  		savVerbose = AH->public.verbose;
  		AH->public.verbose = 0;
  
  		RestoreArchive((Archive *) AH);
  
! 		AH->ropt = savRopt;
  		AH->public.verbose = savVerbose;
  
  		tarClose(AH, th);
--- 870,894 ----
  		ctx->scriptTH = th;
  
  		ropt = NewRestoreOptions();
! 		memcpy(ropt, AH->public.ropt, sizeof(RestoreOptions));
  		ropt->filename = NULL;
  		ropt->dropSchema = 1;
  		ropt->compression = 0;
  		ropt->superuser = NULL;
  		ropt->suppressDumpWarnings = true;
  
! 		savDopt = AH->public.dopt;
! 		savRopt = AH->public.ropt;
! 
! 		SetArchiveOptions((Archive *) AH, NULL, ropt);
  
  		savVerbose = AH->public.verbose;
  		AH->public.verbose = 0;
  
  		RestoreArchive((Archive *) AH);
  
! 		SetArchiveOptions((Archive *) AH, savDopt, savRopt);
! 
  		AH->public.verbose = savVerbose;
  
  		tarClose(AH, th);
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 56c0528..d68d782 100644
*** a/src/bin/pg_dump/pg_dump.c
--- b/src/bin/pg_dump/pg_dump.c
*************** char		g_comment_end[10];
*** 128,134 ****
  static const CatalogId nilCatalogId = {0, 0};
  
  static void help(const char *progname);
! static void setup_connection(Archive *AH, DumpOptions *dopt,
  				 const char *dumpencoding, const char *dumpsnapshot,
  				 char *use_role);
  static ArchiveFormat parseArchiveFormat(const char *format, ArchiveMode *mode);
--- 128,134 ----
  static const CatalogId nilCatalogId = {0, 0};
  
  static void help(const char *progname);
! static void setup_connection(Archive *AH,
  				 const char *dumpencoding, const char *dumpsnapshot,
  				 char *use_role);
  static ArchiveFormat parseArchiveFormat(const char *format, ArchiveMode *mode);
*************** static void expand_table_name_patterns(A
*** 141,206 ****
  						   SimpleOidList *oids,
  						   bool strict_names);
  static NamespaceInfo *findNamespace(Archive *fout, Oid nsoid, Oid objoid);
! static void dumpTableData(Archive *fout, DumpOptions *dopt, TableDataInfo *tdinfo);
  static void refreshMatViewData(Archive *fout, TableDataInfo *tdinfo);
  static void guessConstraintInheritance(TableInfo *tblinfo, int numTables);
! static void dumpComment(Archive *fout, DumpOptions *dopt, const char *target,
  			const char *namespace, const char *owner,
  			CatalogId catalogId, int subid, DumpId dumpId);
  static int findComments(Archive *fout, Oid classoid, Oid objoid,
  			 CommentItem **items);
  static int	collectComments(Archive *fout, CommentItem **items);
! static void dumpSecLabel(Archive *fout, DumpOptions *dopt, const char *target,
  			 const char *namespace, const char *owner,
  			 CatalogId catalogId, int subid, DumpId dumpId);
  static int findSecLabels(Archive *fout, Oid classoid, Oid objoid,
  			  SecLabelItem **items);
  static int	collectSecLabels(Archive *fout, SecLabelItem **items);
! static void dumpDumpableObject(Archive *fout, DumpOptions *dopt, DumpableObject *dobj);
! static void dumpNamespace(Archive *fout, DumpOptions *dopt, NamespaceInfo *nspinfo);
! static void dumpExtension(Archive *fout, DumpOptions *dopt, ExtensionInfo *extinfo);
! static void dumpType(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo);
! static void dumpBaseType(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo);
! static void dumpEnumType(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo);
! static void dumpRangeType(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo);
! static void dumpUndefinedType(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo);
! static void dumpDomain(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo);
! static void dumpCompositeType(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo);
  static void dumpCompositeTypeColComments(Archive *fout, TypeInfo *tyinfo);
! static void dumpShellType(Archive *fout, DumpOptions *dopt, ShellTypeInfo *stinfo);
! static void dumpProcLang(Archive *fout, DumpOptions *dopt, ProcLangInfo *plang);
! static void dumpFunc(Archive *fout, DumpOptions *dopt, FuncInfo *finfo);
! static void dumpCast(Archive *fout, DumpOptions *dopt, CastInfo *cast);
! static void dumpTransform(Archive *fout, DumpOptions *dopt, TransformInfo *transform);
! static void dumpOpr(Archive *fout, DumpOptions *dopt, OprInfo *oprinfo);
! static void dumpOpclass(Archive *fout, DumpOptions *dopt, OpclassInfo *opcinfo);
! static void dumpOpfamily(Archive *fout, DumpOptions *dopt, OpfamilyInfo *opfinfo);
! static void dumpCollation(Archive *fout, DumpOptions *dopt, CollInfo *convinfo);
! static void dumpConversion(Archive *fout, DumpOptions *dopt, ConvInfo *convinfo);
! static void dumpRule(Archive *fout, DumpOptions *dopt, RuleInfo *rinfo);
! static void dumpAgg(Archive *fout, DumpOptions *dopt, AggInfo *agginfo);
! static void dumpTrigger(Archive *fout, DumpOptions *dopt, TriggerInfo *tginfo);
! static void dumpEventTrigger(Archive *fout, DumpOptions *dopt, EventTriggerInfo *evtinfo);
! static void dumpTable(Archive *fout, DumpOptions *dopt, TableInfo *tbinfo);
! static void dumpTableSchema(Archive *fout, DumpOptions *dopt, TableInfo *tbinfo);
! static void dumpAttrDef(Archive *fout, DumpOptions *dopt, AttrDefInfo *adinfo);
! static void dumpSequence(Archive *fout, DumpOptions *dopt, TableInfo *tbinfo);
  static void dumpSequenceData(Archive *fout, TableDataInfo *tdinfo);
! static void dumpIndex(Archive *fout, DumpOptions *dopt, IndxInfo *indxinfo);
! static void dumpConstraint(Archive *fout, DumpOptions *dopt, ConstraintInfo *coninfo);
! static void dumpTableConstraintComment(Archive *fout, DumpOptions *dopt, ConstraintInfo *coninfo);
! static void dumpTSParser(Archive *fout, DumpOptions *dopt, TSParserInfo *prsinfo);
! static void dumpTSDictionary(Archive *fout, DumpOptions *dopt, TSDictInfo *dictinfo);
! static void dumpTSTemplate(Archive *fout, DumpOptions *dopt, TSTemplateInfo *tmplinfo);
! static void dumpTSConfig(Archive *fout, DumpOptions *dopt, TSConfigInfo *cfginfo);
! static void dumpForeignDataWrapper(Archive *fout, DumpOptions *dopt, FdwInfo *fdwinfo);
! static void dumpForeignServer(Archive *fout, DumpOptions *dopt, ForeignServerInfo *srvinfo);
  static void dumpUserMappings(Archive *fout,
  				 const char *servername, const char *namespace,
  				 const char *owner, CatalogId catalogId, DumpId dumpId);
! static void dumpDefaultACL(Archive *fout, DumpOptions *dopt, DefaultACLInfo *daclinfo);
  
! static void dumpACL(Archive *fout, DumpOptions *dopt, CatalogId objCatId, DumpId objDumpId,
  		const char *type, const char *name, const char *subname,
  		const char *tag, const char *nspname, const char *owner,
  		const char *acls);
--- 141,206 ----
  						   SimpleOidList *oids,
  						   bool strict_names);
  static NamespaceInfo *findNamespace(Archive *fout, Oid nsoid, Oid objoid);
! static void dumpTableData(Archive *fout, TableDataInfo *tdinfo);
  static void refreshMatViewData(Archive *fout, TableDataInfo *tdinfo);
  static void guessConstraintInheritance(TableInfo *tblinfo, int numTables);
! static void dumpComment(Archive *fout, const char *target,
  			const char *namespace, const char *owner,
  			CatalogId catalogId, int subid, DumpId dumpId);
  static int findComments(Archive *fout, Oid classoid, Oid objoid,
  			 CommentItem **items);
  static int	collectComments(Archive *fout, CommentItem **items);
! static void dumpSecLabel(Archive *fout, const char *target,
  			 const char *namespace, const char *owner,
  			 CatalogId catalogId, int subid, DumpId dumpId);
  static int findSecLabels(Archive *fout, Oid classoid, Oid objoid,
  			  SecLabelItem **items);
  static int	collectSecLabels(Archive *fout, SecLabelItem **items);
! static void dumpDumpableObject(Archive *fout, DumpableObject *dobj);
! static void dumpNamespace(Archive *fout, NamespaceInfo *nspinfo);
! static void dumpExtension(Archive *fout, ExtensionInfo *extinfo);
! static void dumpType(Archive *fout, TypeInfo *tyinfo);
! static void dumpBaseType(Archive *fout, TypeInfo *tyinfo);
! static void dumpEnumType(Archive *fout, TypeInfo *tyinfo);
! static void dumpRangeType(Archive *fout, TypeInfo *tyinfo);
! static void dumpUndefinedType(Archive *fout, TypeInfo *tyinfo);
! static void dumpDomain(Archive *fout, TypeInfo *tyinfo);
! static void dumpCompositeType(Archive *fout, TypeInfo *tyinfo);
  static void dumpCompositeTypeColComments(Archive *fout, TypeInfo *tyinfo);
! static void dumpShellType(Archive *fout, ShellTypeInfo *stinfo);
! static void dumpProcLang(Archive *fout, ProcLangInfo *plang);
! static void dumpFunc(Archive *fout, FuncInfo *finfo);
! static void dumpCast(Archive *fout, CastInfo *cast);
! static void dumpTransform(Archive *fout, TransformInfo *transform);
! static void dumpOpr(Archive *fout, OprInfo *oprinfo);
! static void dumpOpclass(Archive *fout, OpclassInfo *opcinfo);
! static void dumpOpfamily(Archive *fout, OpfamilyInfo *opfinfo);
! static void dumpCollation(Archive *fout, CollInfo *convinfo);
! static void dumpConversion(Archive *fout, ConvInfo *convinfo);
! static void dumpRule(Archive *fout, RuleInfo *rinfo);
! static void dumpAgg(Archive *fout, AggInfo *agginfo);
! static void dumpTrigger(Archive *fout, TriggerInfo *tginfo);
! static void dumpEventTrigger(Archive *fout, EventTriggerInfo *evtinfo);
! static void dumpTable(Archive *fout, TableInfo *tbinfo);
! static void dumpTableSchema(Archive *fout, TableInfo *tbinfo);
! static void dumpAttrDef(Archive *fout, AttrDefInfo *adinfo);
! static void dumpSequence(Archive *fout, TableInfo *tbinfo);
  static void dumpSequenceData(Archive *fout, TableDataInfo *tdinfo);
! static void dumpIndex(Archive *fout, IndxInfo *indxinfo);
! static void dumpConstraint(Archive *fout, ConstraintInfo *coninfo);
! static void dumpTableConstraintComment(Archive *fout, ConstraintInfo *coninfo);
! static void dumpTSParser(Archive *fout, TSParserInfo *prsinfo);
! static void dumpTSDictionary(Archive *fout, TSDictInfo *dictinfo);
! static void dumpTSTemplate(Archive *fout, TSTemplateInfo *tmplinfo);
! static void dumpTSConfig(Archive *fout, TSConfigInfo *cfginfo);
! static void dumpForeignDataWrapper(Archive *fout, FdwInfo *fdwinfo);
! static void dumpForeignServer(Archive *fout, ForeignServerInfo *srvinfo);
  static void dumpUserMappings(Archive *fout,
  				 const char *servername, const char *namespace,
  				 const char *owner, CatalogId catalogId, DumpId dumpId);
! static void dumpDefaultACL(Archive *fout, DefaultACLInfo *daclinfo);
  
! static void dumpACL(Archive *fout, CatalogId objCatId, DumpId objDumpId,
  		const char *type, const char *name, const char *subname,
  		const char *tag, const char *nspname, const char *owner,
  		const char *acls);
*************** static void selectSourceSchema(Archive *
*** 238,247 ****
  static char *getFormattedTypeName(Archive *fout, Oid oid, OidOptions opts);
  static char *myFormatType(const char *typname, int32 typmod);
  static void getBlobs(Archive *fout);
! static void dumpBlob(Archive *fout, DumpOptions *dopt, BlobInfo *binfo);
! static int	dumpBlobs(Archive *fout, DumpOptions *dopt, void *arg);
! static void dumpPolicy(Archive *fout, DumpOptions *dopt, PolicyInfo *polinfo);
! static void dumpDatabase(Archive *AH, DumpOptions *dopt);
  static void dumpEncoding(Archive *AH);
  static void dumpStdStrings(Archive *AH);
  static void binary_upgrade_set_type_oids_by_type_oid(Archive *fout,
--- 238,247 ----
  static char *getFormattedTypeName(Archive *fout, Oid oid, OidOptions opts);
  static char *myFormatType(const char *typname, int32 typmod);
  static void getBlobs(Archive *fout);
! static void dumpBlob(Archive *fout, BlobInfo *binfo);
! static int	dumpBlobs(Archive *fout, void *arg);
! static void dumpPolicy(Archive *fout, PolicyInfo *polinfo);
! static void dumpDatabase(Archive *AH);
  static void dumpEncoding(Archive *AH);
  static void dumpStdStrings(Archive *AH);
  static void binary_upgrade_set_type_oids_by_type_oid(Archive *fout,
*************** static void fmtReloptionsArray(Archive *
*** 261,267 ****
  				   const char *reloptions, const char *prefix);
  static char *get_synchronized_snapshot(Archive *fout);
  static PGresult *ExecuteSqlQueryForSingleRow(Archive *fout, char *query);
! static void setupDumpWorker(Archive *AHX, DumpOptions *dopt, RestoreOptions *ropt);
  
  
  int
--- 261,267 ----
  				   const char *reloptions, const char *prefix);
  static char *get_synchronized_snapshot(Archive *fout);
  static PGresult *ExecuteSqlQueryForSingleRow(Archive *fout, char *query);
! static void setupDumpWorker(Archive *AHX);
  
  
  int
*************** main(int argc, char **argv)
*** 611,616 ****
--- 611,619 ----
  	fout = CreateArchive(filename, archiveFormat, compressLevel, archiveMode,
  						 setupDumpWorker);
  
+ 	/* Make dump options accessible right away */
+ 	SetArchiveOptions(fout, &dopt, NULL);
+ 
  	/* Register the cleanup hook */
  	on_exit_close_archive(fout);
  
*************** main(int argc, char **argv)
*** 634,640 ****
  	 * death.
  	 */
  	ConnectDatabase(fout, dopt.dbname, dopt.pghost, dopt.pgport, dopt.username, prompt_password);
! 	setup_connection(fout, &dopt, dumpencoding, dumpsnapshot, use_role);
  
  	/*
  	 * Disable security label support if server version < v9.1.x (prevents
--- 637,643 ----
  	 * death.
  	 */
  	ConnectDatabase(fout, dopt.dbname, dopt.pghost, dopt.pgport, dopt.username, prompt_password);
! 	setup_connection(fout, dumpencoding, dumpsnapshot, use_role);
  
  	/*
  	 * Disable security label support if server version < v9.1.x (prevents
*************** main(int argc, char **argv)
*** 739,745 ****
  	 * Now scan the database and create DumpableObject structs for all the
  	 * objects we intend to dump.
  	 */
! 	tblinfo = getSchemaData(fout, &dopt, &numTables);
  
  	if (fout->remoteVersion < 80400)
  		guessConstraintInheritance(tblinfo, numTables);
--- 742,748 ----
  	 * Now scan the database and create DumpableObject structs for all the
  	 * objects we intend to dump.
  	 */
! 	tblinfo = getSchemaData(fout, &numTables);
  
  	if (fout->remoteVersion < 80400)
  		guessConstraintInheritance(tblinfo, numTables);
*************** main(int argc, char **argv)
*** 803,813 ****
  
  	/* The database item is always next, unless we don't want it at all */
  	if (dopt.include_everything && !dopt.dataOnly)
! 		dumpDatabase(fout, &dopt);
  
  	/* Now the rearrangeable objects. */
  	for (i = 0; i < numObjs; i++)
! 		dumpDumpableObject(fout, &dopt, dobjs[i]);
  
  	/*
  	 * Set up options info to ensure we dump what we want.
--- 806,816 ----
  
  	/* The database item is always next, unless we don't want it at all */
  	if (dopt.include_everything && !dopt.dataOnly)
! 		dumpDatabase(fout);
  
  	/* Now the rearrangeable objects. */
  	for (i = 0; i < numObjs; i++)
! 		dumpDumpableObject(fout, dobjs[i]);
  
  	/*
  	 * Set up options info to ensure we dump what we want.
*************** main(int argc, char **argv)
*** 843,849 ****
  
  	ropt->suppressDumpWarnings = true;	/* We've already shown them */
  
! 	SetArchiveRestoreOptions(fout, ropt);
  
  	/*
  	 * The archive's TOC entries are now marked as to which ones will actually
--- 846,855 ----
  
  	ropt->suppressDumpWarnings = true;	/* We've already shown them */
  
! 	SetArchiveOptions(fout, &dopt, ropt);
! 
! 	/* Mark which entries should be output */
! 	ProcessArchiveRestoreOptions(fout);
  
  	/*
  	 * The archive's TOC entries are now marked as to which ones will actually
*************** main(int argc, char **argv)
*** 863,869 ****
  	if (plainText)
  		RestoreArchive(fout);
  
! 	CloseArchive(fout, &dopt);
  
  	exit_nicely(0);
  }
--- 869,875 ----
  	if (plainText)
  		RestoreArchive(fout);
  
! 	CloseArchive(fout);
  
  	exit_nicely(0);
  }
*************** help(const char *progname)
*** 941,949 ****
  }
  
  static void
! setup_connection(Archive *AH, DumpOptions *dopt, const char *dumpencoding,
  				 const char *dumpsnapshot, char *use_role)
  {
  	PGconn	   *conn = GetConnection(AH);
  	const char *std_strings;
  
--- 947,956 ----
  }
  
  static void
! setup_connection(Archive *AH, const char *dumpencoding,
  				 const char *dumpsnapshot, char *use_role)
  {
+ 	DumpOptions *dopt = AH->dopt;
  	PGconn	   *conn = GetConnection(AH);
  	const char *std_strings;
  
*************** setup_connection(Archive *AH, DumpOption
*** 1092,1100 ****
  }
  
  static void
! setupDumpWorker(Archive *AHX, DumpOptions *dopt, RestoreOptions *ropt)
  {
! 	setup_connection(AHX, dopt, NULL, NULL, NULL);
  }
  
  static char *
--- 1099,1107 ----
  }
  
  static void
! setupDumpWorker(Archive *AHX)
  {
! 	setup_connection(AHX, NULL, NULL, NULL);
  }
  
  static char *
*************** selectDumpableObject(DumpableObject *dob
*** 1437,1443 ****
   */
  
  static int
! dumpTableData_copy(Archive *fout, DumpOptions *dopt, void *dcontext)
  {
  	TableDataInfo *tdinfo = (TableDataInfo *) dcontext;
  	TableInfo  *tbinfo = tdinfo->tdtable;
--- 1444,1450 ----
   */
  
  static int
! dumpTableData_copy(Archive *fout, void *dcontext)
  {
  	TableDataInfo *tdinfo = (TableDataInfo *) dcontext;
  	TableInfo  *tbinfo = tdinfo->tdtable;
*************** dumpTableData_copy(Archive *fout, DumpOp
*** 1612,1622 ****
   * E'' strings, or dollar-quoted strings.  So don't emit anything like that.
   */
  static int
! dumpTableData_insert(Archive *fout, DumpOptions *dopt, void *dcontext)
  {
  	TableDataInfo *tdinfo = (TableDataInfo *) dcontext;
  	TableInfo  *tbinfo = tdinfo->tdtable;
  	const char *classname = tbinfo->dobj.name;
  	PQExpBuffer q = createPQExpBuffer();
  	PQExpBuffer insertStmt = NULL;
  	PGresult   *res;
--- 1619,1630 ----
   * E'' strings, or dollar-quoted strings.  So don't emit anything like that.
   */
  static int
! dumpTableData_insert(Archive *fout, void *dcontext)
  {
  	TableDataInfo *tdinfo = (TableDataInfo *) dcontext;
  	TableInfo  *tbinfo = tdinfo->tdtable;
  	const char *classname = tbinfo->dobj.name;
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer q = createPQExpBuffer();
  	PQExpBuffer insertStmt = NULL;
  	PGresult   *res;
*************** dumpTableData_insert(Archive *fout, Dump
*** 1798,1805 ****
   * Actually, this just makes an ArchiveEntry for the table contents.
   */
  static void
! dumpTableData(Archive *fout, DumpOptions *dopt, TableDataInfo *tdinfo)
  {
  	TableInfo  *tbinfo = tdinfo->tdtable;
  	PQExpBuffer copyBuf = createPQExpBuffer();
  	PQExpBuffer clistBuf = createPQExpBuffer();
--- 1806,1814 ----
   * Actually, this just makes an ArchiveEntry for the table contents.
   */
  static void
! dumpTableData(Archive *fout, TableDataInfo *tdinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	TableInfo  *tbinfo = tdinfo->tdtable;
  	PQExpBuffer copyBuf = createPQExpBuffer();
  	PQExpBuffer clistBuf = createPQExpBuffer();
*************** guessConstraintInheritance(TableInfo *tb
*** 2201,2208 ****
   *	dump the database definition
   */
  static void
! dumpDatabase(Archive *fout, DumpOptions *dopt)
  {
  	PQExpBuffer dbQry = createPQExpBuffer();
  	PQExpBuffer delQry = createPQExpBuffer();
  	PQExpBuffer creaQry = createPQExpBuffer();
--- 2210,2218 ----
   *	dump the database definition
   */
  static void
! dumpDatabase(Archive *fout)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer dbQry = createPQExpBuffer();
  	PQExpBuffer delQry = createPQExpBuffer();
  	PQExpBuffer creaQry = createPQExpBuffer();
*************** dumpDatabase(Archive *fout, DumpOptions 
*** 2522,2528 ****
  	{
  		resetPQExpBuffer(dbQry);
  		appendPQExpBuffer(dbQry, "DATABASE %s", fmtId(datname));
! 		dumpComment(fout, dopt, dbQry->data, NULL, "",
  					dbCatId, 0, dbDumpId);
  	}
  
--- 2532,2538 ----
  	{
  		resetPQExpBuffer(dbQry);
  		appendPQExpBuffer(dbQry, "DATABASE %s", fmtId(datname));
! 		dumpComment(fout, dbQry->data, NULL, "",
  					dbCatId, 0, dbDumpId);
  	}
  
*************** getBlobs(Archive *fout)
*** 2693,2699 ****
   * dump the definition (metadata) of the given large object
   */
  static void
! dumpBlob(Archive *fout, DumpOptions *dopt, BlobInfo *binfo)
  {
  	PQExpBuffer cquery = createPQExpBuffer();
  	PQExpBuffer dquery = createPQExpBuffer();
--- 2703,2709 ----
   * dump the definition (metadata) of the given large object
   */
  static void
! dumpBlob(Archive *fout, BlobInfo *binfo)
  {
  	PQExpBuffer cquery = createPQExpBuffer();
  	PQExpBuffer dquery = createPQExpBuffer();
*************** dumpBlob(Archive *fout, DumpOptions *dop
*** 2720,2737 ****
  	appendPQExpBuffer(cquery, "LARGE OBJECT %s", binfo->dobj.name);
  
  	/* Dump comment if any */
! 	dumpComment(fout, dopt, cquery->data,
  				NULL, binfo->rolname,
  				binfo->dobj.catId, 0, binfo->dobj.dumpId);
  
  	/* Dump security label if any */
! 	dumpSecLabel(fout, dopt, cquery->data,
  				 NULL, binfo->rolname,
  				 binfo->dobj.catId, 0, binfo->dobj.dumpId);
  
  	/* Dump ACL if any */
  	if (binfo->blobacl)
! 		dumpACL(fout, dopt, binfo->dobj.catId, binfo->dobj.dumpId, "LARGE OBJECT",
  				binfo->dobj.name, NULL, cquery->data,
  				NULL, binfo->rolname, binfo->blobacl);
  
--- 2730,2747 ----
  	appendPQExpBuffer(cquery, "LARGE OBJECT %s", binfo->dobj.name);
  
  	/* Dump comment if any */
! 	dumpComment(fout, cquery->data,
  				NULL, binfo->rolname,
  				binfo->dobj.catId, 0, binfo->dobj.dumpId);
  
  	/* Dump security label if any */
! 	dumpSecLabel(fout, cquery->data,
  				 NULL, binfo->rolname,
  				 binfo->dobj.catId, 0, binfo->dobj.dumpId);
  
  	/* Dump ACL if any */
  	if (binfo->blobacl)
! 		dumpACL(fout, binfo->dobj.catId, binfo->dobj.dumpId, "LARGE OBJECT",
  				binfo->dobj.name, NULL, cquery->data,
  				NULL, binfo->rolname, binfo->blobacl);
  
*************** dumpBlob(Archive *fout, DumpOptions *dop
*** 2744,2750 ****
   *	dump the data contents of all large objects
   */
  static int
! dumpBlobs(Archive *fout, DumpOptions *dopt, void *arg)
  {
  	const char *blobQry;
  	const char *blobFetchQry;
--- 2754,2760 ----
   *	dump the data contents of all large objects
   */
  static int
! dumpBlobs(Archive *fout, void *arg)
  {
  	const char *blobQry;
  	const char *blobFetchQry;
*************** getPolicies(Archive *fout, TableInfo tbl
*** 2968,2975 ****
   *	  dump the definition of the given policy
   */
  static void
! dumpPolicy(Archive *fout, DumpOptions *dopt, PolicyInfo *polinfo)
  {
  	TableInfo  *tbinfo = polinfo->poltable;
  	PQExpBuffer query;
  	PQExpBuffer delqry;
--- 2978,2986 ----
   *	  dump the definition of the given policy
   */
  static void
! dumpPolicy(Archive *fout, PolicyInfo *polinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	TableInfo  *tbinfo = polinfo->poltable;
  	PQExpBuffer query;
  	PQExpBuffer delqry;
*************** findNamespace(Archive *fout, Oid nsoid, 
*** 3390,3397 ****
   *	numExtensions is set to the number of extensions read in
   */
  ExtensionInfo *
! getExtensions(Archive *fout, DumpOptions *dopt, int *numExtensions)
  {
  	PGresult   *res;
  	int			ntups;
  	int			i;
--- 3401,3409 ----
   *	numExtensions is set to the number of extensions read in
   */
  ExtensionInfo *
! getExtensions(Archive *fout, int *numExtensions)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PGresult   *res;
  	int			ntups;
  	int			i;
*************** getOpfamilies(Archive *fout, int *numOpf
*** 4205,4212 ****
   * numAggs is set to the number of aggregates read in
   */
  AggInfo *
! getAggregates(Archive *fout, DumpOptions *dopt, int *numAggs)
  {
  	PGresult   *res;
  	int			ntups;
  	int			i;
--- 4217,4225 ----
   * numAggs is set to the number of aggregates read in
   */
  AggInfo *
! getAggregates(Archive *fout, int *numAggs)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PGresult   *res;
  	int			ntups;
  	int			i;
*************** getAggregates(Archive *fout, DumpOptions
*** 4362,4369 ****
   * numFuncs is set to the number of functions read in
   */
  FuncInfo *
! getFuncs(Archive *fout, DumpOptions *dopt, int *numFuncs)
  {
  	PGresult   *res;
  	int			ntups;
  	int			i;
--- 4375,4383 ----
   * numFuncs is set to the number of functions read in
   */
  FuncInfo *
! getFuncs(Archive *fout, int *numFuncs)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PGresult   *res;
  	int			ntups;
  	int			i;
*************** getFuncs(Archive *fout, DumpOptions *dop
*** 4524,4531 ****
   * numTables is set to the number of tables read in
   */
  TableInfo *
! getTables(Archive *fout, DumpOptions *dopt, int *numTables)
  {
  	PGresult   *res;
  	int			ntups;
  	int			i;
--- 4538,4546 ----
   * numTables is set to the number of tables read in
   */
  TableInfo *
! getTables(Archive *fout, int *numTables)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PGresult   *res;
  	int			ntups;
  	int			i;
*************** getProcLangs(Archive *fout, int *numProc
*** 6493,6500 ****
   * numCasts is set to the number of casts read in
   */
  CastInfo *
! getCasts(Archive *fout, DumpOptions *dopt, int *numCasts)
  {
  	PGresult   *res;
  	int			ntups;
  	int			i;
--- 6508,6516 ----
   * numCasts is set to the number of casts read in
   */
  CastInfo *
! getCasts(Archive *fout, int *numCasts)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PGresult   *res;
  	int			ntups;
  	int			i;
*************** getTransforms(Archive *fout, int *numTra
*** 6731,6738 ****
   *	modifies tblinfo
   */
  void
! getTableAttrs(Archive *fout, DumpOptions *dopt, TableInfo *tblinfo, int numTables)
  {
  	int			i,
  				j;
  	PQExpBuffer q = createPQExpBuffer();
--- 6747,6755 ----
   *	modifies tblinfo
   */
  void
! getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	int			i,
  				j;
  	PQExpBuffer q = createPQExpBuffer();
*************** getForeignServers(Archive *fout, int *nu
*** 7847,7854 ****
   *	numDefaultACLs is set to the number of ACLs read in
   */
  DefaultACLInfo *
! getDefaultACLs(Archive *fout, DumpOptions *dopt, int *numDefaultACLs)
  {
  	DefaultACLInfo *daclinfo;
  	PQExpBuffer query;
  	PGresult   *res;
--- 7864,7872 ----
   *	numDefaultACLs is set to the number of ACLs read in
   */
  DefaultACLInfo *
! getDefaultACLs(Archive *fout, int *numDefaultACLs)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	DefaultACLInfo *daclinfo;
  	PQExpBuffer query;
  	PGresult   *res;
*************** getDefaultACLs(Archive *fout, DumpOption
*** 7945,7954 ****
   * calling ArchiveEntry() for the specified object.
   */
  static void
! dumpComment(Archive *fout, DumpOptions *dopt, const char *target,
  			const char *namespace, const char *owner,
  			CatalogId catalogId, int subid, DumpId dumpId)
  {
  	CommentItem *comments;
  	int			ncomments;
  
--- 7963,7973 ----
   * calling ArchiveEntry() for the specified object.
   */
  static void
! dumpComment(Archive *fout, const char *target,
  			const char *namespace, const char *owner,
  			CatalogId catalogId, int subid, DumpId dumpId)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	CommentItem *comments;
  	int			ncomments;
  
*************** dumpComment(Archive *fout, DumpOptions *
*** 8009,8017 ****
   * and its columns.
   */
  static void
! dumpTableComment(Archive *fout, DumpOptions *dopt, TableInfo *tbinfo,
  				 const char *reltypename)
  {
  	CommentItem *comments;
  	int			ncomments;
  	PQExpBuffer query;
--- 8028,8037 ----
   * and its columns.
   */
  static void
! dumpTableComment(Archive *fout, TableInfo *tbinfo,
  				 const char *reltypename)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	CommentItem *comments;
  	int			ncomments;
  	PQExpBuffer query;
*************** collectComments(Archive *fout, CommentIt
*** 8263,8373 ****
   * ArchiveEntries (TOC objects) for each object to be dumped.
   */
  static void
! dumpDumpableObject(Archive *fout, DumpOptions *dopt, DumpableObject *dobj)
  {
  	switch (dobj->objType)
  	{
  		case DO_NAMESPACE:
! 			dumpNamespace(fout, dopt, (NamespaceInfo *) dobj);
  			break;
  		case DO_EXTENSION:
! 			dumpExtension(fout, dopt, (ExtensionInfo *) dobj);
  			break;
  		case DO_TYPE:
! 			dumpType(fout, dopt, (TypeInfo *) dobj);
  			break;
  		case DO_SHELL_TYPE:
! 			dumpShellType(fout, dopt, (ShellTypeInfo *) dobj);
  			break;
  		case DO_FUNC:
! 			dumpFunc(fout, dopt, (FuncInfo *) dobj);
  			break;
  		case DO_AGG:
! 			dumpAgg(fout, dopt, (AggInfo *) dobj);
  			break;
  		case DO_OPERATOR:
! 			dumpOpr(fout, dopt, (OprInfo *) dobj);
  			break;
  		case DO_OPCLASS:
! 			dumpOpclass(fout, dopt, (OpclassInfo *) dobj);
  			break;
  		case DO_OPFAMILY:
! 			dumpOpfamily(fout, dopt, (OpfamilyInfo *) dobj);
  			break;
  		case DO_COLLATION:
! 			dumpCollation(fout, dopt, (CollInfo *) dobj);
  			break;
  		case DO_CONVERSION:
! 			dumpConversion(fout, dopt, (ConvInfo *) dobj);
  			break;
  		case DO_TABLE:
! 			dumpTable(fout, dopt, (TableInfo *) dobj);
  			break;
  		case DO_ATTRDEF:
! 			dumpAttrDef(fout, dopt, (AttrDefInfo *) dobj);
  			break;
  		case DO_INDEX:
! 			dumpIndex(fout, dopt, (IndxInfo *) dobj);
  			break;
  		case DO_REFRESH_MATVIEW:
  			refreshMatViewData(fout, (TableDataInfo *) dobj);
  			break;
  		case DO_RULE:
! 			dumpRule(fout, dopt, (RuleInfo *) dobj);
  			break;
  		case DO_TRIGGER:
! 			dumpTrigger(fout, dopt, (TriggerInfo *) dobj);
  			break;
  		case DO_EVENT_TRIGGER:
! 			dumpEventTrigger(fout, dopt, (EventTriggerInfo *) dobj);
  			break;
  		case DO_CONSTRAINT:
! 			dumpConstraint(fout, dopt, (ConstraintInfo *) dobj);
  			break;
  		case DO_FK_CONSTRAINT:
! 			dumpConstraint(fout, dopt, (ConstraintInfo *) dobj);
  			break;
  		case DO_PROCLANG:
! 			dumpProcLang(fout, dopt, (ProcLangInfo *) dobj);
  			break;
  		case DO_CAST:
! 			dumpCast(fout, dopt, (CastInfo *) dobj);
  			break;
  		case DO_TRANSFORM:
! 			dumpTransform(fout, dopt, (TransformInfo *) dobj);
  			break;
  		case DO_TABLE_DATA:
  			if (((TableDataInfo *) dobj)->tdtable->relkind == RELKIND_SEQUENCE)
  				dumpSequenceData(fout, (TableDataInfo *) dobj);
  			else
! 				dumpTableData(fout, dopt, (TableDataInfo *) dobj);
  			break;
  		case DO_DUMMY_TYPE:
  			/* table rowtypes and array types are never dumped separately */
  			break;
  		case DO_TSPARSER:
! 			dumpTSParser(fout, dopt, (TSParserInfo *) dobj);
  			break;
  		case DO_TSDICT:
! 			dumpTSDictionary(fout, dopt, (TSDictInfo *) dobj);
  			break;
  		case DO_TSTEMPLATE:
! 			dumpTSTemplate(fout, dopt, (TSTemplateInfo *) dobj);
  			break;
  		case DO_TSCONFIG:
! 			dumpTSConfig(fout, dopt, (TSConfigInfo *) dobj);
  			break;
  		case DO_FDW:
! 			dumpForeignDataWrapper(fout, dopt, (FdwInfo *) dobj);
  			break;
  		case DO_FOREIGN_SERVER:
! 			dumpForeignServer(fout, dopt, (ForeignServerInfo *) dobj);
  			break;
  		case DO_DEFAULT_ACL:
! 			dumpDefaultACL(fout, dopt, (DefaultACLInfo *) dobj);
  			break;
  		case DO_BLOB:
! 			dumpBlob(fout, dopt, (BlobInfo *) dobj);
  			break;
  		case DO_BLOB_DATA:
  			ArchiveEntry(fout, dobj->catId, dobj->dumpId,
--- 8283,8393 ----
   * ArchiveEntries (TOC objects) for each object to be dumped.
   */
  static void
! dumpDumpableObject(Archive *fout, DumpableObject *dobj)
  {
  	switch (dobj->objType)
  	{
  		case DO_NAMESPACE:
! 			dumpNamespace(fout, (NamespaceInfo *) dobj);
  			break;
  		case DO_EXTENSION:
! 			dumpExtension(fout, (ExtensionInfo *) dobj);
  			break;
  		case DO_TYPE:
! 			dumpType(fout, (TypeInfo *) dobj);
  			break;
  		case DO_SHELL_TYPE:
! 			dumpShellType(fout, (ShellTypeInfo *) dobj);
  			break;
  		case DO_FUNC:
! 			dumpFunc(fout, (FuncInfo *) dobj);
  			break;
  		case DO_AGG:
! 			dumpAgg(fout, (AggInfo *) dobj);
  			break;
  		case DO_OPERATOR:
! 			dumpOpr(fout, (OprInfo *) dobj);
  			break;
  		case DO_OPCLASS:
! 			dumpOpclass(fout, (OpclassInfo *) dobj);
  			break;
  		case DO_OPFAMILY:
! 			dumpOpfamily(fout, (OpfamilyInfo *) dobj);
  			break;
  		case DO_COLLATION:
! 			dumpCollation(fout, (CollInfo *) dobj);
  			break;
  		case DO_CONVERSION:
! 			dumpConversion(fout, (ConvInfo *) dobj);
  			break;
  		case DO_TABLE:
! 			dumpTable(fout, (TableInfo *) dobj);
  			break;
  		case DO_ATTRDEF:
! 			dumpAttrDef(fout, (AttrDefInfo *) dobj);
  			break;
  		case DO_INDEX:
! 			dumpIndex(fout, (IndxInfo *) dobj);
  			break;
  		case DO_REFRESH_MATVIEW:
  			refreshMatViewData(fout, (TableDataInfo *) dobj);
  			break;
  		case DO_RULE:
! 			dumpRule(fout, (RuleInfo *) dobj);
  			break;
  		case DO_TRIGGER:
! 			dumpTrigger(fout, (TriggerInfo *) dobj);
  			break;
  		case DO_EVENT_TRIGGER:
! 			dumpEventTrigger(fout, (EventTriggerInfo *) dobj);
  			break;
  		case DO_CONSTRAINT:
! 			dumpConstraint(fout, (ConstraintInfo *) dobj);
  			break;
  		case DO_FK_CONSTRAINT:
! 			dumpConstraint(fout, (ConstraintInfo *) dobj);
  			break;
  		case DO_PROCLANG:
! 			dumpProcLang(fout, (ProcLangInfo *) dobj);
  			break;
  		case DO_CAST:
! 			dumpCast(fout, (CastInfo *) dobj);
  			break;
  		case DO_TRANSFORM:
! 			dumpTransform(fout, (TransformInfo *) dobj);
  			break;
  		case DO_TABLE_DATA:
  			if (((TableDataInfo *) dobj)->tdtable->relkind == RELKIND_SEQUENCE)
  				dumpSequenceData(fout, (TableDataInfo *) dobj);
  			else
! 				dumpTableData(fout, (TableDataInfo *) dobj);
  			break;
  		case DO_DUMMY_TYPE:
  			/* table rowtypes and array types are never dumped separately */
  			break;
  		case DO_TSPARSER:
! 			dumpTSParser(fout, (TSParserInfo *) dobj);
  			break;
  		case DO_TSDICT:
! 			dumpTSDictionary(fout, (TSDictInfo *) dobj);
  			break;
  		case DO_TSTEMPLATE:
! 			dumpTSTemplate(fout, (TSTemplateInfo *) dobj);
  			break;
  		case DO_TSCONFIG:
! 			dumpTSConfig(fout, (TSConfigInfo *) dobj);
  			break;
  		case DO_FDW:
! 			dumpForeignDataWrapper(fout, (FdwInfo *) dobj);
  			break;
  		case DO_FOREIGN_SERVER:
! 			dumpForeignServer(fout, (ForeignServerInfo *) dobj);
  			break;
  		case DO_DEFAULT_ACL:
! 			dumpDefaultACL(fout, (DefaultACLInfo *) dobj);
  			break;
  		case DO_BLOB:
! 			dumpBlob(fout, (BlobInfo *) dobj);
  			break;
  		case DO_BLOB_DATA:
  			ArchiveEntry(fout, dobj->catId, dobj->dumpId,
*************** dumpDumpableObject(Archive *fout, DumpOp
*** 8378,8384 ****
  						 dumpBlobs, NULL);
  			break;
  		case DO_POLICY:
! 			dumpPolicy(fout, dopt, (PolicyInfo *) dobj);
  			break;
  		case DO_PRE_DATA_BOUNDARY:
  		case DO_POST_DATA_BOUNDARY:
--- 8398,8404 ----
  						 dumpBlobs, NULL);
  			break;
  		case DO_POLICY:
! 			dumpPolicy(fout, (PolicyInfo *) dobj);
  			break;
  		case DO_PRE_DATA_BOUNDARY:
  		case DO_POST_DATA_BOUNDARY:
*************** dumpDumpableObject(Archive *fout, DumpOp
*** 8392,8399 ****
   *	  writes out to fout the queries to recreate a user-defined namespace
   */
  static void
! dumpNamespace(Archive *fout, DumpOptions *dopt, NamespaceInfo *nspinfo)
  {
  	PQExpBuffer q;
  	PQExpBuffer delq;
  	PQExpBuffer labelq;
--- 8412,8420 ----
   *	  writes out to fout the queries to recreate a user-defined namespace
   */
  static void
! dumpNamespace(Archive *fout, NamespaceInfo *nspinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer q;
  	PQExpBuffer delq;
  	PQExpBuffer labelq;
*************** dumpNamespace(Archive *fout, DumpOptions
*** 8432,8445 ****
  				 NULL, NULL);
  
  	/* Dump Schema Comments and Security Labels */
! 	dumpComment(fout, dopt, labelq->data,
  				NULL, nspinfo->rolname,
  				nspinfo->dobj.catId, 0, nspinfo->dobj.dumpId);
! 	dumpSecLabel(fout, dopt, labelq->data,
  				 NULL, nspinfo->rolname,
  				 nspinfo->dobj.catId, 0, nspinfo->dobj.dumpId);
  
! 	dumpACL(fout, dopt, nspinfo->dobj.catId, nspinfo->dobj.dumpId, "SCHEMA",
  			qnspname, NULL, nspinfo->dobj.name, NULL,
  			nspinfo->rolname, nspinfo->nspacl);
  
--- 8453,8466 ----
  				 NULL, NULL);
  
  	/* Dump Schema Comments and Security Labels */
! 	dumpComment(fout, labelq->data,
  				NULL, nspinfo->rolname,
  				nspinfo->dobj.catId, 0, nspinfo->dobj.dumpId);
! 	dumpSecLabel(fout, labelq->data,
  				 NULL, nspinfo->rolname,
  				 nspinfo->dobj.catId, 0, nspinfo->dobj.dumpId);
  
! 	dumpACL(fout, nspinfo->dobj.catId, nspinfo->dobj.dumpId, "SCHEMA",
  			qnspname, NULL, nspinfo->dobj.name, NULL,
  			nspinfo->rolname, nspinfo->nspacl);
  
*************** dumpNamespace(Archive *fout, DumpOptions
*** 8455,8462 ****
   *	  writes out to fout the queries to recreate an extension
   */
  static void
! dumpExtension(Archive *fout, DumpOptions *dopt, ExtensionInfo *extinfo)
  {
  	PQExpBuffer q;
  	PQExpBuffer delq;
  	PQExpBuffer labelq;
--- 8476,8484 ----
   *	  writes out to fout the queries to recreate an extension
   */
  static void
! dumpExtension(Archive *fout, ExtensionInfo *extinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer q;
  	PQExpBuffer delq;
  	PQExpBuffer labelq;
*************** dumpExtension(Archive *fout, DumpOptions
*** 8560,8569 ****
  				 NULL, NULL);
  
  	/* Dump Extension Comments and Security Labels */
! 	dumpComment(fout, dopt, labelq->data,
  				NULL, "",
  				extinfo->dobj.catId, 0, extinfo->dobj.dumpId);
! 	dumpSecLabel(fout, dopt, labelq->data,
  				 NULL, "",
  				 extinfo->dobj.catId, 0, extinfo->dobj.dumpId);
  
--- 8582,8591 ----
  				 NULL, NULL);
  
  	/* Dump Extension Comments and Security Labels */
! 	dumpComment(fout, labelq->data,
  				NULL, "",
  				extinfo->dobj.catId, 0, extinfo->dobj.dumpId);
! 	dumpSecLabel(fout, labelq->data,
  				 NULL, "",
  				 extinfo->dobj.catId, 0, extinfo->dobj.dumpId);
  
*************** dumpExtension(Archive *fout, DumpOptions
*** 8579,8603 ****
   *	  writes out to fout the queries to recreate a user-defined type
   */
  static void
! dumpType(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo)
  {
  	/* Skip if not to be dumped */
  	if (!tyinfo->dobj.dump || dopt->dataOnly)
  		return;
  
  	/* Dump out in proper style */
  	if (tyinfo->typtype == TYPTYPE_BASE)
! 		dumpBaseType(fout, dopt, tyinfo);
  	else if (tyinfo->typtype == TYPTYPE_DOMAIN)
! 		dumpDomain(fout, dopt, tyinfo);
  	else if (tyinfo->typtype == TYPTYPE_COMPOSITE)
! 		dumpCompositeType(fout, dopt, tyinfo);
  	else if (tyinfo->typtype == TYPTYPE_ENUM)
! 		dumpEnumType(fout, dopt, tyinfo);
  	else if (tyinfo->typtype == TYPTYPE_RANGE)
! 		dumpRangeType(fout, dopt, tyinfo);
  	else if (tyinfo->typtype == TYPTYPE_PSEUDO && !tyinfo->isDefined)
! 		dumpUndefinedType(fout, dopt, tyinfo);
  	else
  		write_msg(NULL, "WARNING: typtype of data type \"%s\" appears to be invalid\n",
  				  tyinfo->dobj.name);
--- 8601,8627 ----
   *	  writes out to fout the queries to recreate a user-defined type
   */
  static void
! dumpType(Archive *fout, TypeInfo *tyinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
+ 
  	/* Skip if not to be dumped */
  	if (!tyinfo->dobj.dump || dopt->dataOnly)
  		return;
  
  	/* Dump out in proper style */
  	if (tyinfo->typtype == TYPTYPE_BASE)
! 		dumpBaseType(fout, tyinfo);
  	else if (tyinfo->typtype == TYPTYPE_DOMAIN)
! 		dumpDomain(fout, tyinfo);
  	else if (tyinfo->typtype == TYPTYPE_COMPOSITE)
! 		dumpCompositeType(fout, tyinfo);
  	else if (tyinfo->typtype == TYPTYPE_ENUM)
! 		dumpEnumType(fout, tyinfo);
  	else if (tyinfo->typtype == TYPTYPE_RANGE)
! 		dumpRangeType(fout, tyinfo);
  	else if (tyinfo->typtype == TYPTYPE_PSEUDO && !tyinfo->isDefined)
! 		dumpUndefinedType(fout, tyinfo);
  	else
  		write_msg(NULL, "WARNING: typtype of data type \"%s\" appears to be invalid\n",
  				  tyinfo->dobj.name);
*************** dumpType(Archive *fout, DumpOptions *dop
*** 8608,8615 ****
   *	  writes out to fout the queries to recreate a user-defined enum type
   */
  static void
! dumpEnumType(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo)
  {
  	PQExpBuffer q = createPQExpBuffer();
  	PQExpBuffer delq = createPQExpBuffer();
  	PQExpBuffer labelq = createPQExpBuffer();
--- 8632,8640 ----
   *	  writes out to fout the queries to recreate a user-defined enum type
   */
  static void
! dumpEnumType(Archive *fout, TypeInfo *tyinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer q = createPQExpBuffer();
  	PQExpBuffer delq = createPQExpBuffer();
  	PQExpBuffer labelq = createPQExpBuffer();
*************** dumpEnumType(Archive *fout, DumpOptions 
*** 8713,8726 ****
  				 NULL, NULL);
  
  	/* Dump Type Comments and Security Labels */
! 	dumpComment(fout, dopt, labelq->data,
  				tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
! 	dumpSecLabel(fout, dopt, labelq->data,
  				 tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				 tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
  
! 	dumpACL(fout, dopt, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
  			qtypname, NULL, tyinfo->dobj.name,
  			tyinfo->dobj.namespace->dobj.name,
  			tyinfo->rolname, tyinfo->typacl);
--- 8738,8751 ----
  				 NULL, NULL);
  
  	/* Dump Type Comments and Security Labels */
! 	dumpComment(fout, labelq->data,
  				tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
! 	dumpSecLabel(fout, labelq->data,
  				 tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				 tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
  
! 	dumpACL(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
  			qtypname, NULL, tyinfo->dobj.name,
  			tyinfo->dobj.namespace->dobj.name,
  			tyinfo->rolname, tyinfo->typacl);
*************** dumpEnumType(Archive *fout, DumpOptions 
*** 8737,8744 ****
   *	  writes out to fout the queries to recreate a user-defined range type
   */
  static void
! dumpRangeType(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo)
  {
  	PQExpBuffer q = createPQExpBuffer();
  	PQExpBuffer delq = createPQExpBuffer();
  	PQExpBuffer labelq = createPQExpBuffer();
--- 8762,8770 ----
   *	  writes out to fout the queries to recreate a user-defined range type
   */
  static void
! dumpRangeType(Archive *fout, TypeInfo *tyinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer q = createPQExpBuffer();
  	PQExpBuffer delq = createPQExpBuffer();
  	PQExpBuffer labelq = createPQExpBuffer();
*************** dumpRangeType(Archive *fout, DumpOptions
*** 8845,8858 ****
  				 NULL, NULL);
  
  	/* Dump Type Comments and Security Labels */
! 	dumpComment(fout, dopt, labelq->data,
  				tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
! 	dumpSecLabel(fout, dopt, labelq->data,
  				 tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				 tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
  
! 	dumpACL(fout, dopt, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
  			qtypname, NULL, tyinfo->dobj.name,
  			tyinfo->dobj.namespace->dobj.name,
  			tyinfo->rolname, tyinfo->typacl);
--- 8871,8884 ----
  				 NULL, NULL);
  
  	/* Dump Type Comments and Security Labels */
! 	dumpComment(fout, labelq->data,
  				tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
! 	dumpSecLabel(fout, labelq->data,
  				 tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				 tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
  
! 	dumpACL(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
  			qtypname, NULL, tyinfo->dobj.name,
  			tyinfo->dobj.namespace->dobj.name,
  			tyinfo->rolname, tyinfo->typacl);
*************** dumpRangeType(Archive *fout, DumpOptions
*** 8874,8881 ****
   * depending on it.
   */
  static void
! dumpUndefinedType(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo)
  {
  	PQExpBuffer q = createPQExpBuffer();
  	PQExpBuffer delq = createPQExpBuffer();
  	PQExpBuffer labelq = createPQExpBuffer();
--- 8900,8908 ----
   * depending on it.
   */
  static void
! dumpUndefinedType(Archive *fout, TypeInfo *tyinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer q = createPQExpBuffer();
  	PQExpBuffer delq = createPQExpBuffer();
  	PQExpBuffer labelq = createPQExpBuffer();
*************** dumpUndefinedType(Archive *fout, DumpOpt
*** 8914,8927 ****
  				 NULL, NULL);
  
  	/* Dump Type Comments and Security Labels */
! 	dumpComment(fout, dopt, labelq->data,
  				tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
! 	dumpSecLabel(fout, dopt, labelq->data,
  				 tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				 tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
  
! 	dumpACL(fout, dopt, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
  			qtypname, NULL, tyinfo->dobj.name,
  			tyinfo->dobj.namespace->dobj.name,
  			tyinfo->rolname, tyinfo->typacl);
--- 8941,8954 ----
  				 NULL, NULL);
  
  	/* Dump Type Comments and Security Labels */
! 	dumpComment(fout, labelq->data,
  				tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
! 	dumpSecLabel(fout, labelq->data,
  				 tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				 tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
  
! 	dumpACL(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
  			qtypname, NULL, tyinfo->dobj.name,
  			tyinfo->dobj.namespace->dobj.name,
  			tyinfo->rolname, tyinfo->typacl);
*************** dumpUndefinedType(Archive *fout, DumpOpt
*** 8936,8943 ****
   *	  writes out to fout the queries to recreate a user-defined base type
   */
  static void
! dumpBaseType(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo)
  {
  	PQExpBuffer q = createPQExpBuffer();
  	PQExpBuffer delq = createPQExpBuffer();
  	PQExpBuffer labelq = createPQExpBuffer();
--- 8963,8971 ----
   *	  writes out to fout the queries to recreate a user-defined base type
   */
  static void
! dumpBaseType(Archive *fout, TypeInfo *tyinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer q = createPQExpBuffer();
  	PQExpBuffer delq = createPQExpBuffer();
  	PQExpBuffer labelq = createPQExpBuffer();
*************** dumpBaseType(Archive *fout, DumpOptions 
*** 9302,9315 ****
  				 NULL, NULL);
  
  	/* Dump Type Comments and Security Labels */
! 	dumpComment(fout, dopt, labelq->data,
  				tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
! 	dumpSecLabel(fout, dopt, labelq->data,
  				 tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				 tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
  
! 	dumpACL(fout, dopt, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
  			qtypname, NULL, tyinfo->dobj.name,
  			tyinfo->dobj.namespace->dobj.name,
  			tyinfo->rolname, tyinfo->typacl);
--- 9330,9343 ----
  				 NULL, NULL);
  
  	/* Dump Type Comments and Security Labels */
! 	dumpComment(fout, labelq->data,
  				tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
! 	dumpSecLabel(fout, labelq->data,
  				 tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				 tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
  
! 	dumpACL(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
  			qtypname, NULL, tyinfo->dobj.name,
  			tyinfo->dobj.namespace->dobj.name,
  			tyinfo->rolname, tyinfo->typacl);
*************** dumpBaseType(Archive *fout, DumpOptions 
*** 9326,9333 ****
   *	  writes out to fout the queries to recreate a user-defined domain
   */
  static void
! dumpDomain(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo)
  {
  	PQExpBuffer q = createPQExpBuffer();
  	PQExpBuffer delq = createPQExpBuffer();
  	PQExpBuffer labelq = createPQExpBuffer();
--- 9354,9362 ----
   *	  writes out to fout the queries to recreate a user-defined domain
   */
  static void
! dumpDomain(Archive *fout, TypeInfo *tyinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer q = createPQExpBuffer();
  	PQExpBuffer delq = createPQExpBuffer();
  	PQExpBuffer labelq = createPQExpBuffer();
*************** dumpDomain(Archive *fout, DumpOptions *d
*** 9464,9477 ****
  				 NULL, NULL);
  
  	/* Dump Domain Comments and Security Labels */
! 	dumpComment(fout, dopt, labelq->data,
  				tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
! 	dumpSecLabel(fout, dopt, labelq->data,
  				 tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				 tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
  
! 	dumpACL(fout, dopt, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
  			qtypname, NULL, tyinfo->dobj.name,
  			tyinfo->dobj.namespace->dobj.name,
  			tyinfo->rolname, tyinfo->typacl);
--- 9493,9506 ----
  				 NULL, NULL);
  
  	/* Dump Domain Comments and Security Labels */
! 	dumpComment(fout, labelq->data,
  				tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
! 	dumpSecLabel(fout, labelq->data,
  				 tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				 tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
  
! 	dumpACL(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
  			qtypname, NULL, tyinfo->dobj.name,
  			tyinfo->dobj.namespace->dobj.name,
  			tyinfo->rolname, tyinfo->typacl);
*************** dumpDomain(Archive *fout, DumpOptions *d
*** 9486,9492 ****
  						  fmtId(domcheck->dobj.name));
  		appendPQExpBuffer(labelq, "ON DOMAIN %s",
  						  fmtId(qtypname));
! 		dumpComment(fout, dopt, labelq->data,
  					tyinfo->dobj.namespace->dobj.name,
  					tyinfo->rolname,
  					domcheck->dobj.catId, 0, tyinfo->dobj.dumpId);
--- 9515,9521 ----
  						  fmtId(domcheck->dobj.name));
  		appendPQExpBuffer(labelq, "ON DOMAIN %s",
  						  fmtId(qtypname));
! 		dumpComment(fout, labelq->data,
  					tyinfo->dobj.namespace->dobj.name,
  					tyinfo->rolname,
  					domcheck->dobj.catId, 0, tyinfo->dobj.dumpId);
*************** dumpDomain(Archive *fout, DumpOptions *d
*** 9505,9512 ****
   *	  composite type
   */
  static void
! dumpCompositeType(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo)
  {
  	PQExpBuffer q = createPQExpBuffer();
  	PQExpBuffer dropped = createPQExpBuffer();
  	PQExpBuffer delq = createPQExpBuffer();
--- 9534,9542 ----
   *	  composite type
   */
  static void
! dumpCompositeType(Archive *fout, TypeInfo *tyinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer q = createPQExpBuffer();
  	PQExpBuffer dropped = createPQExpBuffer();
  	PQExpBuffer delq = createPQExpBuffer();
*************** dumpCompositeType(Archive *fout, DumpOpt
*** 9690,9703 ****
  
  
  	/* Dump Type Comments and Security Labels */
! 	dumpComment(fout, dopt, labelq->data,
  				tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
! 	dumpSecLabel(fout, dopt, labelq->data,
  				 tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				 tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
  
! 	dumpACL(fout, dopt, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
  			qtypname, NULL, tyinfo->dobj.name,
  			tyinfo->dobj.namespace->dobj.name,
  			tyinfo->rolname, tyinfo->typacl);
--- 9720,9733 ----
  
  
  	/* Dump Type Comments and Security Labels */
! 	dumpComment(fout, labelq->data,
  				tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
! 	dumpSecLabel(fout, labelq->data,
  				 tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
  				 tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
  
! 	dumpACL(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
  			qtypname, NULL, tyinfo->dobj.name,
  			tyinfo->dobj.namespace->dobj.name,
  			tyinfo->rolname, tyinfo->typacl);
*************** dumpCompositeTypeColComments(Archive *fo
*** 9828,9835 ****
   * We dump a shell definition in advance of the I/O functions for the type.
   */
  static void
! dumpShellType(Archive *fout, DumpOptions *dopt, ShellTypeInfo *stinfo)
  {
  	PQExpBuffer q;
  
  	/* Skip if not to be dumped */
--- 9858,9866 ----
   * We dump a shell definition in advance of the I/O functions for the type.
   */
  static void
! dumpShellType(Archive *fout, ShellTypeInfo *stinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer q;
  
  	/* Skip if not to be dumped */
*************** shouldDumpProcLangs(DumpOptions *dopt)
*** 9899,9906 ****
   *		  procedural language
   */
  static void
! dumpProcLang(Archive *fout, DumpOptions *dopt, ProcLangInfo *plang)
  {
  	PQExpBuffer defqry;
  	PQExpBuffer delqry;
  	PQExpBuffer labelq;
--- 9930,9938 ----
   *		  procedural language
   */
  static void
! dumpProcLang(Archive *fout, ProcLangInfo *plang)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer defqry;
  	PQExpBuffer delqry;
  	PQExpBuffer labelq;
*************** dumpProcLang(Archive *fout, DumpOptions 
*** 10037,10051 ****
  				 NULL, NULL);
  
  	/* Dump Proc Lang Comments and Security Labels */
! 	dumpComment(fout, dopt, labelq->data,
  				NULL, "",
  				plang->dobj.catId, 0, plang->dobj.dumpId);
! 	dumpSecLabel(fout, dopt, labelq->data,
  				 NULL, "",
  				 plang->dobj.catId, 0, plang->dobj.dumpId);
  
  	if (plang->lanpltrusted)
! 		dumpACL(fout, dopt, plang->dobj.catId, plang->dobj.dumpId, "LANGUAGE",
  				qlanname, NULL, plang->dobj.name,
  				lanschema,
  				plang->lanowner, plang->lanacl);
--- 10069,10083 ----
  				 NULL, NULL);
  
  	/* Dump Proc Lang Comments and Security Labels */
! 	dumpComment(fout, labelq->data,
  				NULL, "",
  				plang->dobj.catId, 0, plang->dobj.dumpId);
! 	dumpSecLabel(fout, labelq->data,
  				 NULL, "",
  				 plang->dobj.catId, 0, plang->dobj.dumpId);
  
  	if (plang->lanpltrusted)
! 		dumpACL(fout, plang->dobj.catId, plang->dobj.dumpId, "LANGUAGE",
  				qlanname, NULL, plang->dobj.name,
  				lanschema,
  				plang->lanowner, plang->lanacl);
*************** format_function_signature(Archive *fout,
*** 10192,10199 ****
   *	  dump out one function
   */
  static void
! dumpFunc(Archive *fout, DumpOptions *dopt, FuncInfo *finfo)
  {
  	PQExpBuffer query;
  	PQExpBuffer q;
  	PQExpBuffer delqry;
--- 10224,10232 ----
   *	  dump out one function
   */
  static void
! dumpFunc(Archive *fout, FuncInfo *finfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer query;
  	PQExpBuffer q;
  	PQExpBuffer delqry;
*************** dumpFunc(Archive *fout, DumpOptions *dop
*** 10703,10716 ****
  				 NULL, NULL);
  
  	/* Dump Function Comments and Security Labels */
! 	dumpComment(fout, dopt, labelq->data,
  				finfo->dobj.namespace->dobj.name, finfo->rolname,
  				finfo->dobj.catId, 0, finfo->dobj.dumpId);
! 	dumpSecLabel(fout, dopt, labelq->data,
  				 finfo->dobj.namespace->dobj.name, finfo->rolname,
  				 finfo->dobj.catId, 0, finfo->dobj.dumpId);
  
! 	dumpACL(fout, dopt, finfo->dobj.catId, finfo->dobj.dumpId, "FUNCTION",
  			funcsig, NULL, funcsig_tag,
  			finfo->dobj.namespace->dobj.name,
  			finfo->rolname, finfo->proacl);
--- 10736,10749 ----
  				 NULL, NULL);
  
  	/* Dump Function Comments and Security Labels */
! 	dumpComment(fout, labelq->data,
  				finfo->dobj.namespace->dobj.name, finfo->rolname,
  				finfo->dobj.catId, 0, finfo->dobj.dumpId);
! 	dumpSecLabel(fout, labelq->data,
  				 finfo->dobj.namespace->dobj.name, finfo->rolname,
  				 finfo->dobj.catId, 0, finfo->dobj.dumpId);
  
! 	dumpACL(fout, finfo->dobj.catId, finfo->dobj.dumpId, "FUNCTION",
  			funcsig, NULL, funcsig_tag,
  			finfo->dobj.namespace->dobj.name,
  			finfo->rolname, finfo->proacl);
*************** dumpFunc(Archive *fout, DumpOptions *dop
*** 10741,10748 ****
   * Dump a user-defined cast
   */
  static void
! dumpCast(Archive *fout, DumpOptions *dopt, CastInfo *cast)
  {
  	PQExpBuffer defqry;
  	PQExpBuffer delqry;
  	PQExpBuffer labelq;
--- 10774,10782 ----
   * Dump a user-defined cast
   */
  static void
! dumpCast(Archive *fout, CastInfo *cast)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer defqry;
  	PQExpBuffer delqry;
  	PQExpBuffer labelq;
*************** dumpCast(Archive *fout, DumpOptions *dop
*** 10830,10836 ****
  				 NULL, NULL);
  
  	/* Dump Cast Comments */
! 	dumpComment(fout, dopt, labelq->data,
  				NULL, "",
  				cast->dobj.catId, 0, cast->dobj.dumpId);
  
--- 10864,10870 ----
  				 NULL, NULL);
  
  	/* Dump Cast Comments */
! 	dumpComment(fout, labelq->data,
  				NULL, "",
  				cast->dobj.catId, 0, cast->dobj.dumpId);
  
*************** dumpCast(Archive *fout, DumpOptions *dop
*** 10846,10853 ****
   * Dump a transform
   */
  static void
! dumpTransform(Archive *fout, DumpOptions *dopt, TransformInfo *transform)
  {
  	PQExpBuffer defqry;
  	PQExpBuffer delqry;
  	PQExpBuffer labelq;
--- 10880,10888 ----
   * Dump a transform
   */
  static void
! dumpTransform(Archive *fout, TransformInfo *transform)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer defqry;
  	PQExpBuffer delqry;
  	PQExpBuffer labelq;
*************** dumpTransform(Archive *fout, DumpOptions
*** 10949,10955 ****
  				 NULL, NULL);
  
  	/* Dump Transform Comments */
! 	dumpComment(fout, dopt, labelq->data,
  				NULL, "",
  				transform->dobj.catId, 0, transform->dobj.dumpId);
  
--- 10984,10990 ----
  				 NULL, NULL);
  
  	/* Dump Transform Comments */
! 	dumpComment(fout, labelq->data,
  				NULL, "",
  				transform->dobj.catId, 0, transform->dobj.dumpId);
  
*************** dumpTransform(Archive *fout, DumpOptions
*** 10966,10973 ****
   *	  write out a single operator definition
   */
  static void
! dumpOpr(Archive *fout, DumpOptions *dopt, OprInfo *oprinfo)
  {
  	PQExpBuffer query;
  	PQExpBuffer q;
  	PQExpBuffer delq;
--- 11001,11009 ----
   *	  write out a single operator definition
   */
  static void
! dumpOpr(Archive *fout, OprInfo *oprinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer query;
  	PQExpBuffer q;
  	PQExpBuffer delq;
*************** dumpOpr(Archive *fout, DumpOptions *dopt
*** 11204,11210 ****
  				 NULL, NULL);
  
  	/* Dump Operator Comments */
! 	dumpComment(fout, dopt, labelq->data,
  				oprinfo->dobj.namespace->dobj.name, oprinfo->rolname,
  				oprinfo->dobj.catId, 0, oprinfo->dobj.dumpId);
  
--- 11240,11246 ----
  				 NULL, NULL);
  
  	/* Dump Operator Comments */
! 	dumpComment(fout, labelq->data,
  				oprinfo->dobj.namespace->dobj.name, oprinfo->rolname,
  				oprinfo->dobj.catId, 0, oprinfo->dobj.dumpId);
  
*************** convertTSFunction(Archive *fout, Oid fun
*** 11354,11361 ****
   *	  write out a single operator class definition
   */
  static void
! dumpOpclass(Archive *fout, DumpOptions *dopt, OpclassInfo *opcinfo)
  {
  	PQExpBuffer query;
  	PQExpBuffer q;
  	PQExpBuffer delq;
--- 11390,11398 ----
   *	  write out a single operator class definition
   */
  static void
! dumpOpclass(Archive *fout, OpclassInfo *opcinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer query;
  	PQExpBuffer q;
  	PQExpBuffer delq;
*************** dumpOpclass(Archive *fout, DumpOptions *
*** 11712,11718 ****
  				 NULL, NULL);
  
  	/* Dump Operator Class Comments */
! 	dumpComment(fout, dopt, labelq->data,
  				NULL, opcinfo->rolname,
  				opcinfo->dobj.catId, 0, opcinfo->dobj.dumpId);
  
--- 11749,11755 ----
  				 NULL, NULL);
  
  	/* Dump Operator Class Comments */
! 	dumpComment(fout, labelq->data,
  				NULL, opcinfo->rolname,
  				opcinfo->dobj.catId, 0, opcinfo->dobj.dumpId);
  
*************** dumpOpclass(Archive *fout, DumpOptions *
*** 11731,11738 ****
   * specific opclass within the opfamily.
   */
  static void
! dumpOpfamily(Archive *fout, DumpOptions *dopt, OpfamilyInfo *opfinfo)
  {
  	PQExpBuffer query;
  	PQExpBuffer q;
  	PQExpBuffer delq;
--- 11768,11776 ----
   * specific opclass within the opfamily.
   */
  static void
! dumpOpfamily(Archive *fout, OpfamilyInfo *opfinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer query;
  	PQExpBuffer q;
  	PQExpBuffer delq;
*************** dumpOpfamily(Archive *fout, DumpOptions 
*** 12025,12031 ****
  				 NULL, NULL);
  
  	/* Dump Operator Family Comments */
! 	dumpComment(fout, dopt, labelq->data,
  				NULL, opfinfo->rolname,
  				opfinfo->dobj.catId, 0, opfinfo->dobj.dumpId);
  
--- 12063,12069 ----
  				 NULL, NULL);
  
  	/* Dump Operator Family Comments */
! 	dumpComment(fout, labelq->data,
  				NULL, opfinfo->rolname,
  				opfinfo->dobj.catId, 0, opfinfo->dobj.dumpId);
  
*************** dumpOpfamily(Archive *fout, DumpOptions 
*** 12043,12050 ****
   *	  write out a single collation definition
   */
  static void
! dumpCollation(Archive *fout, DumpOptions *dopt, CollInfo *collinfo)
  {
  	PQExpBuffer query;
  	PQExpBuffer q;
  	PQExpBuffer delq;
--- 12081,12089 ----
   *	  write out a single collation definition
   */
  static void
! dumpCollation(Archive *fout, CollInfo *collinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer query;
  	PQExpBuffer q;
  	PQExpBuffer delq;
*************** dumpCollation(Archive *fout, DumpOptions
*** 12114,12120 ****
  				 NULL, NULL);
  
  	/* Dump Collation Comments */
! 	dumpComment(fout, dopt, labelq->data,
  				collinfo->dobj.namespace->dobj.name, collinfo->rolname,
  				collinfo->dobj.catId, 0, collinfo->dobj.dumpId);
  
--- 12153,12159 ----
  				 NULL, NULL);
  
  	/* Dump Collation Comments */
! 	dumpComment(fout, labelq->data,
  				collinfo->dobj.namespace->dobj.name, collinfo->rolname,
  				collinfo->dobj.catId, 0, collinfo->dobj.dumpId);
  
*************** dumpCollation(Archive *fout, DumpOptions
*** 12131,12138 ****
   *	  write out a single conversion definition
   */
  static void
! dumpConversion(Archive *fout, DumpOptions *dopt, ConvInfo *convinfo)
  {
  	PQExpBuffer query;
  	PQExpBuffer q;
  	PQExpBuffer delq;
--- 12170,12178 ----
   *	  write out a single conversion definition
   */
  static void
! dumpConversion(Archive *fout, ConvInfo *convinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer query;
  	PQExpBuffer q;
  	PQExpBuffer delq;
*************** dumpConversion(Archive *fout, DumpOption
*** 12213,12219 ****
  				 NULL, NULL);
  
  	/* Dump Conversion Comments */
! 	dumpComment(fout, dopt, labelq->data,
  				convinfo->dobj.namespace->dobj.name, convinfo->rolname,
  				convinfo->dobj.catId, 0, convinfo->dobj.dumpId);
  
--- 12253,12259 ----
  				 NULL, NULL);
  
  	/* Dump Conversion Comments */
! 	dumpComment(fout, labelq->data,
  				convinfo->dobj.namespace->dobj.name, convinfo->rolname,
  				convinfo->dobj.catId, 0, convinfo->dobj.dumpId);
  
*************** format_aggregate_signature(AggInfo *aggi
*** 12270,12277 ****
   *	  write out a single aggregate definition
   */
  static void
! dumpAgg(Archive *fout, DumpOptions *dopt, AggInfo *agginfo)
  {
  	PQExpBuffer query;
  	PQExpBuffer q;
  	PQExpBuffer delq;
--- 12310,12318 ----
   *	  write out a single aggregate definition
   */
  static void
! dumpAgg(Archive *fout, AggInfo *agginfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer query;
  	PQExpBuffer q;
  	PQExpBuffer delq;
*************** dumpAgg(Archive *fout, DumpOptions *dopt
*** 12609,12618 ****
  				 NULL, NULL);
  
  	/* Dump Aggregate Comments */
! 	dumpComment(fout, dopt, labelq->data,
  			agginfo->aggfn.dobj.namespace->dobj.name, agginfo->aggfn.rolname,
  				agginfo->aggfn.dobj.catId, 0, agginfo->aggfn.dobj.dumpId);
! 	dumpSecLabel(fout, dopt, labelq->data,
  			agginfo->aggfn.dobj.namespace->dobj.name, agginfo->aggfn.rolname,
  				 agginfo->aggfn.dobj.catId, 0, agginfo->aggfn.dobj.dumpId);
  
--- 12650,12659 ----
  				 NULL, NULL);
  
  	/* Dump Aggregate Comments */
! 	dumpComment(fout, labelq->data,
  			agginfo->aggfn.dobj.namespace->dobj.name, agginfo->aggfn.rolname,
  				agginfo->aggfn.dobj.catId, 0, agginfo->aggfn.dobj.dumpId);
! 	dumpSecLabel(fout, labelq->data,
  			agginfo->aggfn.dobj.namespace->dobj.name, agginfo->aggfn.rolname,
  				 agginfo->aggfn.dobj.catId, 0, agginfo->aggfn.dobj.dumpId);
  
*************** dumpAgg(Archive *fout, DumpOptions *dopt
*** 12627,12633 ****
  	aggsig = format_function_signature(fout, &agginfo->aggfn, true);
  	aggsig_tag = format_function_signature(fout, &agginfo->aggfn, false);
  
! 	dumpACL(fout, dopt, agginfo->aggfn.dobj.catId, agginfo->aggfn.dobj.dumpId,
  			"FUNCTION",
  			aggsig, NULL, aggsig_tag,
  			agginfo->aggfn.dobj.namespace->dobj.name,
--- 12668,12674 ----
  	aggsig = format_function_signature(fout, &agginfo->aggfn, true);
  	aggsig_tag = format_function_signature(fout, &agginfo->aggfn, false);
  
! 	dumpACL(fout, agginfo->aggfn.dobj.catId, agginfo->aggfn.dobj.dumpId,
  			"FUNCTION",
  			aggsig, NULL, aggsig_tag,
  			agginfo->aggfn.dobj.namespace->dobj.name,
*************** dumpAgg(Archive *fout, DumpOptions *dopt
*** 12652,12659 ****
   *	  write out a single text search parser
   */
  static void
! dumpTSParser(Archive *fout, DumpOptions *dopt, TSParserInfo *prsinfo)
  {
  	PQExpBuffer q;
  	PQExpBuffer delq;
  	PQExpBuffer labelq;
--- 12693,12701 ----
   *	  write out a single text search parser
   */
  static void
! dumpTSParser(Archive *fout, TSParserInfo *prsinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer q;
  	PQExpBuffer delq;
  	PQExpBuffer labelq;
*************** dumpTSParser(Archive *fout, DumpOptions 
*** 12709,12715 ****
  				 NULL, NULL);
  
  	/* Dump Parser Comments */
! 	dumpComment(fout, dopt, labelq->data,
  				NULL, "",
  				prsinfo->dobj.catId, 0, prsinfo->dobj.dumpId);
  
--- 12751,12757 ----
  				 NULL, NULL);
  
  	/* Dump Parser Comments */
! 	dumpComment(fout, labelq->data,
  				NULL, "",
  				prsinfo->dobj.catId, 0, prsinfo->dobj.dumpId);
  
*************** dumpTSParser(Archive *fout, DumpOptions 
*** 12723,12730 ****
   *	  write out a single text search dictionary
   */
  static void
! dumpTSDictionary(Archive *fout, DumpOptions *dopt, TSDictInfo *dictinfo)
  {
  	PQExpBuffer q;
  	PQExpBuffer delq;
  	PQExpBuffer labelq;
--- 12765,12773 ----
   *	  write out a single text search dictionary
   */
  static void
! dumpTSDictionary(Archive *fout, TSDictInfo *dictinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer q;
  	PQExpBuffer delq;
  	PQExpBuffer labelq;
*************** dumpTSDictionary(Archive *fout, DumpOpti
*** 12796,12802 ****
  				 NULL, NULL);
  
  	/* Dump Dictionary Comments */
! 	dumpComment(fout, dopt, labelq->data,
  				NULL, dictinfo->rolname,
  				dictinfo->dobj.catId, 0, dictinfo->dobj.dumpId);
  
--- 12839,12845 ----
  				 NULL, NULL);
  
  	/* Dump Dictionary Comments */
! 	dumpComment(fout, labelq->data,
  				NULL, dictinfo->rolname,
  				dictinfo->dobj.catId, 0, dictinfo->dobj.dumpId);
  
*************** dumpTSDictionary(Archive *fout, DumpOpti
*** 12811,12818 ****
   *	  write out a single text search template
   */
  static void
! dumpTSTemplate(Archive *fout, DumpOptions *dopt, TSTemplateInfo *tmplinfo)
  {
  	PQExpBuffer q;
  	PQExpBuffer delq;
  	PQExpBuffer labelq;
--- 12854,12862 ----
   *	  write out a single text search template
   */
  static void
! dumpTSTemplate(Archive *fout, TSTemplateInfo *tmplinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer q;
  	PQExpBuffer delq;
  	PQExpBuffer labelq;
*************** dumpTSTemplate(Archive *fout, DumpOption
*** 12862,12868 ****
  				 NULL, NULL);
  
  	/* Dump Template Comments */
! 	dumpComment(fout, dopt, labelq->data,
  				NULL, "",
  				tmplinfo->dobj.catId, 0, tmplinfo->dobj.dumpId);
  
--- 12906,12912 ----
  				 NULL, NULL);
  
  	/* Dump Template Comments */
! 	dumpComment(fout, labelq->data,
  				NULL, "",
  				tmplinfo->dobj.catId, 0, tmplinfo->dobj.dumpId);
  
*************** dumpTSTemplate(Archive *fout, DumpOption
*** 12876,12883 ****
   *	  write out a single text search configuration
   */
  static void
! dumpTSConfig(Archive *fout, DumpOptions *dopt, TSConfigInfo *cfginfo)
  {
  	PQExpBuffer q;
  	PQExpBuffer delq;
  	PQExpBuffer labelq;
--- 12920,12928 ----
   *	  write out a single text search configuration
   */
  static void
! dumpTSConfig(Archive *fout, TSConfigInfo *cfginfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer q;
  	PQExpBuffer delq;
  	PQExpBuffer labelq;
*************** dumpTSConfig(Archive *fout, DumpOptions 
*** 12990,12996 ****
  				 NULL, NULL);
  
  	/* Dump Configuration Comments */
! 	dumpComment(fout, dopt, labelq->data,
  				NULL, cfginfo->rolname,
  				cfginfo->dobj.catId, 0, cfginfo->dobj.dumpId);
  
--- 13035,13041 ----
  				 NULL, NULL);
  
  	/* Dump Configuration Comments */
! 	dumpComment(fout, labelq->data,
  				NULL, cfginfo->rolname,
  				cfginfo->dobj.catId, 0, cfginfo->dobj.dumpId);
  
*************** dumpTSConfig(Archive *fout, DumpOptions 
*** 13005,13012 ****
   *	  write out a single foreign-data wrapper definition
   */
  static void
! dumpForeignDataWrapper(Archive *fout, DumpOptions *dopt, FdwInfo *fdwinfo)
  {
  	PQExpBuffer q;
  	PQExpBuffer delq;
  	PQExpBuffer labelq;
--- 13050,13058 ----
   *	  write out a single foreign-data wrapper definition
   */
  static void
! dumpForeignDataWrapper(Archive *fout, FdwInfo *fdwinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer q;
  	PQExpBuffer delq;
  	PQExpBuffer labelq;
*************** dumpForeignDataWrapper(Archive *fout, Du
*** 13064,13077 ****
  				 NULL, NULL);
  
  	/* Handle the ACL */
! 	dumpACL(fout, dopt, fdwinfo->dobj.catId, fdwinfo->dobj.dumpId,
  			"FOREIGN DATA WRAPPER",
  			qfdwname, NULL, fdwinfo->dobj.name,
  			NULL, fdwinfo->rolname,
  			fdwinfo->fdwacl);
  
  	/* Dump Foreign Data Wrapper Comments */
! 	dumpComment(fout, dopt, labelq->data,
  				NULL, fdwinfo->rolname,
  				fdwinfo->dobj.catId, 0, fdwinfo->dobj.dumpId);
  
--- 13110,13123 ----
  				 NULL, NULL);
  
  	/* Handle the ACL */
! 	dumpACL(fout, fdwinfo->dobj.catId, fdwinfo->dobj.dumpId,
  			"FOREIGN DATA WRAPPER",
  			qfdwname, NULL, fdwinfo->dobj.name,
  			NULL, fdwinfo->rolname,
  			fdwinfo->fdwacl);
  
  	/* Dump Foreign Data Wrapper Comments */
! 	dumpComment(fout, labelq->data,
  				NULL, fdwinfo->rolname,
  				fdwinfo->dobj.catId, 0, fdwinfo->dobj.dumpId);
  
*************** dumpForeignDataWrapper(Archive *fout, Du
*** 13087,13094 ****
   *	  write out a foreign server definition
   */
  static void
! dumpForeignServer(Archive *fout, DumpOptions *dopt, ForeignServerInfo *srvinfo)
  {
  	PQExpBuffer q;
  	PQExpBuffer delq;
  	PQExpBuffer labelq;
--- 13133,13141 ----
   *	  write out a foreign server definition
   */
  static void
! dumpForeignServer(Archive *fout, ForeignServerInfo *srvinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer q;
  	PQExpBuffer delq;
  	PQExpBuffer labelq;
*************** dumpForeignServer(Archive *fout, DumpOpt
*** 13156,13162 ****
  				 NULL, NULL);
  
  	/* Handle the ACL */
! 	dumpACL(fout, dopt, srvinfo->dobj.catId, srvinfo->dobj.dumpId,
  			"FOREIGN SERVER",
  			qsrvname, NULL, srvinfo->dobj.name,
  			NULL, srvinfo->rolname,
--- 13203,13209 ----
  				 NULL, NULL);
  
  	/* Handle the ACL */
! 	dumpACL(fout, srvinfo->dobj.catId, srvinfo->dobj.dumpId,
  			"FOREIGN SERVER",
  			qsrvname, NULL, srvinfo->dobj.name,
  			NULL, srvinfo->rolname,
*************** dumpForeignServer(Archive *fout, DumpOpt
*** 13169,13175 ****
  					 srvinfo->dobj.catId, srvinfo->dobj.dumpId);
  
  	/* Dump Foreign Server Comments */
! 	dumpComment(fout, dopt, labelq->data,
  				NULL, srvinfo->rolname,
  				srvinfo->dobj.catId, 0, srvinfo->dobj.dumpId);
  
--- 13216,13222 ----
  					 srvinfo->dobj.catId, srvinfo->dobj.dumpId);
  
  	/* Dump Foreign Server Comments */
! 	dumpComment(fout, labelq->data,
  				NULL, srvinfo->rolname,
  				srvinfo->dobj.catId, 0, srvinfo->dobj.dumpId);
  
*************** dumpUserMappings(Archive *fout,
*** 13285,13292 ****
   * Write out default privileges information
   */
  static void
! dumpDefaultACL(Archive *fout, DumpOptions *dopt, DefaultACLInfo *daclinfo)
  {
  	PQExpBuffer q;
  	PQExpBuffer tag;
  	const char *type;
--- 13332,13340 ----
   * Write out default privileges information
   */
  static void
! dumpDefaultACL(Archive *fout, DefaultACLInfo *daclinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer q;
  	PQExpBuffer tag;
  	const char *type;
*************** dumpDefaultACL(Archive *fout, DumpOption
*** 13365,13375 ****
   *----------
   */
  static void
! dumpACL(Archive *fout, DumpOptions *dopt, CatalogId objCatId, DumpId objDumpId,
  		const char *type, const char *name, const char *subname,
  		const char *tag, const char *nspname, const char *owner,
  		const char *acls)
  {
  	PQExpBuffer sql;
  
  	/* Do nothing if ACL dump is not enabled */
--- 13413,13424 ----
   *----------
   */
  static void
! dumpACL(Archive *fout, CatalogId objCatId, DumpId objDumpId,
  		const char *type, const char *name, const char *subname,
  		const char *tag, const char *nspname, const char *owner,
  		const char *acls)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer sql;
  
  	/* Do nothing if ACL dump is not enabled */
*************** dumpACL(Archive *fout, DumpOptions *dopt
*** 13420,13429 ****
   * calling ArchiveEntry() for the specified object.
   */
  static void
! dumpSecLabel(Archive *fout, DumpOptions *dopt, const char *target,
  			 const char *namespace, const char *owner,
  			 CatalogId catalogId, int subid, DumpId dumpId)
  {
  	SecLabelItem *labels;
  	int			nlabels;
  	int			i;
--- 13469,13479 ----
   * calling ArchiveEntry() for the specified object.
   */
  static void
! dumpSecLabel(Archive *fout, const char *target,
  			 const char *namespace, const char *owner,
  			 CatalogId catalogId, int subid, DumpId dumpId)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	SecLabelItem *labels;
  	int			nlabels;
  	int			i;
*************** dumpSecLabel(Archive *fout, DumpOptions 
*** 13484,13491 ****
   * and its columns.
   */
  static void
! dumpTableSecLabel(Archive *fout, DumpOptions *dopt, TableInfo *tbinfo, const char *reltypename)
  {
  	SecLabelItem *labels;
  	int			nlabels;
  	int			i;
--- 13534,13542 ----
   * and its columns.
   */
  static void
! dumpTableSecLabel(Archive *fout, TableInfo *tbinfo, const char *reltypename)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	SecLabelItem *labels;
  	int			nlabels;
  	int			i;
*************** collectSecLabels(Archive *fout, SecLabel
*** 13705,13724 ****
   *	  write out to fout the declarations (not data) of a user-defined table
   */
  static void
! dumpTable(Archive *fout, DumpOptions *dopt, TableInfo *tbinfo)
  {
  	if (tbinfo->dobj.dump && !dopt->dataOnly)
  	{
  		char	   *namecopy;
  
  		if (tbinfo->relkind == RELKIND_SEQUENCE)
! 			dumpSequence(fout, dopt, tbinfo);
  		else
! 			dumpTableSchema(fout, dopt, tbinfo);
  
  		/* Handle the ACL here */
  		namecopy = pg_strdup(fmtId(tbinfo->dobj.name));
! 		dumpACL(fout, dopt, tbinfo->dobj.catId, tbinfo->dobj.dumpId,
  				(tbinfo->relkind == RELKIND_SEQUENCE) ? "SEQUENCE" :
  				"TABLE",
  				namecopy, NULL, tbinfo->dobj.name,
--- 13756,13777 ----
   *	  write out to fout the declarations (not data) of a user-defined table
   */
  static void
! dumpTable(Archive *fout, TableInfo *tbinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
+ 
  	if (tbinfo->dobj.dump && !dopt->dataOnly)
  	{
  		char	   *namecopy;
  
  		if (tbinfo->relkind == RELKIND_SEQUENCE)
! 			dumpSequence(fout, tbinfo);
  		else
! 			dumpTableSchema(fout, tbinfo);
  
  		/* Handle the ACL here */
  		namecopy = pg_strdup(fmtId(tbinfo->dobj.name));
! 		dumpACL(fout, tbinfo->dobj.catId, tbinfo->dobj.dumpId,
  				(tbinfo->relkind == RELKIND_SEQUENCE) ? "SEQUENCE" :
  				"TABLE",
  				namecopy, NULL, tbinfo->dobj.name,
*************** dumpTable(Archive *fout, DumpOptions *do
*** 13753,13759 ****
  				attnamecopy = pg_strdup(fmtId(attname));
  				acltag = psprintf("%s.%s", tbinfo->dobj.name, attname);
  				/* Column's GRANT type is always TABLE */
! 				dumpACL(fout, dopt, tbinfo->dobj.catId, tbinfo->dobj.dumpId, "TABLE",
  						namecopy, attnamecopy, acltag,
  						tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
  						attacl);
--- 13806,13812 ----
  				attnamecopy = pg_strdup(fmtId(attname));
  				acltag = psprintf("%s.%s", tbinfo->dobj.name, attname);
  				/* Column's GRANT type is always TABLE */
! 				dumpACL(fout, tbinfo->dobj.catId, tbinfo->dobj.dumpId, "TABLE",
  						namecopy, attnamecopy, acltag,
  						tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
  						attacl);
*************** createViewAsClause(Archive *fout, TableI
*** 13830,13837 ****
   *	  write the declaration (not data) of one user-defined table or view
   */
  static void
! dumpTableSchema(Archive *fout, DumpOptions *dopt, TableInfo *tbinfo)
  {
  	PQExpBuffer q = createPQExpBuffer();
  	PQExpBuffer delq = createPQExpBuffer();
  	PQExpBuffer labelq = createPQExpBuffer();
--- 13883,13891 ----
   *	  write the declaration (not data) of one user-defined table or view
   */
  static void
! dumpTableSchema(Archive *fout, TableInfo *tbinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer q = createPQExpBuffer();
  	PQExpBuffer delq = createPQExpBuffer();
  	PQExpBuffer labelq = createPQExpBuffer();
*************** dumpTableSchema(Archive *fout, DumpOptio
*** 14456,14465 ****
  
  
  	/* Dump Table Comments */
! 	dumpTableComment(fout, dopt, tbinfo, reltypename);
  
  	/* Dump Table Security Labels */
! 	dumpTableSecLabel(fout, dopt, tbinfo, reltypename);
  
  	/* Dump comments on inlined table constraints */
  	for (j = 0; j < tbinfo->ncheck; j++)
--- 14510,14519 ----
  
  
  	/* Dump Table Comments */
! 	dumpTableComment(fout, tbinfo, reltypename);
  
  	/* Dump Table Security Labels */
! 	dumpTableSecLabel(fout, tbinfo, reltypename);
  
  	/* Dump comments on inlined table constraints */
  	for (j = 0; j < tbinfo->ncheck; j++)
*************** dumpTableSchema(Archive *fout, DumpOptio
*** 14469,14475 ****
  		if (constr->separate || !constr->conislocal)
  			continue;
  
! 		dumpTableConstraintComment(fout, dopt, constr);
  	}
  
  	destroyPQExpBuffer(q);
--- 14523,14529 ----
  		if (constr->separate || !constr->conislocal)
  			continue;
  
! 		dumpTableConstraintComment(fout, constr);
  	}
  
  	destroyPQExpBuffer(q);
*************** dumpTableSchema(Archive *fout, DumpOptio
*** 14481,14488 ****
   * dumpAttrDef --- dump an attribute's default-value declaration
   */
  static void
! dumpAttrDef(Archive *fout, DumpOptions *dopt, AttrDefInfo *adinfo)
  {
  	TableInfo  *tbinfo = adinfo->adtable;
  	int			adnum = adinfo->adnum;
  	PQExpBuffer q;
--- 14535,14543 ----
   * dumpAttrDef --- dump an attribute's default-value declaration
   */
  static void
! dumpAttrDef(Archive *fout, AttrDefInfo *adinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	TableInfo  *tbinfo = adinfo->adtable;
  	int			adnum = adinfo->adnum;
  	PQExpBuffer q;
*************** getAttrName(int attrnum, TableInfo *tblI
*** 14568,14575 ****
   *	  write out to fout a user-defined index
   */
  static void
! dumpIndex(Archive *fout, DumpOptions *dopt, IndxInfo *indxinfo)
  {
  	TableInfo  *tbinfo = indxinfo->indextable;
  	bool		is_constraint = (indxinfo->indexconstraint != 0);
  	PQExpBuffer q;
--- 14623,14631 ----
   *	  write out to fout a user-defined index
   */
  static void
! dumpIndex(Archive *fout, IndxInfo *indxinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	TableInfo  *tbinfo = indxinfo->indextable;
  	bool		is_constraint = (indxinfo->indexconstraint != 0);
  	PQExpBuffer q;
*************** dumpIndex(Archive *fout, DumpOptions *do
*** 14641,14647 ****
  	}
  
  	/* Dump Index Comments */
! 	dumpComment(fout, dopt, labelq->data,
  				tbinfo->dobj.namespace->dobj.name,
  				tbinfo->rolname,
  				indxinfo->dobj.catId, 0,
--- 14697,14703 ----
  	}
  
  	/* Dump Index Comments */
! 	dumpComment(fout, labelq->data,
  				tbinfo->dobj.namespace->dobj.name,
  				tbinfo->rolname,
  				indxinfo->dobj.catId, 0,
*************** dumpIndex(Archive *fout, DumpOptions *do
*** 14658,14665 ****
   *	  write out to fout a user-defined constraint
   */
  static void
! dumpConstraint(Archive *fout, DumpOptions *dopt, ConstraintInfo *coninfo)
  {
  	TableInfo  *tbinfo = coninfo->contable;
  	PQExpBuffer q;
  	PQExpBuffer delq;
--- 14714,14722 ----
   *	  write out to fout a user-defined constraint
   */
  static void
! dumpConstraint(Archive *fout, ConstraintInfo *coninfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	TableInfo  *tbinfo = coninfo->contable;
  	PQExpBuffer q;
  	PQExpBuffer delq;
*************** dumpConstraint(Archive *fout, DumpOption
*** 14879,14885 ****
  
  	/* Dump Constraint Comments --- only works for table constraints */
  	if (tbinfo && coninfo->separate)
! 		dumpTableConstraintComment(fout, dopt, coninfo);
  
  	destroyPQExpBuffer(q);
  	destroyPQExpBuffer(delq);
--- 14936,14942 ----
  
  	/* Dump Constraint Comments --- only works for table constraints */
  	if (tbinfo && coninfo->separate)
! 		dumpTableConstraintComment(fout, coninfo);
  
  	destroyPQExpBuffer(q);
  	destroyPQExpBuffer(delq);
*************** dumpConstraint(Archive *fout, DumpOption
*** 14893,14899 ****
   * or as a separate ALTER command.
   */
  static void
! dumpTableConstraintComment(Archive *fout, DumpOptions *dopt, ConstraintInfo *coninfo)
  {
  	TableInfo  *tbinfo = coninfo->contable;
  	PQExpBuffer labelq = createPQExpBuffer();
--- 14950,14956 ----
   * or as a separate ALTER command.
   */
  static void
! dumpTableConstraintComment(Archive *fout, ConstraintInfo *coninfo)
  {
  	TableInfo  *tbinfo = coninfo->contable;
  	PQExpBuffer labelq = createPQExpBuffer();
*************** dumpTableConstraintComment(Archive *fout
*** 14902,14908 ****
  					  fmtId(coninfo->dobj.name));
  	appendPQExpBuffer(labelq, "ON %s",
  					  fmtId(tbinfo->dobj.name));
! 	dumpComment(fout, dopt, labelq->data,
  				tbinfo->dobj.namespace->dobj.name,
  				tbinfo->rolname,
  				coninfo->dobj.catId, 0,
--- 14959,14965 ----
  					  fmtId(coninfo->dobj.name));
  	appendPQExpBuffer(labelq, "ON %s",
  					  fmtId(tbinfo->dobj.name));
! 	dumpComment(fout, labelq->data,
  				tbinfo->dobj.namespace->dobj.name,
  				tbinfo->rolname,
  				coninfo->dobj.catId, 0,
*************** findLastBuiltinOid_V70(Archive *fout)
*** 14962,14969 ****
   *	  write the declaration (not data) of one user-defined sequence
   */
  static void
! dumpSequence(Archive *fout, DumpOptions *dopt, TableInfo *tbinfo)
  {
  	PGresult   *res;
  	char	   *startv,
  			   *incby,
--- 15019,15027 ----
   *	  write the declaration (not data) of one user-defined sequence
   */
  static void
! dumpSequence(Archive *fout, TableInfo *tbinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PGresult   *res;
  	char	   *startv,
  			   *incby,
*************** dumpSequence(Archive *fout, DumpOptions 
*** 15148,15157 ****
  	}
  
  	/* Dump Sequence Comments and Security Labels */
! 	dumpComment(fout, dopt, labelq->data,
  				tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
  				tbinfo->dobj.catId, 0, tbinfo->dobj.dumpId);
! 	dumpSecLabel(fout, dopt, labelq->data,
  				 tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
  				 tbinfo->dobj.catId, 0, tbinfo->dobj.dumpId);
  
--- 15206,15215 ----
  	}
  
  	/* Dump Sequence Comments and Security Labels */
! 	dumpComment(fout, labelq->data,
  				tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
  				tbinfo->dobj.catId, 0, tbinfo->dobj.dumpId);
! 	dumpSecLabel(fout, labelq->data,
  				 tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
  				 tbinfo->dobj.catId, 0, tbinfo->dobj.dumpId);
  
*************** dumpSequenceData(Archive *fout, TableDat
*** 15222,15229 ****
   *	  write the declaration of one user-defined table trigger
   */
  static void
! dumpTrigger(Archive *fout, DumpOptions *dopt, TriggerInfo *tginfo)
  {
  	TableInfo  *tbinfo = tginfo->tgtable;
  	PQExpBuffer query;
  	PQExpBuffer delqry;
--- 15280,15288 ----
   *	  write the declaration of one user-defined table trigger
   */
  static void
! dumpTrigger(Archive *fout, TriggerInfo *tginfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	TableInfo  *tbinfo = tginfo->tgtable;
  	PQExpBuffer query;
  	PQExpBuffer delqry;
*************** dumpTrigger(Archive *fout, DumpOptions *
*** 15418,15424 ****
  				 NULL, 0,
  				 NULL, NULL);
  
! 	dumpComment(fout, dopt, labelq->data,
  				tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
  				tginfo->dobj.catId, 0, tginfo->dobj.dumpId);
  
--- 15477,15483 ----
  				 NULL, 0,
  				 NULL, NULL);
  
! 	dumpComment(fout, labelq->data,
  				tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
  				tginfo->dobj.catId, 0, tginfo->dobj.dumpId);
  
*************** dumpTrigger(Archive *fout, DumpOptions *
*** 15432,15439 ****
   *	  write the declaration of one user-defined event trigger
   */
  static void
! dumpEventTrigger(Archive *fout, DumpOptions *dopt, EventTriggerInfo *evtinfo)
  {
  	PQExpBuffer query;
  	PQExpBuffer labelq;
  
--- 15491,15499 ----
   *	  write the declaration of one user-defined event trigger
   */
  static void
! dumpEventTrigger(Archive *fout, EventTriggerInfo *evtinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer query;
  	PQExpBuffer labelq;
  
*************** dumpEventTrigger(Archive *fout, DumpOpti
*** 15489,15495 ****
  				 "EVENT TRIGGER", SECTION_POST_DATA,
  				 query->data, "", NULL, NULL, 0, NULL, NULL);
  
! 	dumpComment(fout, dopt, labelq->data,
  				NULL, evtinfo->evtowner,
  				evtinfo->dobj.catId, 0, evtinfo->dobj.dumpId);
  
--- 15549,15555 ----
  				 "EVENT TRIGGER", SECTION_POST_DATA,
  				 query->data, "", NULL, NULL, 0, NULL, NULL);
  
! 	dumpComment(fout, labelq->data,
  				NULL, evtinfo->evtowner,
  				evtinfo->dobj.catId, 0, evtinfo->dobj.dumpId);
  
*************** dumpEventTrigger(Archive *fout, DumpOpti
*** 15502,15509 ****
   *		Dump a rule
   */
  static void
! dumpRule(Archive *fout, DumpOptions *dopt, RuleInfo *rinfo)
  {
  	TableInfo  *tbinfo = rinfo->ruletable;
  	PQExpBuffer query;
  	PQExpBuffer cmd;
--- 15562,15570 ----
   *		Dump a rule
   */
  static void
! dumpRule(Archive *fout, RuleInfo *rinfo)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	TableInfo  *tbinfo = rinfo->ruletable;
  	PQExpBuffer query;
  	PQExpBuffer cmd;
*************** dumpRule(Archive *fout, DumpOptions *dop
*** 15618,15624 ****
  				 NULL, NULL);
  
  	/* Dump rule comments */
! 	dumpComment(fout, dopt, labelq->data,
  				tbinfo->dobj.namespace->dobj.name,
  				tbinfo->rolname,
  				rinfo->dobj.catId, 0, rinfo->dobj.dumpId);
--- 15679,15685 ----
  				 NULL, NULL);
  
  	/* Dump rule comments */
! 	dumpComment(fout, labelq->data,
  				tbinfo->dobj.namespace->dobj.name,
  				tbinfo->rolname,
  				rinfo->dobj.catId, 0, rinfo->dobj.dumpId);
*************** dumpRule(Archive *fout, DumpOptions *dop
*** 15662,15670 ****
   *	  but perhaps we can provide a better solution in the future.
   */
  void
! getExtensionMembership(Archive *fout, DumpOptions *dopt, ExtensionInfo extinfo[],
  					   int numExtensions)
  {
  	PQExpBuffer query;
  	PGresult   *res;
  	int			ntups,
--- 15723,15732 ----
   *	  but perhaps we can provide a better solution in the future.
   */
  void
! getExtensionMembership(Archive *fout, ExtensionInfo extinfo[],
  					   int numExtensions)
  {
+ 	DumpOptions *dopt = fout->dopt;
  	PQExpBuffer query;
  	PGresult   *res;
  	int			ntups,
diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h
index ba37c4c..ec83d02 100644
*** a/src/bin/pg_dump/pg_dump.h
--- b/src/bin/pg_dump/pg_dump.h
*************** extern char g_opaque_type[10];	/* name f
*** 493,499 ****
   *	common utility functions
   */
  
! extern TableInfo *getSchemaData(Archive *, DumpOptions *dopt, int *numTablesPtr);
  
  extern void AssignDumpId(DumpableObject *dobj);
  extern DumpId createDumpId(void);
--- 493,499 ----
   *	common utility functions
   */
  
! extern TableInfo *getSchemaData(Archive *fout, int *numTablesPtr);
  
  extern void AssignDumpId(DumpableObject *dobj);
  extern DumpId createDumpId(void);
*************** extern void sortDataAndIndexObjectsBySiz
*** 527,542 ****
   * version specific routines
   */
  extern NamespaceInfo *getNamespaces(Archive *fout, int *numNamespaces);
! extern ExtensionInfo *getExtensions(Archive *fout, DumpOptions *dopt, int *numExtensions);
  extern TypeInfo *getTypes(Archive *fout, int *numTypes);
! extern FuncInfo *getFuncs(Archive *fout, DumpOptions *dopt, int *numFuncs);
! extern AggInfo *getAggregates(Archive *fout, DumpOptions *dopt, int *numAggregates);
  extern OprInfo *getOperators(Archive *fout, int *numOperators);
  extern OpclassInfo *getOpclasses(Archive *fout, int *numOpclasses);
  extern OpfamilyInfo *getOpfamilies(Archive *fout, int *numOpfamilies);
  extern CollInfo *getCollations(Archive *fout, int *numCollations);
  extern ConvInfo *getConversions(Archive *fout, int *numConversions);
! extern TableInfo *getTables(Archive *fout, DumpOptions *dopt, int *numTables);
  extern void getOwnedSeqs(Archive *fout, TableInfo tblinfo[], int numTables);
  extern InhInfo *getInherits(Archive *fout, int *numInherits);
  extern void getIndexes(Archive *fout, TableInfo tblinfo[], int numTables);
--- 527,542 ----
   * version specific routines
   */
  extern NamespaceInfo *getNamespaces(Archive *fout, int *numNamespaces);
! extern ExtensionInfo *getExtensions(Archive *fout, int *numExtensions);
  extern TypeInfo *getTypes(Archive *fout, int *numTypes);
! extern FuncInfo *getFuncs(Archive *fout, int *numFuncs);
! extern AggInfo *getAggregates(Archive *fout, int *numAggregates);
  extern OprInfo *getOperators(Archive *fout, int *numOperators);
  extern OpclassInfo *getOpclasses(Archive *fout, int *numOpclasses);
  extern OpfamilyInfo *getOpfamilies(Archive *fout, int *numOpfamilies);
  extern CollInfo *getCollations(Archive *fout, int *numCollations);
  extern ConvInfo *getConversions(Archive *fout, int *numConversions);
! extern TableInfo *getTables(Archive *fout, int *numTables);
  extern void getOwnedSeqs(Archive *fout, TableInfo tblinfo[], int numTables);
  extern InhInfo *getInherits(Archive *fout, int *numInherits);
  extern void getIndexes(Archive *fout, TableInfo tblinfo[], int numTables);
*************** extern void getConstraints(Archive *fout
*** 544,552 ****
  extern RuleInfo *getRules(Archive *fout, int *numRules);
  extern void getTriggers(Archive *fout, TableInfo tblinfo[], int numTables);
  extern ProcLangInfo *getProcLangs(Archive *fout, int *numProcLangs);
! extern CastInfo *getCasts(Archive *fout, DumpOptions *dopt, int *numCasts);
  extern TransformInfo *getTransforms(Archive *fout, int *numTransforms);
! extern void getTableAttrs(Archive *fout, DumpOptions *dopt, TableInfo *tbinfo, int numTables);
  extern bool shouldPrintColumn(DumpOptions *dopt, TableInfo *tbinfo, int colno);
  extern TSParserInfo *getTSParsers(Archive *fout, int *numTSParsers);
  extern TSDictInfo *getTSDictionaries(Archive *fout, int *numTSDicts);
--- 544,552 ----
  extern RuleInfo *getRules(Archive *fout, int *numRules);
  extern void getTriggers(Archive *fout, TableInfo tblinfo[], int numTables);
  extern ProcLangInfo *getProcLangs(Archive *fout, int *numProcLangs);
! extern CastInfo *getCasts(Archive *fout, int *numCasts);
  extern TransformInfo *getTransforms(Archive *fout, int *numTransforms);
! extern void getTableAttrs(Archive *fout, TableInfo *tbinfo, int numTables);
  extern bool shouldPrintColumn(DumpOptions *dopt, TableInfo *tbinfo, int colno);
  extern TSParserInfo *getTSParsers(Archive *fout, int *numTSParsers);
  extern TSDictInfo *getTSDictionaries(Archive *fout, int *numTSDicts);
*************** extern FdwInfo *getForeignDataWrappers(A
*** 556,563 ****
  					   int *numForeignDataWrappers);
  extern ForeignServerInfo *getForeignServers(Archive *fout,
  				  int *numForeignServers);
! extern DefaultACLInfo *getDefaultACLs(Archive *fout, DumpOptions *dopt, int *numDefaultACLs);
! extern void getExtensionMembership(Archive *fout, DumpOptions *dopt, ExtensionInfo extinfo[],
  					   int numExtensions);
  extern EventTriggerInfo *getEventTriggers(Archive *fout, int *numEventTriggers);
  extern void getPolicies(Archive *fout, TableInfo tblinfo[], int numTables);
--- 556,563 ----
  					   int *numForeignDataWrappers);
  extern ForeignServerInfo *getForeignServers(Archive *fout,
  				  int *numForeignServers);
! extern DefaultACLInfo *getDefaultACLs(Archive *fout, int *numDefaultACLs);
! extern void getExtensionMembership(Archive *fout, ExtensionInfo extinfo[],
  					   int numExtensions);
  extern EventTriggerInfo *getEventTriggers(Archive *fout, int *numEventTriggers);
  extern void getPolicies(Archive *fout, TableInfo tblinfo[], int numTables);
diff --git a/src/bin/pg_dump/pg_restore.c b/src/bin/pg_dump/pg_restore.c
index af8dff5..1559f1e 100644
*** a/src/bin/pg_dump/pg_restore.c
--- b/src/bin/pg_dump/pg_restore.c
*************** main(int argc, char **argv)
*** 377,382 ****
--- 377,384 ----
  
  	AH = OpenArchive(inputFileSpec, opts->format);
  
+ 	SetArchiveOptions(AH, NULL, opts);
+ 
  	/*
  	 * We don't have a connection yet but that doesn't matter. The connection
  	 * is initialized to NULL and if we terminate through exit_nicely() while
*************** main(int argc, char **argv)
*** 393,399 ****
  	AH->exit_on_error = opts->exit_on_error;
  
  	if (opts->tocFile)
! 		SortTocFromFile(AH, opts);
  
  	/* See comments in pg_dump.c */
  #ifdef WIN32
--- 395,401 ----
  	AH->exit_on_error = opts->exit_on_error;
  
  	if (opts->tocFile)
! 		SortTocFromFile(AH);
  
  	/* See comments in pg_dump.c */
  #ifdef WIN32
*************** main(int argc, char **argv)
*** 408,417 ****
  	AH->numWorkers = numWorkers;
  
  	if (opts->tocSummary)
! 		PrintTOCSummary(AH, opts);
  	else
  	{
! 		SetArchiveRestoreOptions(AH, opts);
  		RestoreArchive(AH);
  	}
  
--- 410,419 ----
  	AH->numWorkers = numWorkers;
  
  	if (opts->tocSummary)
! 		PrintTOCSummary(AH);
  	else
  	{
! 		ProcessArchiveRestoreOptions(AH);
  		RestoreArchive(AH);
  	}
  
*************** main(int argc, char **argv)
*** 423,429 ****
  	/* AH may be freed in CloseArchive? */
  	exit_code = AH->n_errors ? 1 : 0;
  
! 	CloseArchive(AH, NULL);
  
  	return exit_code;
  }
--- 425,431 ----
  	/* AH may be freed in CloseArchive? */
  	exit_code = AH->n_errors ? 1 : 0;
  
! 	CloseArchive(AH);
  
  	return exit_code;
  }
