Improve psql's tabular display of wrapped-around data by inserting markers

in the formerly-always-blank columns just to left and right of the data.
Different marking is used for a line break caused by a newline in the data
than for a straight wraparound.  A newline break is signaled by a "+" in the
right margin column in ASCII mode, or a carriage return arrow in UNICODE mode.
Wraparound is signaled by a dot in the right margin as well as the following
left margin in ASCII mode, or an ellipsis symbol in the same places in UNICODE
mode.  "\pset linestyle old-ascii" is added to make the previous behavior
available if anyone really wants it.

In passing, this commit also cleans up a few regression test files that
had unintended spacing differences from the current actual output.

Roger Leigh, reviewed by Gabrielle Roth and other members of PDXPUG.
This commit is contained in:
Tom Lane 2009-11-22 05:20:41 +00:00
parent 93d3bac564
commit 1753337cf5
19 changed files with 374 additions and 260 deletions

View File

@ -829,51 +829,51 @@ DROP SERVER fdtest;
DROP FOREIGN DATA WRAPPER postgresql;
-- test asynchronous notifications
SELECT dblink_connect('dbname=contrib_regression');
dblink_connect
dblink_connect
----------------
OK
(1 row)
--should return listen
SELECT dblink_exec('LISTEN regression');
dblink_exec
dblink_exec
-------------
LISTEN
(1 row)
--should return listen
SELECT dblink_exec('LISTEN foobar');
dblink_exec
dblink_exec
-------------
LISTEN
(1 row)
SELECT dblink_exec('NOTIFY regression');
dblink_exec
dblink_exec
-------------
NOTIFY
(1 row)
SELECT dblink_exec('NOTIFY foobar');
dblink_exec
dblink_exec
-------------
NOTIFY
(1 row)
SELECT notify_name, be_pid = (select t.be_pid from dblink('select pg_backend_pid()') as t(be_pid int)) AS is_self_notify, extra from dblink_get_notify();
notify_name | is_self_notify | extra
notify_name | is_self_notify | extra
-------------+----------------+-------
regression | t |
foobar | t |
regression | t |
foobar | t |
(2 rows)
SELECT * from dblink_get_notify();
notify_name | be_pid | extra
notify_name | be_pid | extra
-------------+--------+-------
(0 rows)
SELECT dblink_disconnect();
dblink_disconnect
dblink_disconnect
-------------------
OK
(1 row)

View File

@ -17,7 +17,7 @@ CREATE TABLE ctest (data text, res text, salt text);
INSERT INTO ctest VALUES ('password', '', '');
UPDATE ctest SET salt = gen_salt('bf', 8);
UPDATE ctest SET res = crypt(data, salt);
SELECT res = crypt(data, res) AS "worked"
SELECT res = crypt(data, res) AS "worked"
FROM ctest;
worked
--------

View File

@ -6,21 +6,21 @@ SET bytea_output TO escape;
select armor('');
armor
-----------------------------
-----BEGIN PGP MESSAGE-----
=twTO
-----END PGP MESSAGE-----
-----BEGIN PGP MESSAGE-----+
+
=twTO +
-----END PGP MESSAGE----- +
(1 row)
select armor('test');
armor
-----------------------------
-----BEGIN PGP MESSAGE-----
dGVzdA==
=+G7Q
-----END PGP MESSAGE-----
-----BEGIN PGP MESSAGE-----+
+
dGVzdA== +
=+G7Q +
-----END PGP MESSAGE----- +
(1 row)
@ -40,12 +40,12 @@ select armor('0123456789abcdef0123456789abcdef0123456789abcdef
0123456789abcdef0123456789abcdef0123456789abcdef');
armor
------------------------------------------------------------------------------
-----BEGIN PGP MESSAGE-----
MDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmCjAxMjM0NTY3
ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZg==
=JFw5
-----END PGP MESSAGE-----
-----BEGIN PGP MESSAGE----- +
+
MDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmCjAxMjM0NTY3+
ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZg== +
=JFw5 +
-----END PGP MESSAGE----- +
(1 row)

View File

@ -11,7 +11,7 @@ yA6Ce1QTMK3KdL2MPfamsTUSAML8huCJMwYQFfE=
=JcP+
-----END PGP MESSAGE-----
'), 'foobar');
pgp_sym_decrypt
pgp_sym_decrypt
-----------------
Secret message.
(1 row)
@ -25,7 +25,7 @@ UTAsG35A1vYs02VARKzGz6xI2UHwFUirP+brPBg3Ee7muOx8pA==
=XtrP
-----END PGP MESSAGE-----
'), 'foobar');
pgp_sym_decrypt
pgp_sym_decrypt
-----------------
Secret message.
(1 row)
@ -39,7 +39,7 @@ jA0ECAMCI7YQpWqp3D1g0kQBCjB7GlX7+SQeXNleXeXQ78ZAPNliquGDq9u378zI
=rCZt
-----END PGP MESSAGE-----
'), 'foobar');
pgp_sym_decrypt
pgp_sym_decrypt
-----------------
Secret message.
(1 row)
@ -53,7 +53,7 @@ lceMfQdbAg6oTFyJpk/wH18GzRDphCofg0X8uLgkAKMrpcmgog==
=fB6S
-----END PGP MESSAGE-----
'), 'foobar');
pgp_sym_decrypt
pgp_sym_decrypt
-----------------
Secret message.
(1 row)
@ -68,7 +68,7 @@ u9YkgfJfsuRJmgQ9tmo=
=60ui
-----END PGP MESSAGE-----
'), 'foobar');
pgp_sym_decrypt
pgp_sym_decrypt
-----------------
Secret message.
(1 row)
@ -82,7 +82,7 @@ jA0EBwMCEeP3idNjQ1Bg0kQBf4G0wX+2QNzLh2YNwYkQgQkfYhn/hLXjV4nK9nsE
=moGf
-----END PGP MESSAGE-----
'), 'foobar');
pgp_sym_decrypt
pgp_sym_decrypt
-----------------
Secret message.
(1 row)
@ -97,7 +97,7 @@ KyRrHf7zEBuZiZ2AG34jNVMOLToj1jJUg5zTSdecUzQVCykWTA==
=NyLk
-----END PGP MESSAGE-----
'), 'foobar');
pgp_sym_decrypt
pgp_sym_decrypt
-----------------
Secret message.
(1 row)
@ -111,7 +111,7 @@ jA0EBwMCApbdlrURoWJg0kQBzHM/E0o7djY82bNuspjxjAcPFrrtp0uvDdMQ4z2m
=FxbQ
-----END PGP MESSAGE-----
'), 'foobar');
pgp_sym_decrypt
pgp_sym_decrypt
-----------------
Secret message.
(1 row)
@ -126,7 +126,7 @@ Ah9GXjGS1TVALzTImJbz1uHUZRfhJlFbc5yGQw==
=YvkV
-----END PGP MESSAGE-----
'), 'foobar');
pgp_sym_decrypt
pgp_sym_decrypt
-----------------
Secret message.
(1 row)
@ -140,7 +140,7 @@ jAwEBwEC/QTByBLI3b/SRAHPxKzI6SZBo5lAEOD+EsvKQWO4adL9tDY+++Iqy1xK
=dbXm
-----END PGP MESSAGE-----
'), 'foobar');
pgp_sym_decrypt
pgp_sym_decrypt
-----------------
Secret message.
(1 row)
@ -154,7 +154,7 @@ z+9ZaA/XdSx5ZiFnMym8P6r8uY9rLjjNptvvRHlxIReF+p9MNg==
=VJKg
-----END PGP MESSAGE-----
'), 'foobar');
pgp_sym_decrypt
pgp_sym_decrypt
-----------------
Secret message.
(1 row)
@ -168,7 +168,7 @@ Cr3i2M7TgVZ0M4jp4QL0adG1lpN5iK7aQeOwMw==
=cg+i
-----END PGP MESSAGE-----
'), 'foobar');
pgp_sym_decrypt
pgp_sym_decrypt
-----------------
Secret message.
(1 row)
@ -182,7 +182,7 @@ jAwECAECruOfyNDFiTnSRAEVoGXm4A9UZKkWljdzjEO/iaE7mIraltIpQMkiqCh9
=aHmC
-----END PGP MESSAGE-----
'), 'foobar');
pgp_sym_decrypt
pgp_sym_decrypt
-----------------
Secret message.
(1 row)
@ -196,7 +196,7 @@ q6eF6859ZVnli3BFSDSk3a4e/pXhglxmDYCfjAXkozKNYLo6yw==
=K0LS
-----END PGP MESSAGE-----
'), 'foobar');
pgp_sym_decrypt
pgp_sym_decrypt
-----------------
Secret message.
(1 row)
@ -210,7 +210,7 @@ rQr3WbdKdY9ufjOE5+mXI+EFkSPrF9rL9NCq6w==
=RGts
-----END PGP MESSAGE-----
'), 'foobar');
pgp_sym_decrypt
pgp_sym_decrypt
-----------------
Secret message.
(1 row)
@ -224,7 +224,7 @@ jAwECQECKHhrou7ZOIXSRAHWIVP+xjVQcjAVBTt+qh9SNzYe248xFTwozkwev3mO
=SUrU
-----END PGP MESSAGE-----
'), 'foobar');
pgp_sym_decrypt
pgp_sym_decrypt
-----------------
Secret message.
(1 row)
@ -238,7 +238,7 @@ jA0ECQMCjc8lwZu8Fz1g0kQBkEzjImi21liep5jj+3dAJ2aZFfUkohi8b3n9z+7+
=XZrG
-----END PGP MESSAGE-----
'), 'foobar');
pgp_sym_decrypt
pgp_sym_decrypt
-----------------
Secret message.
(1 row)
@ -253,7 +253,7 @@ tTGup1mMz6Cfh1uDRErUuXpx9A0gdMu7zX0o5XjrL7WGDAZdSw==
=XKKG
-----END PGP MESSAGE-----
'), '0123456789abcdefghij');
pgp_sym_decrypt
pgp_sym_decrypt
-----------------
Secret message.
(1 row)
@ -267,7 +267,7 @@ CMxFKadf144H/vpoV9GA0f22keQgCl0EsTE4V4lweVOPTKCMJg==
=gWDh
-----END PGP MESSAGE-----
'), '0123456789abcdefghij2jk4h5g2j54khg23h54g2kh54g2khj54g23hj54');
pgp_sym_decrypt
pgp_sym_decrypt
-----------------
Secret message.
(1 row)
@ -281,7 +281,7 @@ FwsDabdQUz5O7bgNSnxfmyw1OifGF+W2bIn/8W+0rDf8u3+O+Q==
=OxOF
-----END PGP MESSAGE-----
'), 'x');
pgp_sym_decrypt
pgp_sym_decrypt
-----------------
Secret message.
(1 row)

View File

@ -742,8 +742,8 @@ select * from parse('default', '345 qwe@efd.r '' http://www.com/ http://aew.werc
3 | ewri2
12 |
13 | <a href="qwe<qwe>">
12 |
:
12 | +
|
19 | /usr/local/fff
12 |
19 | /awdf/dwqe/4325
@ -775,8 +775,8 @@ select * from parse('default', '345 qwe@efd.r '' http://www.com/ http://aew.werc
20 | -4.2
12 | .
22 | 234
12 |
:
12 | +
|
12 | <
1 | i
12 |
@ -2330,8 +2330,8 @@ Upon a woman s face. E. J. Pratt (1882 1964)
', to_tsquery('sea&thousand&years'));
headline
--------------------------------------------
<b>sea</b> a <b>thousand</b> <b>years</b>,
A <b>thousand</b> <b>years</b> to trace
<b>sea</b> a <b>thousand</b> <b>years</b>,+
A <b>thousand</b> <b>years</b> to trace +
The granite features of this cliff
(1 row)
@ -2347,8 +2347,8 @@ Upon a woman s face. E. J. Pratt (1882 1964)
', to_tsquery('granite&sea'));
headline
-------------------------------------------
<b>sea</b> a thousand years,
A thousand years to trace
<b>sea</b> a thousand years, +
A thousand years to trace +
The <b>granite</b> features of this cliff
(1 row)
@ -2364,8 +2364,8 @@ Upon a woman s face. E. J. Pratt (1882 1964)
', to_tsquery('sea'));
headline
------------------------------------
<b>sea</b> a thousand years,
A thousand years to trace
<b>sea</b> a thousand years, +
A thousand years to trace +
The granite features of this cliff
(1 row)
@ -2384,17 +2384,17 @@ ff-bg
to_tsquery('sea&foo'), 'HighlightAll=true');
headline
-----------------------------------------------------------------------------
<html>
<!-- some comment -->
<body>
<b>Sea</b> view wow <u><b>foo</b> bar</u> <i>qq</i>
<a href="http://www.google.com/foo.bar.html" target="_blank">YES &nbsp;</a>
ff-bg
<script>
document.write(15);
</script>
</body>
+
<html> +
<!-- some comment --> +
<body> +
<b>Sea</b> view wow <u><b>foo</b> bar</u> <i>qq</i> +
<a href="http://www.google.com/foo.bar.html" target="_blank">YES &nbsp;</a>+
ff-bg +
<script> +
document.write(15); +
</script> +
</body> +
</html>
(1 row)

View File

@ -742,8 +742,8 @@ select * from parse('default', '345 qwe@efd.r '' http://www.com/ http://aew.werc
3 | ewri2
12 |
13 | <a href="qwe<qwe>">
12 |
:
12 | +
|
19 | /usr/local/fff
12 |
19 | /awdf/dwqe/4325
@ -775,8 +775,8 @@ select * from parse('default', '345 qwe@efd.r '' http://www.com/ http://aew.werc
20 | -4.2
12 | .
22 | 234
12 |
:
12 | +
|
12 | <
1 | i
12 |
@ -2330,8 +2330,8 @@ Upon a woman s face. E. J. Pratt (1882 1964)
', to_tsquery('sea&thousand&years'));
headline
--------------------------------------------
<b>sea</b> a <b>thousand</b> <b>years</b>,
A <b>thousand</b> <b>years</b> to trace
<b>sea</b> a <b>thousand</b> <b>years</b>,+
A <b>thousand</b> <b>years</b> to trace +
The granite features of this cliff
(1 row)
@ -2347,8 +2347,8 @@ Upon a woman s face. E. J. Pratt (1882 1964)
', to_tsquery('granite&sea'));
headline
-------------------------------------------
<b>sea</b> a thousand years,
A thousand years to trace
<b>sea</b> a thousand years, +
A thousand years to trace +
The <b>granite</b> features of this cliff
(1 row)
@ -2364,8 +2364,8 @@ Upon a woman s face. E. J. Pratt (1882 1964)
', to_tsquery('sea'));
headline
------------------------------------
<b>sea</b> a thousand years,
A thousand years to trace
<b>sea</b> a thousand years, +
A thousand years to trace +
The granite features of this cliff
(1 row)
@ -2384,17 +2384,17 @@ ff-bg
to_tsquery('sea&foo'), 'HighlightAll=true');
headline
-----------------------------------------------------------------------------
<html>
<!-- some comment -->
<body>
<b>Sea</b> view wow <u><b>foo</b> bar</u> <i>qq</i>
<a href="http://www.google.com/foo.bar.html" target="_blank">YES &nbsp;</a>
ff-bg
<script>
document.write(15);
</script>
</body>
+
<html> +
<!-- some comment --> +
<body> +
<b>Sea</b> view wow <u><b>foo</b> bar</u> <i>qq</i> +
<a href="http://www.google.com/foo.bar.html" target="_blank">YES &nbsp;</a>+
ff-bg +
<script> +
document.write(15); +
</script> +
</body> +
</html>
(1 row)

View File

@ -1,5 +1,5 @@
<!--
$PostgreSQL: pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.232 2009/10/13 21:04:01 tgl Exp $
$PostgreSQL: pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.233 2009/11/22 05:20:41 tgl Exp $
PostgreSQL documentation
-->
@ -1765,30 +1765,54 @@ lo_import 152801
<listitem>
<para>
Sets the border line drawing style to one
of <literal>ascii</literal> or <literal>unicode</literal>.
of <literal>ascii</literal>, <literal>old-ascii</literal>
or <literal>unicode</literal>.
Unique abbreviations are allowed. (That would mean one
letter is enough.)
</para>
<para>
<quote>ASCII</quote> uses plain <acronym>ASCII</acronym> characters.
<literal>ascii</literal> style uses plain <acronym>ASCII</acronym>
characters. Newlines in data are shown using
a <literal>+</literal> symbol in the right-hand margin.
When the data wraps from one line
to the next without a newline character, a dot (<literal>.</>)
is shown in the right-hand margin of the first line, and
again in the left-hand margin of the following line.
</para>
<para>
<quote>Unicode</quote> uses Unicode box-drawing characters.
<literal>old-ascii</literal> style uses plain <acronym>ASCII</>
characters, using the formatting style used
in <productname>PostgreSQL</productname> 8.4 and earlier.
Newlines in data are shown using a <literal>:</literal>
symbol in place of the left-hand column separator.
When the data wraps from one line
to the next without a newline character, a <literal>;</>
symbol is used in place of the left-hand column separator.
</para>
<para>
<literal>unicode</literal> style uses Unicode box-drawing characters.
Newlines in data are shown using a carriage return symbol
in the right-hand margin. When the data wraps from one line
to the next without a newline character, an ellipsis symbol
is shown in the right-hand margin of the first line, and
again in the left-hand margin of the following line.
</para>
<para>
When the selected output format is one that draws lines or boxes
around the data, this setting controls how the lines are drawn.
around the data, this setting also determines the characters
with which the lines are drawn.
Plain <acronym>ASCII</acronym> characters work everywhere, but
Unicode characters look nicer on displays that recognize them.
</para>
<para>
If this option has not been set, the default behavior is to
use Unicode characters if the client character set encoding
is UTF-8, otherwise <acronym>ASCII</acronym> characters.
If this option has not been set, the default behavior is to use
<literal>unicode</literal> style if the client character set encoding
is UTF-8, otherwise <literal>ascii</literal> style.
</para>
</listitem>
</varlistentry>

View File

@ -3,7 +3,7 @@
*
* Copyright (c) 2000-2009, PostgreSQL Global Development Group
*
* $PostgreSQL: pgsql/src/bin/psql/command.c,v 1.210 2009/10/13 21:04:01 tgl Exp $
* $PostgreSQL: pgsql/src/bin/psql/command.c,v 1.211 2009/11/22 05:20:41 tgl Exp $
*/
#include "postgres_fe.h"
#include "command.h"
@ -1795,11 +1795,13 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
;
else if (pg_strncasecmp("ascii", value, vallen) == 0)
popt->topt.line_style = &pg_asciiformat;
else if (pg_strncasecmp("old-ascii", value, vallen) == 0)
popt->topt.line_style = &pg_asciiformat_old;
else if (pg_strncasecmp("unicode", value, vallen) == 0)
popt->topt.line_style = &pg_utf8format;
else
{
psql_error("\\pset: allowed line styles are ascii, unicode\n");
psql_error("\\pset: allowed line styles are ascii, old-ascii, unicode\n");
return false;
}

View File

@ -3,7 +3,7 @@
*
* Copyright (c) 2000-2009, PostgreSQL Global Development Group
*
* $PostgreSQL: pgsql/src/bin/psql/print.c,v 1.117 2009/10/13 21:04:01 tgl Exp $
* $PostgreSQL: pgsql/src/bin/psql/print.c,v 1.118 2009/11/22 05:20:41 tgl Exp $
*/
#include "postgres_fe.h"
@ -54,9 +54,37 @@ const printTextFormat pg_asciiformat =
{ "-", "+", "+", "+" },
{ "", "|", "|", "|" }
},
"|",
"|",
"|",
" ",
"+",
" ",
"+",
".",
".",
true
};
const printTextFormat pg_asciiformat_old =
{
"old-ascii",
{
{ "-", "+", "+", "+" },
{ "-", "+", "+", "+" },
{ "-", "+", "+", "+" },
{ "", "|", "|", "|" }
},
":",
";",
" "
" ",
"+",
" ",
" ",
" ",
" ",
" ",
false
};
const printTextFormat pg_utf8format =
@ -72,12 +100,23 @@ const printTextFormat pg_utf8format =
/* N/A, │, │, │ */
{ "", "\342\224\202", "\342\224\202", "\342\224\202" }
},
/* ╎ */
"\342\225\216",
/* ┊ */
"\342\224\212",
/* ╷ */
"\342\225\267"
/* │ */
"\342\224\202",
/* │ */
"\342\224\202",
/* │ */
"\342\224\202",
" ",
/* ↵ */
"\342\206\265",
" ",
/* ↵ */
"\342\206\265",
/* … */
"\342\200\246",
/* … */
"\342\200\246",
true
};
@ -476,6 +515,7 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
bool *header_done; /* Have all header lines been output? */
int *bytes_output; /* Bytes output for column value */
printTextLineWrap *wrap; /* Wrap status for each column */
int output_columns = 0; /* Width of interactive console */
bool is_pager = false;
@ -499,6 +539,7 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
format_buf = pg_local_calloc(col_count, sizeof(*format_buf));
header_done = pg_local_calloc(col_count, sizeof(*header_done));
bytes_output = pg_local_calloc(col_count, sizeof(*bytes_output));
wrap = pg_local_calloc(col_count, sizeof(*wrap));
}
else
{
@ -513,6 +554,7 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
format_buf = NULL;
header_done = NULL;
bytes_output = NULL;
wrap = NULL;
}
/* scan all column headers, find maximum width and max max_nl_lines */
@ -575,7 +617,7 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
/* adjust the total display width based on border style */
if (opt_border == 0)
width_total = col_count - 1;
width_total = col_count;
else if (opt_border == 1)
width_total = col_count * 3 - 1;
else
@ -770,16 +812,18 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
while (more_col_wrapping)
{
if (opt_border == 2)
fprintf(fout, "%s%c", dformat->leftvrule,
curr_nl_line ? '+' : ' ');
else if (opt_border == 1)
fputc(curr_nl_line ? '+' : ' ', fout);
fputs(dformat->leftvrule, fout);
for (i = 0; i < cont->ncolumns; i++)
{
struct lineptr *this_line = col_lineptrs[i] + curr_nl_line;
unsigned int nbspace;
if (opt_border != 0 ||
(format->wrap_right_border == false && i > 0))
fputs(curr_nl_line ? format->header_nl_left : " ",
fout);
if (!header_done[i])
{
nbspace = width_wrap[i] - this_line->width;
@ -796,21 +840,18 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
}
else
fprintf(fout, "%*s", width_wrap[i], "");
if (i < col_count - 1)
{
if (opt_border == 0)
fputc(curr_nl_line ? '+' : ' ', fout);
else
fprintf(fout, " %s%c", dformat->midvrule,
curr_nl_line ? '+' : ' ');
}
if (opt_border != 0 || format->wrap_right_border == true)
fputs(!header_done[i] ? format->header_nl_right : " ",
fout);
if (opt_border != 0 && i < col_count - 1)
fputs(dformat->midvrule, fout);
}
curr_nl_line++;
if (opt_border == 2)
fprintf(fout, " %s", dformat->rightvrule);
else if (opt_border == 1)
fputc(' ', fout);
fputs(dformat->rightvrule, fout);
fputc('\n', fout);
}
@ -861,9 +902,7 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
/* left border */
if (opt_border == 2)
fprintf(fout, "%s ", dformat->leftvrule);
else if (opt_border == 1)
fputc(' ', fout);
fputs(dformat->leftvrule, fout);
/* for each column */
for (j = 0; j < col_count; j++)
@ -874,6 +913,17 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
int chars_to_output = width_wrap[j];
bool finalspaces = (opt_border == 2 || j < col_count - 1);
/* Print left-hand wrap or newline mark */
if (opt_border != 0)
{
if (wrap[j] == PRINT_LINE_WRAP_WRAP)
fputs(format->wrap_left, fout);
else if (wrap[j] == PRINT_LINE_WRAP_NEWLINE)
fputs(format->nl_left, fout);
else
fputc(' ', fout);
}
if (!this_line->ptr)
{
/* Past newline lines so just pad for other columns */
@ -908,8 +958,6 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
/* spaces second */
fprintf(fout, "%.*s", bytes_to_output,
this_line->ptr + bytes_output[j]);
if (finalspaces)
fprintf(fout, "%*s", width_wrap[j] - chars_to_output, "");
}
bytes_output[j] += bytes_to_output;
@ -927,29 +975,54 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
}
}
/* print a divider, if not the last column */
if (j < col_count - 1)
/* Determine next line's wrap status for this column */
wrap[j] = PRINT_LINE_WRAP_NONE;
if (col_lineptrs[j][curr_nl_line[j]].ptr != NULL)
{
if (opt_border == 0)
fputc(' ', fout);
/* Next value is beyond past newlines? */
if (bytes_output[j] != 0)
wrap[j] = PRINT_LINE_WRAP_WRAP;
else if (curr_nl_line[j] != 0)
wrap[j] = PRINT_LINE_WRAP_NEWLINE;
}
/*
* If left-aligned, pad out remaining space if needed (not
* last column, and/or wrap marks required).
*/
if (cont->aligns[j] != 'r') /* Left aligned cell */
{
if (finalspaces ||
wrap[j] == PRINT_LINE_WRAP_WRAP ||
wrap[j] == PRINT_LINE_WRAP_NEWLINE)
fprintf(fout, "%*s",
width_wrap[j] - chars_to_output, "");
}
/* Print right-hand wrap or newline mark */
if (wrap[j] == PRINT_LINE_WRAP_WRAP)
fputs(format->wrap_right, fout);
else if (wrap[j] == PRINT_LINE_WRAP_NEWLINE)
fputs(format->nl_right, fout);
else if (opt_border == 2 || j < col_count - 1)
fputc(' ', fout);
/* Print column divider, if not the last column */
if (opt_border != 0 && j < col_count - 1)
{
if (wrap[j+1] == PRINT_LINE_WRAP_WRAP)
fputs(format->midvrule_wrap, fout);
else if (wrap[j+1] == PRINT_LINE_WRAP_NEWLINE)
fputs(format->midvrule_nl, fout);
else if (col_lineptrs[j + 1][curr_nl_line[j + 1]].ptr == NULL)
fprintf(fout, " %s ", format->midvrule_blank);
/* In wrapping of value? */
else if (bytes_output[j + 1] != 0)
fprintf(fout, " %s ", format->midvrule_wrap);
/* After first newline value */
else if (curr_nl_line[j + 1] != 0)
fprintf(fout, " %s ", format->midvrule_cont);
/* Ordinary line */
fputs(format->midvrule_blank, fout);
else
fprintf(fout, " %s ", dformat->midvrule);
fputs(dformat->midvrule, fout);
}
}
/* end-of-row border */
if (opt_border == 2)
fprintf(fout, " %s", dformat->rightvrule);
fputs(dformat->rightvrule, fout);
fputc('\n', fout);
} while (more_lines);
@ -1196,9 +1269,7 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
fprintf(fout, "%*s", hwidth, "");
if (opt_border > 0)
fprintf(fout, " %s ",
(line_count == 0) ?
format->midvrule_cont : dformat->midvrule);
fprintf(fout, " %s ", dformat->midvrule);
else
fputc(' ', fout);

View File

@ -3,7 +3,7 @@
*
* Copyright (c) 2000-2009, PostgreSQL Global Development Group
*
* $PostgreSQL: pgsql/src/bin/psql/print.h,v 1.41 2009/10/13 21:04:01 tgl Exp $
* $PostgreSQL: pgsql/src/bin/psql/print.h,v 1.42 2009/11/22 05:20:41 tgl Exp $
*/
#ifndef PRINT_H
#define PRINT_H
@ -41,14 +41,30 @@ typedef enum printTextRule
PRINT_RULE_DATA /* data line (hrule is unused here) */
} printTextRule;
typedef enum printTextLineWrap
{
/* Line wrapping conditions */
PRINT_LINE_WRAP_NONE, /* No wrapping */
PRINT_LINE_WRAP_WRAP, /* Wraparound due to overlength line */
PRINT_LINE_WRAP_NEWLINE /* Newline in data */
} printTextLineWrap;
typedef struct printTextFormat
{
/* A complete line style */
const char *name; /* for display purposes */
printTextLineFormat lrule[4]; /* indexed by enum printTextRule */
const char *midvrule_cont; /* vertical line for continue after newline */
const char *midvrule_nl; /* vertical line for continue after newline */
const char *midvrule_wrap; /* vertical line for wrapped data */
const char *midvrule_blank; /* vertical line for blank data */
const char *header_nl_left; /* left mark after newline */
const char *header_nl_right; /* right mark for newline */
const char *nl_left; /* left mark after newline */
const char *nl_right; /* right mark for newline */
const char *wrap_left; /* left mark after wrapped data */
const char *wrap_right; /* right mark for wrapped data */
bool wrap_right_border; /* use right-hand border for wrap marks
* when border=0? */
} printTextFormat;
typedef struct printTableOpt
@ -125,6 +141,7 @@ typedef struct printQueryOpt
extern const printTextFormat pg_asciiformat;
extern const printTextFormat pg_asciiformat_old;
extern const printTextFormat pg_utf8format;

View File

@ -53,7 +53,7 @@ SELECT casttestfunc('foo'::text); -- Should work now
SELECT 1234::int4::casttesttype; -- No cast yet, should fail
ERROR: cannot cast type integer to casttesttype
LINE 1: SELECT 1234::int4::casttesttype;
^
^
CREATE CAST (int4 AS casttesttype) WITH INOUT;
SELECT 1234::int4::casttesttype; -- Should work now
casttesttype

View File

@ -71,9 +71,9 @@ RESET SESSION AUTHORIZATION;
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+----------+-------+--------------------------------------------------+--------------------------
public | deptest1 | table | regression_user0=arwdDxt/regression_user0 |
: regression_user1=a*r*w*d*D*x*t*/regression_user0
: regression_user2=arwdDxt/regression_user1
public | deptest1 | table | regression_user0=arwdDxt/regression_user0 +|
| | | regression_user1=a*r*w*d*D*x*t*/regression_user0+|
| | | regression_user2=arwdDxt/regression_user1 |
(1 row)
DROP OWNED BY regression_user1;

View File

@ -366,14 +366,14 @@ GRANT USAGE ON FOREIGN SERVER s6 TO regress_test_role2 WITH GRANT OPTION;
List of foreign servers
Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | Options
------+-------------------+----------------------+-----------------------------------------+--------+---------+------------------------------
s1 | foreign_data_user | foo | foreign_data_user=U/foreign_data_user | | 1.0 | {servername=s1}
: regress_test_role=U/foreign_data_user
s1 | foreign_data_user | foo | foreign_data_user=U/foreign_data_user +| | 1.0 | {servername=s1}
| | | regress_test_role=U/foreign_data_user | | |
s2 | foreign_data_user | foo | | | 1.1 | {host=a,dbname=b}
s3 | foreign_data_user | foo | | oracle | | {tnsname=orcl,port=1521}
s4 | foreign_data_user | foo | | oracle | | {host=a,dbname=b}
s5 | foreign_data_user | foo | | | 15.0 |
s6 | foreign_data_user | foo | foreign_data_user=U/foreign_data_user | | 16.0 | {host=a,dbname=b}
: regress_test_role2=U*/foreign_data_user
s6 | foreign_data_user | foo | foreign_data_user=U/foreign_data_user +| | 16.0 | {host=a,dbname=b}
| | | regress_test_role2=U*/foreign_data_user | | |
s7 | foreign_data_user | foo | | oracle | 17.0 | {host=a,dbname=b}
s8 | foreign_data_user | postgresql | | | | {host=localhost,dbname=s8db}
t1 | regress_test_role | foo | | | |
@ -417,14 +417,14 @@ access to foreign-data wrapper foo
List of foreign servers
Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | Options
------+-----------------------+----------------------+-----------------------------------------+--------+---------+---------------------------------
s1 | regress_test_indirect | foo | foreign_data_user=U/foreign_data_user | | 1.1 | {servername=s1}
: regress_test_role=U/foreign_data_user
s1 | regress_test_indirect | foo | foreign_data_user=U/foreign_data_user +| | 1.1 | {servername=s1}
| | | regress_test_role=U/foreign_data_user | | |
s2 | foreign_data_user | foo | | | 1.1 | {host=a,dbname=b}
s3 | foreign_data_user | foo | | oracle | | {tnsname=orcl,port=1521}
s4 | foreign_data_user | foo | | oracle | | {host=a,dbname=b}
s5 | foreign_data_user | foo | | | 15.0 |
s6 | foreign_data_user | foo | foreign_data_user=U/foreign_data_user | | 16.0 | {host=a,dbname=b}
: regress_test_role2=U*/foreign_data_user
s6 | foreign_data_user | foo | foreign_data_user=U/foreign_data_user +| | 16.0 | {host=a,dbname=b}
| | | regress_test_role2=U*/foreign_data_user | | |
s7 | foreign_data_user | foo | | oracle | 17.0 | {host=a,dbname=b}
s8 | foreign_data_user | postgresql | | | | {dbname=db1,connect_timeout=30}
t1 | regress_test_role | foo | | | |

View File

@ -85,10 +85,10 @@ INSERT INTO FKTABLE VALUES (NULL, NULL, 0);
-- Insert failed rows into FK TABLE
INSERT INTO FKTABLE VALUES (100, 2, 4);
ERROR: insert or update on table "fktable" violates foreign key constraint "constrname"
DETAIL: Key (ftest1,ftest2)=(100,2) is not present in table "pktable".
DETAIL: Key (ftest1, ftest2)=(100, 2) is not present in table "pktable".
INSERT INTO FKTABLE VALUES (2, 2, 4);
ERROR: insert or update on table "fktable" violates foreign key constraint "constrname"
DETAIL: Key (ftest1,ftest2)=(2,2) is not present in table "pktable".
DETAIL: Key (ftest1, ftest2)=(2, 2) is not present in table "pktable".
INSERT INTO FKTABLE VALUES (NULL, 2, 4);
ERROR: insert or update on table "fktable" violates foreign key constraint "constrname"
DETAIL: MATCH FULL does not allow mixing of null and nonnull key values.
@ -195,10 +195,10 @@ INSERT INTO FKTABLE VALUES (NULL, NULL, 0);
-- Insert failed rows into FK TABLE
INSERT INTO FKTABLE VALUES (100, 2, 4);
ERROR: insert or update on table "fktable" violates foreign key constraint "constrname2"
DETAIL: Key (ftest1,ftest2)=(100,2) is not present in table "pktable".
DETAIL: Key (ftest1, ftest2)=(100, 2) is not present in table "pktable".
INSERT INTO FKTABLE VALUES (2, 2, 4);
ERROR: insert or update on table "fktable" violates foreign key constraint "constrname2"
DETAIL: Key (ftest1,ftest2)=(2,2) is not present in table "pktable".
DETAIL: Key (ftest1, ftest2)=(2, 2) is not present in table "pktable".
INSERT INTO FKTABLE VALUES (NULL, 2, 4);
ERROR: insert or update on table "fktable" violates foreign key constraint "constrname2"
DETAIL: MATCH FULL does not allow mixing of null and nonnull key values.
@ -359,7 +359,7 @@ INSERT INTO FKTABLE VALUES (NULL, 3, 4, 5);
-- Insert a failed values
INSERT INTO FKTABLE VALUES (1, 2, 7, 6);
ERROR: insert or update on table "fktable" violates foreign key constraint "constrname3"
DETAIL: Key (ftest1,ftest2,ftest3)=(1,2,7) is not present in table "pktable".
DETAIL: Key (ftest1, ftest2, ftest3)=(1, 2, 7) is not present in table "pktable".
-- Show FKTABLE
SELECT * from FKTABLE;
ftest1 | ftest2 | ftest3 | ftest4
@ -374,13 +374,13 @@ SELECT * from FKTABLE;
-- Try to update something that should fail
UPDATE PKTABLE set ptest2=5 where ptest2=2;
ERROR: update or delete on table "pktable" violates foreign key constraint "constrname3" on table "fktable"
DETAIL: Key (ptest1,ptest2,ptest3)=(1,2,3) is still referenced from table "fktable".
DETAIL: Key (ptest1, ptest2, ptest3)=(1, 2, 3) is still referenced from table "fktable".
-- Try to update something that should succeed
UPDATE PKTABLE set ptest1=1 WHERE ptest2=3;
-- Try to delete something that should fail
DELETE FROM PKTABLE where ptest1=1 and ptest2=2 and ptest3=3;
ERROR: update or delete on table "pktable" violates foreign key constraint "constrname3" on table "fktable"
DETAIL: Key (ptest1,ptest2,ptest3)=(1,2,3) is still referenced from table "fktable".
DETAIL: Key (ptest1, ptest2, ptest3)=(1, 2, 3) is still referenced from table "fktable".
-- Try to delete something that should work
DELETE FROM PKTABLE where ptest1=2;
-- Show PKTABLE and FKTABLE
@ -424,7 +424,7 @@ INSERT INTO FKTABLE VALUES (NULL, 3, 4, 5);
-- Insert a failed values
INSERT INTO FKTABLE VALUES (1, 2, 7, 6);
ERROR: insert or update on table "fktable" violates foreign key constraint "constrname3"
DETAIL: Key (ftest1,ftest2,ftest3)=(1,2,7) is not present in table "pktable".
DETAIL: Key (ftest1, ftest2, ftest3)=(1, 2, 7) is not present in table "pktable".
-- Show FKTABLE
SELECT * from FKTABLE;
ftest1 | ftest2 | ftest3 | ftest4
@ -522,7 +522,7 @@ INSERT INTO FKTABLE VALUES (NULL, 3, 4, 5);
-- Insert a failed values
INSERT INTO FKTABLE VALUES (1, 2, 7, 6);
ERROR: insert or update on table "fktable" violates foreign key constraint "constrname3"
DETAIL: Key (ftest1,ftest2,ftest3)=(1,2,7) is not present in table "pktable".
DETAIL: Key (ftest1, ftest2, ftest3)=(1, 2, 7) is not present in table "pktable".
-- Show FKTABLE
SELECT * from FKTABLE;
ftest1 | ftest2 | ftest3 | ftest4
@ -628,7 +628,7 @@ INSERT INTO FKTABLE VALUES (NULL, 3, 4, 5);
-- Insert a failed values
INSERT INTO FKTABLE VALUES (1, 2, 7, 6);
ERROR: insert or update on table "fktable" violates foreign key constraint "constrname3"
DETAIL: Key (ftest1,ftest2,ftest3)=(1,2,7) is not present in table "pktable".
DETAIL: Key (ftest1, ftest2, ftest3)=(1, 2, 7) is not present in table "pktable".
-- Show FKTABLE
SELECT * from FKTABLE;
ftest1 | ftest2 | ftest3 | ftest4
@ -645,7 +645,7 @@ SELECT * from FKTABLE;
-- Try to update something that will fail
UPDATE PKTABLE set ptest2=5 where ptest2=2;
ERROR: insert or update on table "fktable" violates foreign key constraint "constrname3"
DETAIL: Key (ftest1,ftest2,ftest3)=(1,-1,3) is not present in table "pktable".
DETAIL: Key (ftest1, ftest2, ftest3)=(1, -1, 3) is not present in table "pktable".
-- Try to update something that will set default
UPDATE PKTABLE set ptest1=0, ptest2=5, ptest3=10 where ptest2=2;
UPDATE PKTABLE set ptest2=10 where ptest2=4;
@ -896,19 +896,19 @@ insert into pktable(base1, ptest1) values (2, 2);
-- let's insert a non-existant fktable value
insert into fktable(ftest1, ftest2) values (3, 1);
ERROR: insert or update on table "fktable" violates foreign key constraint "fktable_ftest1_fkey"
DETAIL: Key (ftest1,ftest2)=(3,1) is not present in table "pktable".
DETAIL: Key (ftest1, ftest2)=(3, 1) is not present in table "pktable".
-- let's make a valid row for that
insert into pktable(base1,ptest1) values (3, 1);
insert into fktable(ftest1, ftest2) values (3, 1);
-- let's try removing a row that should fail from pktable
delete from pktable where base1>2;
ERROR: update or delete on table "pktable" violates foreign key constraint "fktable_ftest1_fkey" on table "fktable"
DETAIL: Key (base1,ptest1)=(3,1) is still referenced from table "fktable".
DETAIL: Key (base1, ptest1)=(3, 1) is still referenced from table "fktable".
-- okay, let's try updating all of the base1 values to *4
-- which should fail.
update pktable set base1=base1*4;
ERROR: update or delete on table "pktable" violates foreign key constraint "fktable_ftest1_fkey" on table "fktable"
DETAIL: Key (base1,ptest1)=(3,1) is still referenced from table "fktable".
DETAIL: Key (base1, ptest1)=(3, 1) is still referenced from table "fktable".
-- okay, let's try an update that should work.
update pktable set base1=base1*4 where base1<3;
-- and a delete that should work
@ -929,15 +929,15 @@ insert into pktable (base1, ptest1, base2, ptest2) values (1, 3, 2, 2);
-- fails (3,2) isn't in base1, ptest1
insert into pktable (base1, ptest1, base2, ptest2) values (2, 3, 3, 2);
ERROR: insert or update on table "pktable" violates foreign key constraint "pktable_base2_fkey"
DETAIL: Key (base2,ptest2)=(3,2) is not present in table "pktable".
DETAIL: Key (base2, ptest2)=(3, 2) is not present in table "pktable".
-- fails (2,2) is being referenced
delete from pktable where base1=2;
ERROR: update or delete on table "pktable" violates foreign key constraint "pktable_base2_fkey" on table "pktable"
DETAIL: Key (base1,ptest1)=(2,2) is still referenced from table "pktable".
DETAIL: Key (base1, ptest1)=(2, 2) is still referenced from table "pktable".
-- fails (1,1) is being referenced (twice)
update pktable set base1=3 where base1=1;
ERROR: update or delete on table "pktable" violates foreign key constraint "pktable_base2_fkey" on table "pktable"
DETAIL: Key (base1,ptest1)=(1,1) is still referenced from table "pktable".
DETAIL: Key (base1, ptest1)=(1, 1) is still referenced from table "pktable".
-- this sequence of two deletes will work, since after the first there will be no (2,*) references
delete from pktable where base2=2;
delete from pktable where base1=2;

View File

@ -685,7 +685,7 @@ language plpgsql
set work_mem = '1MB';
select myfunc(0);
ERROR: division by zero
CONTEXT: SQL statement "SELECT 1/ $1 "
CONTEXT: SQL statement "SELECT 1/$1"
PL/pgSQL function "myfunc" line 3 at PERFORM
select current_setting('work_mem');
current_setting

View File

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

View File

@ -377,10 +377,10 @@ SELECT * FROM main_table ORDER BY a, b;
SELECT pg_get_triggerdef(oid, true) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'modified_a';
pg_get_triggerdef
--------------------------------------------------
CREATE TRIGGER modified_a
BEFORE UPDATE OF a ON main_table
FOR EACH ROW
WHEN (old.a <> new.a)
CREATE TRIGGER modified_a +
BEFORE UPDATE OF a ON main_table +
FOR EACH ROW +
WHEN (old.a <> new.a) +
EXECUTE PROCEDURE trigger_func('modified_a')
(1 row)
@ -393,10 +393,10 @@ SELECT pg_get_triggerdef(oid, false) FROM pg_trigger WHERE tgrelid = 'main_table
SELECT pg_get_triggerdef(oid, true) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'modified_any';
pg_get_triggerdef
----------------------------------------------------
CREATE TRIGGER modified_any
BEFORE UPDATE OF a ON main_table
FOR EACH ROW
WHEN (old.* IS DISTINCT FROM new.*)
CREATE TRIGGER modified_any +
BEFORE UPDATE OF a ON main_table +
FOR EACH ROW +
WHEN (old.* IS DISTINCT FROM new.*) +
EXECUTE PROCEDURE trigger_func('modified_any')
(1 row)
@ -427,9 +427,9 @@ SELECT pg_get_triggerdef(oid) FROM pg_trigger WHERE tgrelid = 'main_table'::regc
SELECT pg_get_triggerdef(oid, true) FROM pg_trigger WHERE tgrelid = 'main_table'::regclass AND tgname = 'after_upd_a_b_row_trig';
pg_get_triggerdef
---------------------------------------------------------
CREATE TRIGGER after_upd_a_b_row_trig
AFTER UPDATE OF a, b ON main_table
FOR EACH ROW
CREATE TRIGGER after_upd_a_b_row_trig +
AFTER UPDATE OF a, b ON main_table +
FOR EACH ROW +
EXECUTE PROCEDURE trigger_func('after_upd_a_b_row')
(1 row)

View File

@ -344,8 +344,8 @@ SELECT * FROM ts_parse('default', '345 qwe@efd.r '' http://www.com/ http://aew.w
3 | ewri2
12 |
13 | <a href="qwe<qwe>">
12 |
:
12 | +
|
19 | /usr/local/fff
12 |
19 | /awdf/dwqe/4325
@ -377,8 +377,8 @@ SELECT * FROM ts_parse('default', '345 qwe@efd.r '' http://www.com/ http://aew.w
20 | -4.2
12 | .
22 | 234
12 |
:
12 | +
|
12 | <
1 | i
12 |
@ -559,9 +559,9 @@ S. T. Coleridge (1772-1834)
', to_tsquery('english', 'paint&water'));
ts_headline
-----------------------------------------
<b>painted</b> Ocean.
<b>Water</b>, <b>water</b>, every where
And all the boards did shrink;
<b>painted</b> Ocean. +
<b>Water</b>, <b>water</b>, every where+
And all the boards did shrink; +
<b>Water</b>, <b>water</b>, every
(1 row)
@ -578,9 +578,9 @@ S. T. Coleridge (1772-1834)
', to_tsquery('english', 'breath&motion&water'));
ts_headline
----------------------------------
<b>breath</b> nor <b>motion</b>,
As idle as a painted Ship
Upon a painted Ocean.
<b>breath</b> nor <b>motion</b>,+
As idle as a painted Ship +
Upon a painted Ocean. +
<b>Water</b>, <b>water</b>
(1 row)
@ -597,9 +597,9 @@ S. T. Coleridge (1772-1834)
', to_tsquery('english', 'ocean'));
ts_headline
----------------------------------
<b>Ocean</b>.
Water, water, every where
And all the boards did shrink;
<b>Ocean</b>. +
Water, water, every where +
And all the boards did shrink;+
Water, water, every where
(1 row)
@ -618,17 +618,17 @@ ff-bg
to_tsquery('english', 'sea&foo'), 'HighlightAll=true');
ts_headline
-----------------------------------------------------------------------------
<html>
<!-- some comment -->
<body>
<b>Sea</b> view wow <u><b>foo</b> bar</u> <i>qq</i>
<a href="http://www.google.com/foo.bar.html" target="_blank">YES &nbsp;</a>
ff-bg
<script>
document.write(15);
</script>
</body>
+
<html> +
<!-- some comment --> +
<body> +
<b>Sea</b> view wow <u><b>foo</b> bar</u> <i>qq</i> +
<a href="http://www.google.com/foo.bar.html" target="_blank">YES &nbsp;</a>+
ff-bg +
<script> +
document.write(15); +
</script> +
</body> +
</html>
(1 row)
@ -646,13 +646,13 @@ S. T. Coleridge (1772-1834)
', to_tsquery('english', 'ocean'), 'MaxFragments=1');
ts_headline
------------------------------------
after day,
We stuck, nor breath nor motion,
As idle as a painted Ship
Upon a painted <b>Ocean</b>.
Water, water, every where
And all the boards did shrink;
Water, water, every where,
after day, +
We stuck, nor breath nor motion,+
As idle as a painted Ship +
Upon a painted <b>Ocean</b>. +
Water, water, every where +
And all the boards did shrink; +
Water, water, every where, +
Nor any drop
(1 row)
@ -670,13 +670,13 @@ S. T. Coleridge (1772-1834)
', to_tsquery('english', 'Coleridge & stuck'), 'MaxFragments=2');
ts_headline
----------------------------------------------
after day, day after day,
We <b>stuck</b>, nor breath nor motion,
As idle as a painted Ship
Upon a painted Ocean.
Water, water, every where
And all the boards did shrink;
Water, water, every where ... drop to drink.
after day, day after day, +
We <b>stuck</b>, nor breath nor motion, +
As idle as a painted Ship +
Upon a painted Ocean. +
Water, water, every where +
And all the boards did shrink; +
Water, water, every where ... drop to drink.+
S. T. <b>Coleridge</b>
(1 row)
@ -694,9 +694,9 @@ S. T. Coleridge (1772-1834)
', to_tsquery('english', 'ocean & seahorse'), 'MaxFragments=1');
ts_headline
------------------------------------
Day after day, day after day,
We stuck, nor breath nor motion,
+
Day after day, day after day, +
We stuck, nor breath nor motion,+
As idle as
(1 row)
@ -714,13 +714,13 @@ S. T. Coleridge (1772-1834)
', to_tsquery('english', 'Coleridge & stuck'), 'MaxFragments=2,FragmentDelimiter=***');
ts_headline
--------------------------------------------
after day, day after day,
We <b>stuck</b>, nor breath nor motion,
As idle as a painted Ship
Upon a painted Ocean.
Water, water, every where
And all the boards did shrink;
Water, water, every where***drop to drink.
after day, day after day, +
We <b>stuck</b>, nor breath nor motion, +
As idle as a painted Ship +
Upon a painted Ocean. +
Water, water, every where +
And all the boards did shrink; +
Water, water, every where***drop to drink.+
S. T. <b>Coleridge</b>
(1 row)

View File

@ -279,16 +279,16 @@ SELECT pg_get_viewdef('vsubdepartment'::regclass);
SELECT pg_get_viewdef('vsubdepartment'::regclass, true);
pg_get_viewdef
--------------------------------------------------------------------------------------
WITH RECURSIVE subdepartment AS (
SELECT department.id, department.parent_department, department.name
FROM department
WHERE department.name = 'A'::text
UNION ALL
SELECT d.id, d.parent_department, d.name
FROM department d, subdepartment sd
WHERE d.parent_department = sd.id
)
SELECT subdepartment.id, subdepartment.parent_department, subdepartment.name
WITH RECURSIVE subdepartment AS ( +
SELECT department.id, department.parent_department, department.name+
FROM department +
WHERE department.name = 'A'::text +
UNION ALL +
SELECT d.id, d.parent_department, d.name +
FROM department d, subdepartment sd +
WHERE d.parent_department = sd.id +
) +
SELECT subdepartment.id, subdepartment.parent_department, subdepartment.name +
FROM subdepartment;
(1 row)