Re: psql latex bugfixes

From: Christopher Kings-Lynne <chriskl(at)familyhealth(dot)com(dot)au>
To: Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>
Cc: Roger Leigh <rleigh(at)whinlatter(dot)ukfsn(dot)org>, pgsql-patches(at)postgresql(dot)org
Subject: Re: psql latex bugfixes
Date: 2004-08-06 06:03:04
Message-ID: 41131F18.1080401@familyhealth.com.au
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-patches

OK, it looks good. I don't have latex handy to build it, but it looks
fine to me...

Chris

Bruce Momjian wrote:

> If you would like to review it I will apply it.
>
> ---------------------------------------------------------------------------
>
> Christopher Kings-Lynne wrote:
>
>>Surely this is a really good bug fix and should be in 7.5?
>>
>>Bruce Momjian wrote:
>>
>>
>>>This has been saved for the 7.6 release:
>>>
>>> http:/momjian.postgresql.org/cgi-bin/pgpatches2
>>>
>>>---------------------------------------------------------------------------
>>>
>>>Roger Leigh wrote:
>>>
>>>
>>>>I have noticed that the latex format in psql has some bugs:
>>>>
>>>>? "_" is not escaped, and causes TeX to abort, thinking it's a
>>>> subscript outside of maths mode. Most of my table and field names
>>>> use underscores, so this is a really nasty one.
>>>>? The column count is calculated using the contents of opt_align. But
>>>> opt_align has one extra element, and so it's always one too many. I
>>>> changed it to count the column headings, like all the other output
>>>> formats. There may be a bug in computing opt_align that this patch
>>>> does not address, but I'm not yet familiar enough with the psql
>>>> source to fix this as well.
>>>>? The line drawing rules for each border setting (0-3) and expanded
>>>> mode didn't always match the documented behaviour and what other
>>>> formats (e.g. aligned) did. I made it as conformant as possible,
>>>> and also tidied the alignment of the first line of the footer, which
>>>> was incorrectly indented.
>>>>
>>>>I've attached some example output with this patch applied.
>>>>
>>>>Regards,
>>>>Roger
>>>>
>>>>
>>>>Index: src/bin/psql/print.c
>>>>===================================================================
>>>>RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/print.c,v
>>>>retrieving revision 1.48
>>>>diff -u -r1.48 print.c
>>>>--- src/bin/psql/print.c 23 May 2004 22:20:10 -0000 1.48
>>>>+++ src/bin/psql/print.c 1 Aug 2004 22:54:22 -0000
>>>>@@ -769,7 +769,7 @@
>>>>
>>>>
>>>>/*************************/
>>>>-/* LaTeX */
>>>>+/* LaTeX */
>>>>/*************************/
>>>>
>>>>
>>>>@@ -790,6 +790,9 @@
>>>> case '$':
>>>> fputs("\\$", fout);
>>>> break;
>>>>+ case '_':
>>>>+ fputs("\\_", fout);
>>>>+ break;
>>>> case '{':
>>>> fputs("\\{", fout);
>>>> break;
>>>>@@ -817,7 +820,6 @@
>>>>{
>>>> unsigned int col_count = 0;
>>>> unsigned int i;
>>>>- const char *cp;
>>>> const char *const * ptr;
>>>>
>>>>
>>>>@@ -829,42 +831,39 @@
>>>> fputs("\n\\end{center}\n\n", fout);
>>>> }
>>>>
>>>>+ /* count columns */
>>>>+ for (ptr = headers; *ptr; ptr++)
>>>>+ col_count++;
>>>>+
>>>> /* begin environment and set alignments and borders */
>>>> fputs("\\begin{tabular}{", fout);
>>>>- if (opt_border == 0)
>>>>- fputs(opt_align, fout);
>>>>- else if (opt_border == 1)
>>>>- {
>>>>- for (cp = opt_align; *cp; cp++)
>>>>- {
>>>>- if (cp != opt_align)
>>>>- fputc('|', fout);
>>>>- fputc(*cp, fout);
>>>>- }
>>>>- }
>>>>- else if (opt_border == 2)
>>>>+
>>>>+ if (opt_border == 2)
>>>>+ fputs("| ", fout);
>>>>+ for (i = 0; i < col_count; i++)
>>>> {
>>>>- for (cp = opt_align; *cp; cp++)
>>>>- {
>>>>- fputc('|', fout);
>>>>- fputc(*cp, fout);
>>>>- }
>>>>- fputc('|', fout);
>>>>+ fputc(*(opt_align + i), fout);
>>>>+ if (opt_border != 0 && i < col_count - 1)
>>>>+ fputs (" | ", fout);
>>>> }
>>>>+ if (opt_border == 2)
>>>>+ fputs(" |", fout);
>>>>+
>>>> fputs("}\n", fout);
>>>>
>>>> if (!opt_barebones && opt_border == 2)
>>>> fputs("\\hline\n", fout);
>>>>
>>>> /* print headers and count columns */
>>>>- for (i = 0, ptr = headers; *ptr; i++, ptr++)
>>>>+ for (i = 0, ptr = headers; i < col_count; i++, ptr++)
>>>> {
>>>>- col_count++;
>>>> if (!opt_barebones)
>>>> {
>>>> if (i != 0)
>>>> fputs(" & ", fout);
>>>>+ fputs("\\textit{", fout);
>>>> latex_escaped_print(*ptr, fout);
>>>>+ fputc('}', fout);
>>>> }
>>>> }
>>>>
>>>>@@ -888,7 +887,7 @@
>>>> if (opt_border == 2)
>>>> fputs("\\hline\n", fout);
>>>>
>>>>- fputs("\\end{tabular}\n\n", fout);
>>>>+ fputs("\\end{tabular}\n\n\\noindent ", fout);
>>>>
>>>>
>>>> /* print footers */
>>>>@@ -951,8 +950,12 @@
>>>> if (!opt_barebones)
>>>> {
>>>> if (opt_border == 2)
>>>>+ {
>>>> fputs("\\hline\n", fout);
>>>>- fprintf(fout, "\\multicolumn{2}{c}{Record %d} \\\\\n", record++);
>>>>+ fprintf(fout, "\\multicolumn{2}{|c|}{\\textit{Record %d}} \\\\\n", record++);
>>>>+ }
>>>>+ else
>>>>+ fprintf(fout, "\\multicolumn{2}{c}{\\textit{Record %d}} \\\\\n", record++);
>>>> }
>>>> if (opt_border >= 1)
>>>> fputs("\\hline\n", fout);
>>>>@@ -967,7 +970,7 @@
>>>> if (opt_border == 2)
>>>> fputs("\\hline\n", fout);
>>>>
>>>>- fputs("\\end{tabular}\n\n", fout);
>>>>+ fputs("\\end{tabular}\n\n\\noindent ", fout);
>>>>
>>>>
>>>> /* print footers */
>>>>
>>>>
>>>>
>>>>--
>>>>Roger Leigh
>>>>
>>>> Printing on GNU/Linux? http://gimp-print.sourceforge.net/
>>>> GPG Public Key: 0x25BFB848. Please sign and encrypt your mail.
>>>
>>>
>>>Content-Description: psql latex output
>>>
>>>[ text/x-tex is unsupported, treating like TEXT/PLAIN ]
>>>
>>>
>>>
>>>>\documentclass[a4paper]{article}
>>>>
>>>>\begin{document}
>>>>\title{Test}
>>>>\maketitle
>>>>
>>>>\section{Normal}
>>>>
>>>>\begin{center}
>>>>Table "public.suites"
>>>>\end{center}
>>>>
>>>>\begin{tabular}{lll}
>>>>\textit{Column} & \textit{Type} & \textit{Modifiers} \\
>>>>\hline
>>>>id & integer & not null default nextval('public.suites\_id\_seq'::text) \\
>>>>name & text & not null \\
>>>>archive\_id & integer & not null \\
>>>>version & text & \\
>>>>path & text & \\
>>>>alias & text & \\
>>>>description & text & \\
>>>>\end{tabular}
>>>>
>>>>\noindent Indexes: \\
>>>> "suites\_pkey" PRIMARY KEY, btree (id) \\
>>>> "suites\_alias\_key" UNIQUE, btree (alias) \\
>>>> "suites\_name\_key" UNIQUE, btree (name) \\
>>>>Foreign-key constraints: \\
>>>> "suites\_archive\_ref" FOREIGN KEY (archive\_id) REFERENCES archives(id) \\
>>>>
>>>>\begin{center}
>>>>Table "public.suites"
>>>>\end{center}
>>>>
>>>>\begin{tabular}{l | l | l}
>>>>\textit{Column} & \textit{Type} & \textit{Modifiers} \\
>>>>\hline
>>>>id & integer & not null default nextval('public.suites\_id\_seq'::text) \\
>>>>name & text & not null \\
>>>>archive\_id & integer & not null \\
>>>>version & text & \\
>>>>path & text & \\
>>>>alias & text & \\
>>>>description & text & \\
>>>>\end{tabular}
>>>>
>>>>\noindent Indexes: \\
>>>> "suites\_pkey" PRIMARY KEY, btree (id) \\
>>>> "suites\_alias\_key" UNIQUE, btree (alias) \\
>>>> "suites\_name\_key" UNIQUE, btree (name) \\
>>>>Foreign-key constraints: \\
>>>> "suites\_archive\_ref" FOREIGN KEY (archive\_id) REFERENCES archives(id) \\
>>>>
>>>>\begin{center}
>>>>Table "public.suites"
>>>>\end{center}
>>>>
>>>>\begin{tabular}{| l | l | l |}
>>>>\hline
>>>>\textit{Column} & \textit{Type} & \textit{Modifiers} \\
>>>>\hline
>>>>id & integer & not null default nextval('public.suites\_id\_seq'::text) \\
>>>>name & text & not null \\
>>>>archive\_id & integer & not null \\
>>>>version & text & \\
>>>>path & text & \\
>>>>alias & text & \\
>>>>description & text & \\
>>>>\hline
>>>>\end{tabular}
>>>>
>>>>\noindent Indexes: \\
>>>> "suites\_pkey" PRIMARY KEY, btree (id) \\
>>>> "suites\_alias\_key" UNIQUE, btree (alias) \\
>>>> "suites\_name\_key" UNIQUE, btree (name) \\
>>>>Foreign-key constraints: \\
>>>> "suites\_archive\_ref" FOREIGN KEY (archive\_id) REFERENCES archives(id) \\
>>>>
>>>>\begin{center}
>>>>Table "public.suites"
>>>>\end{center}
>>>>
>>>>\begin{tabular}{cl}
>>>>\multicolumn{2}{c}{\textit{Record 1}} \\
>>>>Column & id \\
>>>>Type & integer \\
>>>>Modifiers & not null default nextval('public.suites\_id\_seq'::text) \\
>>>>\multicolumn{2}{c}{\textit{Record 2}} \\
>>>>Column & name \\
>>>>Type & text \\
>>>>Modifiers & not null \\
>>>>\multicolumn{2}{c}{\textit{Record 3}} \\
>>>>Column & archive\_id \\
>>>>Type & integer \\
>>>>Modifiers & not null \\
>>>>\multicolumn{2}{c}{\textit{Record 4}} \\
>>>>Column & version \\
>>>>Type & text \\
>>>>Modifiers & \\
>>>>\multicolumn{2}{c}{\textit{Record 5}} \\
>>>>Column & path \\
>>>>Type & text \\
>>>>Modifiers & \\
>>>>\multicolumn{2}{c}{\textit{Record 6}} \\
>>>>Column & alias \\
>>>>Type & text \\
>>>>Modifiers & \\
>>>>\multicolumn{2}{c}{\textit{Record 7}} \\
>>>>Column & description \\
>>>>Type & text \\
>>>>Modifiers & \\
>>>>\end{tabular}
>>>>
>>>>\noindent Indexes: \\
>>>> "suites\_pkey" PRIMARY KEY, btree (id) \\
>>>> "suites\_alias\_key" UNIQUE, btree (alias) \\
>>>> "suites\_name\_key" UNIQUE, btree (name) \\
>>>>Foreign-key constraints: \\
>>>> "suites\_archive\_ref" FOREIGN KEY (archive\_id) REFERENCES archives(id) \\
>>>>
>>>>\begin{center}
>>>>Table "public.suites"
>>>>\end{center}
>>>>
>>>>\begin{tabular}{c|l}
>>>>\multicolumn{2}{c}{\textit{Record 1}} \\
>>>>\hline
>>>>Column & id \\
>>>>Type & integer \\
>>>>Modifiers & not null default nextval('public.suites\_id\_seq'::text) \\
>>>>\multicolumn{2}{c}{\textit{Record 2}} \\
>>>>\hline
>>>>Column & name \\
>>>>Type & text \\
>>>>Modifiers & not null \\
>>>>\multicolumn{2}{c}{\textit{Record 3}} \\
>>>>\hline
>>>>Column & archive\_id \\
>>>>Type & integer \\
>>>>Modifiers & not null \\
>>>>\multicolumn{2}{c}{\textit{Record 4}} \\
>>>>\hline
>>>>Column & version \\
>>>>Type & text \\
>>>>Modifiers & \\
>>>>\multicolumn{2}{c}{\textit{Record 5}} \\
>>>>\hline
>>>>Column & path \\
>>>>Type & text \\
>>>>Modifiers & \\
>>>>\multicolumn{2}{c}{\textit{Record 6}} \\
>>>>\hline
>>>>Column & alias \\
>>>>Type & text \\
>>>>Modifiers & \\
>>>>\multicolumn{2}{c}{\textit{Record 7}} \\
>>>>\hline
>>>>Column & description \\
>>>>Type & text \\
>>>>Modifiers & \\
>>>>\end{tabular}
>>>>
>>>>\noindent Indexes: \\
>>>> "suites\_pkey" PRIMARY KEY, btree (id) \\
>>>> "suites\_alias\_key" UNIQUE, btree (alias) \\
>>>> "suites\_name\_key" UNIQUE, btree (name) \\
>>>>Foreign-key constraints: \\
>>>> "suites\_archive\_ref" FOREIGN KEY (archive\_id) REFERENCES archives(id) \\
>>>>
>>>>\begin{center}
>>>>Table "public.suites"
>>>>\end{center}
>>>>
>>>>\begin{tabular}{|c|l|}
>>>>\hline
>>>>\multicolumn{2}{|c|}{\textit{Record 1}} \\
>>>>\hline
>>>>Column & id \\
>>>>Type & integer \\
>>>>Modifiers & not null default nextval('public.suites\_id\_seq'::text) \\
>>>>\hline
>>>>\multicolumn{2}{|c|}{\textit{Record 2}} \\
>>>>\hline
>>>>Column & name \\
>>>>Type & text \\
>>>>Modifiers & not null \\
>>>>\hline
>>>>\multicolumn{2}{|c|}{\textit{Record 3}} \\
>>>>\hline
>>>>Column & archive\_id \\
>>>>Type & integer \\
>>>>Modifiers & not null \\
>>>>\hline
>>>>\multicolumn{2}{|c|}{\textit{Record 4}} \\
>>>>\hline
>>>>Column & version \\
>>>>Type & text \\
>>>>Modifiers & \\
>>>>\hline
>>>>\multicolumn{2}{|c|}{\textit{Record 5}} \\
>>>>\hline
>>>>Column & path \\
>>>>Type & text \\
>>>>Modifiers & \\
>>>>\hline
>>>>\multicolumn{2}{|c|}{\textit{Record 6}} \\
>>>>\hline
>>>>Column & alias \\
>>>>Type & text \\
>>>>Modifiers & \\
>>>>\hline
>>>>\multicolumn{2}{|c|}{\textit{Record 7}} \\
>>>>\hline
>>>>Column & description \\
>>>>Type & text \\
>>>>Modifiers & \\
>>>>\hline
>>>>\end{tabular}
>>>>
>>>>\noindent Indexes: \\
>>>> "suites\_pkey" PRIMARY KEY, btree (id) \\
>>>> "suites\_alias\_key" UNIQUE, btree (alias) \\
>>>> "suites\_name\_key" UNIQUE, btree (name) \\
>>>>Foreign-key constraints: \\
>>>> "suites\_archive\_ref" FOREIGN KEY (archive\_id) REFERENCES archives(id) \\
>>>>
>>>>
>>>>
>>>>\end{document}
>>>>
>>>>%%% Local Variables:
>>>>%%% mode: latex
>>>>%%% TeX-master: t
>>>>%%% End:
>>>
>>>
>>>Content-Description: psql latex PDF output
>>>
>>>[ Attachment, skipping... ]
>>>
>>>
>>>
>>>>---------------------------(end of broadcast)---------------------------
>>>>TIP 9: the planner will ignore your desire to choose an index scan if your
>>>> joining column's datatypes do not match
>>>
>>>
>

In response to

Browse pgsql-patches by date

  From Date Subject
Next Message Koju Iijima 2004-08-06 06:34:39 Patch for Array min() / max()
Previous Message Weiping 2004-08-06 05:50:36 po files for libpq, psql and scripts