From aab0b8f5eb6d1ad9ea09cc59bfe75e4e4d15718c Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Fri, 5 Apr 2002 11:52:38 +0000
Subject: [PATCH] I was tinkering with creating rules on views (so, for
 instance, one could insert on a view), and noticed that psql wouldn't show
 the list of rules set up on a view, like it does for tables.

The fix was extremely simple, so I figured I'd share it.  Not sure what
the standard is for communicating these things, so I've attached the diff
file for /src/bin/psql/describe.c.

Paul (?)
---
 src/bin/psql/describe.c | 49 ++++++++++++++++++++++++++++++++++++-----
 1 file changed, 44 insertions(+), 5 deletions(-)

diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c
index 0c6f5441cad..68bbcfb8026 100644
--- a/src/bin/psql/describe.c
+++ b/src/bin/psql/describe.c
@@ -3,7 +3,7 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/describe.c,v 1.47 2002/03/20 19:44:45 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/describe.c,v 1.48 2002/04/05 11:52:38 momjian Exp $
  */
 #include "postgres_fe.h"
 #include "describe.h"
@@ -692,12 +692,51 @@ describeTableDetails(const char *name, bool desc)
 	}
 	else if (view_def)
 	{
+		PGresult   *result = NULL;
+		int			rule_count = 0;
+		int			count_footers = 0;
+
+		/* count rules */
+		if (!error && tableinfo.hasrules)
+		{
+			sprintf(buf,
+					"SELECT r.rulename\n"
+					"FROM pg_rewrite r, pg_class c\n"
+					"WHERE c.relname='%s' AND c.oid = r.ev_class\n"
+					"AND r.rulename NOT LIKE '_RET%%'",
+					name);
+			result = PSQLexec(buf);
+			if (!result)
+				error = true;
+			else
+				rule_count = PQntuples(result);
+		}
+
 		/* Footer information about a view */
-		footers = xmalloc(2 * sizeof(*footers));
-		footers[0] = xmalloc(64 + strlen(view_def));
-		snprintf(footers[0], 64 + strlen(view_def),
+		footers = xmalloc((rule_count + 2) * sizeof(*footers));
+		footers[count_footers] = xmalloc(64 + strlen(view_def));
+		snprintf(footers[count_footers], 64 + strlen(view_def),
 				 _("View definition: %s"), view_def);
-		footers[1] = NULL;
+		count_footers++;
+
+		/* print rules */
+		for (i = 0; i < rule_count; i++)
+		{
+			char	   *s = _("Rules");
+
+			if (i == 0)
+				snprintf(buf, sizeof(buf), "%s: %s", s, PQgetvalue(result, i, 0));
+			else
+				snprintf(buf, sizeof(buf), "%*s  %s", (int) strlen(s), "", PQgetvalue(result, i, 0));
+			if (i < rule_count - 1)
+				strcat(buf, ",");
+
+			footers[count_footers++] = xstrdup(buf);
+		}
+		PQclear(result);
+
+		footers[count_footers] = NULL;
+
 	}
 	else if (tableinfo.relkind == 'r')
 	{
-- 
GitLab