Tom Lane wrote:
Andrew Dunstan <and...@dunslane.net> writes:
I do have a solution that wraps when running line length over 80 instead
of on every col:
SELECT sh.shoename, sh.sh_avail, sh.slcolor, sh.slminlen,
sh.slminlen * un.un_fact AS slminlen_cm, sh.slmaxlen,
sh.slmaxlen * un.un_fact AS slmaxlen_cm, sh.slunit
FROM shoe_data sh, unit un
WHERE sh.slunit = un.un_name;
It's not a huge amount of code.
Well, let's see it? What do you do with expressions that don't fit?
See attached.
We don't apply the wrapping unless there has been a column printed on
the line (except for the SELECT line).
So we can run over the limit on a line, but if we do there's only one
column spec. I think that's acceptable.
Maybe we need a couple of extra pg_get_viewdef() variants. One to wrap
on some provided line length, one to wrap on every column. psql could
use the first, pg_dump could use the second.
pg_dump doesn't use prettyprinting at all, and won't if I have anything
to say about it. But I could see teaching the psql \d views to pass
along whatever psql thinks the window width is.
OK, but I'd still like to have the only one col per line variant available.
cheers
andrew
Index: src/backend/utils/adt/ruleutils.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v
retrieving revision 1.306
diff -c -r1.306 ruleutils.c
*** src/backend/utils/adt/ruleutils.c 1 Aug 2009 19:59:41 -0000 1.306
--- src/backend/utils/adt/ruleutils.c 26 Aug 2009 23:09:00 -0000
***************
*** 2649,2659 ****
{
StringInfo buf = context->buf;
char *sep;
! int colno;
ListCell *l;
sep = " ";
colno = 0;
foreach(l, targetList)
{
TargetEntry *tle = (TargetEntry *) lfirst(l);
--- 2649,2669 ----
{
StringInfo buf = context->buf;
char *sep;
! int colno, linecol;
ListCell *l;
+ int save_len;
+ char *line_start;
+
+ line_start = strrchr(buf->data,'\n');
+ if (line_start == NULL)
+ line_start = buf->data;
+ else
+ line_start++;
+
sep = " ";
colno = 0;
+ linecol = 1;
foreach(l, targetList)
{
TargetEntry *tle = (TargetEntry *) lfirst(l);
***************
*** 2666,2671 ****
--- 2676,2683 ----
appendStringInfoString(buf, sep);
sep = ", ";
colno++;
+ linecol++;
+ save_len = buf->len;
/*
* We special-case Var nodes rather than using get_rule_expr. This is
***************
*** 2703,2708 ****
--- 2715,2748 ----
if (attname == NULL || strcmp(attname, colname) != 0)
appendStringInfo(buf, " AS %s", quote_identifier(colname));
}
+
+ /* handle line overflow */
+ if (strlen(line_start) > 80 && linecol > 1 && PRETTY_INDENT(context))
+ {
+ StringInfoData thiscol;
+
+ initStringInfo(&thiscol);
+
+ /* save what we just added */
+ appendStringInfoString(&thiscol,buf->data + save_len);
+
+ /* wipe it out from the buffer */
+ buf->len = save_len;
+ buf->data[save_len] = '\0';
+
+ /* add a line break and reindent */
+ appendContextKeyword(context, "", -PRETTYINDENT_STD,
+ PRETTYINDENT_STD, PRETTYINDENT_VAR);
+
+ /* and now put back what we wiped out */
+ appendStringInfoString(buf,thiscol.data);
+
+ /* reset the counters */
+ line_start = strrchr(buf->data,'\n') + 1;
+ linecol = 0;
+
+ pfree(thiscol.data);
+ }
}
}
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers