From bb8563c6273ab358ac8b8db5d3b94a2833ab8345 Mon Sep 17 00:00:00 2001 From: Paul Ramsey Date: Wed, 14 Nov 2012 23:01:32 +0000 Subject: [PATCH] #2035, Strange behavior when using left (<<) and right (>>) operators git-svn-id: http://svn.osgeo.org/postgis/trunk@10677 b70326c6-7e19-0410-871a-916f4a2858ee --- postgis/gserialized_gist_2d.c | 62 +++++++++++++++++++++++++++++++++++ regress/tickets.sql | 35 ++++++++++++++++++++ regress/tickets_expected | 2 ++ 3 files changed, 99 insertions(+) diff --git a/postgis/gserialized_gist_2d.c b/postgis/gserialized_gist_2d.c index 1b3c5e0a5..ef3be4dfd 100644 --- a/postgis/gserialized_gist_2d.c +++ b/postgis/gserialized_gist_2d.c @@ -848,6 +848,8 @@ static inline bool gserialized_gist_consistent_leaf_2d(BOX2DF *key, BOX2DF *quer switch (strategy) { + + /* Basic overlaps */ case RTOverlapStrategyNumber: retval = (bool) box2df_overlaps(key, query); break; @@ -862,6 +864,35 @@ static inline bool gserialized_gist_consistent_leaf_2d(BOX2DF *key, BOX2DF *quer case RTOldContainedByStrategyNumber: retval = (bool) box2df_contains(query, key); break; + + /* To one side */ + case RTAboveStrategyNumber: + retval = (bool) box2df_above(key, query); + break; + case RTBelowStrategyNumber: + retval = (bool) box2df_below(key, query); + break; + case RTRightStrategyNumber: + retval = (bool) box2df_right(key, query); + break; + case RTLeftStrategyNumber: + retval = (bool) box2df_left(key, query); + break; + + /* Overlapping to one side */ + case RTOverAboveStrategyNumber: + retval = (bool) box2df_overabove(key, query); + break; + case RTOverBelowStrategyNumber: + retval = (bool) box2df_overbelow(key, query); + break; + case RTOverRightStrategyNumber: + retval = (bool) box2df_overright(key, query); + break; + case RTOverLeftStrategyNumber: + retval = (bool) box2df_overleft(key, query); + break; + default: retval = FALSE; } @@ -881,6 +912,8 @@ static inline bool gserialized_gist_consistent_internal_2d(BOX2DF *key, BOX2DF * switch (strategy) { + + /* Basic overlaps */ case RTOverlapStrategyNumber: retval = (bool) box2df_overlaps(key, query); break; @@ -893,6 +926,35 @@ static inline bool gserialized_gist_consistent_internal_2d(BOX2DF *key, BOX2DF * case RTOldContainedByStrategyNumber: retval = (bool) box2df_overlaps(key, query); break; + + /* To one side */ + case RTAboveStrategyNumber: + retval = (bool)(!box2df_overbelow(key, query)); + break; + case RTBelowStrategyNumber: + retval = (bool)(!box2df_overabove(key, query)); + break; + case RTRightStrategyNumber: + retval = (bool)(!box2df_overleft(key, query)); + break; + case RTLeftStrategyNumber: + retval = (bool)(!box2df_overright(key, query)); + break; + + /* Overlapping to one side */ + case RTOverAboveStrategyNumber: + retval = (bool)(!box2df_below(key, query)); + break; + case RTOverBelowStrategyNumber: + retval = (bool)(!box2df_above(key, query)); + break; + case RTOverRightStrategyNumber: + retval = (bool)(!box2df_left(key, query)); + break; + case RTOverLeftStrategyNumber: + retval = (bool)(!box2df_right(key, query)); + break; + default: retval = FALSE; } diff --git a/regress/tickets.sql b/regress/tickets.sql index 32c8eeb95..25ba1632d 100644 --- a/regress/tickets.sql +++ b/regress/tickets.sql @@ -734,6 +734,41 @@ SELECT '#2001', ST_AsText(ST_CurveToLine(ST_GeomFromText('CURVEPOLYGON((0 0, 0 1 -- #2028 -- SELECT '#2028', ST_AsText(ST_Multi('TRIANGLE((0 0, 0 1, 1 1, 0 0))')); + +-- #2035 START ------------------------------------------------------------ + +-- Simple geographic table, with single point. +CREATE TABLE "city" ( + "id" integer, + "name" varchar(30) NOT NULL, + "point" geometry(POINT,4326) NOT NULL +); +CREATE INDEX "city_point_id" ON "city" USING GIST ( "point" ); + +-- Initial data, with points around the world. +INSERT INTO "city" (id, name, point) VALUES (1, 'Houston', 'SRID=4326;POINT(-95.363151 29.763374)'); +INSERT INTO "city" (id, name, point) VALUES (2, 'Dallas', 'SRID=4326;POINT(-95.363151 29.763374)'); +INSERT INTO "city" (id, name, point) VALUES (3, 'Oklahoma City', 'SRID=4326;POINT(-97.521157 34.464642)'); +INSERT INTO "city" (id, name, point) VALUES (4, 'Wellington', 'SRID=4326;POINT(174.783117 -41.315268)'); +INSERT INTO "city" (id, name, point) VALUES (5, 'Pueblo', 'SRID=4326;POINT(-104.609252 38.255001)'); +INSERT INTO "city" (id, name, point) VALUES (6, 'Lawrence', 'SRID=4326;POINT(-95.23506 38.971823)'); +INSERT INTO "city" (id, name, point) VALUES (7, 'Chicago', 'SRID=4326;POINT(-87.650175 41.850385)'); +INSERT INTO "city" (id, name, point) VALUES (8, 'Victoria', 'SRID=4326;POINT(-123.305196 48.462611)'); + +-- This query, or COUNT(*), does not return anything; should return 6 cities, +-- excluding Pueblo and Victoria. The Polygon is a simple approximation of +-- Colorado. +SELECT '#2035a', Count(*) FROM "city" + WHERE "city"."point" >> ST_GeomFromEWKT('SRID=4326;POLYGON ((-109.060253 36.992426, -109.060253 41.003444, -102.041524 41.003444, -102.041524 36.992426, -109.060253 36.992426))'); + +-- However, when a LIMIT is placed on statement, the query suddenly works. +SELECT '#2035b', Count(*) FROM "city" + WHERE "city"."point" >> ST_GeomFromEWKT('SRID=4326;POLYGON ((-109.060253 36.992426, -109.060253 41.003444, -102.041524 41.003444, -102.041524 36.992426, -109.060253 36.992426))') LIMIT 6; + +DROP TABLE "city"; +-- #2035 END -------------------------------------------------------------- + + -- #2084 -- SELECT '#2048', num, ST_Within('POINT(-54.394 56.522)', "the_geom"), ST_CoveredBy('POINT(-54.394 56.522)', "the_geom") FROM ( VALUES diff --git a/regress/tickets_expected b/regress/tickets_expected index 737e79da1..61547bf48 100644 --- a/regress/tickets_expected +++ b/regress/tickets_expected @@ -232,6 +232,8 @@ ERROR: invalid GML representation #1996|{"type":"Point","coordinates":[]} #2001|POLYGON((0 0,0 1,1 1,0 0)) #2028|TIN(((0 0,0 1,1 1,0 0))) +#2035a|6 +#2035b|6 #2048|1|f|f #2048|2|t|t #2048|3|f|f -- 2.40.0