Re: Bug in pg_dump/restore -o - Mailing list pgsql-hackers
| From | Tom Lane |
|---|---|
| Subject | Re: Bug in pg_dump/restore -o |
| Date | |
| Msg-id | 2465.1011319515@sss.pgh.pa.us Whole thread Raw |
| In response to | Re: Bug in pg_dump/restore -o (Bruce Momjian <pgman@candle.pha.pa.us>) |
| Responses |
Re: Bug in pg_dump/restore -o
|
| List | pgsql-hackers |
Bruce Momjian <pgman@candle.pha.pa.us> writes:
> I am told this was broken in 7.1 too.
Good point. That probably means it's not a "must fix" for 7.2, but
still, it'd be nice to have a solution.
Attached is a diff that seems to actually work in all three pgdump modes
(script output, -Fc, -Ft). A disadvantage of this approach is that
there doesn't seem to be any clean way to issue a DROP for the temp
table, so it will persist in the target database until we finish the
psql script or pg_restore run (or at least until we have to do a
\connect). This would create a problem if the name pgdump_oid
conflicted with any actual table name being restored. We could choose
some more bizarre name to reduce the probability of such a conflict.
A potentially more serious problem is that if the archiving code chooses
to issue other operations between the schema restore and data restore
for the temp table, we might do a \connect and lose the temp table.
Come to think of it, a data-only restore request won't work either.
I had originally tried a single data-only archive entry with copy
command CREATE... COPY. This would avoid the latter two problems.
However, while it seemed to work okay in -Fc mode, -Ft blew up:
$ pg_dump -Ft -b -o test >/tmp/dump.tar
pg_dump: [tar archiver] bad COPY statement - could not find "copy" in string "cr
eate temporary table pgdump_oid (dummy int4);
copy pgdump_oid with oids from stdin;
Philip, is this a fundamental problem, or do we just need to make
the tar archiver a little smarter about looking at the COPY strings?
regards, tom lane
*** src/bin/pg_dump/pg_dump.c.orig Fri Jan 11 18:21:55 2002
--- src/bin/pg_dump/pg_dump.c Thu Jan 17 20:51:50 2002
***************
*** 89,94 ****
--- 89,95 ----
static Oid findLastBuiltinOid_V71(const char *);
static Oid findLastBuiltinOid_V70(void);
static void setMaxOid(Archive *fout);
+ static int setMaxOid_dumper(Archive *fout, char *oid, void *dctxv);
static void AddAcl(char *aclbuf, const char *keyword);
static char *GetPrivileges(Archive *AH, const char *s);
***************
*** 4538,4552 ****
/*
* setMaxOid -
! * find the maximum oid and generate a COPY statement to set it
! */
static void
setMaxOid(Archive *fout)
{
PGresult *res;
Oid max_oid;
- char sql[1024];
res = PQexec(g_conn, "CREATE TEMPORARY TABLE pgdump_oid (dummy int4)");
if (!res ||
--- 4539,4568 ----
/*
* setMaxOid -
! * find the maximum oid and generate commands to reproduce it in the target
! */
static void
setMaxOid(Archive *fout)
{
+ ArchiveEntry(fout, "0", "Max OID",
+ "<Init>", NULL,
+ "CREATE TEMPORARY TABLE pgdump_oid (dummy int4);\n",
+ "", "", "",
+ NULL, NULL);
+
+ ArchiveEntry(fout, "0", "Max OID",
+ "<Init Data>", NULL, "", "",
+ "COPY pgdump_oid WITH OIDS FROM stdin;\n",
+ "",
+ setMaxOid_dumper, NULL);
+ }
+
+ static int
+ setMaxOid_dumper(Archive *fout, char *oid, void *dctxv)
+ {
PGresult *res;
Oid max_oid;
res = PQexec(g_conn, "CREATE TEMPORARY TABLE pgdump_oid (dummy int4)");
if (!res ||
***************
*** 4578,4594 ****
exit_nicely();
}
PQclear(res);
if (g_verbose)
write_msg(NULL, "maximum system oid is %u\n", max_oid);
- snprintf(sql, 1024,
- "CREATE TEMPORARY TABLE pgdump_oid (dummy int4);\n"
- "COPY pgdump_oid WITH OIDS FROM stdin;\n"
- "%u\t0\n"
- "\\.\n"
- "DROP TABLE pgdump_oid;\n",
- max_oid);
! ArchiveEntry(fout, "0", "Max OID", "<Init>", NULL, sql, "", "", "", NULL, NULL);
}
/*
--- 4594,4609 ----
exit_nicely();
}
PQclear(res);
+
if (g_verbose)
write_msg(NULL, "maximum system oid is %u\n", max_oid);
! archprintf(fout,
! "%u\t0\n"
! "\\.\n",
! max_oid);
!
! return 1;
}
/*
pgsql-hackers by date: