Re: Adding \ev view editor? - Mailing list pgsql-hackers
| From | Andrew Dunstan |
|---|---|
| Subject | Re: Adding \ev view editor? |
| Date | |
| Msg-id | 4AB7C53D.7080002@dunslane.net Whole thread Raw |
| In response to | Re: Adding \ev view editor? (Tom Lane <tgl@sss.pgh.pa.us>) |
| Responses |
Re: Adding \ev view editor?
Re: Adding \ev view editor? |
| List | pgsql-hackers |
Tom Lane wrote:
> It might be worth pointing out that what I don't want pg_dump doing
> is suppressing "useless" parentheses. Adding whitespace ought to be
> safe enough. So if anyone wanted to do the work of decoupling those
> two effects of the prettyprint option, we could have "semi pretty
> printed" output in pg_dump. Dunno if it's worth it.
>
>
>
The attached patch goes part of the way towards doing this, by adding
white space unconditionally to the target list of a viewdef.
The nice thing about that is that it's the part of a viewdef which
basically isn't pretty-printed now, even if you ask for pretty printing.
That would certainly
make editing the view with a \ev command a lot nicer.
Along the way it suppresses putting a newline before a CASE expression
in pretty printing mode, which seems to be an odd thing to do and is
inconsistent with the way other expressions are treated.
Sample output:
andrew=# select pg_get_viewdef('foo',true);
pg_get_viewdef
------------------------------
SELECT 'a'::text AS b,
( SELECT 1
FROM dual) AS x,
random() AS y,
CASE
WHEN true THEN 1
ELSE 0
END AS c,
1 AS d
FROM dual;
(1 row)
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 21 Sep 2009 18:22:01 -0000
***************
*** 2648,2659 ****
TupleDesc resultDesc)
{
StringInfo buf = context->buf;
char *sep;
! int colno;
ListCell *l;
sep = " ";
colno = 0;
foreach(l, targetList)
{
TargetEntry *tle = (TargetEntry *) lfirst(l);
--- 2648,2671 ----
TupleDesc resultDesc)
{
StringInfo buf = context->buf;
+ StringInfoData sep_indent;
char *sep;
! int colno, len;
ListCell *l;
sep = " ";
colno = 0;
+
+ /*
+ * Separator to make each target appear on its own line, regardless
+ * of pretty printing.
+ * Try to make them all line up at the same line position.
+ */
+ initStringInfo(&sep_indent);
+ appendStringInfoString(&sep_indent,",\n ");
+ for (len = buf->len -1; len >= 0 && buf->data[len]!= '\n'; len--)
+ appendStringInfoChar(&sep_indent,' ');
+
foreach(l, targetList)
{
TargetEntry *tle = (TargetEntry *) lfirst(l);
***************
*** 2664,2670 ****
continue; /* ignore junk entries */
appendStringInfoString(buf, sep);
! sep = ", ";
colno++;
/*
--- 2676,2682 ----
continue; /* ignore junk entries */
appendStringInfoString(buf, sep);
! sep = sep_indent.data;
colno++;
/*
***************
*** 2704,2709 ****
--- 2716,2726 ----
appendStringInfo(buf, " AS %s", quote_identifier(colname));
}
}
+
+ if (colno > 1 && ! PRETTY_INDENT(context))
+ appendStringInfoChar(buf,'\n');
+
+ pfree(sep_indent.data);
}
static void
***************
*** 4595,4602 ****
CaseExpr *caseexpr = (CaseExpr *) node;
ListCell *temp;
! appendContextKeyword(context, "CASE",
! 0, PRETTYINDENT_VAR, 0);
if (caseexpr->arg)
{
appendStringInfoChar(buf, ' ');
--- 4612,4620 ----
CaseExpr *caseexpr = (CaseExpr *) node;
ListCell *temp;
! appendStringInfoString(buf,"CASE");
! if (PRETTY_INDENT(context))
! context->indentLevel += PRETTYINDENT_VAR;
if (caseexpr->arg)
{
appendStringInfoChar(buf, ' ');
pgsql-hackers by date: