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-03 02:15:44
Message-ID: 410EF550.3070502@familyhealth.com.au
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-patches

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

Responses

Browse pgsql-patches by date

  From Date Subject
Next Message Bruce Momjian 2004-08-03 02:15:52 Re: psql latex bugfixes
Previous Message Bruce Momjian 2004-08-03 02:15:31 Re: [PATCHES] Patch for pg_dump: Multiple -t options and new -T option