]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Reject invalid databases in pg_get_database_ddl()
authorAmit Langote <amitlan@postgresql.org>
Fri, 17 Apr 2026 04:19:56 +0000 (13:19 +0900)
committerAmit Langote <amitlan@postgresql.org>
Fri, 17 Apr 2026 04:19:56 +0000 (13:19 +0900)
An invalid database has datconnlimit set to -2.  pg_get_database_ddl()
emits this verbatim as CONNECTION LIMIT = -2, which ALTER DATABASE
rejects.  Error out early instead.

Reported-by: Lakshmi N <lakshmin.jhs@gmail.com>
Author: Lakshmi N <lakshmin.jhs@gmail.com>
Reviewed-by: Amit Langote <amitlangote09@gmail.com>
Reviewed-by: Euler Taveira <euler@eulerto.com>
Reviewed-by: Hu Xunqi <huxunqi.08@gmail.com>
Discussion: https://postgr.es/m/CA+3i_M8m1k2gFch+tU0JmAQh9FRV+pFrfTXDrJo+BqmwsTmOhg@mail.gmail.com

src/backend/utils/adt/ddlutils.c

index c4f9f86c43ebef71939efac0a246cdf8720f6483..d83cda3342e2d041bb936cda000a5e57bccc3165 100644 (file)
@@ -887,6 +887,16 @@ pg_get_database_ddl_internal(Oid dbid, bool pretty,
        dbform = (Form_pg_database) GETSTRUCT(tuple);
        dbname = pstrdup(NameStr(dbform->datname));
 
+       /*
+        * Reject invalid databases. Deparsing a pg_database row in invalid state
+        * can produce SQL that is not executable, such as CONNECTION LIMIT = -2.
+        */
+       if (database_is_invalid_form(dbform))
+               ereport(ERROR,
+                               (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+                                errmsg("cannot generate DDL for invalid database \"%s\"",
+                                               dbname)));
+
        /*
         * We don't support generating DDL for system databases.  The primary
         * reason for this is that users shouldn't be recreating them.