I also noticed that \d on an index doesn't warn about the invisible state
whereas \d on a table does:
[local]:5444 postgres@postgres=# SELECT indexrelid::regclass,
indisvalid, indisvisible FROM pg_index WHERE indexrelid =
'repli_pkey'::regclass \gx
-[ RECORD 1 ]+-----------
indexrelid | repli_pkey
indisvalid | f
indisvisible | f
[local]:5444 postgres@postgres=# \d repli_pkey
Index "public.repli_pkey"
Column | Type | Key? | Definition
--------+---------+------+------------
i | integer | yes | i
primary key, btree, for table "public.repli", invalid
[local]:5444 postgres@postgres=# \d repli
Table "public.repli"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
i | integer | | not null |
t | text | | |
Indexes:
"repli_pkey" PRIMARY KEY, btree (i) INVISIBLE INVALID
Publications:
"pub"
The attached patch adds the flag.
[local]:5444 postgres@postgres=# \d repli_pkey
Index "public.repli_pkey"
Column | Type | Key? | Definition
--------+---------+------+------------
i | integer | yes | i
primary key, btree, for table "public.repli", invalid, invisible
From bf3f11e5e88a30a9c1affd9678dadec9bc236351 Mon Sep 17 00:00:00 2001
From: benoit <[email protected]>
Date: Fri, 24 Jan 2025 16:12:45 +0100
Subject: [PATCH 2/3] Add the invisible tag for indexes in \d
---
src/bin/psql/describe.c | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c
index 2ef99971ac0..5d1acbd149d 100644
--- a/src/bin/psql/describe.c
+++ b/src/bin/psql/describe.c
@@ -2318,6 +2318,11 @@ describeOneTableDetails(const char *schemaname,
else
appendPQExpBufferStr(&buf, "false AS indnullsnotdistinct,\n");
+ if (pset.sversion >= 180000)
+ appendPQExpBufferStr(&buf, "i.indisvisible,\n");
+ else
+ appendPQExpBufferStr(&buf, "true AS indisvisible,\n");
+
appendPQExpBuffer(&buf, " a.amname, c2.relname, "
"pg_catalog.pg_get_expr(i.indpred, i.indrelid, true)\n"
"FROM pg_catalog.pg_index i, pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_am a\n"
@@ -2343,9 +2348,10 @@ describeOneTableDetails(const char *schemaname,
char *deferred = PQgetvalue(result, 0, 5);
char *indisreplident = PQgetvalue(result, 0, 6);
char *indnullsnotdistinct = PQgetvalue(result, 0, 7);
- char *indamname = PQgetvalue(result, 0, 8);
- char *indtable = PQgetvalue(result, 0, 9);
- char *indpred = PQgetvalue(result, 0, 10);
+ char *indisvisible = PQgetvalue(result, 0, 8);
+ char *indamname = PQgetvalue(result, 0, 9);
+ char *indtable = PQgetvalue(result, 0, 10);
+ char *indpred = PQgetvalue(result, 0, 11);
if (strcmp(indisprimary, "t") == 0)
printfPQExpBuffer(&tmpbuf, _("primary key, "));
@@ -2382,6 +2388,9 @@ describeOneTableDetails(const char *schemaname,
if (strcmp(indisreplident, "t") == 0)
appendPQExpBufferStr(&tmpbuf, _(", replica identity"));
+ if (strcmp(indisvisible, "t") != 0)
+ appendPQExpBufferStr(&tmpbuf, _(", invisible"));
+
printTableAddFooter(&cont, tmpbuf.data);
/*
--
2.48.1