On Wed, Apr 20, 2022 at 10:38:46AM -0700, Nathan Bossart wrote:
> > +void
> > +check_objfilter(VacObjectFilter curr_objfilter, VacObjectFilter
> > curr_option)
> > +{
> > + switch (curr_option)
> > + {
> > + case OBJFILTER_NONE:
> > + break;
> > + case OBJFILTER_DATABASE:
> > + /* When filtering on database name, vacuum on all
> > database is not allowed. */
> > + if (curr_objfilter == OBJFILTER_ALL)
> > + pg_fatal("cannot vacuum all databases and a
> > specific one at the same time");
> > + break;
> > + case OBJFILTER_ALL:
> > + /* When vacuuming all database, filter on database name
> > is not allowed. */
> > + if (curr_objfilter == OBJFILTER_DATABASE)
> > + pg_fatal("cannot vacuum all databases and a
> > specific one at the same time");
> > + /* When vacuuming all database, filter on schema name
> > is not allowed. */
> > + if (curr_objfilter == OBJFILTER_SCHEMA)
> > + pg_fatal("cannot vacuum specific schema(s) in
> > all databases");
> > + /* When vacuuming all database, schema exclusion is not
> > allowed. */
> > + if (curr_objfilter == OBJFILTER_SCHEMA_EXCLUDE)
> > + pg_fatal("cannot exclude from vacuum specific
> > schema(s) in all databases");
> > + /* When vacuuming all database, filter on table name is
> > not allowed. */
> > + if (curr_objfilter == OBJFILTER_TABLE)
> > + pg_fatal("cannot vacuum specific table(s) in
> > all databases");
> > + break;
> > + case OBJFILTER_TABLE:
> > + /* When filtering on table name, filter by schema is
> > not allowed. */
> > + if (curr_objfilter == OBJFILTER_SCHEMA)
> > + pg_fatal("cannot vacuum all tables in schema(s)
> > and specific table(s) at the same time");
> > + /* When filtering on table name, schema exclusion is
> > not allowed. */
> > + if (curr_objfilter == OBJFILTER_SCHEMA_EXCLUDE)
> > + pg_fatal("cannot vacuum specific table(s) and
> > exclude specific schema(s) at the same time");
> > + break;
> > + case OBJFILTER_SCHEMA:
> > + /* When filtering on schema name, filter by table is
> > not allowed. */
> > + if (curr_objfilter == OBJFILTER_TABLE)
> > + pg_fatal("cannot vacuum all tables in schema(s)
> > and specific table(s) at the same time");
> > + /* When filtering on schema name, schema exclusion is
> > not allowed. */
> > + if (curr_objfilter == OBJFILTER_SCHEMA_EXCLUDE)
> > + pg_fatal("cannot vacuum all tables in schema(s)
> > and exclude specific schema(s) at the same time");
> > + /* filtering on schema name can not be use on all
> > database. */
> > + if (curr_objfilter == OBJFILTER_ALL)
> > + pg_fatal("cannot vacuum specific schema(s) in
> > all databases");
> > + break;
> > + case OBJFILTER_SCHEMA_EXCLUDE:
> > + /* When filtering on schema exclusion, filter by table
> > is not allowed. */
> > + if (curr_objfilter == OBJFILTER_TABLE)
> > + pg_fatal("cannot vacuum all tables in schema(s)
> > and specific table(s) at the same time");
> > + /* When filetring on schema exclusion, filter by schema
> > is not allowed. */
> > + if (curr_objfilter == OBJFILTER_SCHEMA)
> > + pg_fatal("cannot vacuum all tables in schema(s)
> > and exclude specific schema(s) at the same time");
> > + break;
> > + }
> > +}
>
> I don't think this handles all combinations. For example, the following
> command does not fail:
>
> vacuumdb -a -N test postgres
>
> Furthermore, do you think it'd be possible to dynamically generate the
> message?
Not in the obvious way, because that breaks translatability.
--
Justin