On Sat, Sep 24, 2005 at 07:18:16PM -0400, Bruce Momjian wrote: > > Well, it seems we are going to have to fix it somehow for 8.1. It is > not crashing here so I can't work up a patch. Can you submit a minimal > fix for 8.1? Thanks.
Ah, it would only happen if your encoding was UTF-8 since that's the only case psql handles differently. I've attached a patch which fixes it. With a bit more rearrangement you could probably simplify it a bit but this works. Have a nice day, -- Martijn van Oosterhout <kleptog@svana.org> http://svana.org/kleptog/ > Patent. n. Genius is 5% inspiration and 95% perspiration. A patent is a > tool for doing 5% of the work and then sitting around waiting for someone > else to do the other 95% so you can sue them.
Index: print.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/bin/psql/print.c,v retrieving revision 1.74 diff -c -r1.74 print.c *** print.c 24 Sep 2005 17:53:27 -0000 1.74 --- print.c 25 Sep 2005 09:16:01 -0000 *************** *** 697,714 **** else fputs(" ", fout); { char *my_cell = pg_local_malloc(cell_w[i] + 1); strcpy(my_cell, *ptr); ! if (opt_align[i % col_count] == 'r' && opt_numeric_locale) ! format_numeric_locale(my_cell); if (opt_border < 2) fprintf(fout, "%s\n", my_cell); else fprintf(fout, "%-s%*s |\n", my_cell, dwidth - cell_w[i], ""); free(my_cell); } } if (opt_border == 2) --- 697,726 ---- else fputs(" ", fout); + /* We seperate the cases for numeric_locale because for UTF-8 (and + * other) encodings, cell_w <= strlen(*ptr). We can't just use + * strlen() in the malloc because there needs to be enough room for + * format_numeric_locale() to store its result. */ + + if (opt_align[i % col_count] == 'r' && opt_numeric_locale) { char *my_cell = pg_local_malloc(cell_w[i] + 1); strcpy(my_cell, *ptr); ! format_numeric_locale(my_cell); if (opt_border < 2) fprintf(fout, "%s\n", my_cell); else fprintf(fout, "%-s%*s |\n", my_cell, dwidth - cell_w[i], ""); free(my_cell); } + else + { + if (opt_border < 2) + fprintf(fout, "%s\n", *ptr); + else + fprintf(fout, "%-s%*s |\n", *ptr, dwidth - cell_w[i], ""); + } } if (opt_border == 2)
pgpOenUi8TQtR.pgp
Description: PGP signature