On 13 Aug 2002, Rod Taylor wrote:
> On Tue, 2002-08-13 at 07:49, Oleg Bartunov wrote:
> > We have a patch for pg_dump which adds a possibility to dump
> > a part of table, for example:
> >
> > dump Top.Science.Astronomy heirarchy from dmoz catalog
> >
> > pg_dump -d -t dmoz -w "select * from dmoz where path <@ 'Top.Science.Astronomy'"
>dmoz
> >
> > We found it's very useful. We'd like to extend it to use also with COPY
> > but it has no support for select (of course it will works only for
> > special case when ALL columns retrieved).
> >
> > The question is: Is't worth to submit patch for pg_dump and look into
> > copy code ?
>
> I've been asked by co-workers for information on how to do this type of
> thing. They do partial table dumps to a development system for the
> purpose of finding / eliminating bugs.
>
> That said, it may be smart to make the 'select * from <table>' part
> yourself, and let the user supply a where clause.
>
find patch (7.2) in attachement. Note, it works with -d (insert mode) option.
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to [EMAIL PROTECTED] so that your
> message can get through to the mailing list cleanly
>
Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, sci.researcher, hostmaster of AstroNet,
Sternberg Astronomical Institute, Moscow University (Russia)
Internet: [EMAIL PROTECTED], http://www.sai.msu.su/~megera/
phone: +007(095)939-16-83, +007(095)939-23-83
--- pg_dump.c.old Fri Aug 9 19:41:08 2002
+++ pg_dump.c Fri Aug 9 19:28:34 2002
@@ -128,6 +128,7 @@
TableInfo *tblinfo;
int tblidx;
bool oids;
+ const char *select_command;
} DumpContext;
static void
@@ -390,6 +391,7 @@
{
const DumpContext *dctx = (DumpContext *) dctxv;
const char *classname = dctx->tblinfo[dctx->tblidx].relname;
+ const char *select_command = dctx->select_command;
PGresult *res;
PQExpBuffer q = createPQExpBuffer();
@@ -397,9 +399,23 @@
int field;
if (fout->remoteVersion >= 70100)
- appendPQExpBuffer(q, "DECLARE _pg_dump_cursor CURSOR FOR SELECT * FROM
ONLY %s", fmtId(classname, force_quotes));
+ if (select_command)
+ {
+ appendPQExpBuffer(q, "DECLARE _pg_dump_cursor CURSOR FOR %s",
+select_command);
+ }
+ else
+ {
+ appendPQExpBuffer(q, "DECLARE _pg_dump_cursor CURSOR FOR
+SELECT * FROM ONLY %s", fmtId(classname, force_quotes));
+ }
else
- appendPQExpBuffer(q, "DECLARE _pg_dump_cursor CURSOR FOR SELECT * FROM
%s", fmtId(classname, force_quotes));
+ if (select_command)
+ {
+ appendPQExpBuffer(q, "DECLARE _pg_dump_cursor CURSOR FOR %s",
+select_command);
+ }
+ else
+ {
+ appendPQExpBuffer(q, "DECLARE _pg_dump_cursor CURSOR FOR
+SELECT * FROM %s", fmtId(classname, force_quotes));
+ }
res = PQexec(g_conn, q->data);
if (!res ||
@@ -547,7 +563,7 @@
*/
static void
dumpClasses(const TableInfo *tblinfo, const int numTables, Archive *fout,
- const char *onlytable, const bool oids, const bool force_quotes)
+ const char *onlytable, const bool oids, const bool force_quotes,
+const char *select_command)
{
int i;
DataDumperPtr dumpFn;
@@ -587,6 +603,7 @@
dumpCtx->tblinfo = (TableInfo *) tblinfo;
dumpCtx->tblidx = i;
dumpCtx->oids = oids;
+ dumpCtx->select_command = NULL;
if (!dumpData)
{
@@ -602,6 +619,10 @@
/* Restore using INSERT */
dumpFn = dumpClasses_dumpData;
copyStmt = NULL;
+ if (onlytable && (strcmp(classname, onlytable) == 0))
+ {
+ dumpCtx->select_command = select_command;
+ }
}
ArchiveEntry(fout, tblinfo[i].oid, tblinfo[i].relname,
@@ -648,6 +669,7 @@
const char *pghost = NULL;
const char *pgport = NULL;
const char *username = NULL;
+ const char *select_command = NULL;
char *tablename = NULL;
bool oids = false;
TableInfo *tblinfo;
@@ -694,6 +716,7 @@
{"no-privileges", no_argument, NULL, 'x'},
{"no-acl", no_argument, NULL, 'x'},
{"compress", required_argument, NULL, 'Z'},
+ {"where-clause", required_argument, NULL, 'w'},
{"help", no_argument, NULL, '?'},
{"version", no_argument, NULL, 'V'},
@@ -748,9 +771,9 @@
}
#ifdef HAVE_GETOPT_LONG
- while ((c = getopt_long(argc, argv, "abcCdDf:F:h:inNoOp:RsS:t:uU:vWxX:zZ:V?",
long_options, &optindex)) != -1)
+ while ((c = getopt_long(argc, argv,
+"abcCdDf:F:h:inNoOp:RsS:t:uU:vWxX:zZ:w:V?", long_options, &optindex)) != -1)
#else
- while ((c = getopt(argc, argv, "abcCdDf:F:h:inNoOp:RsS:t:uU:vWxX:zZ:V?-")) !=
-1)
+ while ((c = getopt(argc, argv, "abcCdDf:F:h:inNoOp:RsS:t:uU:vWxX:zZ:w:V?-"))
+!= -1)
#endif
{
@@ -881,6 +904,9 @@
case 'v': /* verbose */
g_verbose = true;
break;
+ case 'w': /* select query */
+ select_command = optarg;
+ break;
case 'W':
force_password = true;
@@ -1063,7 +1089,7 @@
tblinfo = dumpSchema(g_fout, &numTables, tablename, aclsSkip, oids,
schemaOnly, dataOnly);
if (!schemaOnly)
- dumpClasses(tblinfo, numTables, g_fout, tablename, oids,
force_quotes);
+ dumpClasses(tblinfo, numTables, g_fout, tablename, oids, force_quotes,
+select_command);
if (outputBlobs)
ArchiveEntry(g_fout, "0", "BLOBS", "BLOBS", NULL, "", "", "", "",
dumpBlobs, 0);
---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?
http://archives.postgresql.org