Re: Spaces before newlines in view definitions in 9.3 - Mailing list pgsql-bugs

From Joe Abbate
Subject Re: Spaces before newlines in view definitions in 9.3
Date
Msg-id 527D6E76.3040308@freedomcircle.com
Whole thread Raw
In response to Re: Spaces before newlines in view definitions in 9.3  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: Spaces before newlines in view definitions in 9.3  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-bugs
Hello Tom,

On 08/11/13 17:24, Tom Lane wrote:
> Joe Abbate <jma@freedomcircle.com> writes:
>> View definition:
>>  SELECT t1.c1,
>>     t1.c2
>>    FROM t1;
>
>> It may not be immediately obvious but there is a space after the
>> "t1.c1," and before the first newline.  In 9.2 and previous releases,
>> the view definition is:
>
>>  SELECT t1.c1, t1.c2
>>    FROM t1;
>
> Yeah, this was changed by commit 2f582f76b1945929ff07116cd4639747ce9bb8a1,
> which added newlines to the output without making any attempt to suppress
> the spaces that had been printed before.
>
>> The problem is that the string comes back, e.g., from pg_get_viewdef()
>> with those extra spaces before the newlines, e.g.,
>
>> " SELECT t1.c1, \n    t1.c3 * 2 AS mc3\n   FROM t1;
>
>> and YAML has a way displaying a text string nicely so that it can be
>> recovered when it's read back, but it *doesn't* work if there are
>> invisible characters such as tabs or spaces before a newline because
>> obviously one can't tell how many or of what kind they are.
>
> Hm.  I am not sure whether to consider that a significant complaint or
> not, because in reality the ruleutils code has been pretty sloppy about
> trailing whitespace ever since it grew any "pretty printing" capability
> at all.  Looking for trailing whitespace in the ruleutils regression test,
> I find it in "UNION ALL" and "INSERT ... VALUES" constructs, which were
> that way long before that patch, and there are probably more cases that
> don't happen to get exercised by the regression tests.  That patch
> certainly made things worse, but it's not like pre-9.3 output was
> YAML-safe.
>
> Having said that, this seems relatively easy to fix by adjusting
> appendContextKeyword to delete any trailing spaces that are immediately
> before the newline it inserts.  AFAICS that's the only place in ruleutils
> that inserts newlines that might follow a space.  get_target_list also
> needs to do that when transposing a newline-started field value into the
> main buffer; but that complexity is offset because it no longer need
> consider the possibility of spaces before said newline.  I've tested the
> attached patch and it seems to do what's wanted (note: I didn't bother
> including the regression test output changes in the patch, as they're
> bulky and boring).
>
> I think that this is a reasonable thing to fix, but I'm not sure
> if we ought to back-patch it into 9.3 or not.  The pretty-printing
> change evidently broke your use-case but I'm thinking you weren't
> pushing it very hard.

Agreed it's not a significant complaint, just an extra annoyance --made
more visible because for Pyrseas 0.7 we added nicer view text formatting
rather than outputting what pg_get_viewdef gave us, no matter how ugly
and long the resulting quoted string looked like.

Our tests generally compare SQL texts in a "forgiving" manner,
particularly when it comes to whitespace.  However, the problem was
introduced in 9.3 and broke some of our view tests (and analogous
matview tests derived from them).  It's not a big deal if you don't
backpatch to 9.3, but it would help, since some of our tests now read:

        if ("postgres version" < 90300):
            fmt = "(%s%s %s%s )"
        else:
            fmt = "( %s\n %s\n %s\n %s\n)"

That would probably require yet another branch for 9.4 and later.

Best regards,

Joe

pgsql-bugs by date:

Previous
From: Tom Lane
Date:
Subject: Re: Spaces before newlines in view definitions in 9.3
Next
From: pansen
Date:
Subject: Re: Darwin: make check fails with "child process exited with exit code 134"