On 09/01/2008, Andrew Gilligan <[EMAIL PROTECTED]> wrote:
>
> The following bug has been logged online:
>
> Bug reference:      3866
> Logged by:          Andrew Gilligan
> Email address:      [EMAIL PROTECTED]
> PostgreSQL version: 8.3RC1
> Operating system:   FreeBSD 4.11
> Description:        Segfault during table update when using convert_from()
> Details:
>
> Greetings,
>
> It seems there exists a bug in the way character set conversion
> is handled in some circumstances.
>
> Running the test below results in the server (8.3RC1) segfaulting
> every time.  I haven't fully explored the extent, but it exists
> with (at least) LATIN2 and LATIN9 conversion.
>
> The database and client encoding are both UTF8.
>
> Best regards,
> -Andy
>
> -- test case --
> test=# CREATE TABLE t (id int, geo text);
> CREATE TABLE
> test=# INSERT INTO t (id, geo) VALUES (1,
> convert_from(decode('50696f74726bf3772c20506f6c616e64','hex'), 'LATIN9'));
> INSERT 0 1
> test=# UPDATE t SET geo =
> convert_from(decode('50696f74726bf3772c20506f6c616e64','hex'), 'LATIN9');
> UPDATE 1
> -- more than 1 row is needed to trigger the error
> test=# INSERT INTO t (id, geo) VALUES (2,
> convert_from(decode('50696f74726bf3772c20506f6c616e64','hex'), 'LATIN9'));
> INSERT 0 1
> test=# UPDATE t SET geo =
> convert_from(decode('50696f74726bf3772c20506f6c616e64','hex'), 'LATIN9');
> server closed the connection unexpectedly
>         This probably means the server terminated abnormally
>         before or while processing the request.
> The connection to the server was lost. Attempting reset: Failed.
> !>

I tested it without debug flags and server faults.

with --enable-debug and --enable-cassert I got
convert_from(decode('50696f74726bf3772c20506f6c616e64','hex'), 'LATIN9');
ERROR:  42622: encoding name too long
LOCATION:  pg_char_to_encname_struct, encnames.c:515

postgres=# INSERT INTO t (id, geo) VALUES (2,
convert_from(decode('50696f74726bf3772c20506f6c616e64','hex'), 'LATIN9'));
INSERT 0 1
postgres=# UPDATE t SET geo =
convert_from(decode('50696f74726bf3772c20506f6c616e64','hex'), 'LATIN2');
ERROR:  42622: encoding name too long
LOCATION:  pg_char_to_encname_struct, encnames.c:515
postgres=#

this problem is only in UPDATE statement

pg_char_to_encname_struct is called 3 times, 2times with correct name
and last time with garbage

Breakpoint 1, pg_char_to_encname_struct (
    name=0x8bb3510 '\177' <repeats 64 times>, "���\b ") at encnames.c:496
496             unsigned int nel = pg_encname_tbl_sz;
(gdb) bt
#0  pg_char_to_encname_struct (
    name=0x8bb3510 '\177' <repeats 64 times>, "���\b ") at encnames.c:496
#1  0x082e24dc in pg_char_to_encoding (
    name=0x8bb3510 '\177' <repeats 64 times>, "���\b ") at encnames.c:550
#2  0x082e3ed8 in pg_convert (fcinfo=0xbfa237dc) at mbutils.c:362
#3  0x082d949e in DirectFunctionCall3 (func=0x82e3eb0 <pg_convert>,
    arg1=146487356, arg2=146486544, arg3=146597884) at fmgr.c:1030
#4  0x082e3c24 in pg_convert_from (fcinfo=0xbfa23a38) at mbutils.c:336
#5  0x0818c563 in ExecMakeFunctionResultNoSets (fcache=0x8bccc64,
    econtext=0x8bccb64, isNull=0x8bcd7a9 "", isDone=0x8bcd80c)
    at execQual.c:1412
#6  0x081875d2 in ExecProject (projInfo=0x8bcd7bc, isDone=0xbfa23ce8)
    at execQual.c:4601
#7  0x0818e13b in ExecScan (node=0x8bccad8, accessMtd=0x819a810 <SeqNext>)
    at execScan.c:143
#8  0x0819a809 in ExecSeqScan (node=0x8bccad8) at nodeSeqscan.c:130
#9  0x08186ead in ExecProcNode (node=0x8bccad8) at execProcnode.c:334
#10 0x0818610b in ExecutorRun (queryDesc=0x8bc99f4,
    direction=ForwardScanDirection, count=0) at execMain.c:1233
#11 0x0822d824 in ProcessQuery (plan=0x8bb3fc8, params=<value optimized out>,
    dest=0x8bb4044, completionTag=0xbfa23f7a "") at pquery.c:179
#12 0x0822dae8 in PortalRunMulti (portal=0x8bbd22c,
    isTopLevel=<value optimized out>, dest=0x8bb4044, altdest=0x8bb4044,
---Type <return> to continue, or q <return> to quit---
    completionTag=0xbfa23f7a "") at pquery.c:1242
#13 0x0822e2a4 in PortalRun (portal=0x8bbd22c, count=2147483647,
    isTopLevel=1 '\001', dest=0x8bb4044, altdest=0x8bb4044,
    completionTag=0xbfa23f7a "") at pquery.c:813
#14 0x08229363 in exec_simple_query (
    query_string=0x8bb245c "UPDATE t SET geo
=\nconvert_from(decode('50696f74726bf3772c20506f6c616e64','hex'),
'LATIN2');") at postgres.c:963
#15 0x0822ae21 in PostgresMain (argc=4, argv=<value optimized out>,
    username=0x8b31564 "pavel") at postgres.c:3535
#16 0x081f6ca8 in ServerLoop () at postmaster.c:3180
#17 0x081f7996 in PostmasterMain (argc=3, argv=0x8b2e528) at postmaster.c:1028
#18 0x081a99e0 in main (argc=3, argv=Cannot access memory at address 0x4
) at main.c:188

regards
Pavel Stehule

---------------------------(end of broadcast)---------------------------
TIP 2: Don't 'kill -9' the postmaster

Reply via email to