1
0
mirror of https://github.com/postgres/postgres.git synced 2025-05-05 09:19:17 +03:00

Make 8.3.x psql print tab characters as an appropriate number of spaces,

rather than "\x09".  Before 8.3 we just printed tabs as-is, leading to poor
formatting of subsequent columns, but consensus is that "\x09" is not an
improvement over that.  Back-patch of fix that's already in HEAD.
This commit is contained in:
Tom Lane 2008-05-29 19:34:44 +00:00
parent fe4f2861ba
commit 8146f890bb
3 changed files with 55 additions and 31 deletions

View File

@ -3,7 +3,7 @@
* *
* Copyright (c) 2000-2008, PostgreSQL Global Development Group * Copyright (c) 2000-2008, PostgreSQL Global Development Group
* *
* $PostgreSQL: pgsql/src/bin/psql/mbprint.c,v 1.29 2008/01/01 19:45:56 momjian Exp $ * $PostgreSQL: pgsql/src/bin/psql/mbprint.c,v 1.29.2.1 2008/05/29 19:34:43 tgl Exp $
* *
* XXX this file does not really belong in psql/. Perhaps move to libpq? * XXX this file does not really belong in psql/. Perhaps move to libpq?
* It also seems that the mbvalidate function is redundant with existing * It also seems that the mbvalidate function is redundant with existing
@ -204,13 +204,16 @@ pg_wcswidth(const unsigned char *pwcs, size_t len, int encoding)
/* /*
* pg_wcssize takes the given string in the given encoding and returns three * pg_wcssize takes the given string in the given encoding and returns three
* values: * values:
* result_width: Width in display character of longest line in string * result_width: Width in display characters of the longest line in string
* result_hieght: Number of lines in display output * result_height: Number of lines in display output
* result_format_size: Number of bytes required to store formatted representation of string * result_format_size: Number of bytes required to store formatted
* representation of string
*
* This MUST be kept in sync with pg_wcsformat!
*/ */
int void
pg_wcssize(unsigned char *pwcs, size_t len, int encoding, int *result_width, pg_wcssize(unsigned char *pwcs, size_t len, int encoding,
int *result_height, int *result_format_size) int *result_width, int *result_height, int *result_format_size)
{ {
int w, int w,
chlen = 0, chlen = 0,
@ -241,6 +244,14 @@ pg_wcssize(unsigned char *pwcs, size_t len, int encoding, int *result_width,
linewidth += 2; linewidth += 2;
format_size += 2; format_size += 2;
} }
else if (*pwcs == '\t') /* Tab */
{
do
{
linewidth++;
format_size++;
} while (linewidth % 8 != 0);
}
else if (w < 0) /* Other control char */ else if (w < 0) /* Other control char */
{ {
linewidth += 4; linewidth += 4;
@ -266,7 +277,7 @@ pg_wcssize(unsigned char *pwcs, size_t len, int encoding, int *result_width,
} }
if (linewidth > width) if (linewidth > width)
width = linewidth; width = linewidth;
format_size += 1; format_size += 1; /* For NUL char */
/* Set results */ /* Set results */
if (result_width) if (result_width)
@ -275,10 +286,14 @@ pg_wcssize(unsigned char *pwcs, size_t len, int encoding, int *result_width,
*result_height = height; *result_height = height;
if (result_format_size) if (result_format_size)
*result_format_size = format_size; *result_format_size = format_size;
return width;
} }
/*
* Format a string into one or more "struct lineptr" lines.
* lines[i].ptr == NULL indicates the end of the array.
*
* This MUST be kept in sync with pg_wcssize!
*/
void void
pg_wcsformat(unsigned char *pwcs, size_t len, int encoding, pg_wcsformat(unsigned char *pwcs, size_t len, int encoding,
struct lineptr * lines, int count) struct lineptr * lines, int count)
@ -304,7 +319,7 @@ pg_wcsformat(unsigned char *pwcs, size_t len, int encoding,
linewidth = 0; linewidth = 0;
lines++; lines++;
count--; count--;
if (count == 0) if (count <= 0)
exit(1); /* Screwup */ exit(1); /* Screwup */
lines->ptr = ptr; lines->ptr = ptr;
@ -315,6 +330,14 @@ pg_wcsformat(unsigned char *pwcs, size_t len, int encoding,
linewidth += 2; linewidth += 2;
ptr += 2; ptr += 2;
} }
else if (*pwcs == '\t') /* Tab */
{
do
{
*ptr++ = ' ';
linewidth++;
} while (linewidth % 8 != 0);
}
else if (w < 0) /* Other control char */ else if (w < 0) /* Other control char */
{ {
sprintf((char *) ptr, "\\x%02X", *pwcs); sprintf((char *) ptr, "\\x%02X", *pwcs);
@ -332,14 +355,14 @@ pg_wcsformat(unsigned char *pwcs, size_t len, int encoding,
if (encoding == PG_UTF8) if (encoding == PG_UTF8)
sprintf((char *) ptr, "\\u%04X", utf2ucs(pwcs)); sprintf((char *) ptr, "\\u%04X", utf2ucs(pwcs));
else else
{
/* /*
* This case cannot happen in the current code because only * This case cannot happen in the current code because only
* UTF-8 signals multibyte control characters. But we may need * UTF-8 signals multibyte control characters. But we may need
* to support it at some stage * to support it at some stage
*/ */
sprintf((char *) ptr, "\\u????"); sprintf((char *) ptr, "\\u????");
}
ptr += 6; ptr += 6;
linewidth += 6; linewidth += 6;
} }

View File

@ -1,4 +1,4 @@
/* $PostgreSQL: pgsql/src/bin/psql/mbprint.h,v 1.11 2006/10/04 00:30:06 momjian Exp $ */ /* $PostgreSQL: pgsql/src/bin/psql/mbprint.h,v 1.11.4.1 2008/05/29 19:34:43 tgl Exp $ */
#ifndef MBPRINT_H #ifndef MBPRINT_H
#define MBPRINT_H #define MBPRINT_H
@ -13,6 +13,7 @@ extern unsigned char *mbvalidate(unsigned char *pwcs, int encoding);
extern int pg_wcswidth(const unsigned char *pwcs, size_t len, int encoding); extern int pg_wcswidth(const unsigned char *pwcs, size_t len, int encoding);
extern void pg_wcsformat(unsigned char *pwcs, size_t len, int encoding, struct lineptr * lines, int count); extern void pg_wcsformat(unsigned char *pwcs, size_t len, int encoding, struct lineptr * lines, int count);
extern int pg_wcssize(unsigned char *pwcs, size_t len, int encoding, int *width, int *height, int *format_size); extern void pg_wcssize(unsigned char *pwcs, size_t len, int encoding,
int *width, int *height, int *format_size);
#endif /* MBPRINT_H */ #endif /* MBPRINT_H */

View File

@ -152,21 +152,21 @@ PREPARE q7(unknown) AS
SELECT * FROM road WHERE thepath = $1; SELECT * FROM road WHERE thepath = $1;
SELECT name, statement, parameter_types FROM pg_prepared_statements SELECT name, statement, parameter_types FROM pg_prepared_statements
ORDER BY name; ORDER BY name;
name | statement | parameter_types name | statement | parameter_types
------+-----------------------------------------------------------------+-------------------------------------------------------- ------+---------------------------------------------------------------------+--------------------------------------------------------
q2 | PREPARE q2(text) AS | {text} q2 | PREPARE q2(text) AS | {text}
: \x09SELECT datname, datistemplate, datallowconn : SELECT datname, datistemplate, datallowconn
: \x09FROM pg_database WHERE datname = $1; : FROM pg_database WHERE datname = $1;
q3 | PREPARE q3(text, int, float, boolean, oid, smallint) AS | {text,integer,"double precision",boolean,oid,smallint} q3 | PREPARE q3(text, int, float, boolean, oid, smallint) AS | {text,integer,"double precision",boolean,oid,smallint}
: \x09SELECT * FROM tenk1 WHERE string4 = $1 AND (four = $2 OR : SELECT * FROM tenk1 WHERE string4 = $1 AND (four = $2 OR
: \x09ten = $3::bigint OR true = $4 OR oid = $5 OR odd = $6::int) : ten = $3::bigint OR true = $4 OR oid = $5 OR odd = $6::int)
: \x09ORDER BY unique1; : ORDER BY unique1;
q5 | PREPARE q5(int, text) AS | {integer,text} q5 | PREPARE q5(int, text) AS | {integer,text}
: \x09SELECT * FROM tenk1 WHERE unique1 = $1 OR stringu1 = $2 : SELECT * FROM tenk1 WHERE unique1 = $1 OR stringu1 = $2
: \x09ORDER BY unique1; : ORDER BY unique1;
q6 | PREPARE q6 AS | {integer,name} q6 | PREPARE q6 AS | {integer,name}
: SELECT * FROM tenk1 WHERE unique1 = $1 AND stringu1 = $2; : SELECT * FROM tenk1 WHERE unique1 = $1 AND stringu1 = $2;
q7 | PREPARE q7(unknown) AS | {path} q7 | PREPARE q7(unknown) AS | {path}
: SELECT * FROM road WHERE thepath = $1; : SELECT * FROM road WHERE thepath = $1;
(5 rows) (5 rows)