Re: BUG #5748: Invalid oidvector data during binary recv

From: Yeb Havinga <yebhavinga(at)gmail(dot)com>
To: Heikki Linnakangas <heikki(dot)linnakangas(at)enterprisedb(dot)com>
Cc: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, pgsql-bugs(at)postgresql(dot)org
Subject: Re: BUG #5748: Invalid oidvector data during binary recv
Date: 2010-11-15 10:56:22
Message-ID: 4CE111D6.5070801@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

On 2010-11-15 11:40, Heikki Linnakangas wrote:
> On 15.11.2010 12:08, Yeb Havinga wrote:
>> On 2010-11-11 17:02, Heikki Linnakangas wrote:
>>> On 11.11.2010 17:48, Tom Lane wrote:
>>>> "Yeb Havinga"<yebhavinga(at)gmail(dot)com> writes:
>>>>> postgres=# create table a as select ''::oidvector;
>>>>> SELECT 1
>>>>> postgres=# copy a to '/tmp/test' with binary;
>>>>> COPY 1
>>>>> postgres=# copy a from '/tmp/test' with binary;
>>>>> ERROR: invalid oidvector data
>>>>
>>>> The problem seems to be that array_recv passes back a zero-dimensional
>>>> array, *not* a 1-D array, when it observes that the input has no
>>>> elements. A zero-D array is not part of the subset of possible arrays
>>>> that we allow for oidvector.
>>>
>>> Yeah, I just reached that conclusion too..
>> The patch below changes array_recv, so that it returns an empty 1-D
>> array when an empty 1-D array was written binary. No changes in
>> oidvectorrecv or int2vectorrecv are needed.
>
> That seems like a bad idea. array_in() represents an empty array with
> zero dimensions, we're not going to change the generic array_recv()
> function used for all arrays to behave differently because of some
> corner-case in oidvectorrecv.
It's possible to trigger it with any element type, as long as the use
manages to construct a 1-D array. E.g. with contrib/_int.sql loaded,
array substraction is possible. Now:
postgres=# select ARRAY[1]::int4[] - ARRAY[1]::int4[];
?column?
----------
{}
(1 row)

postgres=# select array_ndims(ARRAY[1]::int4[] - ARRAY[1]::int4[]);
array_ndims
-------------
1
(1 row)

Binary send and recv of the value at hand would change it into a 0-D vector.

>
> If we want do anything about this, the right fix is to add a special
> case in oidvectorrecv/int2vectorrecv to handle empty array.
Judging from the fact that it also happens with int4 arrays, this seems
like the wrong place.

regards,
Yeb Havinga

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Tom Lane 2010-11-15 15:22:07 Re: BUG #5748: Invalid oidvector data during binary recv
Previous Message Heikki Linnakangas 2010-11-15 10:40:57 Re: BUG #5748: Invalid oidvector data during binary recv