Thread: BUG #5840: Updating arrays using subscripted assignment results in uninitialized values
BUG #5840: Updating arrays using subscripted assignment results in uninitialized values
From
"Karsten Loesing"
Date:
The following bug has been logged online: Bug reference: 5840 Logged by: Karsten Loesing Email address: karsten.loesing@gmx.net PostgreSQL version: 8.4.5 Operating system: Mac OS X 10.6 and Debian Lenny Description: Updating arrays using subscripted assignment results in uninitialized values Details: Modifying an array as described in http://www.postgresql.org/docs/8.4/static/arrays.html#ARRAYS-MODIFYING sometimes leads to uninitialized values. See the following example: CREATE TABLE test_array (my_array BIGINT[]); INSERT INTO test_array (my_array) VALUES ('[40:41]={40,41}'); UPDATE test_array SET my_array[1:2]='{1,2}'; SELECT * FROM test_array; The result might be: {16383,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,N ULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NU LL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,40,41} Running the update a second time leads to the expected result: UPDATE test_array SET my_array[1:2]='{1,2}'; SELECT * FROM test_array; {1,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,N ULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,40,41} The problem only occurs with a sufficiently large "hole" between the first and second array part.
Re: BUG #5840: Updating arrays using subscripted assignment results in uninitialized values
From
Tom Lane
Date:
"Karsten Loesing" <karsten.loesing@gmx.net> writes: > Modifying an array as described in > http://www.postgresql.org/docs/8.4/static/arrays.html#ARRAYS-MODIFYING > sometimes leads to uninitialized values. See the following example: > CREATE TABLE test_array (my_array BIGINT[]); > INSERT INTO test_array (my_array) VALUES ('[40:41]={40,41}'); > UPDATE test_array SET my_array[1:2]='{1,2}'; > SELECT * FROM test_array; They're not actually "uninitialized"; the correct values are inserted, but then overwritten with garbage. This seems to have been broken since 8.2 :-(. Fix committed: http://git.postgresql.org/gitweb?p=postgresql.git;a=commitdiff;h=f43c4d9ec4d46e4d664af4c1a2a6345921a353fb Thanks for the report! regards, tom lane