Обсуждение: BUG #5840: Updating arrays using subscripted assignment results in uninitialized values

Поиск
Список
Период
Сортировка

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

От
"Karsten Loesing"
Дата:
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

От
Tom Lane
Дата:
"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