Thread: Re: [COMMITTERS] pgsql: Allow GiST distance function to return merely a lower-bound.
Re: [COMMITTERS] pgsql: Allow GiST distance function to return merely a lower-bound.
From
Tom Lane
Date:
Heikki Linnakangas <heikki.linnakangas@iki.fi> writes: > Allow GiST distance function to return merely a lower-bound. I wondered how come this patch did not touch nodeIndexonlyscan.c. After some investigation, it seems the only reason that this patch even appears to work is that none of the built-in or contrib opclasses support both lossy ordering operators and GIST fetch functions. Otherwise we would do an index-only scan and the executor would simply ignore the recheck flag. I doubt we can ship this in this state; even if the core code doesn't exercise the problematic combination, surely third-party opclasses will want to? I thought about hacking the planner to not select index-only scans, but there's no way for it to know whether the opclass might return recheck = true at runtime. I think the only real fix is to actually propagate all the changes in nodeIndexscan.c into nodeIndexonlyscan.c. Testing it would be problematic without a suitable opclass, though :-( A short-term hack might be to throw a "not implemented" error in nodeIndexonlyscan.c if it sees the distance-recheck flag set. regards, tom lane
Re: [COMMITTERS] pgsql: Allow GiST distance function to return merely a lower-bound.
From
Tom Lane
Date:
I wrote: > Heikki Linnakangas <heikki.linnakangas@iki.fi> writes: >> Allow GiST distance function to return merely a lower-bound. > I wondered how come this patch did not touch nodeIndexonlyscan.c. > After some investigation, it seems the only reason that this patch even > appears to work is that none of the built-in or contrib opclasses support > both lossy ordering operators and GIST fetch functions. Otherwise we > would do an index-only scan and the executor would simply ignore the > recheck flag. > I doubt we can ship this in this state; even if the core code doesn't > exercise the problematic combination, surely third-party opclasses > will want to? On further thought, maybe it's OK: we'd only be using an index-only scan if the index can return the exact value of the indexed column (as the circle and polygon GIST opclasses cannot). If it can do that, then it should be able to compute exact distances too --- worst case, it could reconstitute the column value and apply the distance operator itself. So maybe we don't need to add a pile of code for that. We do need a not-implemented error check though, so I added one. regards, tom lane