BUG #5840: Updating arrays using subscripted assignment results in uninitialized values

Started by Karsten Loesingabout 15 years ago2 messagesbugs
Jump to latest
#1Karsten Loesing
karsten.loesing@gmx.net

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.

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Karsten Loesing (#1)
Re: BUG #5840: Updating arrays using subscripted assignment results in uninitialized values

"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