"Bruce Momjian" <[EMAIL PROTECTED]> writes:

> Gregory Stark wrote:
>> "Bruce Momjian" <[EMAIL PROTECTED]> writes:
>> 
>> > We do look at COLUMNS if the ioctl() fails, but not for file/pipe
>> > output.
>> 
>> Yeah, it looks like your most recent patch still has the bug that if the user
>> specifies wrapped there are some complicated rules creating cases where it
>> will ignore the user's request and use un-wrapped output instead.
>
> Can you be more specific?  You mean if the headings don't fit?  Yea,
> that is true.  I am thinking of adding a \pset auto format to \x in
> those cases, but that if for later.

[No I wasn't thinking of that, that's an interesting case too though I think
we might need to think a bit harder about cases that wrap poorly. If you have
long column headings we could wrap those too. But what if you have enough
space for just a few characters per column and you have long text fields in
those columns?]

I just meant the same thing I've been on about all week. Currently the
decision about whether to use wrapped mode is tied up with the decision on
what width to use and the result is that we ignore -Pformat=wrapped according
to some arcane set of rules.

The cases where we ignore the user's selected format are quite complex and not
accurately described in the documentation. They're also not accurately
described by your "not for file/pipe output" description either.

An accurate description would appear to be something like:

 <quote>Wrapped</quote> is like <literal>aligned</> but wraps to a target
 width of <literal>\pset columns</> or the width of the screen (unless screen
 size determination fails or output has been redirected using -o or \o in
 which case it is ignored and psql uses normal aligned mode unless \pset
 columns is used).

It's confusing and inconsistent. I think it's better to pick a simple set of
general principles and code to that. Trying to code to presumed use cases
often ends up with code which handles corner cases poorly or inconsistently.

I think the behaviour should be simply:

format=auto
 isatty(fout) ? format := wrapped : format := aligned
format=wrapped
 columns := \pset columns || ioctl(fout) || getenv(COLUMNS) || 79

[Note in the above that the ioctl is on fout, not stdout!]


That would be easy to explain in the documentation as two simple consistent
rules. And as a bonus it would be consistent with other programs which use
these variables.

So the description I would code to is simply:

 "Wrapped" is like aligned but wraps to \pset columns or an automatically
 determined screen size. The screen size is determined automatically if output
 is to a terminal which supports that, if that fails then by checking the
 COLUMNS environment variable, and if that's unset then by defaulting to 79.

 "Auto" selects "wrapped" format when output is a terminal and "aligned"
 format otherwise.

-- 
  Gregory Stark
  EnterpriseDB          http://www.enterprisedb.com
  Ask me about EnterpriseDB's Slony Replication support!

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to