]> granicus.if.org Git - postgresql/commitdiff
This patch finishes off the work that I did with making view
authorBruce Momjian <bruce@momjian.us>
Mon, 1 Dec 2003 22:11:06 +0000 (22:11 +0000)
committerBruce Momjian <bruce@momjian.us>
Mon, 1 Dec 2003 22:11:06 +0000 (22:11 +0000)
definitions use pretty printing.

It does:

* Pretty index predicates
* Pretty rule definitions
* Uppercases PRIMARY KEY and UNIQUE to be consistent with CHECK and
FOREIGN KEY
* View rules are improved to match table rules:

Christopher Kings-Lynne

src/bin/psql/describe.c

index f8dc818ea1488f1fe44666f71ed39116668cf18a..327dd69a3ce63f8bdddf08744cefda851fa6b562 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2003, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/describe.c,v 1.88 2003/11/29 19:52:06 pgsql Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/describe.c,v 1.89 2003/12/01 22:11:06 momjian Exp $
  */
 #include "postgres_fe.h"
 #include "describe.h"
@@ -857,7 +857,7 @@ describeOneTableDetails(const char *schemaname,
 
                printfPQExpBuffer(&buf,
                  "SELECT i.indisunique, i.indisprimary, a.amname, c2.relname,\n"
-                                         "  pg_catalog.pg_get_expr(i.indpred, i.indrelid)\n"
+                                         "  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"
                                                  "WHERE i.indexrelid = c.oid AND c.oid = '%s' AND c.relam = a.oid\n"
                                                  "AND i.indrelid = c2.oid",
@@ -880,9 +880,9 @@ describeOneTableDetails(const char *schemaname,
                        char       *indpred = PQgetvalue(result, 0, 4);
 
                        if (strcmp(indisprimary, "t") == 0)
-                               printfPQExpBuffer(&tmpbuf, _("primary key, "));
+                               printfPQExpBuffer(&tmpbuf, _("PRIMARY KEY, "));
                        else if (strcmp(indisunique, "t") == 0)
-                               printfPQExpBuffer(&tmpbuf, _("unique, "));
+                               printfPQExpBuffer(&tmpbuf, _("UNIQUE, "));
                        else
                                resetPQExpBuffer(&tmpbuf);
                        appendPQExpBuffer(&tmpbuf, "%s, ", indamname);
@@ -892,7 +892,7 @@ describeOneTableDetails(const char *schemaname,
                                                          schemaname, indtable);
 
                        if (strlen(indpred))
-                               appendPQExpBuffer(&tmpbuf, ", predicate %s", indpred);
+                               appendPQExpBuffer(&tmpbuf, ", predicate (%s)", indpred);
 
                        footers = xmalloczero(2 * sizeof(*footers));
                        footers[0] = xstrdup(tmpbuf.data);
@@ -911,7 +911,7 @@ describeOneTableDetails(const char *schemaname,
                if (tableinfo.hasrules)
                {
                        printfPQExpBuffer(&buf,
-                                                         "SELECT r.rulename\n"
+                                                         "SELECT r.rulename, trim(trailing ';' from pg_catalog.pg_get_ruledef(r.oid, true))\n"
                                                          "FROM pg_catalog.pg_rewrite r\n"
                                   "WHERE r.ev_class = '%s' AND r.rulename != '_RETURN'",
                                                          oid);
@@ -923,27 +923,31 @@ describeOneTableDetails(const char *schemaname,
                }
 
                /* Footer information about a view */
-               footers = xmalloczero((rule_count + 2) * sizeof(*footers));
+               footers = xmalloczero((rule_count + 3) * sizeof(*footers));
                footers[count_footers] = xmalloc(64 + strlen(view_def));
                snprintf(footers[count_footers], 64 + strlen(view_def),
                                 _("View definition:\n%s"), view_def);
                count_footers++;
 
                /* print rules */
-               for (i = 0; i < rule_count; i++)
+               if (rule_count > 0)
                {
-                       char       *s = _("Rules");
+                       printfPQExpBuffer(&buf, _("Rules:"));
+                       footers[count_footers++] = xstrdup(buf.data);
+                       for (i = 0; i < rule_count; i++)
+                       {
+                               const char *ruledef;
 
-                       if (i == 0)
-                               printfPQExpBuffer(&buf, "%s: %s", s, PQgetvalue(result, i, 0));
-                       else
-                               printfPQExpBuffer(&buf, "%*s  %s", (int) strlen(s), "", PQgetvalue(result, i, 0));
-                       if (i < rule_count - 1)
-                               appendPQExpBuffer(&buf, ",");
+                               /* Everything after "CREATE RULE" is echoed verbatim */
+                               ruledef = PQgetvalue(result, i, 1);
+                               ruledef += 12;
 
-                       footers[count_footers++] = xstrdup(buf.data);
+                               printfPQExpBuffer(&buf, " %s", ruledef);
+
+                               footers[count_footers++] = xstrdup(buf.data);
+                       }
+                       PQclear(result);
                }
-               PQclear(result);
 
                footers[count_footers] = NULL;
 
@@ -970,7 +974,7 @@ describeOneTableDetails(const char *schemaname,
                {
                        printfPQExpBuffer(&buf,
                                         "SELECT c2.relname, i.indisprimary, i.indisunique, "
-                                                         "pg_catalog.pg_get_indexdef(i.indexrelid)\n"
+                                                         "pg_catalog.pg_get_indexdef(i.indexrelid, 0, true)\n"
                                                          "FROM pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_index i\n"
                                                          "WHERE c.oid = '%s' AND c.oid = i.indrelid AND i.indexrelid = c2.oid\n"
                                                          "ORDER BY i.indisprimary DESC, i.indisunique DESC, c2.relname",
@@ -1006,7 +1010,7 @@ describeOneTableDetails(const char *schemaname,
                if (tableinfo.hasrules)
                {
                        printfPQExpBuffer(&buf,
-                                                         "SELECT r.rulename, trim(trailing ';' from pg_catalog.pg_get_ruledef(r.oid))\n"
+                                                         "SELECT r.rulename, trim(trailing ';' from pg_catalog.pg_get_ruledef(r.oid, true))\n"
                                                          "FROM pg_catalog.pg_rewrite r\n"
                                                          "WHERE r.ev_class = '%s'",
                                                          oid);
@@ -1051,7 +1055,7 @@ describeOneTableDetails(const char *schemaname,
                {
                        printfPQExpBuffer(&buf,
                                                          "SELECT conname,\n"
-                                        "  pg_catalog.pg_get_constraintdef(oid) as condef\n"
+                                        "  pg_catalog.pg_get_constraintdef(oid, true) as condef\n"
                                                          "FROM pg_catalog.pg_constraint r\n"
                                                   "WHERE r.conrelid = '%s' AND r.contype = 'f'",
                                                          oid);
@@ -1097,9 +1101,9 @@ describeOneTableDetails(const char *schemaname,
                                /* Label as primary key or unique (but not both) */
                                appendPQExpBuffer(&buf,
                                                          strcmp(PQgetvalue(result1, i, 1), "t") == 0
-                                                                 ? _(" primary key,") :
+                                                                 ? _(" PRIMARY KEY,") :
                                                         (strcmp(PQgetvalue(result1, i, 2), "t") == 0
-                                                         ? _(" unique,")
+                                                         ? _(" UNIQUE,")
                                                          : ""));
 
                                /* Everything after "USING" is echoed verbatim */