Re: pretty print viewdefs - Mailing list pgsql-hackers
| From | Andrew Dunstan |
|---|---|
| Subject | Re: pretty print viewdefs |
| Date | |
| Msg-id | 4A95C16A.6090706@dunslane.net Whole thread Raw |
| In response to | Re: pretty print viewdefs (Tom Lane <tgl@sss.pgh.pa.us>) |
| Responses |
Re: pretty print viewdefs
|
| List | pgsql-hackers |
Tom Lane wrote:
> Andrew Dunstan <andrew@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);
+ }
}
}
pgsql-hackers by date: