Re: [HACKERS] \x output blowing up

2005-09-25 Thread Martijn van Oosterhout
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 -  1.74
--- print.c 25 Sep 2005 09:16:01 -
***
*** 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


Re: [HACKERS] \x output blowing up

2005-09-24 Thread Martijn van Oosterhout
On Sat, Sep 24, 2005 at 11:45:08PM +0200, Martijn van Oosterhout wrote:
 Hi,
 
 On CVS tip, whenever I do \x output, it dies with an internal error in
 glibc on free. If you run it under valgrind, it complains about these
 lines of code:

snip

Ok, I worked out the direct cause, pg_wcswidth only returns the length
upto the first newline and the line it breaks on is the multiline
definition in _pg_expandarray.

The quick fix should be to only allocate memory if it's going to call
format_numeric_locale(), since then you know it's a number. It makes
the code slightly more convoluated but it should be slightly more
efficient.

I actually have a working psql that handles and displays newlines
properly, but it's too late for 8.1. It fixes all these issues
properly.

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.


pgpSxRFAxuskf.pgp
Description: PGP signature


Re: [HACKERS] \x output blowing up

2005-09-24 Thread Bruce Momjian

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.

---

Martijn van Oosterhout wrote:
-- Start of PGP signed section.
 On Sat, Sep 24, 2005 at 11:45:08PM +0200, Martijn van Oosterhout wrote:
  Hi,
  
  On CVS tip, whenever I do \x output, it dies with an internal error in
  glibc on free. If you run it under valgrind, it complains about these
  lines of code:
 
 snip
 
 Ok, I worked out the direct cause, pg_wcswidth only returns the length
 upto the first newline and the line it breaks on is the multiline
 definition in _pg_expandarray.
 
 The quick fix should be to only allocate memory if it's going to call
 format_numeric_locale(), since then you know it's a number. It makes
 the code slightly more convoluated but it should be slightly more
 efficient.
 
 I actually have a working psql that handles and displays newlines
 properly, but it's too late for 8.1. It fixes all these issues
 properly.
 
 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.
-- End of PGP section, PGP failed!

-- 
  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

---(end of broadcast)---
TIP 5: don't forget to increase your free space map settings