Hi,
This patch finishes off the work that I did with making view
definitions use pretty printing.
It does:
* Pretty check constraints
* 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:
View "public.v"
Column | Type | Modifiers
----------+---------+-----------
?column? | integer |
View definition:
SELECT 1;
Rules:
r1 AS
ON INSERT TO v DO INSTEAD NOTHING
r2 AS
ON INSERT TO v DO INSTEAD NOTHING
Chris
Index: describe.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/describe.c,v
retrieving revision 1.85
diff -c -r1.85 describe.c
*** describe.c 7 Sep 2003 03:43:53 -0000 1.85
--- describe.c 29 Sep 2003 04:24:56 -0000
***************
*** 857,863 ****
printfPQExpBuffer(&buf,
"SELECT i.indisunique, i.indisprimary, a.amname, c2.relname,\n"
! " pg_catalog.pg_get_expr(i.indpred,
i.indrelid)\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",
--- 857,863 ----
printfPQExpBuffer(&buf,
"SELECT i.indisunique, i.indisprimary, a.amname, c2.relname,\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,888 ****
char *indpred = PQgetvalue(result, 0, 4);
if (strcmp(indisprimary, "t") == 0)
! printfPQExpBuffer(&tmpbuf, _("primary key, "));
else if (strcmp(indisunique, "t") == 0)
! printfPQExpBuffer(&tmpbuf, _("unique, "));
else
resetPQExpBuffer(&tmpbuf);
appendPQExpBuffer(&tmpbuf, "%s, ", indamname);
--- 880,888 ----
char *indpred = PQgetvalue(result, 0, 4);
if (strcmp(indisprimary, "t") == 0)
! printfPQExpBuffer(&tmpbuf, _("PRIMARY KEY, "));
else if (strcmp(indisunique, "t") == 0)
! printfPQExpBuffer(&tmpbuf, _("UNIQUE, "));
else
resetPQExpBuffer(&tmpbuf);
appendPQExpBuffer(&tmpbuf, "%s, ", indamname);
***************
*** 892,898 ****
schemaname, indtable);
if (strlen(indpred))
! appendPQExpBuffer(&tmpbuf, ", predicate %s", indpred);
footers = xmalloczero(2 * sizeof(*footers));
footers[0] = xstrdup(tmpbuf.data);
--- 892,898 ----
schemaname, indtable);
if (strlen(indpred))
! appendPQExpBuffer(&tmpbuf, ", predicate (%s)",
indpred);
footers = xmalloczero(2 * sizeof(*footers));
footers[0] = xstrdup(tmpbuf.data);
***************
*** 911,917 ****
if (tableinfo.hasrules)
{
printfPQExpBuffer(&buf,
! "SELECT r.rulename\n"
"FROM pg_catalog.pg_rewrite
r\n"
"WHERE r.ev_class = '%s' AND r.rulename !=
'_RETURN'",
oid);
--- 911,917 ----
if (tableinfo.hasrules)
{
printfPQExpBuffer(&buf,
! "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,949 ****
}
/* Footer information about a view */
! footers = xmalloczero((rule_count + 2) * 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++)
{
! char *s = _("Rules");
! 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, ",");
! footers[count_footers++] = xstrdup(buf.data);
}
- PQclear(result);
footers[count_footers] = NULL;
--- 923,953 ----
}
/* Footer information about a view */
! 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 */
! if (rule_count > 0)
{
! printfPQExpBuffer(&buf, _("Rules:"));
! footers[count_footers++] = xstrdup(buf.data);
! for (i = 0; i < rule_count; i++)
! {
! const char *ruledef;
! /* Everything after "CREATE RULE" is echoed verbatim */
! ruledef = PQgetvalue(result, i, 1);
! ruledef += 12;
! printfPQExpBuffer(&buf, " %s", ruledef);
!
! footers[count_footers++] = xstrdup(buf.data);
! }
! PQclear(result);
}
footers[count_footers] = NULL;
***************
*** 970,976 ****
{
printfPQExpBuffer(&buf,
"SELECT c2.relname, i.indisprimary,
i.indisunique, "
!
"pg_catalog.pg_get_indexdef(i.indexrelid)\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",
--- 974,980 ----
{
printfPQExpBuffer(&buf,
"SELECT c2.relname, i.indisprimary,
i.indisunique, "
!
"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",
***************
*** 986,992 ****
if (tableinfo.checks)
{
printfPQExpBuffer(&buf,
! "SELECT consrc, conname\n"
"FROM
pg_catalog.pg_constraint r\n"
"WHERE r.conrelid = '%s' AND
r.contype = 'c'",
oid);
--- 990,996 ----
if (tableinfo.checks)
{
printfPQExpBuffer(&buf,
! "SELECT
pg_catalog.pg_get_constraintdef(oid, true) AS consrc, conname\n"
"FROM
pg_catalog.pg_constraint r\n"
"WHERE r.conrelid = '%s' AND
r.contype = 'c'",
oid);
***************
*** 1004,1010 ****
if (tableinfo.hasrules)
{
printfPQExpBuffer(&buf,
! "SELECT r.rulename,
trim(trailing ';' from pg_catalog.pg_get_ruledef(r.oid))\n"
"FROM pg_catalog.pg_rewrite
r\n"
"WHERE r.ev_class = '%s'",
oid);
--- 1008,1014 ----
if (tableinfo.hasrules)
{
printfPQExpBuffer(&buf,
! "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);
***************
*** 1049,1055 ****
{
printfPQExpBuffer(&buf,
"SELECT conname,\n"
! " pg_catalog.pg_get_constraintdef(oid) as
condef\n"
"FROM
pg_catalog.pg_constraint r\n"
"WHERE r.conrelid = '%s' AND
r.contype = 'f'",
oid);
--- 1053,1059 ----
{
printfPQExpBuffer(&buf,
"SELECT conname,\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);
***************
*** 1095,1103 ****
/* Label as primary key or unique (but not both) */
appendPQExpBuffer(&buf,
strcmp(PQgetvalue(result1,
i, 1), "t") == 0
! ? _(" primary key,")
:
(strcmp(PQgetvalue(result1,
i, 2), "t") == 0
! ? _(" unique,")
: ""));
/* Everything after "USING" is echoed verbatim */
--- 1099,1107 ----
/* Label as primary key or unique (but not both) */
appendPQExpBuffer(&buf,
strcmp(PQgetvalue(result1,
i, 1), "t") == 0
! ? _(" PRIMARY KEY,")
:
(strcmp(PQgetvalue(result1,
i, 2), "t") == 0
! ? _(" UNIQUE,")
: ""));
/* Everything after "USING" is echoed verbatim */
***************
*** 1119,1125 ****
footers[count_footers++] = xstrdup(buf.data);
for (i = 0; i < check_count; i++)
{
! printfPQExpBuffer(&buf, _(" \"%s\" CHECK %s"),
PQgetvalue(result2,
i, 1),
PQgetvalue(result2,
i, 0));
--- 1123,1129 ----
footers[count_footers++] = xstrdup(buf.data);
for (i = 0; i < check_count; i++)
{
! printfPQExpBuffer(&buf, _(" \"%s\" %s"),
PQgetvalue(result2,
i, 1),
PQgetvalue(result2,
i, 0));
---------------------------(end of broadcast)---------------------------
TIP 9: the planner will ignore your desire to choose an index scan if your
joining column's datatypes do not match