mirror of https://github.com/postgres/postgres
parent
5859215015
commit
d714560658
@ -0,0 +1,316 @@ |
||||
From pgsql-bugs-owner+M10740=pgman=candle.pha.pa.us@postgresql.org Mon Jan 24 18:00:00 2005 |
||||
Return-path: <pgsql-bugs-owner+M10740=pgman=candle.pha.pa.us@postgresql.org> |
||||
Received: from svr1.postgresql.org (svr1.postgresql.org [200.46.204.71]) |
||||
by candle.pha.pa.us (8.11.6/8.11.6) with ESMTP id j0ONxxw11019 |
||||
for <pgman@candle.pha.pa.us>; Mon, 24 Jan 2005 18:59:59 -0500 (EST) |
||||
Received: from localhost (unknown [200.46.204.144]) |
||||
by svr1.postgresql.org (Postfix) with ESMTP id 182703A4CB1 |
||||
for <pgman@candle.pha.pa.us>; Mon, 24 Jan 2005 23:59:55 +0000 (GMT) |
||||
Received: from svr1.postgresql.org ([200.46.204.71]) |
||||
by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) |
||||
with ESMTP id 38013-02 for <pgman@candle.pha.pa.us>; |
||||
Mon, 24 Jan 2005 23:59:53 +0000 (GMT) |
||||
Received: from postgresql.org (svr1.postgresql.org [200.46.204.71]) |
||||
by svr1.postgresql.org (Postfix) with ESMTP id 4B17E3A4B12 |
||||
for <pgman@candle.pha.pa.us>; Mon, 24 Jan 2005 23:59:54 +0000 (GMT) |
||||
X-Original-To: pgsql-bugs-postgresql.org@localhost.postgresql.org |
||||
Received: from localhost (unknown [200.46.204.144]) |
||||
by svr1.postgresql.org (Postfix) with ESMTP id E7E323A53D0 |
||||
for <pgsql-bugs-postgresql.org@localhost.postgresql.org>; Mon, 24 Jan 2005 23:44:58 +0000 (GMT) |
||||
Received: from svr1.postgresql.org ([200.46.204.71]) |
||||
by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) |
||||
with ESMTP id 14037-08 |
||||
for <pgsql-bugs-postgresql.org@localhost.postgresql.org>; |
||||
Mon, 24 Jan 2005 23:44:45 +0000 (GMT) |
||||
Received: by svr1.postgresql.org (Postfix, from userid 1001) |
||||
id 1C2D53A585A; Tue, 25 Jan 2005 00:59:20 +0000 (GMT) |
||||
Received: from floppy.pyrenet.fr (floppy.pyrenet.fr [194.250.190.2]) |
||||
by svr1.postgresql.org (Postfix) with ESMTP id C0CB23A573E |
||||
for <pgsql-bugs@postgresql.org>; Mon, 24 Jan 2005 23:29:17 +0000 (GMT) |
||||
Received: by floppy.pyrenet.fr (Postfix, from userid 106) |
||||
id EF14E31D91; Tue, 25 Jan 2005 00:29:16 +0100 (MET) |
||||
From: Andrew - Supernews <andrew+nonews@supernews.com> |
||||
X-Newsgroups: pgsql.bugs |
||||
Subject: [BUGS] incorrect index behaviour with rtree on box values |
||||
Date: Mon, 24 Jan 2005 23:29:12 -0000 |
||||
Organization: http://www.supernews.com - all your nntp are belong to us |
||||
Message-ID: <slrncvb167.5vn.andrew+nonews@trinity.supernews.net> |
||||
Reply-To: andrew@supernews.com |
||||
User-Agent: slrn/0.9.8.0 (FreeBSD) |
||||
X-Complaints-To: abuse@supernews.com |
||||
Lines: 56 |
||||
To: pgsql-bugs@postgresql.org |
||||
X-Virus-Scanned: by amavisd-new at hub.org |
||||
X-Mailing-List: pgsql-bugs |
||||
Precedence: bulk |
||||
Sender: pgsql-bugs-owner@postgresql.org |
||||
X-Virus-Scanned: by amavisd-new at hub.org |
||||
X-Spam-Checker-Version: SpamAssassin 2.61 (1.212.2.1-2003-12-09-exp) on |
||||
candle.pha.pa.us |
||||
X-Spam-Status: No, hits=-4.9 required=5.0 tests=BAYES_00 autolearn=ham |
||||
version=2.61 |
||||
Status: OR |
||||
|
||||
Testcase: |
||||
|
||||
create table boxtest (a box); |
||||
create index boxtest_idx on boxtest using rtree (a); |
||||
|
||||
create function gen_data() returns void as ' |
||||
begin for i in 1..200 loop |
||||
insert into boxtest |
||||
values (box(point((i*2-1)::float,0),point((i*2)::float,1))); |
||||
end loop; |
||||
return; |
||||
end;' language plpgsql; |
||||
|
||||
select gen_data(); |
||||
analyze boxtest; |
||||
|
||||
set enable_seqscan = false; |
||||
set enable_bitmapscan = true; |
||||
set enable_indexscan = true; |
||||
select * from boxtest where a << '(3,0),(3,1)'::box; |
||||
set enable_seqscan = true; |
||||
set enable_bitmapscan = false; |
||||
set enable_indexscan = false; |
||||
select * from boxtest where a << '(3,0),(3,1)'::box; |
||||
|
||||
|
||||
Those two selects at the end should clearly return the same result, a |
||||
single row. In fact, what happens is that the second returns no rows at |
||||
all; I tested this on 7.4.6, but others have confirmed this on everything |
||||
from 7.3 to latest. |
||||
|
||||
The problem is that the semantics of the &< and &> operators for the box |
||||
type are not what rtree needs for the "OverLeft" and "OverRight" slots of |
||||
the operator class. Specifically, what rtree needs is this: |
||||
|
||||
if X << K or X &< K |
||||
then for all A where A is a union of values including X, |
||||
then A &< K |
||||
|
||||
(the designation "&<" is of course arbitrary, what matters is what operator |
||||
is placed in the applicable slot of the opclass. Same goes for >> and &>.) |
||||
|
||||
This is because rtree converts (see rtstrat.c) the original "Left" operator |
||||
to an "OverLeft" when comparing against internal nodes of the index, which |
||||
contain values which are the union of all values in their subtree. In the |
||||
testcase, the top node of the tree contains as its first entry a union |
||||
value of the form (184,1),(1,0), which the scan then rejects since |
||||
(184,1),(1,0) &< (3,0),(3,1) is false. |
||||
|
||||
I can see three possible approaches to fixing this: |
||||
|
||||
1) change the semantics of &< and &> to match rtree's expectations |
||||
|
||||
2) replace &< and &> in the opclass with operators that behave as rtree |
||||
expects (this will have the side effect of rendering &< and &> un-indexable) |
||||
|
||||
3) change rtree's behaviour in some way. |
||||
|
||||
-- |
||||
Andrew, Supernews |
||||
http://www.supernews.com - individual and corporate NNTP services |
||||
|
||||
---------------------------(end of broadcast)--------------------------- |
||||
TIP 2: you can get off all lists at once with the unregister command |
||||
(send "unregister YourEmailAddressHere" to majordomo@postgresql.org) |
||||
|
||||
From pgsql-bugs-owner+M10748=pgman=candle.pha.pa.us@postgresql.org Mon Jan 24 18:57:46 2005 |
||||
Return-path: <pgsql-bugs-owner+M10748=pgman=candle.pha.pa.us@postgresql.org> |
||||
Received: from svr1.postgresql.org (svr1.postgresql.org [200.46.204.71]) |
||||
by candle.pha.pa.us (8.11.6/8.11.6) with ESMTP id j0P0vjw18152 |
||||
for <pgman@candle.pha.pa.us>; Mon, 24 Jan 2005 19:57:45 -0500 (EST) |
||||
Received: from localhost (unknown [200.46.204.144]) |
||||
by svr1.postgresql.org (Postfix) with ESMTP id 1CD183A52F3 |
||||
for <pgman@candle.pha.pa.us>; Tue, 25 Jan 2005 00:57:41 +0000 (GMT) |
||||
Received: from svr1.postgresql.org ([200.46.204.71]) |
||||
by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) |
||||
with ESMTP id 43652-07 for <pgman@candle.pha.pa.us>; |
||||
Tue, 25 Jan 2005 00:57:39 +0000 (GMT) |
||||
Received: from postgresql.org (svr1.postgresql.org [200.46.204.71]) |
||||
by svr1.postgresql.org (Postfix) with ESMTP id 9FEA63A52C5 |
||||
for <pgman@candle.pha.pa.us>; Tue, 25 Jan 2005 00:57:40 +0000 (GMT) |
||||
X-Original-To: pgsql-bugs-postgresql.org@localhost.postgresql.org |
||||
Received: from localhost (unknown [200.46.204.144]) |
||||
by svr1.postgresql.org (Postfix) with ESMTP id 3E2AF3A1A35 |
||||
for <pgsql-bugs-postgresql.org@localhost.postgresql.org>; Tue, 25 Jan 2005 00:09:47 +0000 (GMT) |
||||
Received: from svr1.postgresql.org ([200.46.204.71]) |
||||
by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) |
||||
with ESMTP id 39621-06 |
||||
for <pgsql-bugs-postgresql.org@localhost.postgresql.org>; |
||||
Tue, 25 Jan 2005 00:09:42 +0000 (GMT) |
||||
Received: from sss.pgh.pa.us (sss.pgh.pa.us [66.207.139.130]) |
||||
by svr1.postgresql.org (Postfix) with ESMTP id CAB643A19B8 |
||||
for <pgsql-bugs@postgresql.org>; Tue, 25 Jan 2005 00:09:41 +0000 (GMT) |
||||
Received: from sss2.sss.pgh.pa.us (tgl@localhost [127.0.0.1]) |
||||
by sss.pgh.pa.us (8.13.1/8.13.1) with ESMTP id j0P09fcc027307; |
||||
Mon, 24 Jan 2005 19:09:42 -0500 (EST) |
||||
To: andrew@supernews.com |
||||
cc: pgsql-bugs@postgresql.org |
||||
Subject: Re: [BUGS] incorrect index behaviour with rtree on box values |
||||
In-Reply-To: <slrncvb167.5vn.andrew+nonews@trinity.supernews.net> |
||||
References: <slrncvb167.5vn.andrew+nonews@trinity.supernews.net> |
||||
Comments: In-reply-to Andrew - Supernews <andrew+nonews@supernews.com> |
||||
message dated "Mon, 24 Jan 2005 23:29:12 +0000" |
||||
Date: Mon, 24 Jan 2005 19:09:41 -0500 |
||||
Message-ID: <27306.1106611781@sss.pgh.pa.us> |
||||
From: Tom Lane <tgl@sss.pgh.pa.us> |
||||
X-Virus-Scanned: by amavisd-new at hub.org |
||||
X-Mailing-List: pgsql-bugs |
||||
Precedence: bulk |
||||
Sender: pgsql-bugs-owner@postgresql.org |
||||
X-Virus-Scanned: by amavisd-new at hub.org |
||||
Status: OR |
||||
|
||||
Andrew - Supernews <andrew+nonews@supernews.com> writes: |
||||
> The problem is that the semantics of the &< and &> operators for the box |
||||
> type are not what rtree needs for the "OverLeft" and "OverRight" slots of |
||||
> the operator class. |
||||
|
||||
This was observed nearly a year ago, see this thread: |
||||
http://archives.postgresql.org/pgsql-general/2004-03/msg01135.php |
||||
|
||||
but apparently no one cares enough to fix it. Are you volunteering? |
||||
|
||||
regards, tom lane |
||||
|
||||
---------------------------(end of broadcast)--------------------------- |
||||
TIP 8: explain analyze is your friend |
||||
|
||||
From pgsql-bugs-owner+M10762=pgman=candle.pha.pa.us@postgresql.org Wed Jan 26 08:56:08 2005 |
||||
Return-path: <pgsql-bugs-owner+M10762=pgman=candle.pha.pa.us@postgresql.org> |
||||
Received: from svr1.postgresql.org (svr1.postgresql.org [200.46.204.71]) |
||||
by candle.pha.pa.us (8.11.6/8.11.6) with ESMTP id j0QEu6w07027 |
||||
for <pgman@candle.pha.pa.us>; Wed, 26 Jan 2005 09:56:07 -0500 (EST) |
||||
Received: from localhost (unknown [200.46.204.144]) |
||||
by svr1.postgresql.org (Postfix) with ESMTP id 86BC83A5C12 |
||||
for <pgman@candle.pha.pa.us>; Wed, 26 Jan 2005 14:56:02 +0000 (GMT) |
||||
Received: from svr1.postgresql.org ([200.46.204.71]) |
||||
by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) |
||||
with ESMTP id 26111-04 for <pgman@candle.pha.pa.us>; |
||||
Wed, 26 Jan 2005 14:55:58 +0000 (GMT) |
||||
Received: from postgresql.org (svr1.postgresql.org [200.46.204.71]) |
||||
by svr1.postgresql.org (Postfix) with ESMTP id 5329B3A5C0B |
||||
for <pgman@candle.pha.pa.us>; Wed, 26 Jan 2005 14:56:02 +0000 (GMT) |
||||
X-Original-To: pgsql-bugs-postgresql.org@localhost.postgresql.org |
||||
Received: from localhost (unknown [200.46.204.144]) |
||||
by svr1.postgresql.org (Postfix) with ESMTP id 3C43C3A5801 |
||||
for <pgsql-bugs-postgresql.org@localhost.postgresql.org>; Wed, 26 Jan 2005 14:54:51 +0000 (GMT) |
||||
Received: from svr1.postgresql.org ([200.46.204.71]) |
||||
by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) |
||||
with ESMTP id 25627-10 |
||||
for <pgsql-bugs-postgresql.org@localhost.postgresql.org>; |
||||
Wed, 26 Jan 2005 14:54:39 +0000 (GMT) |
||||
Received: from floppy.pyrenet.fr (floppy.pyrenet.fr [194.250.190.2]) |
||||
by svr1.postgresql.org (Postfix) with ESMTP id 17AD33A516B |
||||
for <pgsql-bugs@postgresql.org>; Wed, 26 Jan 2005 14:54:42 +0000 (GMT) |
||||
Received: by floppy.pyrenet.fr (Postfix, from userid 106) |
||||
id F3BF931D93; Wed, 26 Jan 2005 15:54:43 +0100 (MET) |
||||
From: Andrew - Supernews <andrew+nonews@supernews.com> |
||||
X-Newsgroups: pgsql.bugs |
||||
Subject: Re: [BUGS] incorrect index behaviour with rtree on box values |
||||
Date: Wed, 26 Jan 2005 14:54:41 -0000 |
||||
Organization: http://www.supernews.com - all your nntp are belong to us |
||||
Message-ID: <slrncvfbph.5vn.andrew+nonews@trinity.supernews.net> |
||||
References: <slrncvb167.5vn.andrew+nonews@trinity.supernews.net> <27306.1106611781@sss.pgh.pa.us> |
||||
Reply-To: andrew@supernews.com |
||||
User-Agent: slrn/0.9.8.0 (FreeBSD) |
||||
X-Complaints-To: abuse@supernews.com |
||||
Lines: 79 |
||||
To: pgsql-bugs@postgresql.org |
||||
X-Virus-Scanned: by amavisd-new at hub.org |
||||
X-Mailing-List: pgsql-bugs |
||||
Precedence: bulk |
||||
Sender: pgsql-bugs-owner@postgresql.org |
||||
X-Virus-Scanned: by amavisd-new at hub.org |
||||
X-Spam-Checker-Version: SpamAssassin 2.61 (1.212.2.1-2003-12-09-exp) on |
||||
candle.pha.pa.us |
||||
X-Spam-Status: No, hits=-4.9 required=5.0 tests=BAYES_00 autolearn=ham |
||||
version=2.61 |
||||
Status: OR |
||||
|
||||
On 2005-01-25, Tom Lane <tgl@sss.pgh.pa.us> wrote: |
||||
> Andrew - Supernews <andrew+nonews@supernews.com> writes: |
||||
>> The problem is that the semantics of the &< and &> operators for the box |
||||
>> type are not what rtree needs for the "OverLeft" and "OverRight" slots of |
||||
>> the operator class. |
||||
> |
||||
> This was observed nearly a year ago, see this thread: |
||||
> http://archives.postgresql.org/pgsql-general/2004-03/msg01135.php |
||||
> |
||||
> but apparently no one cares enough to fix it. Are you volunteering? |
||||
|
||||
Possibly. I don't feel comfortable with changing anything specific to the |
||||
geometric operators, since (a) I don't actually use them (I discovered |
||||
this issue when adding rtree support to a type of my own) and (b) the |
||||
compatibility implications are obvious. But I think there is a solution |
||||
that involves only changes to the rtree strategy code. |
||||
|
||||
Looking at the earlier discussion: it seems to have ended with the |
||||
conclusion that &< should mean "does not extend to the right of", which |
||||
matches the current implementation for box, but not for some other types. |
||||
|
||||
So for box values, we seem (and someone please correct me if I'm wrong) to |
||||
have the following semantics: |
||||
|
||||
a << b - a is strictly left of b, i.e. a.right < b.left |
||||
a &< b - a is no further right than b, i.e. a.right <= b.right |
||||
a &> b - a is no further left than b, i.e. a.left >= b.left |
||||
a >> b - a is strictly right of b, i.e. a.left > b.right |
||||
|
||||
For rtree to work as apparently intended, it needs four more operators, |
||||
to use for inner nodes when the scan operator is one of the above four. |
||||
However, a small modification to the way that the internal scan key is |
||||
initialised should eliminate the requirement to explicitly specify these |
||||
operators, which strikes me as the solution which preserves maximum |
||||
compatibility. The four operators required are: |
||||
|
||||
NOT (a &> b) (used when the scan operator is (a << b)) |
||||
NOT (a >> b) (used when the scan operator is (a &< b)) |
||||
NOT (a << b) (used when the scan operator is (a &> b)) |
||||
NOT (a &< b) (used when the scan operator is (a >> b)) |
||||
|
||||
(This won't fix rtree on contrib/seg or contrib/cube, but those appear to be |
||||
broken already since they have different, and equally incorrect, definitions |
||||
of &> and &<. Fixing those would require slightly more complex operators, |
||||
such as NOT (a &> b OR a >> b) and so on. The more complex operators would |
||||
work for box too, so it might be worth using them anyway, but I don't yet |
||||
understand the scan key handling well enough to know if these can be |
||||
constructed rather than supplied in the opclass.) |
||||
|
||||
Proof: |
||||
|
||||
Let V be the scan key, i.e. the value we are searching for in the index. |
||||
Let U be a union over a set of values. |
||||
Let X be some value for which X OP V holds. |
||||
|
||||
Consider an internal node entry with union U. We require that the following |
||||
holds: if U contains some value X where X OP V holds, then U OP' V must be |
||||
true. (But not the converse; U OP' V may be true even if no such X exists in |
||||
U. However, we wish it to be false as much as possible for efficiency.) |
||||
|
||||
When OP is << : |
||||
|
||||
X << V, therefore X.right < V.left, therefore X.left < V.left |
||||
therefore NOT (X &> V) |
||||
|
||||
If U contains X, then U &> V is true iff U.left >= V.left |
||||
|
||||
U.left <= min(E.left) for all elements E of U, and therefore for X if X in U |
||||
|
||||
So if X in U, then U.left <= X.left < V.left, and therefore NOT (U &> V) |
||||
|
||||
When OP is &< : |
||||
|
||||
X &< V, therefore X.right <= V.right, therefore X.left <= V.right |
||||
therefore NOT (X >> V), and similar reasoning for U containing X as above. |
||||
|
||||
-- |
||||
Andrew, Supernews |
||||
http://www.supernews.com - individual and corporate NNTP services |
||||
|
||||
---------------------------(end of broadcast)--------------------------- |
||||
TIP 7: don't forget to increase your free space map settings |
||||
|
||||
Loading…
Reference in new issue