Re: pg_dump and premature optimizations for objects not to be dumped

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: pg_dump and premature optimizations for objects not to be dumped
Дата
Msg-id 19197.1452715551@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Re: pg_dump and premature optimizations for objects not to be dumped  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-hackers
I wrote:
> BTW, the bulk of the changes in this patch are just there to pass down
> the DumpOptions struct to where it's needed, following some pre-existing
> work that passed that around as a separate pointer.  I wonder why things
> were done that way, rather than adding a DumpOptions pointer in the
> Archive struct?  The vast majority of the functions I had to touch already
> had an Archive* parameter, and would not have needed to be touched if it
> were done the other way.  I'm tempted to push a preliminary patch that
> adds such a field and gets rid of DumpOptions as a separate parameter
> to anything that also takes an Archive* pointer.

Specifically, something like the attached, which is bulky but mostly
mechanical.  This undoes a lot of API changes introduced by 0eea8047bf
to pass DumpOptions as a separate argument to assorted functions.
I think this is a good idea because (a) those changes were pretty random
and incomplete, as evidenced by the fact that I had to do a bunch more of
them in my upthread patch; (b) this significantly reduces the delta
between 9.5/HEAD and pre-9.5 code in pg_dump, which will no doubt ease
future back-patching.  So unless I hear objections, I plan to push this
pretty soon.

            regards, tom lane

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;
  }

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Peter Geoghegan
Дата:
Сообщение: Re: pgindent-polluted commits
Следующее
От: Tom Lane
Дата:
Сообщение: Re: Fuzzy substring searching with the pg_trgm extension