Re: psql latex bugfixes - Mailing list pgsql-patches

From Christopher Kings-Lynne
Subject Re: psql latex bugfixes
Date
Msg-id 410EF550.3070502@familyhealth.com.au
Whole thread Raw
In response to Re: psql latex bugfixes  (Bruce Momjian <pgman@candle.pha.pa.us>)
Responses Re: psql latex bugfixes  (Bruce Momjian <pgman@candle.pha.pa.us>)
Re: psql latex bugfixes  (Tom Lane <tgl@sss.pgh.pa.us>)
List 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
>
>

pgsql-patches by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: Troff -ms output for psql
Next
From: Bruce Momjian
Date:
Subject: Re: psql latex bugfixes