Subject: Re: pgsql: Improve default and empty privilege outputs in psql.

From: Tom Lane <[email-masked]>
Date: Tue, 24 Sep 2024 12:27:59 -0400

Christoph Berg <[email-masked]> writes:
> Re: Tom Lane
>> Improve default and empty privilege outputs in psql.

> I'm sorry to report this when 17.0 has already been wrapped, but this
> change is breaking `psql -l` against 9.3-or-earlier servers:
> FEHLER:  42883: Funktion pg_catalog.cardinality(aclitem[]) existiert nicht

Grumble.  Well, if that's the worst bug in 17.0 we should all be
very pleased indeed ;-).  I'll see about fixing it after the
release freeze lifts.

> The psql docs aren't really explicit about which old versions are
> still supported, but there's some mentioning that \d should work back
> to 9.2:

Yes, that's the expectation.  I'm sure we can think of a more
backwards-compatible way to test for empty datacl, though.

			regards, tom lane

---

From: Tom Lane <[email-masked]>
Date: Tue, 24 Sep 2024 13:57:28 -0400

> backwards-compatible way to test for empty datacl, though.

Looks like the attached should be sufficient.  As penance, I tried
all the commands in describe.c against 9.2 (or the oldest supported
server version), and none of them fail now.

			regards, tom lane

diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c
index faabecbc76..6a36c91083 100644
--- a/src/bin/psql/describe.c
+++ b/src/bin/psql/describe.c
@@ -6678,7 +6678,7 @@ printACLColumn(PQExpBuffer buf, const char *colname)
 {
 	appendPQExpBuffer(buf,
 					  "CASE"
-					  " WHEN pg_catalog.cardinality(%s) = 0 THEN '%s'"
+					  " WHEN pg_catalog.array_length(%s, 1) = 0 THEN '%s'"
 					  " ELSE pg_catalog.array_to_string(%s, E'\\n')"
 					  " END AS \"%s\"",
 					  colname, gettext_noop("(none)"),