2017-03-27 19:41 GMT+02:00 Jan Michálek <[email protected]>:
>
>
> 2017-03-23 17:26 GMT+01:00 Pierre Ducroquet <[email protected]>:
>
>> The following review has been posted through the commitfest application:
>> make installcheck-world: tested, passed
>> Implements feature: tested, passed
>> Spec compliant: tested, passed
>> Documentation: tested, passed
>>
>> Hi
>>
>> This is my first review (Magnus said in his presentation in PGDay Paris
>> that volunteers should just come and help, so here I am), so please notify
>> me for any mistake I do when using the review tools...
>>
>> The feature seems to work as expected, but I don't claim to be a markdown
>> and rst expert.
>> Some minor issues with the code itself :
>> - some indentation issues (documentation and code itself with mix between
>> space based and tab based indentation) and a few trailing spaces in code
>>
>
> corrected
>
>
>> - typographic issues in the documentation :
>> - "The html, asciidoc, latex, latex-longtable, troff-ms, and markdown
>> and rst formats" ==> duplicated and
>>
>
> corrected
>
>> - "Sets the output format to one of unaligned, aligned, wrapped, html,
>> asciidoc, latex (uses tabular), latex-longtable, rst, markdown, or
>> troff-ms." ==> extra comma at the end of the list
>> - the comment " dont add line after last row, because line is added after
>> every row" is misleading, it should warn that it's only for rst
>> - there is a block of commented out code left
>> - in the print_aligned_vertical function, there is a mix between
>> "cont->opt->format == PRINT_RST" and "format == &pg_rst" and I don't see
>> any obvious reason for that
>>
> corrected
>
>> - the documentation doesn't mention (but ok, it's kind of obvious) that
>> the linestyle option will not work with rst and markdown
>>
>>
> In this patch are corrected (i hope, i had correct changes in vimrc)
> indentation issues. Plese, look at this if it is OK (i men indentats) and
> some minor errors. And it should work on current master (probably).
>
Added \x option form markdown
In markdown works multiline cels (newline replaced by </br>)
regre tests passed
Jan
>
> Have nice day
>
> Jan
>
>
>> Thanks !
>>
>> The new status of this patch is: Waiting on Author
>>
>> --
>> Sent via pgsql-hackers mailing list ([email protected])
>> To make changes to your subscription:
>> http://www.postgresql.org/mailpref/pgsql-hackers
>>
>
>
>
> --
> Jelen
> Starší čeledín datovýho chlíva
>
--
Jelen
Starší čeledín datovýho chlíva
diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml
index 2a9c412020..ee0c8fbea6 100644
*** a/doc/src/sgml/ref/psql-ref.sgml
--- b/doc/src/sgml/ref/psql-ref.sgml
***************
*** 2366,2372 **** lo_import 152801
<literal>aligned</literal>, <literal>wrapped</literal>,
<literal>html</literal>, <literal>asciidoc</literal>,
<literal>latex</literal> (uses <literal>tabular</literal>),
! <literal>latex-longtable</literal>, or
<literal>troff-ms</literal>.
Unique abbreviations are allowed. (That would mean one letter
is enough.)
--- 2366,2373 ----
<literal>aligned</literal>, <literal>wrapped</literal>,
<literal>html</literal>, <literal>asciidoc</literal>,
<literal>latex</literal> (uses <literal>tabular</literal>),
! <literal>latex-longtable</literal>,
! <literal>rst</literal>, <literal>markdown</literal>, or
<literal>troff-ms</literal>.
Unique abbreviations are allowed. (That would mean one letter
is enough.)
***************
*** 2394,2400 **** lo_import 152801
<para>
The <literal>html</>, <literal>asciidoc</>, <literal>latex</>,
! <literal>latex-longtable</literal>, and <literal>troff-ms</>
formats put out tables that are intended to
be included in documents using the respective mark-up
language. They are not complete documents! This might not be
--- 2395,2402 ----
<para>
The <literal>html</>, <literal>asciidoc</>, <literal>latex</>,
! <literal>latex-longtable</literal>, <literal>troff-ms</>,
! <literal>markdown</> and <literal>rst</>
formats put out tables that are intended to
be included in documents using the respective mark-up
language. They are not complete documents! This might not be
diff --git a/src/bin/psql/command.c bindex 4f4a0aa9bd..97f4f37923 100644
*** a/src/bin/psql/command.c
--- b/src/bin/psql/command.c
***************
*** 2518,2523 **** _align2string(enum printFormat in)
--- 2518,2529 ----
case PRINT_TROFF_MS:
return "troff-ms";
break;
+ case PRINT_MARKDOWN:
+ return "markdown";
+ break;
+ case PRINT_RST:
+ return "rst";
+ break;
}
return "unknown";
}
***************
*** 2589,2597 **** do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
popt->topt.format = PRINT_LATEX_LONGTABLE;
else if (pg_strncasecmp("troff-ms", value, vallen) == 0)
popt->topt.format = PRINT_TROFF_MS;
else
{
! psql_error("\\pset: allowed formats are unaligned, aligned, wrapped, html, asciidoc, latex, latex-longtable, troff-ms\n");
return false;
}
}
--- 2595,2607 ----
popt->topt.format = PRINT_LATEX_LONGTABLE;
else if (pg_strncasecmp("troff-ms", value, vallen) == 0)
popt->topt.format = PRINT_TROFF_MS;
+ else if (pg_strncasecmp("markdown", value, vallen) == 0)
+ popt->topt.format = PRINT_MARKDOWN;
+ else if (pg_strncasecmp("rst", value, vallen) == 0)
+ popt->topt.format = PRINT_RST;
else
{
! psql_error("\\pset: allowed formats are unaligned, aligned, wrapped, html, asciidoc, latex, latex-longtable, troff-ms, markdown, rst\n");
return false;
}
}
diff --git a/src/bin/psql/helindex ba14df0344..d9dc5e10d9 100644
*** a/src/bin/psql/help.c
--- b/src/bin/psql/help.c
***************
*** 375,381 **** helpVariables(unsigned short int pager)
fprintf(output, _(" fieldsep field separator for unaligned output (default \"%s\")\n"), DEFAULT_FIELD_SEP);
fprintf(output, _(" fieldsep_zero set field separator for unaligned output to zero byte\n"));
fprintf(output, _(" footer enable or disable display of the table footer [on, off]\n"));
! fprintf(output, _(" format set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"));
fprintf(output, _(" linestyle set the border line drawing style [ascii, old-ascii, unicode]\n"));
fprintf(output, _(" null set the string to be printed in place of a null value\n"));
fprintf(output, _(" numericlocale enable or disable display of a locale-specific character to separate\n"
--- 375,381 ----
fprintf(output, _(" fieldsep field separator for unaligned output (default \"%s\")\n"), DEFAULT_FIELD_SEP);
fprintf(output, _(" fieldsep_zero set field separator for unaligned output to zero byte\n"));
fprintf(output, _(" footer enable or disable display of the table footer [on, off]\n"));
! fprintf(output, _(" format set output format [unaligned, aligned, wrapped, html, asciidoc, rst, markdown ...]\n"));
fprintf(output, _(" linestyle set the border line drawing style [ascii, old-ascii, unicode]\n"));
fprintf(output, _(" null set the string to be printed in place of a null value\n"));
fprintf(output, _(" numericlocale enable or disable display of a locale-specific character to separate\n"
diff --git a/src/bin/psql/index f7494065de..ea14ec3d28 100644
*** a/src/bin/psql/tab-complete.c
--- b/src/bin/psql/tab-complete.c
***************
*** 3422,3428 **** psql_completion(const char *text, int start, int end)
{
static const char *const my_list[] =
{"unaligned", "aligned", "wrapped", "html", "asciidoc",
! "latex", "latex-longtable", "troff-ms", NULL};
COMPLETE_WITH_LIST_CS(my_list);
}
--- 3422,3428 ----
{
static const char *const my_list[] =
{"unaligned", "aligned", "wrapped", "html", "asciidoc",
! "latex", "latex-longtable", "troff-ms", "markdown", "rst", NULL};
COMPLETE_WITH_LIST_CS(my_list);
}
diff --git a/src/fe_utils/mbprint.index d186fc4c91..a2b030e2f7 100644
*** a/src/fe_utils/mbprint.c
--- b/src/fe_utils/mbprint.c
***************
*** 285,290 **** pg_wcssize(const unsigned char *pwcs, size_t len, int encoding,
--- 285,368 ----
}
/*
+ * version of pg_wcssize for markdown
+ * replace newline with </br>
+ */
+ void
+ pg_wcssize_newline(const unsigned char *pwcs, size_t len, int encoding,
+ int *result_width, int *result_height, int *result_format_size)
+ {
+ int w,
+ chlen = 0,
+ linewidth = 0;
+ int width = 0;
+ int height = 1;
+ int format_size = 0;
+
+ for (; *pwcs && len > 0; pwcs += chlen)
+ {
+ chlen = PQmblen((const char *) pwcs, encoding);
+ if (len < (size_t) chlen)
+ break;
+ w = PQdsplen((const char *) pwcs, encoding);
+
+ if (chlen == 1) /* single-byte char */
+ {
+ if (*pwcs == '\n') /* Newline */
+ {
+ linewidth += 5;
+ format_size += 5;
+ }
+ else if (*pwcs == '\r') /* Linefeed */
+ {
+ linewidth += 2;
+ format_size += 2;
+ }
+ else if (*pwcs == '\t') /* Tab */
+ {
+ do
+ {
+ linewidth++;
+ format_size++;
+ } while (linewidth % 8 != 0);
+ }
+ else if (w < 0) /* Other control char */
+ {
+ linewidth += 4;
+ format_size += 4;
+ }
+ else /* Output it as-is */
+ {
+ linewidth += w;
+ format_size += 1;
+ }
+ }
+ else if (w < 0) /* Non-ascii control char */
+ {
+ linewidth += 6; /* \u0000 */
+ format_size += 6;
+ }
+ else /* All other chars */
+ {
+ linewidth += w;
+ format_size += chlen;
+ }
+ len -= chlen;
+ }
+ if (linewidth > width)
+ width = linewidth;
+ format_size += 1; /* For NUL char */
+
+ /* Set results */
+ if (result_width)
+ *result_width = width;
+ if (result_height)
+ *result_height = height;
+ if (result_format_size)
+ *result_format_size = format_size;
+ }
+
+ /*
* Format a string into one or more "struct lineptr" lines.
* lines[i].ptr == NULL indicates the end of the array.
*
***************
*** 382,387 **** pg_wcsformat(const unsigned char *pwcs, size_t len, int encoding,
--- 460,555 ----
(lines + 1)->ptr = NULL; /* terminate line array */
}
+ /*
+ * version of pg_wcsformat for markdown
+ * replace newline with </br>
+ */
+
+ void
+ pg_wcsformat_newline(const unsigned char *pwcs, size_t len, int encoding,
+ struct lineptr * lines, int count)
+ {
+ int w,
+ chlen = 0;
+ int linewidth = 0;
+ unsigned char *ptr = lines->ptr; /* Pointer to data area */
+
+ for (; *pwcs && len > 0; pwcs += chlen)
+ {
+ chlen = PQmblen((const char *) pwcs, encoding);
+ if (len < (size_t) chlen)
+ break;
+ w = PQdsplen((const char *) pwcs, encoding);
+
+ if (chlen == 1) /* single-byte char */
+ {
+ if (*pwcs == '\n') /* Newline */
+ {
+ strcpy((char *) ptr, "</br>");
+ linewidth += 5;
+ ptr += 5;
+ }
+ else if (*pwcs == '\r') /* Linefeed */
+ {
+ strcpy((char *) ptr, "\\r");
+ linewidth += 2;
+ ptr += 2;
+ }
+ else if (*pwcs == '\t') /* Tab */
+ {
+ do
+ {
+ *ptr++ = ' ';
+ linewidth++;
+ } while (linewidth % 8 != 0);
+ }
+ else if (w < 0) /* Other control char */
+ {
+ sprintf((char *) ptr, "\\x%02X", *pwcs);
+ linewidth += 4;
+ ptr += 4;
+ }
+ else /* Output it as-is */
+ {
+ linewidth += w;
+ *ptr++ = *pwcs;
+ }
+ }
+ else if (w < 0) /* Non-ascii control char */
+ {
+ if (encoding == PG_UTF8)
+ sprintf((char *) ptr, "\\u%04X", utf8_to_unicode(pwcs));
+ else
+ {
+ /*
+ * This case cannot happen in the current code because only
+ * UTF-8 signals multibyte control characters. But we may need
+ * to support it at some stage
+ */
+ sprintf((char *) ptr, "\\u????");
+ }
+ ptr += 6;
+ linewidth += 6;
+ }
+ else /* All other chars */
+ {
+ int i;
+
+ for (i = 0; i < chlen; i++)
+ *ptr++ = pwcs[i];
+ linewidth += w;
+ }
+ len -= chlen;
+ }
+ lines->width = linewidth;
+ *ptr++ = '\0'; /* Terminate formatted string */
+
+ if (count <= 0)
+ exit(1); /* Screwup */
+
+ (lines + 1)->ptr = NULL; /* terminate line array */
+ }
+
/*
* Encoding validation: delete any unvalidatable characters from the string
diff --git a/src/fe_utils/priindex 9180b90004..735d3973ce 100644
*** a/src/fe_utils/print.c
--- b/src/fe_utils/print.c
***************
*** 56,61 **** static char default_footer[100];
--- 56,104 ----
static printTableFooter default_footer_cell = {default_footer, NULL};
/* Line style control structures */
+
+ const printTextFormat pg_markdown =
+ {
+ "markdown",
+ {
+ {"", "", "", ""},
+ {"-", "|", "|", "|"},
+ {"", "", "", ""},
+ {" ", "|", "|", "|"}
+ },
+ "|",
+ "|",
+ "|",
+ " ",
+ "+",
+ " ",
+ " ",
+ ".",
+ ".",
+ true
+ };
+
+ const printTextFormat pg_rst =
+ {
+ "rst",
+ {
+ {"-", "+", "+", "+"},
+ {"=", "+", "+", "+"},
+ {"-", "+", "+", "+"},
+ {" ", "|", "|", "|"}
+ },
+ "|",
+ "|",
+ "|",
+ " ",
+ "+",
+ " ",
+ " ",
+ ".",
+ ".",
+ true
+ };
+
const printTextFormat pg_asciiformat =
{
"ascii",
***************
*** 205,210 **** static void IsPagerNeeded(const printTableContent *cont, int extra_lines, bool e
--- 248,255 ----
static void print_aligned_vertical(const printTableContent *cont,
FILE *fout, bool is_pager);
+ static void skip_leading_spaces_print(const char *in, FILE *fout);
+
/* Count number of digits in integral part of number */
static int
***************
*** 574,579 **** _print_horizontal_line(const unsigned int ncolumns, const unsigned int *widths,
--- 619,655 ----
fputc('\n', fout);
}
+ /*
+ * skip leading spaces
+ */
+ static void
+ skip_leading_spaces_print(const char *in, FILE *fout)
+ {
+ const char *p;
+ bool leading_space = true;
+ unsigned int spac; /**leading spaces*/
+ spac = 0;
+
+ for (p = in; *p; p++)
+ {
+ if (*p != ' ' && *p != '\n')
+ {
+ leading_space = false;
+ fputc(*p, fout);
+ }
+ else if (*p == '\n')
+ {
+ fputc(*p, fout);
+ leading_space = true;
+ }
+ else if (leading_space)
+ spac++;
+ else
+ fputc(*p, fout);
+ }
+ if (spac != 0)
+ fprintf(fout, "%*s", spac, " ");
+ }
/*
* Print pretty boxes around cells.
***************
*** 622,627 **** print_aligned_text(const printTableContent *cont, FILE *fout, bool is_pager)
--- 698,709 ----
if (opt_border > 2)
opt_border = 2;
+ if (format == &pg_markdown)
+ opt_border = 2;
+
+ if (format == &pg_rst)
+ opt_border = 2;
+
if (cont->ncolumns > 0)
{
col_count = cont->ncolumns;
***************
*** 661,668 **** print_aligned_text(const printTableContent *cont, FILE *fout, bool is_pager)
nl_lines,
bytes_required;
! pg_wcssize((const unsigned char *) cont->headers[i], strlen(cont->headers[i]),
! encoding, &width, &nl_lines, &bytes_required);
if (width > max_width[i])
max_width[i] = width;
if (nl_lines > max_nl_lines[i])
--- 743,754 ----
nl_lines,
bytes_required;
! if (format != &pg_markdown)
! pg_wcssize((const unsigned char *) cont->headers[i], strlen(cont->headers[i]),
! encoding, &width, &nl_lines, &bytes_required);
! else
! pg_wcssize_newline((const unsigned char *) cont->headers[i], strlen(cont->headers[i]),
! encoding, &width, &nl_lines, &bytes_required);
if (width > max_width[i])
max_width[i] = width;
if (nl_lines > max_nl_lines[i])
***************
*** 685,692 **** print_aligned_text(const printTableContent *cont, FILE *fout, bool is_pager)
nl_lines,
bytes_required;
! pg_wcssize((const unsigned char *) *ptr, strlen(*ptr), encoding,
! &width, &nl_lines, &bytes_required);
if (width > max_width[i % col_count])
max_width[i % col_count] = width;
--- 771,782 ----
nl_lines,
bytes_required;
! if (format != &pg_markdown)
! pg_wcssize((const unsigned char *) *ptr, strlen(*ptr), encoding,
! &width, &nl_lines, &bytes_required);
! else
! pg_wcssize_newline((const unsigned char *) *ptr, strlen(*ptr), encoding,
! &width, &nl_lines, &bytes_required);
if (width > max_width[i % col_count])
max_width[i % col_count] = width;
***************
*** 846,853 **** print_aligned_text(const printTableContent *cont, FILE *fout, bool is_pager)
nl_lines,
bytes_required;
! pg_wcssize((const unsigned char *) *ptr, strlen(*ptr), encoding,
! &width, &nl_lines, &bytes_required);
/*
* A row can have both wrapping and newlines that cause it to
--- 936,947 ----
nl_lines,
bytes_required;
! if (format != &pg_markdown)
! pg_wcssize((const unsigned char *) *ptr, strlen(*ptr), encoding,
! &width, &nl_lines, &bytes_required);
! else
! pg_wcssize_newline((const unsigned char *) *ptr, strlen(*ptr), encoding,
! &width, &nl_lines, &bytes_required);
/*
* A row can have both wrapping and newlines that cause it to
***************
*** 885,892 **** print_aligned_text(const printTableContent *cont, FILE *fout, bool is_pager)
int width,
height;
! pg_wcssize((const unsigned char *) cont->title, strlen(cont->title),
! encoding, &width, &height, NULL);
if (width >= width_total)
/* Aligned */
fprintf(fout, "%s\n", cont->title);
--- 979,990 ----
int width,
height;
! if (format != &pg_markdown)
! pg_wcssize((const unsigned char *) cont->title, strlen(cont->title),
! encoding, &width, &height, NULL);
! else
! pg_wcssize_newline((const unsigned char *) cont->title, strlen(cont->title),
! encoding, &width, &height, NULL);
if (width >= width_total)
/* Aligned */
fprintf(fout, "%s\n", cont->title);
***************
*** 907,915 **** print_aligned_text(const printTableContent *cont, FILE *fout, bool is_pager)
PRINT_RULE_TOP, format, fout);
for (i = 0; i < col_count; i++)
! pg_wcsformat((const unsigned char *) cont->headers[i],
! strlen(cont->headers[i]), encoding,
! col_lineptrs[i], max_nl_lines[i]);
more_col_wrapping = col_count;
curr_nl_line = 0;
--- 1005,1018 ----
PRINT_RULE_TOP, format, fout);
for (i = 0; i < col_count; i++)
! if (format != &pg_markdown)
! pg_wcsformat((const unsigned char *) cont->headers[i],
! strlen(cont->headers[i]), encoding,
! col_lineptrs[i], max_nl_lines[i]);
! else
! pg_wcsformat_newline((const unsigned char *) cont->headers[i],
! strlen(cont->headers[i]), encoding,
! col_lineptrs[i], max_nl_lines[i]);
more_col_wrapping = col_count;
curr_nl_line = 0;
***************
*** 978,985 **** print_aligned_text(const printTableContent *cont, FILE *fout, bool is_pager)
*/
for (j = 0; j < col_count; j++)
{
! pg_wcsformat((const unsigned char *) ptr[j], strlen(ptr[j]), encoding,
! col_lineptrs[j], max_nl_lines[j]);
curr_nl_line[j] = 0;
}
--- 1081,1092 ----
*/
for (j = 0; j < col_count; j++)
{
! if (format != &pg_markdown)
! pg_wcsformat((const unsigned char *) ptr[j], strlen(ptr[j]), encoding,
! col_lineptrs[j], max_nl_lines[j]);
! else
! pg_wcsformat_newline((const unsigned char *) ptr[j], strlen(ptr[j]), encoding,
! col_lineptrs[j], max_nl_lines[j]);
curr_nl_line[j] = 0;
}
***************
*** 1052,1060 **** print_aligned_text(const printTableContent *cont, FILE *fout, bool is_pager)
else /* Left aligned cell */
{
/* spaces second */
! fputnbytes(fout,
! (char *) (this_line->ptr + bytes_output[j]),
! bytes_to_output);
}
bytes_output[j] += bytes_to_output;
--- 1159,1170 ----
else /* Left aligned cell */
{
/* spaces second */
! if (format != &pg_rst)
! fputnbytes(fout,
! (char *) (this_line->ptr + bytes_output[j]),
! bytes_to_output);
! else
! skip_leading_spaces_print((char *) (this_line->ptr + bytes_output[j]), fout);
}
bytes_output[j] += bytes_to_output;
***************
*** 1123,1142 **** print_aligned_text(const printTableContent *cont, FILE *fout, bool is_pager)
fputc('\n', fout);
} while (more_lines);
}
if (cont->opt->stop_table)
{
printTableFooter *footers = footers_with_default(cont);
! if (opt_border == 2 && !cancel_pressed)
_print_horizontal_line(col_count, width_wrap, opt_border,
! PRINT_RULE_BOTTOM, format, fout);
/* print footers */
if (footers && !opt_tuples_only && !cancel_pressed)
{
printTableFooter *f;
for (f = footers; f; f = f->next)
fprintf(fout, "%s\n", f->data);
--- 1233,1266 ----
fputc('\n', fout);
} while (more_lines);
+
+ if (format == &pg_rst)
+ _print_horizontal_line(col_count, width_wrap, opt_border,
+ PRINT_RULE_BOTTOM, format, fout);
}
if (cont->opt->stop_table)
{
printTableFooter *footers = footers_with_default(cont);
! if ((opt_border == 2 && format != &pg_rst) && !cancel_pressed)
! /*
! * dont add line after last row, because line is added after every row
! */
_print_horizontal_line(col_count, width_wrap, opt_border,
! PRINT_RULE_BOTTOM, format, fout);
/* print footers */
if (footers && !opt_tuples_only && !cancel_pressed)
{
printTableFooter *f;
+ /*
+ * add newline after table because rst needs empty line after table
+ */
+ if (format == &pg_rst || format == &pg_markdown)
+ {
+ fprintf(fout, "\n");
+ }
for (f = footers; f; f = f->next)
fprintf(fout, "%s\n", f->data);
***************
*** 1192,1197 **** print_aligned_vertical_line(const printTextFormat *format,
--- 1316,1325 ----
{
if (opt_border == 0)
reclen = fprintf(fout, "* Record %lu", record);
+ else if (format == &pg_rst)
+ reclen = fprintf(fout, "**RECORD %lu**", record);
+ else if (format == &pg_markdown)
+ reclen = fprintf(fout, "**RECORD %lu**", record);
else
reclen = fprintf(fout, "[ RECORD %lu ]", record);
}
***************
*** 1257,1262 **** print_aligned_vertical(const printTableContent *cont,
--- 1385,1393 ----
if (opt_border > 2)
opt_border = 2;
+ if (format == &pg_rst || format == &pg_markdown) /*rst works only with border 2*/
+ opt_border = 2;
+
if (cont->cells[0] == NULL && cont->opt->start_table &&
cont->opt->stop_table)
{
***************
*** 1293,1300 **** print_aligned_vertical(const printTableContent *cont,
height,
fs;
! pg_wcssize((const unsigned char *) cont->headers[i], strlen(cont->headers[i]),
! encoding, &width, &height, &fs);
if (width > hwidth)
hwidth = width;
if (height > hheight)
--- 1424,1436 ----
height,
fs;
! if (format != &pg_markdown)
! pg_wcssize((const unsigned char *) cont->headers[i], strlen(cont->headers[i]),
! encoding, &width, &height, &fs);
! else
! pg_wcssize_newline((const unsigned char *) cont->headers[i], strlen(cont->headers[i]),
! encoding, &width, &height, &fs);
!
if (width > hwidth)
hwidth = width;
if (height > hheight)
***************
*** 1305,1310 **** print_aligned_vertical(const printTableContent *cont,
--- 1441,1453 ----
if (fs > hformatsize)
hformatsize = fs;
}
+ if (format == &pg_rst)
+ hwidth = hwidth + 4;
+
+ /* if hwidth < reclen fromheader */
+ if (format == &pg_markdown)
+ if (hwidth < floor (log10 (abs (cont->nrows))) + 12)
+ hwidth = floor (log10 (abs (cont->nrows))) + 12;
/* find longest data cell */
for (i = 0, ptr = cont->cells; *ptr; ptr++, i++)
***************
*** 1313,1320 **** print_aligned_vertical(const printTableContent *cont,
height,
fs;
! pg_wcssize((const unsigned char *) *ptr, strlen(*ptr), encoding,
! &width, &height, &fs);
if (width > dwidth)
dwidth = width;
if (height > dheight)
--- 1456,1468 ----
height,
fs;
! if (format != &pg_markdown)
! pg_wcssize((const unsigned char *) *ptr, strlen(*ptr), encoding,
! &width, &height, &fs);
! else
! pg_wcssize_newline((const unsigned char *) *ptr, strlen(*ptr), encoding,
! &width, &height, &fs);
!
if (width > dwidth)
dwidth = width;
if (height > dheight)
***************
*** 1503,1509 **** print_aligned_vertical(const printTableContent *cont,
if (cancel_pressed)
break;
! if (i == 0)
pos = PRINT_RULE_TOP;
else
pos = PRINT_RULE_MIDDLE;
--- 1651,1657 ----
if (cancel_pressed)
break;
! if (i == 0 || format == &pg_rst)
pos = PRINT_RULE_TOP;
else
pos = PRINT_RULE_MIDDLE;
***************
*** 1518,1538 **** print_aligned_vertical(const printTableContent *cont,
(format == &pg_asciiformat_old))
lhwidth++; /* for newline indicators */
! if (!opt_tuples_only)
print_aligned_vertical_line(format, opt_border, record++,
lhwidth, dwidth, pos, fout);
else if (i != 0 || !cont->opt->start_table || opt_border == 2)
print_aligned_vertical_line(format, opt_border, 0, lhwidth,
dwidth, pos, fout);
}
! /* Format the header */
! pg_wcsformat((const unsigned char *) cont->headers[i % cont->ncolumns],
! strlen(cont->headers[i % cont->ncolumns]),
! encoding, hlineptr, hheight);
! /* Format the data */
! pg_wcsformat((const unsigned char *) *ptr, strlen(*ptr), encoding,
! dlineptr, dheight);
/*
* Loop through header and data in parallel dealing with newlines and
--- 1666,1717 ----
(format == &pg_asciiformat_old))
lhwidth++; /* for newline indicators */
! if (!opt_tuples_only && (format != &pg_rst && format != &pg_markdown))
print_aligned_vertical_line(format, opt_border, record++,
lhwidth, dwidth, pos, fout);
+ else if (!opt_tuples_only && format == &pg_rst)
+ {
+ if (i ==0)
+ print_aligned_vertical_line(format, opt_border, 0, lhwidth,
+ dwidth, pos, fout);
+ print_aligned_vertical_line(format, opt_border, record++,
+ 0, lhwidth + dwidth, PRINT_RULE_DATA, fout); /* because need of only one column*/
+ print_aligned_vertical_line(format, opt_border, 0, lhwidth,
+ dwidth, pos, fout);
+ }
+ else if (!opt_tuples_only && format == &pg_markdown)
+ {
+ print_aligned_vertical_line(format, opt_border, record++,
+ lhwidth, dwidth, PRINT_RULE_DATA, fout);
+ if (i == 0)
+ print_aligned_vertical_line(format, opt_border, 0, lhwidth,
+ dwidth, PRINT_RULE_MIDDLE, fout);
+ }
else if (i != 0 || !cont->opt->start_table || opt_border == 2)
print_aligned_vertical_line(format, opt_border, 0, lhwidth,
dwidth, pos, fout);
}
! if (format != &pg_markdown)
! {
! /* Format the header */
! pg_wcsformat((const unsigned char *) cont->headers[i % cont->ncolumns],
! strlen(cont->headers[i % cont->ncolumns]),
! encoding, hlineptr, hheight);
! /* Format the data */
! pg_wcsformat((const unsigned char *) *ptr, strlen(*ptr), encoding,
! dlineptr, dheight);
! }
! else
! {
! /* Format the header */
! pg_wcsformat_newline((const unsigned char *) cont->headers[i % cont->ncolumns],
! strlen(cont->headers[i % cont->ncolumns]),
! encoding, hlineptr, hheight);
! /* Format the data */
! pg_wcsformat_newline((const unsigned char *) *ptr, strlen(*ptr), encoding,
! dlineptr, dheight);
! }
/*
* Loop through header and data in parallel dealing with newlines and
***************
*** 1564,1572 **** print_aligned_vertical(const printTableContent *cont,
/*
* Header text
*/
! strlen_max_width(hlineptr[hline].ptr, &target_width,
! encoding);
! fprintf(fout, "%-s", hlineptr[hline].ptr);
/*
* Spacer
--- 1743,1758 ----
/*
* Header text
*/
! if (format != &pg_rst)
! strlen_max_width(hlineptr[hline].ptr, &target_width,
! encoding);
! else
! strlen_max_width(hlineptr[hline].ptr, &target_width - 4,
! encoding);
! if (format != &pg_rst)
! fprintf(fout, "%-s", hlineptr[hline].ptr);
! else
! fprintf(fout, "**%-s**", hlineptr[hline].ptr); /*header bold*/
/*
* Spacer
***************
*** 1640,1647 **** print_aligned_vertical(const printTableContent *cont,
*/
bytes_to_output = strlen_max_width(dlineptr[dline].ptr + offset,
&target_width, encoding);
! fputnbytes(fout, (char *) (dlineptr[dline].ptr + offset),
! bytes_to_output);
chars_to_output -= target_width;
offset += bytes_to_output;
--- 1826,1837 ----
*/
bytes_to_output = strlen_max_width(dlineptr[dline].ptr + offset,
&target_width, encoding);
!
! if (format != &pg_rst)
! fputnbytes(fout, (char *) (dlineptr[dline].ptr + offset),
! bytes_to_output);
! else
! skip_leading_spaces_print((char *) (dlineptr[dline].ptr + offset), fout);
chars_to_output -= target_width;
offset += bytes_to_output;
***************
*** 1704,1714 **** print_aligned_vertical(const printTableContent *cont,
fprintf(fout, "%*s %s\n", dwidth, "", dformat->rightvrule);
}
}
}
if (cont->opt->stop_table)
{
! if (opt_border == 2 && !cancel_pressed)
print_aligned_vertical_line(format, opt_border, 0, hwidth, dwidth,
PRINT_RULE_BOTTOM, fout);
--- 1894,1907 ----
fprintf(fout, "%*s %s\n", dwidth, "", dformat->rightvrule);
}
}
+ if (opt_border == 2 && format == &pg_rst)
+ print_aligned_vertical_line(format, opt_border, 0, hwidth, dwidth,
+ PRINT_RULE_BOTTOM, fout);
}
if (cont->opt->stop_table)
{
! if (opt_border == 2 && !cancel_pressed && format != &pg_rst)
print_aligned_vertical_line(format, opt_border, 0, hwidth, dwidth,
PRINT_RULE_BOTTOM, fout);
***************
*** 3262,3267 **** printTable(const printTableContent *cont,
--- 3455,3473 ----
else
print_troff_ms_text(cont, fout);
break;
+ case PRINT_RST:
+ if (cont->opt->expanded == 1)
+ print_aligned_vertical(cont, fout, false);
+ else
+ print_aligned_text(cont, fout, false);
+ break;
+ case PRINT_MARKDOWN:
+ if (cont->opt->expanded == 1)
+ print_aligned_vertical(cont, fout, false);
+ else
+ print_aligned_text(cont, fout, false);
+ break;
+
default:
fprintf(stderr, _("invalid output format (internal error): %d"),
cont->opt->format);
***************
*** 3416,3422 **** get_line_style(const printTableOpt *opt)
* printTableOpt struct can be initialized to zeroes to get default
* behavior.
*/
! if (opt->line_style != NULL)
return opt->line_style;
else
return &pg_asciiformat;
--- 3622,3632 ----
* printTableOpt struct can be initialized to zeroes to get default
* behavior.
*/
! if (opt->format == PRINT_RST)
! return &pg_rst;
! else if (opt->format == PRINT_MARKDOWN)
! return &pg_markdown;
! else if (opt->line_style != NULL)
return opt->line_style;
else
return &pg_asciiformat;
diff --git a/src/include/feindex 56626f631b..70684155b5 100644
*** a/src/include/fe_utils/mbprint.h
--- b/src/include/fe_utils/mbprint.h
***************
*** 25,29 **** extern void pg_wcsformat(const unsigned char *pwcs, size_t len, int encoding,
--- 25,33 ----
struct lineptr * lines, int count);
extern void pg_wcssize(const unsigned char *pwcs, size_t len, int encoding,
int *width, int *height, int *format_size);
+ extern void pg_wcsformat_newline(const unsigned char *pwcs, size_t len, int encoding,
+ struct lineptr * lines, int count);
+ extern void pg_wcssize_newline(const unsigned char *pwcs, size_t len, int encoding,
+ int *width, int *height, int *format_size);
#endif /* MBPRINT_H */
diff --git a/src/include/fe_utils/priindex d89b6febcb..e8b7532bbf 100644
*** a/src/include/fe_utils/print.h
--- b/src/include/fe_utils/print.h
***************
*** 33,39 **** enum printFormat
PRINT_ASCIIDOC,
PRINT_LATEX,
PRINT_LATEX_LONGTABLE,
! PRINT_TROFF_MS
/* add your favourite output format here ... */
};
--- 33,41 ----
PRINT_ASCIIDOC,
PRINT_LATEX,
PRINT_LATEX_LONGTABLE,
! PRINT_TROFF_MS,
! PRINT_MARKDOWN,
! PRINT_RST
/* add your favourite output format here ... */
};
***************
*** 176,181 **** typedef struct printQueryOpt
--- 178,185 ----
extern volatile bool cancel_pressed;
extern const printTextFormat pg_asciiformat;
+ extern const printTextFormat pg_markdown; /*linestyle markdown*/
+ extern const printTextFormat pg_rst; /*linestyle rst*/
extern const printTextFormat pg_asciiformat_old;
extern printTextFormat pg_utf8format; /* ideally would be const, but... */
diff --git a/src/test/regress/expecindex eb7f197b12..adaac27fc3 100644
*** a/src/test/regress/expected/psql.out
--- b/src/test/regress/expected/psql.out
***************
*** 2763,2765 **** NOTICE: foo
--- 2763,2879 ----
CONTEXT: PL/pgSQL function inline_code_block line 3 at RAISE
ERROR: bar
CONTEXT: PL/pgSQL function inline_code_block line 4 at RAISE
+ prepare q AS VALUES(E'Elephant, kangaroo,\nsquirrel, gorilla', 121,
+ (279./278.)::text, 0.1111, repeat('Hello ', 10))
+ , (E'goat, rhinoceros,\nmonkey, ape', 11121, (1279./1278.)::text, 5.1111,
+ repeat('xxxxxx ', 10))
+ , (E'donkey, cow, horse, tit,\neagle, whale,\naligator,
+ pelican,\ngrasshoper\npig\n\tbat', 14351, (12345./245.)::text, 345.11,
+ repeat('yyyyyy ', 10));
+ \pset format rst
+ execute q;
+ +--------------------------+---------+---------------------+---------+------------------------------------------------------------------------+
+ | column1 | column2 | column3 | column4 | column5 |
+ +==========================+=========+=====================+=========+========================================================================+
+ | Elephant, kangaroo, | 121 | 1.0035971223021583 | 0.1111 | Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello |
+ | squirrel, gorilla | | | | |
+ +--------------------------+---------+---------------------+---------+------------------------------------------------------------------------+
+ | goat, rhinoceros, | 11121 | 1.0007824726134585 | 5.1111 | xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx |
+ | monkey, ape | | | | |
+ +--------------------------+---------+---------------------+---------+------------------------------------------------------------------------+
+ | donkey, cow, horse, tit, | 14351 | 50.3877551020408163 | 345.11 | yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy |
+ | eagle, whale, | | | | |
+ | aligator, | | | | |
+ | pelican, | | | | |
+ | grasshoper | | | | |
+ | pig | | | | |
+ | bat | | | | |
+ +--------------------------+---------+---------------------+---------+------------------------------------------------------------------------+
+
+ (3 rows)
+
+ \pset format markdown
+ execute q;
+
+ | column1 | column2 | column3 | column4 | column5 |
+ |-------------------------------------------------------------------------------------------------------------|---------|---------------------|---------|------------------------------------------------------------------------|
+ | Elephant, kangaroo,</br>squirrel, gorilla | 121 | 1.0035971223021583 | 0.1111 | Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello |
+ | goat, rhinoceros,</br>monkey, ape | 11121 | 1.0007824726134585 | 5.1111 | xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx |
+ | donkey, cow, horse, tit,</br>eagle, whale,</br>aligator,</br> pelican,</br>grasshoper</br>pig</br> bat | 14351 | 50.3877551020408163 | 345.11 | yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy |
+
+
+ (3 rows)
+
+ \x
+ \pset format rst
+ execute q;
+ +-------------+------------------------------------------------------------------------+
+ | **RECORD 1** |
+ +-------------+------------------------------------------------------------------------+
+ | **column1** | Elephant, kangaroo, |
+ | | squirrel, gorilla |
+ +-------------+------------------------------------------------------------------------+
+ | **column2** | 121 |
+ +-------------+------------------------------------------------------------------------+
+ | **column3** | 1.0035971223021583 |
+ +-------------+------------------------------------------------------------------------+
+ | **column4** | 0.1111 |
+ +-------------+------------------------------------------------------------------------+
+ | **column5** | Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello |
+ +-------------+------------------------------------------------------------------------+
+ | **RECORD 2** |
+ +-------------+------------------------------------------------------------------------+
+ | **column1** | goat, rhinoceros, |
+ | | monkey, ape |
+ +-------------+------------------------------------------------------------------------+
+ | **column2** | 11121 |
+ +-------------+------------------------------------------------------------------------+
+ | **column3** | 1.0007824726134585 |
+ +-------------+------------------------------------------------------------------------+
+ | **column4** | 5.1111 |
+ +-------------+------------------------------------------------------------------------+
+ | **column5** | xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx |
+ +-------------+------------------------------------------------------------------------+
+ | **RECORD 3** |
+ +-------------+------------------------------------------------------------------------+
+ | **column1** | donkey, cow, horse, tit, |
+ | | eagle, whale, |
+ | | aligator, |
+ | | pelican, |
+ | | grasshoper |
+ | | pig |
+ | | bat |
+ +-------------+------------------------------------------------------------------------+
+ | **column2** | 14351 |
+ +-------------+------------------------------------------------------------------------+
+ | **column3** | 50.3877551020408163 |
+ +-------------+------------------------------------------------------------------------+
+ | **column4** | 345.11 |
+ +-------------+------------------------------------------------------------------------+
+ | **column5** | yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy |
+ +-------------+------------------------------------------------------------------------+
+
+ \pset format markdown
+ execute q;
+ | **RECORD 1** | |
+ |--------------|-------------------------------------------------------------------------------------------------------------|
+ | column1 | Elephant, kangaroo,</br>squirrel, gorilla |
+ | column2 | 121 |
+ | column3 | 1.0035971223021583 |
+ | column4 | 0.1111 |
+ | column5 | Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello |
+ | **RECORD 2** | |
+ | column1 | goat, rhinoceros,</br>monkey, ape |
+ | column2 | 11121 |
+ | column3 | 1.0007824726134585 |
+ | column4 | 5.1111 |
+ | column5 | xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx xxxxxx |
+ | **RECORD 3** | |
+ | column1 | donkey, cow, horse, tit,</br>eagle, whale,</br>aligator,</br> pelican,</br>grasshoper</br>pig</br> bat |
+ | column2 | 14351 |
+ | column3 | 50.3877551020408163 |
+ | column4 | 345.11 |
+ | column5 | yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy yyyyyy |
+
+
+ deallocate q;
diff --git a/src/test/regress/sql/psql.sqindex 8f8e17a87c..8e3aea7c6b 100644
*** a/src/test/regress/sql/psql.sql
--- b/src/test/regress/sql/psql.sql
***************
*** 404,406 **** begin
--- 404,425 ----
raise notice 'foo';
raise exception 'bar';
end $$;
+
+ prepare q AS VALUES(E'Elephant, kangaroo,\nsquirrel, gorilla', 121,
+ (279./278.)::text, 0.1111, repeat('Hello ', 10))
+ , (E'goat, rhinoceros,\nmonkey, ape', 11121, (1279./1278.)::text, 5.1111,
+ repeat('xxxxxx ', 10))
+ , (E'donkey, cow, horse, tit,\neagle, whale,\naligator,
+ pelican,\ngrasshoper\npig\n\tbat', 14351, (12345./245.)::text, 345.11,
+ repeat('yyyyyy ', 10));
+
+ \pset format rst
+ execute q;
+ \pset format markdown
+ execute q;
+ \x
+ \pset format rst
+ execute q;
+ \pset format markdown
+ execute q;
+ deallocate q;
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers