Re: Bug in intarray?

From: Guillaume Lelarge <guillaume(at)lelarge(dot)info>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: pgsql-hackers(at)postgresql(dot)org
Subject: Re: Bug in intarray?
Date: 2012-02-17 08:42:07
Message-ID: 1329468127.2271.11.camel@localhost.localdomain
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Thu, 2012-02-16 at 19:27 -0500, Tom Lane wrote:
> Guillaume Lelarge <guillaume(at)lelarge(dot)info> writes:
> > This query:
> > SELECT ARRAY[-1,3,1] & ARRAY[1, 2];
> > should give {1} as a result.
>
> > But, on HEAD (and according to his tests, on 9.0.6 and 9.1.2), it
> > appears to give en empty array.
>
> Definitely a bug, and I'll bet it goes all the way back.
>
> > Digging on this issue, another user (Julien Rouhaud) made an interesting
> > comment on this line of code:
>
> > if (i + j == 0 || (i + j > 0 && *(dr - 1) != db[j]))
>
> > (line 159 of contrib/intarray/_int_tool.c, current HEAD)
>
> > Apparently, the code tries to check the current value of the right side
> > array with the previous value of the resulting array. Which clearly
> > cannot work if there is no previous value in the resulting array.
>
> > So I worked on a patch to fix this, as I think it is a bug (but I may be
> > wrong). Patch is attached and fixes the issue AFAICT.
>
> Yeah, this code is bogus, but it's also pretty unreadable. I think
> it's better to get rid of the inconsistently-used pointer arithmetic
> and the fundamentally wrong/irrelevant test on i+j, along the lines
> of the attached.
>

Completely agree.

Thank you.

--
Guillaume
http://blog.guillaume.lelarge.info
http://www.dalibo.com

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Heikki Linnakangas 2012-02-17 08:48:50 Re: Notes about fixing regexes and UTF-8 (yet again)
Previous Message Etsuro Fujita 2012-02-17 07:50:50 Re: WIP: Collecting statistics on CSV file data