Обсуждение: GIN overlap vs empty arrays
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/
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
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/