Provide pg_amcheck with an --install-missing option
authorAndrew Dunstan <andrew@dunslane.net>
Sat, 24 Apr 2021 14:13:07 +0000 (10:13 -0400)
committerAndrew Dunstan <andrew@dunslane.net>
Sat, 24 Apr 2021 14:13:07 +0000 (10:13 -0400)
This will install amcheck in the database if not present. The default
schema is for the extension is pg_catalog, but this can be overridden by
providing a value for the option.

Mark Dilger, slightly editorialized by me.

(rather divergent)
Discussion: https://postgr.es/m/bdc0f7c2-09e3-ee57-8471-569dfb509234@dunslane.net

doc/src/sgml/ref/pg_amcheck.sgml
src/bin/pg_amcheck/pg_amcheck.c

index d01e26faa81be70082719516eb8e6c65b7fa6701..d4989c9f231760a5e37b58e7323f72add513470e 100644 (file)
@@ -217,6 +217,23 @@ PostgreSQL documentation
      </listitem>
     </varlistentry>
 
+    <varlistentry>
+     <term><option>--install-missing</option></term>
+     <term><option>--install-missing=<replaceable class="parameter">schema</replaceable></option></term>
+     <listitem>
+      <para>
+       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
+       <replaceable class="parameter">schema</replaceable>, or if not specified
+       into schema <literal>pg_catalog</literal>.
+      </para>
+      <para>
+       At present, the only required extension is <xref linkend="amcheck"/>.
+      </para>
+     </listitem>
+    </varlistentry>
+
     <varlistentry>
      <term><option>-j <replaceable class="parameter">num</replaceable></option></term>
      <term><option>--jobs=<replaceable class="parameter">num</replaceable></option></term>
index bfe3d8e59497dffc8f9358dbb9a885e4f5abec7f..09ebb4929a7b80d96f414f1588d3e2168ca29a8e 100644 (file)
@@ -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);