Greg Sabino Mullane wrote: -- Start of PGP signed section. > Here's the latest pg_dump patch I've been (too sporadically) working on. > I abandoned building linked lists and decided to make the backend do all > the work, from building the list of good relations, to doing the POSIX > regex matching. I've added numerous examples to the docs, but it may > still need some more explaining. It should be nearly 100% backwards > compatible with any existing scripts that use a single -t as well.
Very updated patch attached and applied. I did reformatting, variable renaming, and some cleanup on the linked list handling. Thanks. I am very glad to get this long-overdue TODO item done. -- Bruce Momjian [EMAIL PROTECTED] EnterpriseDB http://www.enterprisedb.com + If your life is a hard drive, Christ can be your backup. +
Index: doc/src/sgml/ref/pg_dump.sgml =================================================================== RCS file: /cvsroot/pgsql/doc/src/sgml/ref/pg_dump.sgml,v retrieving revision 1.86 diff -c -c -r1.86 pg_dump.sgml *** doc/src/sgml/ref/pg_dump.sgml 13 May 2006 17:10:35 -0000 1.86 --- doc/src/sgml/ref/pg_dump.sgml 1 Aug 2006 17:44:56 -0000 *************** *** 398,415 **** <listitem> <para> Dump data for <replaceable class="parameter">table</replaceable> ! only. It is possible for there to be ! multiple tables with the same name in different schemas; if that ! is the case, all matching tables will be dumped. Specify both ! <option>--schema</> and <option>--table</> to select just one table. </para> <note> <para> In this mode, <application>pg_dump</application> makes no ! attempt to dump any other database objects that the selected table may depend upon. Therefore, there is no guarantee ! that the results of a single-table dump can be successfully restored by themselves into a clean database. </para> </note> --- 398,460 ---- <listitem> <para> Dump data for <replaceable class="parameter">table</replaceable> ! only. It is possible for there to be multiple tables with the same ! name in different schemas; if that is the case, all matching tables ! will be dumped. Also, if any POSIX regular expression character appears ! in the table name (<literal>([{\.?+</>, the string will be interpreted ! as a regular expression. Note that when in regular expression mode, the ! string will not be anchored to the start/end unless <literal>^</> and ! <literal>$</> are used at the beginning/end of the string. </para> + <para> + The options <option>-t</>, <option>-T</>, <option>-n</>, and <option>-N</> + can be used together to achieve a high degree of control over what is + dumped. Multiple arguments can be used, and are parsed in the order + given to build a list of valid tables and schemas. The schema options are + parsed first to create a list of schemas to dump, and then the table options + are parsed to only find tables in the matching schemas. + </para> + + <para>For example, to dump a single table named <literal>pg_class</>: + + <screen> + <prompt>$</prompt> <userinput>pg_dump -t pg_class mydb > db.out</userinput> + </screen> + </para> + + <para>To dump all tables starting with <literal>employee</> in the + <literal>detroit</> schema, except for the table named <literal>employee_log</literal>: + + <screen> + <prompt>$</prompt> <userinput>pg_dump -n detroit -t ^employee -T employee_log mydb > db.out</userinput> + </screen> + </para> + + <para>To dump all schemas starting with <literal>east</> or <literal>west</> and ending in + <literal>gsm</>, but not schemas that contain the letters <literal>test</>, except for + one named <literal>east_alpha_test_five</>: + + <screen> + <prompt>$</prompt> <userinput>pg_dump -n "^(east|west).*gsm$" -N test -n east_alpha_test_five mydb > db.out</userinput> + </screen> + </para> + + + <para>To dump all tables except for those beginning with <literal>ts_</literal>: + + <screen> + <prompt>$</prompt> <userinput>pg_dump -T "^ts_" mydb > db.out</userinput> + </screen> + </para> + + <note> <para> In this mode, <application>pg_dump</application> makes no ! attempt to dump any other database objects that the selected tables may depend upon. Therefore, there is no guarantee ! that the results of a specific-table dump can be successfully restored by themselves into a clean database. </para> </note> *************** *** 417,422 **** --- 462,505 ---- </varlistentry> <varlistentry> + <term><option>-T <replaceable class="parameter">table</replaceable></option></term> + <term><option>--exclude-table=<replaceable class="parameter">table</replaceable></option></term> + <listitem> + <para> + Do not dump any matching <replaceable class="parameter">tables</replaceable>. + More than one option can be used, and POSIX regular expressions are handled just + like <literal>-t</>. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term><option>-n <replaceable class="parameter">schema</replaceable></option></term> + <term><option>--schema=<replaceable class="parameter">schema</replaceable></option></term> + <listitem> + <para> + Dump only the matching <replaceable class="parameter">schemas</replaceable>. + More than one option can be used, and POSIX regular expressions are handled just + like <literal>-t</>. + </para> + + </listitem> + </varlistentry> + + <varlistentry> + <term><option>-N <replaceable class="parameter">schema</replaceable></option></term> + <term><option>--exclude-schema=<replaceable class="parameter">schema</replaceable></option></term> + <listitem> + <para> + Do not dump the matching <replaceable class="parameter">schemas</replaceable>. + More than one option can be used, and POSIX regular expressions are handled just + like <literal>-t</>. + </para> + + </listitem> + </varlistentry> + + <varlistentry> <term><option>-v</></term> <term><option>--verbose</></term> <listitem> Index: src/bin/pg_dump/common.c =================================================================== RCS file: /cvsroot/pgsql/src/bin/pg_dump/common.c,v retrieving revision 1.91 diff -c -c -r1.91 common.c *** src/bin/pg_dump/common.c 14 Jul 2006 14:52:26 -0000 1.91 --- src/bin/pg_dump/common.c 1 Aug 2006 17:44:57 -0000 *************** *** 72,80 **** * Collect information about all potentially dumpable objects */ TableInfo * ! getSchemaData(int *numTablesPtr, ! const bool schemaOnly, ! const bool dataOnly) { NamespaceInfo *nsinfo; AggInfo *agginfo; --- 72,78 ---- * Collect information about all potentially dumpable objects */ TableInfo * ! getSchemaData(int *numTablesPtr) { NamespaceInfo *nsinfo; AggInfo *agginfo; Index: src/bin/pg_dump/pg_dump.c =================================================================== RCS file: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v retrieving revision 1.442 diff -c -c -r1.442 pg_dump.c *** src/bin/pg_dump/pg_dump.c 27 Jul 2006 19:52:06 -0000 1.442 --- src/bin/pg_dump/pg_dump.c 1 Aug 2006 17:44:59 -0000 *************** *** 91,98 **** /* obsolete as of 7.3: */ static Oid g_last_builtin_oid; /* value of the last builtin oid */ ! static char *selectTableName = NULL; /* name of a single table to dump */ ! static char *selectSchemaName = NULL; /* name of a single schema to dump */ char g_opaque_type[10]; /* name for the opaque type */ --- 91,109 ---- /* obsolete as of 7.3: */ static Oid g_last_builtin_oid; /* value of the last builtin oid */ ! /* select and exclude tables and schemas */ ! typedef struct objnameArg ! { ! struct objnameArg *next; ! char *name; /* name of the relation */ ! bool is_include; /* include/exclude? */ ! } objnameArg; ! ! objnameArg *schemaList = NULL; /* List of schemas to include/exclude */ ! objnameArg *tableList = NULL; /* List of tables to include/exclude */ ! ! char *matchingSchemas = NULL; /* Final list of schemas to dump by oid */ ! char *matchingTables = NULL; /* Final list of tables to dump by oid */ char g_opaque_type[10]; /* name for the opaque type */ *************** *** 180,185 **** --- 191,199 ---- int main(int argc, char **argv) { + PQExpBuffer query = createPQExpBuffer(); + PGresult *res; + objnameArg *this_obj_name = NULL; int c; const char *filename = NULL; const char *format = "p"; *************** *** 195,200 **** --- 209,215 ---- DumpableObject **dobjs; int numObjs; int i; + bool switch_include_exclude; bool force_password = false; int compressLevel = -1; bool ignore_version = false; *************** *** 226,234 **** --- 241,251 ---- {"no-owner", no_argument, NULL, 'O'}, {"port", required_argument, NULL, 'p'}, {"schema", required_argument, NULL, 'n'}, + {"exclude-schema", required_argument, NULL, 'N'}, {"schema-only", no_argument, NULL, 's'}, {"superuser", required_argument, NULL, 'S'}, {"table", required_argument, NULL, 't'}, + {"exclude-table", required_argument, NULL, 'T'}, {"password", no_argument, NULL, 'W'}, {"username", required_argument, NULL, 'U'}, {"verbose", no_argument, NULL, 'v'}, *************** *** 281,289 **** } } ! while ((c = getopt_long(argc, argv, "abcCdDE:f:F:h:in:oOp:RsS:t:uU:vWxX:Z:", long_options, &optindex)) != -1) { switch (c) { case 'a': /* Dump data only */ --- 298,308 ---- } } ! while ((c = getopt_long(argc, argv, "abcCdDE:f:F:h:in:N:oOp:RsS:t:T:uU:vWxX:Z:", long_options, &optindex)) != -1) { + objnameArg *schemaList_tail = NULL, *tableList_tail = NULL; + switch (c) { case 'a': /* Dump data only */ *************** *** 332,339 **** ignore_version = true; break; ! case 'n': /* Dump data for this schema only */ ! selectSchemaName = strdup(optarg); break; case 'o': /* Dump oids */ --- 351,392 ---- ignore_version = true; break; ! case 'n': /* Include schemas */ ! case 'N': /* Exclude schemas */ ! case 't': /* Include tables */ ! case 'T': /* Exclude tables */ ! ! if (strlen(optarg) < 1) ! { ! fprintf(stderr, _("%s: invalid -%c option\n"), progname, c); ! exit(1); ! } ! ! { ! /* Create a struct for this name */ ! objnameArg *new_obj_name = (objnameArg *) ! malloc(sizeof(objnameArg)); ! ! new_obj_name->next = NULL; ! new_obj_name->name = strdup(optarg); ! new_obj_name->is_include = islower(c) ? true : false; ! ! /* add new entry to the proper list */ ! if (tolower(c) == 'n') ! { ! if (!schemaList_tail) ! schemaList_tail = schemaList = new_obj_name; ! else ! schemaList_tail = schemaList_tail->next = new_obj_name; ! } ! else ! { ! if (!tableList_tail) ! tableList_tail = tableList = new_obj_name; ! else ! tableList_tail = tableList_tail->next = new_obj_name; ! } ! } break; case 'o': /* Dump oids */ *************** *** 361,370 **** outputSuperuser = strdup(optarg); break; - case 't': /* Dump data for this table only */ - selectTableName = strdup(optarg); - break; - case 'u': force_password = true; username = simple_prompt("User name: ", 100, true); --- 414,419 ---- *************** *** 449,455 **** exit(1); } ! if (selectTableName != NULL || selectSchemaName != NULL) outputBlobs = false; if (dumpInserts == true && oids == true) --- 498,504 ---- exit(1); } ! if (matchingTables != NULL || matchingSchemas != NULL) outputBlobs = false; if (dumpInserts == true && oids == true) *************** *** 568,578 **** write_msg(NULL, "last built-in OID is %u\n", g_last_builtin_oid); } /* * Now scan the database and create DumpableObject structs for all the * objects we intend to dump. */ ! tblinfo = getSchemaData(&numTables, schemaOnly, dataOnly); if (!schemaOnly) getTableData(tblinfo, numTables, oids); --- 617,773 ---- write_msg(NULL, "last built-in OID is %u\n", g_last_builtin_oid); } + + if (schemaList != NULL && g_fout->remoteVersion < 70300) + { + write_msg(NULL, "Postgres must be at least version 7.3 to use schema switches\n"); + exit_nicely(); + } + + /* Check schema selection flags */ + resetPQExpBuffer(query); + switch_include_exclude = true; + for (this_obj_name = schemaList; this_obj_name; this_obj_name = this_obj_name->next) + { + if (switch_include_exclude) + { + /* Special case for when -N is the first argument */ + if (this_obj_name == schemaList && !this_obj_name->is_include) + appendPQExpBuffer(query, "SELECT oid FROM pg_catalog.pg_namespace EXCEPT\n"); + + appendPQExpBuffer(query, "SELECT oid FROM pg_catalog.pg_namespace WHERE"); + } + + appendPQExpBuffer(query, "%s nspname %c ", switch_include_exclude ? "" : " OR", + /* any meta-characters? */ + strpbrk(this_obj_name->name,"([{\\.?+") == NULL ? '=' : '~'); + appendStringLiteralAH(query, this_obj_name->name, g_fout); + + if (this_obj_name->next && this_obj_name->next->is_include == this_obj_name->is_include) + switch_include_exclude = false; + else + { + switch_include_exclude = true; + + /* Add the joiner if needed */ + if (this_obj_name->next) + appendPQExpBuffer(query, "\n%s\n", + this_obj_name->next->is_include ? "UNION" : "EXCEPT"); + } + } + + /* Construct OID list of matching schemas */ + if (schemaList) + { + int len; + + res = PQexec(g_conn, query->data); + check_sql_result(res, g_conn, query->data, PGRES_TUPLES_OK); + if (PQntuples(res) == 0) + { + write_msg(NULL, "No matching schemas were found\n"); + exit_nicely(); + } + + for (i = 0, len = strlen(" "); i < PQntuples(res); i++) + len += strlen(PQgetvalue(res, i, 0)) + 1; + + /* + * Need to use comma separators so it can be used by IN. zero + * is a dummy placeholder. Format is " oid oid oid ". + */ + matchingSchemas = malloc(len + 1); + strcpy(matchingSchemas, " "); + for (i = 0; i < PQntuples(res); i++) + { + strcat(matchingSchemas, PQgetvalue(res, i, 0)); + strcat(matchingSchemas, " "); + } + } + + /* Check table selection flags */ + resetPQExpBuffer(query); + switch_include_exclude = true; + for (this_obj_name = tableList; this_obj_name; this_obj_name = this_obj_name->next) + { + if (switch_include_exclude) + { + /* Special case for when -T is the first argument */ + if (this_obj_name == tableList && !this_obj_name->is_include && !strlen(query->data)) + appendPQExpBuffer(query, "SELECT oid FROM pg_catalog.pg_class WHERE relkind='r' EXCEPT\n"); + + appendPQExpBuffer(query, "SELECT oid FROM pg_catalog.pg_class WHERE relkind='r' AND ("); + } + + appendPQExpBuffer(query, "%srelname %c ", switch_include_exclude ? "" : " OR ", + /* any meta-characters? */ + strpbrk(this_obj_name->name,"([{\\.?+") == NULL ? '=' : '~'); + appendStringLiteralAH(query, this_obj_name->name, g_fout); + + if (this_obj_name->next && this_obj_name->next->is_include == this_obj_name->is_include) + switch_include_exclude = false; + else + { + switch_include_exclude = true; + appendPQExpBuffer(query, ")"); + + /* Add the joiner if needed */ + if (this_obj_name->next) + appendPQExpBuffer(query, "\n%s\n", this_obj_name->next->is_include ? + "UNION" : "EXCEPT"); + } + } + + /* Construct OID list of matching tables */ + if (tableList) + { + int len; + + /* Restrict by schema? */ + if (matchingSchemas != NULL) + { + char *matchingSchemas_commas = strdup(matchingSchemas), *p; + + /* Construct "IN" SQL string by adding commas, " oid, oid, oid " */ + for (p = matchingSchemas_commas; *p; p++) + { + /* No commas for first/last characters */ + if (*p == ' ' && p != matchingSchemas_commas && *(p+1)) + *p = ','; + } + + appendPQExpBuffer(query, + "\nINTERSECT\nSELECT oid FROM pg_catalog.pg_class WHERE relkind='r' AND relnamespace IN (%s)\n", + matchingSchemas_commas); + } + + res = PQexec(g_conn, query->data); + check_sql_result(res, g_conn, query->data, PGRES_TUPLES_OK); + if (PQntuples(res) == 0) + { + write_msg(NULL, "No matching tables were found\n"); + exit_nicely(); + } + + for (i = 0, len = strlen(" "); i < PQntuples(res); i++) + len += strlen(PQgetvalue(res, i, 0)) + 1; + + matchingTables = malloc(len + 1); + strcpy(matchingTables, " "); + for (i = 0; i < PQntuples(res); i++) + { + strcat(matchingTables, PQgetvalue(res, i, 0)); + strcat(matchingTables, " "); + } + } + + destroyPQExpBuffer(query); + /* * Now scan the database and create DumpableObject structs for all the * objects we intend to dump. */ ! tblinfo = getSchemaData(&numTables); if (!schemaOnly) getTableData(tblinfo, numTables, oids); *************** *** 628,634 **** dumpStdStrings(g_fout); /* The database item is always next, unless we don't want it at all */ ! if (!dataOnly && selectTableName == NULL && selectSchemaName == NULL) dumpDatabase(g_fout); /* Now the rearrangeable objects. */ --- 823,829 ---- dumpStdStrings(g_fout); /* The database item is always next, unless we don't want it at all */ ! if (!dataOnly && matchingTables == NULL && matchingSchemas == NULL) dumpDatabase(g_fout); /* Now the rearrangeable objects. */ *************** *** 687,714 **** printf(_(" --version output version information, then exit\n")); printf(_("\nOptions controlling the output content:\n")); ! printf(_(" -a, --data-only dump only the data, not the schema\n")); ! printf(_(" -c, --clean clean (drop) schema prior to create\n")); ! printf(_(" -C, --create include commands to create database in dump\n")); ! printf(_(" -d, --inserts dump data as INSERT, rather than COPY, commands\n")); ! printf(_(" -D, --column-inserts dump data as INSERT commands with column names\n")); ! printf(_(" -E, --encoding=ENCODING dump the data in encoding ENCODING\n")); ! printf(_(" -n, --schema=SCHEMA dump the named schema only\n")); ! printf(_(" -o, --oids include OIDs in dump\n")); ! printf(_(" -O, --no-owner skip restoration of object ownership\n" ! " in plain text format\n")); ! printf(_(" -s, --schema-only dump only the schema, no data\n")); ! printf(_(" -S, --superuser=NAME specify the superuser user name to use in\n" ! " plain text format\n")); ! printf(_(" -t, --table=TABLE dump the named table only\n")); ! printf(_(" -x, --no-privileges do not dump privileges (grant/revoke)\n")); printf(_(" -X disable-dollar-quoting, --disable-dollar-quoting\n" ! " disable dollar quoting, use SQL standard quoting\n")); printf(_(" -X disable-triggers, --disable-triggers\n" ! " disable triggers during data-only restore\n")); printf(_(" -X use-set-session-authorization, --use-set-session-authorization\n" ! " use SESSION AUTHORIZATION commands instead of\n" ! " OWNER TO commands\n")); printf(_("\nConnection options:\n")); printf(_(" -h, --host=HOSTNAME database server host or socket directory\n")); --- 882,911 ---- printf(_(" --version output version information, then exit\n")); printf(_("\nOptions controlling the output content:\n")); ! printf(_(" -a, --data-only dump only the data, not the schema\n")); ! printf(_(" -c, --clean clean (drop) schema prior to create\n")); ! printf(_(" -C, --create include commands to create database in dump\n")); ! printf(_(" -d, --inserts dump data as INSERT, rather than COPY, commands\n")); ! printf(_(" -D, --column-inserts dump data as INSERT commands with column names\n")); ! printf(_(" -E, --encoding=ENCODING dump the data in encoding ENCODING\n")); ! printf(_(" -n, --schema=SCHEMA dump the named schema only\n")); ! printf(_(" -N, --exclude-schema=SCHEMA do NOT dump the named schema\n")); ! printf(_(" -o, --oids include OIDs in dump\n")); ! printf(_(" -O, --no-owner skip restoration of object ownership\n" ! " in plain text format\n")); ! printf(_(" -s, --schema-only dump only the schema, no data\n")); ! printf(_(" -S, --superuser=NAME specify the superuser user name to use in\n" ! " plain text format\n")); ! printf(_(" -t, --table=TABLE dump the named table only\n")); ! printf(_(" -T, --exclude-table=TABLE do NOT dump the named table\n")); ! printf(_(" -x, --no-privileges do not dump privileges (grant/revoke)\n")); printf(_(" -X disable-dollar-quoting, --disable-dollar-quoting\n" ! " disable dollar quoting, use SQL standard quoting\n")); printf(_(" -X disable-triggers, --disable-triggers\n" ! " disable triggers during data-only restore\n")); printf(_(" -X use-set-session-authorization, --use-set-session-authorization\n" ! " use SESSION AUTHORIZATION commands instead of\n" ! " OWNER TO commands\n")); printf(_("\nConnection options:\n")); printf(_(" -h, --host=HOSTNAME database server host or socket directory\n")); *************** *** 738,755 **** selectDumpableNamespace(NamespaceInfo *nsinfo) { /* ! * If a specific table is being dumped, do not dump any complete ! * namespaces. If a specific namespace is being dumped, dump just that ! * namespace. Otherwise, dump all non-system namespaces. */ ! if (selectTableName != NULL) nsinfo->dobj.dump = false; ! else if (selectSchemaName != NULL) { ! if (strcmp(nsinfo->dobj.name, selectSchemaName) == 0) nsinfo->dobj.dump = true; ! else ! nsinfo->dobj.dump = false; } else if (strncmp(nsinfo->dobj.name, "pg_", 3) == 0 || strcmp(nsinfo->dobj.name, "information_schema") == 0) --- 935,954 ---- selectDumpableNamespace(NamespaceInfo *nsinfo) { /* ! * If specific tables are being dumped, do not dump any complete ! * namespaces. If specific namespaces are being dumped, dump just ! * those namespaces. Otherwise, dump all non-system namespaces. */ ! if (matchingTables != NULL) nsinfo->dobj.dump = false; ! else if (matchingSchemas != NULL) { ! char *searchname = NULL; ! searchname = malloc(20); ! sprintf(searchname, " %d ", nsinfo->dobj.catId.oid); ! if (strstr(matchingSchemas, searchname) != NULL) nsinfo->dobj.dump = true; ! free(searchname); } else if (strncmp(nsinfo->dobj.name, "pg_", 3) == 0 || strcmp(nsinfo->dobj.name, "information_schema") == 0) *************** *** 771,786 **** * dump. */ tbinfo->dobj.dump = false; ! if (tbinfo->dobj.namespace->dobj.dump) tbinfo->dobj.dump = true; ! else if (selectTableName != NULL && ! strcmp(tbinfo->dobj.name, selectTableName) == 0) { ! /* If both -s and -t specified, must match both to dump */ ! if (selectSchemaName == NULL) ! tbinfo->dobj.dump = true; ! else if (strcmp(tbinfo->dobj.namespace->dobj.name, selectSchemaName) == 0) tbinfo->dobj.dump = true; } } --- 970,985 ---- * dump. */ tbinfo->dobj.dump = false; ! if (tbinfo->dobj.namespace->dobj.dump || matchingTables == NULL) tbinfo->dobj.dump = true; ! else { ! char *searchname = NULL; ! searchname = malloc(20); ! sprintf(searchname, " %d ", tbinfo->dobj.catId.oid); ! if (strstr(matchingTables, searchname) != NULL) tbinfo->dobj.dump = true; + free(searchname); } } *************** *** 1722,1746 **** nsinfo[i].dobj.name); } - /* - * If the user attempted to dump a specific namespace, check to ensure - * that the specified namespace actually exists. - */ - if (selectSchemaName) - { - for (i = 0; i < ntups; i++) - if (strcmp(nsinfo[i].dobj.name, selectSchemaName) == 0) - break; - - /* Didn't find a match */ - if (i == ntups) - { - write_msg(NULL, "specified schema \"%s\" does not exist\n", - selectSchemaName); - exit_nicely(); - } - } - PQclear(res); destroyPQExpBuffer(query); --- 1921,1926 ---- *************** *** 2905,2930 **** tblinfo[i].dobj.name); } - /* - * If the user is attempting to dump a specific table, check to ensure - * that the specified table actually exists. (This is a bit simplistic - * since we don't fully check the combination of -n and -t switches.) - */ - if (selectTableName) - { - for (i = 0; i < ntups; i++) - if (strcmp(tblinfo[i].dobj.name, selectTableName) == 0) - break; - - /* Didn't find a match */ - if (i == ntups) - { - write_msg(NULL, "specified table \"%s\" does not exist\n", - selectTableName); - exit_nicely(); - } - } - PQclear(res); destroyPQExpBuffer(query); destroyPQExpBuffer(delqry); --- 3085,3090 ---- *************** *** 5438,5444 **** static bool shouldDumpProcLangs(void) { ! if (selectTableName != NULL || selectSchemaName != NULL) return false; /* And they're schema not data */ if (dataOnly) --- 5598,5604 ---- static bool shouldDumpProcLangs(void) { ! if (matchingTables != NULL || matchingSchemas != NULL) return false; /* And they're schema not data */ if (dataOnly) Index: src/bin/pg_dump/pg_dump.h =================================================================== RCS file: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.h,v retrieving revision 1.127 diff -c -c -r1.127 pg_dump.h *** src/bin/pg_dump/pg_dump.h 27 Jul 2006 19:52:06 -0000 1.127 --- src/bin/pg_dump/pg_dump.h 1 Aug 2006 17:44:59 -0000 *************** *** 340,348 **** * common utility functions */ ! extern TableInfo *getSchemaData(int *numTablesPtr, ! const bool schemaOnly, ! const bool dataOnly); typedef enum _OidOptions { --- 340,346 ---- * common utility functions */ ! extern TableInfo *getSchemaData(int *numTablesPtr); typedef enum _OidOptions {
---------------------------(end of broadcast)--------------------------- TIP 4: Have you searched our list archives? http://archives.postgresql.org