Show index predicate when doing \d on a partial index.
authorTom Lane
Sun, 5 Aug 2001 22:13:46 +0000 (22:13 +0000)
committerTom Lane
Sun, 5 Aug 2001 22:13:46 +0000 (22:13 +0000)
src/bin/psql/describe.c

index 154e7a27c75c65bfbc9b4a541931110b4bd6f243..d0f5ccf3bb59868a718931e65a0804a1aaa89d7e 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/describe.c,v 1.35 2001/07/08 14:42:17 petere Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/describe.c,v 1.36 2001/08/05 22:13:46 tgl Exp $
  */
 #include "postgres_fe.h"
 #include "describe.h"
@@ -27,8 +27,8 @@
  */
 
 /* the maximal size of regular expression we'll accept here */
-/* (it is save to just change this here) */
-#define REGEXP_CUTOFF 10 * NAMEDATALEN
+/* (it is safe to just change this here) */
+#define REGEXP_CUTOFF (10 * NAMEDATALEN)
 
 
 /* \da
@@ -637,49 +637,65 @@ describeTableDetails(const char *name, bool desc)
    }
 
    /* Make footers */
-   /* Information about the index */
    if (tableinfo.relkind == 'i')
    {
+       /* Footer information about an index */
        PGresult   *result;
 
-       sprintf(buf, "SELECT i.indisunique, i.indisprimary, i.indislossy, a.amname\n"
+       sprintf(buf, "SELECT i.indisunique, i.indisprimary, i.indislossy, a.amname,\n"
+               "       pg_get_expr(i.indpred, i.indrelid) as indpred\n"
                "FROM pg_index i, pg_class c, pg_am a\n"
                "WHERE i.indexrelid = c.oid AND c.relname = '%s' AND c.relam = a.oid",
                name);
 
        result = PSQLexec(buf);
-       if (!result)
+       if (!result || PQntuples(result) != 1)
            error = true;
        else
        {
+           char   *indisunique = PQgetvalue(result, 0, 0);
+           char   *indisprimary = PQgetvalue(result, 0, 1);
+           char   *indislossy = PQgetvalue(result, 0, 2);
+           char   *indamname = PQgetvalue(result, 0, 3);
+           char   *indpred = PQgetvalue(result, 0, 4);
+
+           footers = xmalloc(3 * sizeof(*footers));
            /* XXX This construction is poorly internationalized. */
-           footers = xmalloc(2 * sizeof(*footers));
            footers[0] = xmalloc(NAMEDATALEN + 128);
-           snprintf(footers[0], NAMEDATALEN + 128, "%s%s%s",
-                    strcmp(PQgetvalue(result, 0, 0), "t") == 0 ? _("unique ") : "",
-                    PQgetvalue(result, 0, 3),
-                    strcmp(PQgetvalue(result, 0, 2), "t") == 0 ? _(" (lossy)") : ""
-               );
-           if (strcmp(PQgetvalue(result, 0, 1), "t") == 0)
+           snprintf(footers[0], NAMEDATALEN + 128, "%s%s",
+                    strcmp(indisunique, "t") == 0 ? _("unique ") : "",
+                    indamname);
+           if (strcmp(indisprimary, "t") == 0)
                snprintf(footers[0] + strlen(footers[0]),
                         NAMEDATALEN + 128 - strlen(footers[0]),
                         _(" (primary key)"));
-           footers[1] = NULL;
+           if (strcmp(indislossy, "t") == 0)
+               snprintf(footers[0] + strlen(footers[0]),
+                        NAMEDATALEN + 128 - strlen(footers[0]),
+                        _(" (lossy)"));
+           if (strlen(indpred) > 0)
+           {
+               footers[1] = xmalloc(64 + strlen(indpred));
+               snprintf(footers[1], 64 + strlen(indpred),
+                        _("Index predicate: %s"), indpred);
+               footers[2] = NULL;
+           }
+           else
+               footers[1] = NULL;
        }
    }
-   /* Information about the view */
    else if (view_def)
    {
+       /* Footer information about a view */
        footers = xmalloc(2 * sizeof(*footers));
        footers[0] = xmalloc(64 + strlen(view_def));
        snprintf(footers[0], 64 + strlen(view_def),
                 _("View definition: %s"), view_def);
        footers[1] = NULL;
    }
-
-   /* Information about the table */
    else if (tableinfo.relkind == 'r')
    {
+       /* Footer information about a table */
        PGresult        *result1 = NULL,
                        *result2 = NULL,
                        *result3 = NULL,