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
Re: psql latex bugfixes |
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: