</listitem>
</varlistentry>
+ <varlistentry>
+ <term><option>--exclude-extension=<replaceable class="parameter">pattern</replaceable></option></term>
+ <listitem>
+ <para>
+ Do not dump any extensions matching <replaceable
+ class="parameter">pattern</replaceable>. The pattern is
+ interpreted according to the same rules as for <option>-e</option>.
+ <option>--exclude-extension</option> can be given more than once to exclude extensions
+ matching any of several patterns.
+ </para>
+
+ <para>
+ When both <option>-e</option> and <option>--exclude-extension</option> are given, the behavior
+ is to dump just the extensions that match at least one <option>-e</option>
+ switch but no <option>--exclude-extension</option> switches. If <option>--exclude-extension</option>
+ appears without <option>-e</option>, then extensions matching <option>--exclude-extension</option> are
+ excluded from what is otherwise a normal dump.
+ </para>
+ </listitem>
+ </varlistentry>
+
<varlistentry>
<term><option>-E <replaceable class="parameter">encoding</replaceable></option></term>
<term><option>--encoding=<replaceable class="parameter">encoding</replaceable></option></term>
<option>--exclude-table-and-children</option> or
<option>-T</option> for tables,
<option>-n</option>/<option>--schema</option> for schemas,
- <option>--include-foreign-data</option> for data on foreign servers and
+ <option>--include-foreign-data</option> for data on foreign servers,
<option>--exclude-table-data</option>,
- <option>--exclude-table-data-and-children</option> for table data,
- <option>-e</option>/<option>--extension</option> for extensions.
+ <option>--exclude-table-data-and-children</option> for table data, and
+ <option>-e</option>/<option>--extension</option> or
+ <option>--exclude-extension</option> for extensions.
To read from <literal>STDIN</literal>, use <filename>-</filename> as the
filename. The <option>--filter</option> option can be specified in
conjunction with the above listed options for including or excluding
<listitem>
<para>
<literal>extension</literal>: extensions, works like the
- <option>--extension</option> option. This keyword can only be
- used with the <literal>include</literal> keyword.
+ <option>-e</option>/<option>--extension</option> option.
</para>
</listitem>
<listitem>
</para>
<para>
This option has no effect
- on <option>-N</option>/<option>--exclude-schema</option>,
+ on <option>--exclude-extension</option>,
+ <option>-N</option>/<option>--exclude-schema</option>,
<option>-T</option>/<option>--exclude-table</option>,
or <option>--exclude-table-data</option>. An exclude pattern failing
to match any objects is not considered an error.
static SimpleStringList extension_include_patterns = {NULL, NULL};
static SimpleOidList extension_include_oids = {NULL, NULL};
+static SimpleStringList extension_exclude_patterns = {NULL, NULL};
+static SimpleOidList extension_exclude_oids = {NULL, NULL};
+
static const CatalogId nilCatalogId = {0, 0};
/* override for standard extra_float_digits setting */
{"exclude-table-data-and-children", required_argument, NULL, 14},
{"sync-method", required_argument, NULL, 15},
{"filter", required_argument, NULL, 16},
+ {"exclude-extension", required_argument, NULL, 17},
{NULL, 0, NULL, 0}
};
read_dump_filters(optarg, &dopt);
break;
+ case 17: /* exclude extension(s) */
+ simple_string_list_append(&extension_exclude_patterns,
+ optarg);
+ break;
+
default:
/* getopt_long already emitted a complaint */
pg_log_error_hint("Try \"%s --help\" for more information.", progname);
if (extension_include_oids.head == NULL)
pg_fatal("no matching extensions were found");
}
+ expand_extension_name_patterns(fout, &extension_exclude_patterns,
+ &extension_exclude_oids,
+ false);
+ /* non-matching exclusion patterns aren't an error */
/*
* Dumping LOs is the default for dumps where an inclusion switch is not
printf(_(" -c, --clean clean (drop) database objects before recreating\n"));
printf(_(" -C, --create include commands to create database in dump\n"));
printf(_(" -e, --extension=PATTERN dump the specified extension(s) only\n"));
+ printf(_(" --exclude-extension=PATTERN do NOT dump the specified extension(s)\n"));
printf(_(" -E, --encoding=ENCODING dump the data in encoding ENCODING\n"));
printf(_(" -n, --schema=PATTERN dump the specified schema(s) only\n"));
printf(_(" -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"));
extinfo->dobj.dump = extinfo->dobj.dump_contains =
dopt->include_everything ?
DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE;
+
+ /* check that the extension is not explicitly excluded */
+ if (extinfo->dobj.dump &&
+ simple_oid_list_member(&extension_exclude_oids,
+ extinfo->dobj.catId.oid))
+ extinfo->dobj.dump = extinfo->dobj.dump_contains = DUMP_COMPONENT_NONE;
}
}
curext->dobj.catId.oid))
continue;
+ /*
+ * Check if this extension is listed as to exclude in the dump. If
+ * yes, any table data associated with it is discarded.
+ */
+ if (extension_exclude_oids.head != NULL &&
+ simple_oid_list_member(&extension_exclude_oids,
+ curext->dobj.catId.oid))
+ continue;
+
if (strlen(extconfig) != 0 || strlen(extcondition) != 0)
{
int j;
case FILTER_OBJECT_TYPE_FUNCTION:
case FILTER_OBJECT_TYPE_INDEX:
case FILTER_OBJECT_TYPE_TRIGGER:
- case FILTER_OBJECT_TYPE_EXTENSION:
case FILTER_OBJECT_TYPE_FOREIGN_DATA:
pg_log_filter_error(&fstate, _("%s filter for \"%s\" is not allowed"),
"exclude",
exit_nicely(1);
break;
+ case FILTER_OBJECT_TYPE_EXTENSION:
+ simple_string_list_append(&extension_exclude_patterns, objname);
+ break;
case FILTER_OBJECT_TYPE_TABLE_DATA:
simple_string_list_append(&tabledata_exclude_patterns,
objname);
'--extension=test_pg_dump', 'postgres',
],
},
+ exclude_extension => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync', "--file=$tempdir/exclude_extension.sql",
+ '--exclude-extension=test_pg_dump', 'postgres',
+ ],
+ },
+ exclude_extension_filter => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync',
+ "--file=$tempdir/exclude_extension_filter.sql",
+ "--filter=$tempdir/exclude_extension_filter.txt", 'postgres',
+ ],
+ },
# plpgsql in the list blocks the dump of extension test_pg_dump
without_extension => {
no_owner => 1,
privileged_internals => 1,
with_extension => 1,
+ exclude_extension => 1,
+ exclude_extension_filter => 1,
without_extension => 1);
my %tests = (
schema_only => 1,
section_pre_data => 1,
},
- unlike => { binary_upgrade => 1, without_extension => 1 },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_extension => 1,
+ exclude_extension_filter => 1,
+ without_extension => 1
+ },
},
'CREATE ROLE regress_dump_test_role' => {
section_data => 1,
extension_schema => 1,
},
- unlike => { without_extension => 1, },
+ unlike => {
+ exclude_extension => 1,
+ exclude_extension_filter => 1,
+ without_extension => 1,
+ },
},
'CREATE TABLE regress_pg_dump_table' => {
unlike => {
binary_upgrade => 1,
exclude_table => 1,
+ exclude_extension => 1,
+ exclude_extension_filter => 1,
without_extension => 1,
},
},
schema_only => 1,
section_pre_data => 1,
},
- unlike => { no_privs => 1, without_extension => 1, },
+ unlike => {
+ no_privs => 1,
+ exclude_extension => 1,
+ exclude_extension_filter => 1,
+ without_extension => 1,
+ },
},
'REVOKE GRANT OPTION FOR UPDATE ON SEQUENCE wgo_then_regular' => {
schema_only => 1,
section_pre_data => 1,
},
- unlike => { no_privs => 1, without_extension => 1, },
+ unlike => {
+ no_privs => 1,
+ exclude_extension => 1,
+ exclude_extension_filter => 1,
+ without_extension => 1,
+ },
},
'CREATE ACCESS METHOD regress_test_am' => {
schema_only => 1,
section_pre_data => 1,
},
- unlike => { without_extension => 1, },
+ unlike => {
+ exclude_extension => 1,
+ exclude_extension_filter => 1,
+ without_extension => 1,
+ },
},
'GRANT SELECT regress_pg_dump_table_added pre-ALTER EXTENSION' => {
schema_only => 1,
section_pre_data => 1,
},
- unlike => { no_privs => 1, without_extension => 1, },
+ unlike => {
+ no_privs => 1,
+ exclude_extension => 1,
+ exclude_extension_filter => 1,
+ without_extension => 1,
+ },
},
'GRANT SELECT ON TABLE regress_pg_dump_table' => {
schema_only => 1,
section_pre_data => 1,
},
- unlike => { no_privs => 1, without_extension => 1 },
+ unlike => {
+ no_privs => 1,
+ exclude_extension => 1,
+ exclude_extension_filter => 1,
+ without_extension => 1
+ },
},
'GRANT USAGE ON regress_pg_dump_table_col1_seq TO regress_dump_test_role'
schema_only => 1,
section_pre_data => 1,
},
- unlike => { no_privs => 1, without_extension => 1, },
+ unlike => {
+ no_privs => 1,
+ exclude_extension => 1,
+ exclude_extension_filter => 1,
+ without_extension => 1,
+ },
},
'GRANT USAGE ON regress_pg_dump_seq TO regress_dump_test_role' => {
schema_only => 1,
section_pre_data => 1,
},
- unlike => { no_privs => 1, without_extension => 1, },
+ unlike => {
+ no_privs => 1,
+ exclude_extension => 1,
+ exclude_extension_filter => 1,
+ without_extension => 1,
+ },
},
# Objects included in extension part of a schema created by this extension */
# Send the combined set of commands to psql
$node->safe_psql('postgres', $create_sql);
+#########################################
+# Create filter file for exclude_extension_filter test
+
+my $filterfile;
+
+open $filterfile, '>', "$tempdir/exclude_extension_filter.txt"
+ or die "unable to open filter file for writing";
+print $filterfile "exclude extension test_pg_dump\n";
+close $filterfile;
+
#########################################
# Run all runs