]> granicus.if.org Git - postgresql/commitdiff
Show index predicate when doing \d on a partial index.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 5 Aug 2001 22:13:46 +0000 (22:13 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
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,