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 по дате отправления: