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 <[email protected]> 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
