diff --git a/doc/src/sgml/ref/pg_amcheck.sgml b/doc/src/sgml/ref/pg_amcheck.sgml
index d01e26faa81..d4989c9f231 100644
--- a/doc/src/sgml/ref/pg_amcheck.sgml
+++ b/doc/src/sgml/ref/pg_amcheck.sgml
@@ -217,6 +217,23 @@ PostgreSQL documentation
+
+
+
+
+
+ Install any missing extensions that are required to check the
+ database(s). If not yet installed, each extension's objects will be
+ installed into the given
+ schema, or if not specified
+ into schema pg_catalog.
+
+
+ At present, the only required extension is .
+
+
+
+
diff --git a/src/bin/pg_amcheck/pg_amcheck.c b/src/bin/pg_amcheck/pg_amcheck.c
index bfe3d8e5949..09ebb4929a7 100644
--- a/src/bin/pg_amcheck/pg_amcheck.c
+++ b/src/bin/pg_amcheck/pg_amcheck.c
@@ -61,6 +61,13 @@ typedef struct AmcheckOptions
bool show_progress;
int jobs;
+ /*
+ * Whether to install missing extensions, and optionally the name of the
+ * schema in which to install the extension's objects.
+ */
+ bool install_missing;
+ char *install_schema;
+
/* Objects to check or not to check, as lists of PatternInfo structs. */
PatternInfoArray include;
PatternInfoArray exclude;
@@ -109,6 +116,8 @@ static AmcheckOptions opts = {
.strict_names = true,
.show_progress = false,
.jobs = 1,
+ .install_missing = false,
+ .install_schema = "pg_catalog",
.include = {NULL, 0},
.exclude = {NULL, 0},
.excludetbl = false,
@@ -259,6 +268,7 @@ main(int argc, char *argv[])
{"no-strict-names", no_argument, NULL, 10},
{"heapallindexed", no_argument, NULL, 11},
{"parent-check", no_argument, NULL, 12},
+ {"install-missing", optional_argument, NULL, 13},
{NULL, 0, NULL, 0}
};
@@ -435,6 +445,11 @@ main(int argc, char *argv[])
case 12:
opts.parent_check = true;
break;
+ case 13:
+ opts.install_missing = true;
+ if (optarg)
+ opts.install_schema = pg_strdup(optarg);
+ break;
default:
fprintf(stderr,
_("Try \"%s --help\" for more information.\n"),
@@ -543,6 +558,29 @@ main(int argc, char *argv[])
conn = connectDatabase(&cparams, progname, opts.echo, false, true);
}
+ /*
+ * Optionally install amcheck if not already installed in this
+ * database.
+ */
+ if (opts.install_missing)
+ {
+ char *schema;
+ char *install_sql;
+
+ /*
+ * Must re-escape the schema name for each database, as the
+ * escaping rules may change.
+ */
+ schema = PQescapeIdentifier(conn, opts.install_schema,
+ strlen(opts.install_schema));
+ install_sql = psprintf("CREATE EXTENSION IF NOT EXISTS amcheck WITH SCHEMA %s",
+ schema);
+
+ executeCommand(conn, install_sql, opts.echo);
+ pfree(install_sql);
+ pfree(schema);
+ }
+
/*
* Verify that amcheck is installed for this next database. User
* error could result in a database not having amcheck that should
@@ -1153,6 +1191,7 @@ help(const char *progname)
printf(_(" -V, --version output version information, then exit\n"));
printf(_(" -P, --progress show progress information\n"));
printf(_(" -?, --help show this help, then exit\n"));
+ printf(_(" --install-missing install missing extensions\n"));
printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);