GIN overlap vs empty arrays

Started by Jeffabout 16 years ago3 messagesbugs
Jump to latest
#1Jeff
threshar@torgo.978.org

Ran into this and I'm trying to decide if this is functioning as
designed or if this is a bug that should be fixed: (PG 8.4.2)

create table gintest
(
idList int[],
foo text
);

create index gintest_gin_idx on gintest using gin(idList gin__int_ops);

insert into gintest(idlist, foo) values (array[1,2,3], 'bar');

select * from gintest where idList && array[]::int[];

CREATE TABLE
CREATE INDEX
INSERT 0 1
psql:ginproblem.sql:11: ERROR: GIN indexes do not support whole-index
scans

I came across this in a production setting and widdled it down to
this. In a nutshell using overlap with an empty (not null) array
causes this error. Should there be a short circuit to bail on zero-
length input to overlap since you can't overlap with nothing. (if you
pass in a plain null it works fine).

In the production setting it is tickled by the array being produced by
a subselect that uses array_accum to gather a list of ids to pull up.

If this is the proper behavior I'll deal with it (in the end the
result is the same - no rows). Just a bit surprised by it.

--
Jeff Trout <jeff@jefftrout.com>
http://www.stuarthamm.net/
http://www.dellsmartexitin.com/

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Jeff (#1)
Re: GIN overlap vs empty arrays

Jeff <threshar@threshar.is-a-geek.com> writes:

Ran into this and I'm trying to decide if this is functioning as
designed or if this is a bug that should be fixed: (PG 8.4.2)

create table gintest
(
idList int[],
foo text
);

create index gintest_gin_idx on gintest using gin(idList gin__int_ops);

insert into gintest(idlist, foo) values (array[1,2,3], 'bar');

select * from gintest where idList && array[]::int[];

CREATE TABLE
CREATE INDEX
INSERT 0 1
psql:ginproblem.sql:11: ERROR: GIN indexes do not support whole-index
scans

Hmm, that case is supposed to work, in 8.3 and later ... but it doesn't
because of a stupid typo in contrib/intarray.

Index: _int_gin.c
===================================================================
RCS file: /cvsroot/pgsql/contrib/intarray/_int_gin.c,v
retrieving revision 1.10
diff -c -r1.10 _int_gin.c
*** _int_gin.c	11 Jun 2009 14:48:51 -0000	1.10
--- _int_gin.c	25 Mar 2010 15:37:56 -0000
***************
*** 65,71 ****
  		}
  	}
! 	if (nentries == 0)
  	{
  		switch (strategy)
  		{
--- 65,71 ----
  		}
  	}

! if (*nentries == 0)
{
switch (strategy)
{

Sometimes C is not the most helpful language to work in.

regards, tom lane

#3Jeff
threshar@torgo.978.org
In reply to: Tom Lane (#2)
Re: GIN overlap vs empty arrays

On Mar 25, 2010, at 11:44 AM, Tom Lane wrote:

Hmm, that case is supposed to work, in 8.3 and later ... but it
doesn't
because of a stupid typo in contrib/intarray.

This works. -
thanks!

--
Jeff Trout <jeff@jefftrout.com>
http://www.stuarthamm.net/
http://www.dellsmartexitin.com/