Improve error message for missing extension.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 11 Jan 2022 19:22:00 +0000 (14:22 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 11 Jan 2022 19:22:00 +0000 (14:22 -0500)
If we get ENOENT while trying to read an extension control file,
report that as a missing extension (with a HINT to install it)
rather than as a filesystem access problem.  The message wording
was extensively bikeshedded in hopes of pointing people to the
idea that they need to do a software installation before they
can install the extension into the current database.

Nathan Bossart, with review/wording suggestions from Daniel
Gustafsson, Chapman Flack, and myself

Discussion: https://postgr.es/m/3950D56A-4E47-48E7-BF9B-F5F22E268BE7@amazon.com

src/backend/commands/extension.c

index 345787fe2cec4083e874a6112b60d7e321ae97aa..a2e77c418a429e34f1c5bdf0723b8867e18dad4f 100644 (file)
@@ -487,11 +487,22 @@ parse_extension_control_file(ExtensionControlFile *control,
 
    if ((file = AllocateFile(filename, "r")) == NULL)
    {
-       if (version && errno == ENOENT)
+       if (errno == ENOENT)
        {
-           /* no auxiliary file for this version */
-           pfree(filename);
-           return;
+           /* no complaint for missing auxiliary file */
+           if (version)
+           {
+               pfree(filename);
+               return;
+           }
+
+           /* missing control file indicates extension is not installed */
+           ereport(ERROR,
+                   (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                    errmsg("extension \"%s\" is not available", control->name),
+                    errdetail("Could not open extension control file \"%s\": %m.",
+                              filename),
+                    errhint("The extension must first be installed on the system where PostgreSQL is running.")));
        }
        ereport(ERROR,
                (errcode_for_file_access(),