Skip to content
Snippets Groups Projects
Commit 06d9afa6 authored by Tom Lane's avatar Tom Lane
Browse files

Fix longstanding error in contrib/intarray's int[] & int[] operator.

The array intersection code would give wrong results if the first entry of
the correct output array would be "1".  (I think only this value could be
at risk, since the previous word would always be a lower-bound entry with
that fixed value.)

Problem spotted by Julien Rouhaud, initial patch by Guillaume Lelarge,
cosmetic improvements by me.
parent 4767bc8f
No related branches found
No related tags found
No related merge requests found
......@@ -140,7 +140,8 @@ inner_int_inter(ArrayType *a, ArrayType *b)
*db,
*dr;
int i,
j;
j,
k;
if (ARRISEMPTY(a) || ARRISEMPTY(b))
return new_intArrayType(0);
......@@ -152,15 +153,15 @@ inner_int_inter(ArrayType *a, ArrayType *b)
r = new_intArrayType(Min(na, nb));
dr = ARRPTR(r);
i = j = 0;
i = j = k = 0;
while (i < na && j < nb)
{
if (da[i] < db[j])
i++;
else if (da[i] == db[j])
{
if (i + j == 0 || (i + j > 0 && *(dr - 1) != db[j]))
*dr++ = db[j];
if (k == 0 || dr[k - 1] != db[j])
dr[k++] = db[j];
i++;
j++;
}
......@@ -168,13 +169,13 @@ inner_int_inter(ArrayType *a, ArrayType *b)
j++;
}
if ((dr - ARRPTR(r)) == 0)
if (k == 0)
{
pfree(r);
return new_intArrayType(0);
}
else
return resize_intArrayType(r, dr - ARRPTR(r));
return resize_intArrayType(r, k);
}
void
......
......@@ -137,6 +137,12 @@ SELECT '{123,623,445}'::int[] & '{1623,623}';
{623}
(1 row)
SELECT '{-1,3,1}'::int[] & '{1,2}';
?column?
----------
{1}
(1 row)
--test query_int
SELECT '1'::query_int;
query_int
......
......@@ -24,6 +24,7 @@ SELECT '{123,623,445}'::int[] | 623;
SELECT '{123,623,445}'::int[] | 1623;
SELECT '{123,623,445}'::int[] | '{1623,623}';
SELECT '{123,623,445}'::int[] & '{1623,623}';
SELECT '{-1,3,1}'::int[] & '{1,2}';
--test query_int
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment