]> granicus.if.org Git - postgresql/commitdiff
Provide better message when CREATE EXTENSION can't find a target schema.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 4 Jun 2013 21:22:29 +0000 (17:22 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 4 Jun 2013 21:22:29 +0000 (17:22 -0400)
The new message (and SQLSTATE) matches the corresponding error cases in
namespace.c.

This was thought to be a "can't happen" case when extension.c was written,
so we didn't think hard about how to report it.  But it definitely can
happen in 9.2 and later, since we no longer require search_path to contain
any valid schema names.  It's probably also possible in 9.1 if search_path
came from a noninteractive source.  So, back-patch to all releases
containing this code.

Per report from Sean Chittenden, though this isn't exactly his patch.

src/backend/commands/extension.c

index 2d84ac8620dc3a23a6c41b4b1ce618bef5d8fcab..08e8cade6b1adbe38428dd391d776d49001a7406 100644 (file)
@@ -1394,12 +1394,16 @@ CreateExtension(CreateExtensionStmt *stmt)
                 */
                List       *search_path = fetch_search_path(false);
 
-               if (search_path == NIL) /* probably can't happen */
-                       elog(ERROR, "there is no default creation target");
+               if (search_path == NIL) /* nothing valid in search_path? */
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_UNDEFINED_SCHEMA),
+                                        errmsg("no schema has been selected to create in")));
                schemaOid = linitial_oid(search_path);
                schemaName = get_namespace_name(schemaOid);
                if (schemaName == NULL) /* recently-deleted namespace? */
-                       elog(ERROR, "there is no default creation target");
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_UNDEFINED_SCHEMA),
+                                        errmsg("no schema has been selected to create in")));
 
                list_free(search_path);
        }