]> granicus.if.org Git - postgis/commitdiff
#2035, Strange behavior when using left (<<) and right (>>) operators
authorPaul Ramsey <pramsey@cleverelephant.ca>
Wed, 14 Nov 2012 23:01:32 +0000 (23:01 +0000)
committerPaul Ramsey <pramsey@cleverelephant.ca>
Wed, 14 Nov 2012 23:01:32 +0000 (23:01 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@10677 b70326c6-7e19-0410-871a-916f4a2858ee

postgis/gserialized_gist_2d.c
regress/tickets.sql
regress/tickets_expected

index 1b3c5e0a51809977a584defbb8756589659d9df1..ef3be4dfdc304fc9ea952f74175172b4947a86d8 100644 (file)
@@ -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;
        }
index 32c8eeb95c635365c84dbd2e4f85048e90eacf6a..25ba1632dd2d8332d7b09afef9a5e8e045653086 100644 (file)
@@ -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
index 737e79da115d5e189bc17cd5fc0ee6aba81f59e3..61547bf48f6028df56caaffe7f756e6028862b77 100644 (file)
@@ -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