Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wDPrn-002wS1-3D for pgsql-hackers@arkaria.postgresql.org; Thu, 16 Apr 2026 16:47:00 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wDPrn-006KGn-0q for pgsql-hackers@arkaria.postgresql.org; Thu, 16 Apr 2026 16:46:59 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wDPrm-006KGe-2n for pgsql-hackers@lists.postgresql.org; Thu, 16 Apr 2026 16:46:58 +0000 Received: from mail-yw1-x112c.google.com ([2607:f8b0:4864:20::112c]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wDPrk-00000001LC1-34BV for pgsql-hackers@lists.postgresql.org; Thu, 16 Apr 2026 16:46:57 +0000 Received: by mail-yw1-x112c.google.com with SMTP id 00721157ae682-797ab169454so116438867b3.3 for ; Thu, 16 Apr 2026 09:46:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1776358016; cv=none; d=google.com; s=arc-20240605; b=il1JeTgtyy5PMFpKkrmK0ddl7VZk8/esa3KUeeVDBTiLEGx/geS+Ho2z4f3qaL6WpB FRvu7mc08t6JcXZcxWorh6fhXmpoNuFMCaW5d9++4jjcN3oG1X/9tuNQqjs7iM3gDPW5 WwXB/Lu30YXKvuMqk6YdBwFyJCBDuaeL40DOKkjvu2WfGC5OhRPHXe3uh3E4pkzRxdA9 yCz6SO/nNWWYMgKb1QDYXq4rhDxghz7dvC+Xsy9JlRQHETgsy7ftWTuDo77fBIHroMRX lqNkYUGcNk0Bjlcri+0+YIlSf+C5BldRyP8cVIjATeX9FHLIzT9/mzGODx+VuKJ5jiTX 9sGQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=4z9Br/A7HaxX14wGdUUuQzjGmpR+IF91AuSprz9RkQM=; fh=VJH4m7LJkJPKlWL1w6RAaotJvitdTPnrbcQNgheHWnA=; b=NhpgN2dcSLERw+c0DB/pASFTP+LnHtL5ugA9gFs3nkTXPyxDnScg0zQGB4XEwfqjBl aPwp4sVZhvXjElbT039LM88akIAZGtVq0lwewBfyTPBDxiWDhgH/N4sXFJZmw3Lw7Avn 8Wv1gIhZaCoKg4WYWGKIsNpo8eNXhJI/+Fp9y+HOlDp0eo2QLdydrg8mNHOXTogqesBw uktI/fsC77CCZkIV1dUib7jZ9ffkpXbj6VwG6Q9BoYANfaHQckWSsUabbL4T5kj1BOv3 ydx8kp6i194GtpHPoj5LNpoJBmnhLjozndZUBsMIZ35vOx4Uv2RSeZKrKRhdeJVL7Ert Rs2Q==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776358016; x=1776962816; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=4z9Br/A7HaxX14wGdUUuQzjGmpR+IF91AuSprz9RkQM=; b=lHQwofm9JTS8KqS5Mj24dJQUCoWAL5jlbec+accgMpDFp5HKl12cyTT6pEbbGIuspO GSC/+Z04/09EKu5ieSuQ9KNO05gQ1AZZatkWOxIWmHW1TSjc0k9MZ5qSi8d4psv1xNGh LYkvmeeFAiMfy7ilY6x/p+DOZmRaBIZUQkot7qtdHbpBy+1T6m51PFADj0jqfztRlI9a EWtXP05xpHfStzFm0sM9YzZjhO9AUKzhmjxhvs8UONXQCa593C89j34iU/ixt2Ot7ij/ H6ePKBA9rkBempbS2Zob0Towsk7kz+cw8ziNDBtXqbKm8SXOIgNyllKLYck5T0/qd+9e ODog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776358016; x=1776962816; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=4z9Br/A7HaxX14wGdUUuQzjGmpR+IF91AuSprz9RkQM=; b=dkYCC14Py6hS9ThWKyM4vvQYh91DbMLdvTkRjufysmPSiveFYe2t215g6QqVIeafKw ioL4oqeSHxo80NOldIAgZvxGZ8V5q2REzU/vyZX2YTg9O4xf2aNH0padFmH/hQZTwbfi cuDX2J3PXihmyqwcYsbJ4OeXILmMZFg1ffJK7dmzZTBS63y9WzE9ShpQAq68l3uTHkPi ED/BGT/ITOJpQ2vMDec+L4VokPdeM9LioM18K1zoBslqkUOqohESlM2oEltfUPM+FKEw dc4SYtSI1mIiMzANhAj233Ab2g5OQib6kdW/BIWWI9IoYI7PM+lakf69XvNgSpEgRO7S 0hUA== X-Gm-Message-State: AOJu0YwiXyyKJwlfsdYq7ZYdmt2Xj2msyGzZvlvx38jkNrPIkBShyPff kgcoh7imyaBcx+B4WLdUnGLkDOxhvnf+DFaXNfl1+/NoNGBszbHbbjEFiMAXFicaIFEOWfAwsap q/re87Gf7MV00wdFU2oOEzuMj78rKtNo= X-Gm-Gg: AeBDiesLkYrN2pSaxE6oQ3e84ccvIC8W+5HEatQWV2CeWe1luoIfckKM4kmfqc5PxbK upgfMHDuxii8vX4Wtx+06KcboR0Qvx82yeaEZh7tJolaABEldBEyviCpgVMvenGu4S/sxaVp7PA XqZQR/MH4Z8Go95kKQ/65rprkBkuDYEEH2R0wWPU1v2YmpE7rjgpzGjB8Oidiu1zaPaoNvmtfQJ akyJWLXmYoZXHpYL3BICDk3lrsH85AcyRfpxAwlhFLjc6HkCu5dGXHJ7owDlGnjVASHXp3vBd9z CzjskliobxMYRR2Z+A== X-Received: by 2002:a05:690c:6893:b0:7b8:21ff:e2d8 with SMTP id 00721157ae682-7b822000660mr65069667b3.22.1776358016359; Thu, 16 Apr 2026 09:46:56 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Lakshmi N Date: Thu, 16 Apr 2026 09:46:45 -0700 X-Gm-Features: AQROBzCC3DUYlbtGRUpik_Hl0y5q9VYjyrHBPdYAYpFgSWFJIdcilaXuzldSuj4 Message-ID: Subject: Re: Reject invalid databases in pg_get_database_ddl() To: Amit Langote Cc: "pgsql-hackers@lists.postgresql.org" , andrew@dunslane.net Content-Type: multipart/mixed; boundary="0000000000008f7274064f96942c" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000008f7274064f96942c Content-Type: multipart/alternative; boundary="0000000000008f7273064f96942a" --0000000000008f7273064f96942a Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Amit, On Thu, Apr 16, 2026 at 2:29=E2=80=AFAM Amit Langote wrote: > Hi, > > On Thu, Apr 16, 2026 at 5:20=E2=80=AFPM Lakshmi N wrote: > > pg_get_database_ddl() is not checking for databases in an invalid state > > before producing ddl statements. This caused the function to emit > > CONNECTION_LIMIT =3D -2, which is invalid SQL that Postgres rejects. > > A database row can be in this inconsistent state longer, for example > > server crashed during a drop database. > > > > Attached patch to fix this issue by doing a database_is_invalid_form() > > check early in pg_get_database_ddl_internal(). > > Thanks for the report. > > Hmm, I see that the function will happily emit datconnlimit =3D -2 and > your patch catches that at the top instead of down below near this > code: > > /* CONNECTION LIMIT */ > if (dbform->datconnlimit !=3D -1) > { > resetStringInfo(&buf); > appendStringInfo(&buf, "ALTER DATABASE %s CONNECTION LIMIT =3D %d;", > quote_identifier(dbname), dbform->datconnlimit); > statements =3D lappend(statements, pstrdup(buf.data)); > } > > which, I guess, makes sense. > > The comment is correct but could be more explicit: > > /* > * Reject invalid databases: datconnlimit =3D -2 would be emitted as > * CONNECTION LIMIT =3D -2, which fails on replay. > */ > Thank you for reviewing! Please find the attached v2 addressing this. Regards, Lakshmi --0000000000008f7273064f96942a Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi Amit,

On Thu, Apr= 16, 2026 at 2:29=E2=80=AFAM Amit Langote <amitlangote09@gmail.com> wrote:
Hi,

On Thu, Apr 16, 2026 at 5:20=E2=80=AFPM Lakshmi N <lakshmin.jhs@gmail.com> wrote= :
> pg_get_database_ddl() is not checking for databases in an invalid stat= e
> before producing ddl statements. This caused the function to emit
> CONNECTION_LIMIT =3D -2, which is invalid SQL that Postgres rejects. > A database row can be in this inconsistent state longer, for example > server crashed during a drop database.
>
> Attached patch to fix this issue by doing a database_is_invalid_form()=
> check early in pg_get_database_ddl_internal().

Thanks for the report.

Hmm, I see that the function will happily emit datconnlimit =3D -2 and
your patch catches that at the top instead of down below near this
code:

/* CONNECTION LIMIT */
if (dbform->datconnlimit !=3D -1)
{
=C2=A0 =C2=A0 resetStringInfo(&buf);
=C2=A0 =C2=A0 appendStringInfo(&buf, "ALTER DATABASE %s CONNECTION= LIMIT =3D %d;",
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0quote_identifier(dbname), dbform->datconnlimit);
=C2=A0 =C2=A0 statements =3D lappend(statements, pstrdup(buf.data));
}

which, I guess, makes sense.

The comment is correct but could be more explicit:

=C2=A0 =C2=A0 /*
=C2=A0 =C2=A0 =C2=A0* Reject invalid databases: datconnlimit =3D -2 would b= e emitted as
=C2=A0 =C2=A0 =C2=A0* CONNECTION LIMIT =3D -2, which fails on replay.
=C2=A0 =C2=A0 =C2=A0*/
Thank you for reviewing! Please= find the attached v2 addressing this.

Regards,
Lakshmi=C2=A0
=C2=A0
--0000000000008f7273064f96942a-- --0000000000008f7274064f96942c Content-Type: application/octet-stream; name="v2-0001-Reject-pg_get_database_ddl-for-invalid-databases.patch" Content-Disposition: attachment; filename="v2-0001-Reject-pg_get_database_ddl-for-invalid-databases.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mo1possj0 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9kZGx1dGlscy5jIGIvc3JjL2JhY2tl bmQvdXRpbHMvYWR0L2RkbHV0aWxzLmMKaW5kZXggYzRmOWY4NmM0M2UuLjUzM2ZjOGM5ZjljIDEw MDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQvZGRsdXRpbHMuYworKysgYi9zcmMvYmFj a2VuZC91dGlscy9hZHQvZGRsdXRpbHMuYwpAQCAtODg3LDYgKzg4NywxNyBAQCBwZ19nZXRfZGF0 YWJhc2VfZGRsX2ludGVybmFsKE9pZCBkYmlkLCBib29sIHByZXR0eSwKIAlkYmZvcm0gPSAoRm9y bV9wZ19kYXRhYmFzZSkgR0VUU1RSVUNUKHR1cGxlKTsKIAlkYm5hbWUgPSBwc3RyZHVwKE5hbWVT dHIoZGJmb3JtLT5kYXRuYW1lKSk7CiAKKwkvKgorCSAqIFJlamVjdCBpbnZhbGlkIGRhdGFiYXNl czogZGF0Y29ubmxpbWl0ID0gLTIgd291bGQgYmUgZW1pdHRlZCBhcworCSAqIENPTk5FQ1RJT04g TElNSVQgPSAtMiwgd2hpY2ggZmFpbHMgb24gcmVwbGF5LgorCSAqLworCWlmIChkYXRhYmFzZV9p c19pbnZhbGlkX2Zvcm0oZGJmb3JtKSkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShF UlJDT0RFX09CSkVDVF9OT1RfSU5fUFJFUkVRVUlTSVRFX1NUQVRFKSwKKwkJCQkgZXJybXNnKCJj YW5ub3QgZ2VuZXJhdGUgRERMIGZvciBpbnZhbGlkIGRhdGFiYXNlIFwiJXNcIiIsCisJCQkJCQlk Ym5hbWUpLAorCQkJCSBlcnJoaW50KCJVc2UgRFJPUCBEQVRBQkFTRSB0byBkcm9wIGludmFsaWQg ZGF0YWJhc2VzLiIpKSk7CisKIAkvKgogCSAqIFdlIGRvbid0IHN1cHBvcnQgZ2VuZXJhdGluZyBE REwgZm9yIHN5c3RlbSBkYXRhYmFzZXMuICBUaGUgcHJpbWFyeQogCSAqIHJlYXNvbiBmb3IgdGhp cyBpcyB0aGF0IHVzZXJzIHNob3VsZG4ndCBiZSByZWNyZWF0aW5nIHRoZW0uCg== --0000000000008f7274064f96942c--