Re: psql latex bugfixes - Mailing list pgsql-patches
From | Bruce Momjian |
---|---|
Subject | Re: psql latex bugfixes |
Date | |
Msg-id | 200408030215.i732Fql28244@candle.pha.pa.us Whole thread Raw |
In response to | Re: psql latex bugfixes (Christopher Kings-Lynne <chriskl@familyhealth.com.au>) |
Responses |
Re: psql latex bugfixes
Re: psql latex bugfixes |
List | pgsql-patches |
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 > > > > > -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073
pgsql-patches by date: