+#ifdef GSERIALIZED_ON
+-----------------------------------------------------------------------------
+-- GiST ND GEOMETRY-over-GSERIALIZED
+-----------------------------------------------------------------------------
+
+
+-- ---------- ---------- ---------- ---------- ---------- ---------- ----------
+-- GiST Support Functions
+-- ---------- ---------- ---------- ---------- ---------- ---------- ----------
+
+-- Availability: 2.0.0
+CREATE OR REPLACE FUNCTION geometry_gist_consistent_nd(internal,geometry,int4)
+ RETURNS bool
+ AS 'MODULE_PATHNAME' ,'gserialized_gist_consistent'
+ LANGUAGE 'C';
+
+-- Availability: 2.0.0
+CREATE OR REPLACE FUNCTION geometry_gist_compress_nd(internal)
+ RETURNS internal
+ AS 'MODULE_PATHNAME','gserialized_gist_compress'
+ LANGUAGE 'C';
+
+-- Availability: 2.0.0
+CREATE OR REPLACE FUNCTION geometry_gist_penalty_nd(internal,internal,internal)
+ RETURNS internal
+ AS 'MODULE_PATHNAME' ,'gserialized_gist_penalty'
+ LANGUAGE 'C';
+
+-- Availability: 2.0.0
+CREATE OR REPLACE FUNCTION geometry_gist_picksplit_nd(internal, internal)
+ RETURNS internal
+ AS 'MODULE_PATHNAME' ,'gserialized_gist_picksplit'
+ LANGUAGE 'C';
+
+-- Availability: 2.0.0
+CREATE OR REPLACE FUNCTION geometry_gist_union_nd(bytea, internal)
+ RETURNS internal
+ AS 'MODULE_PATHNAME' ,'gserialized_gist_union'
+ LANGUAGE 'C';
+
+-- Availability: 2.0.0
+CREATE OR REPLACE FUNCTION geometry_gist_same_nd(geometry, geometry, internal)
+ RETURNS internal
+ AS 'MODULE_PATHNAME' ,'gserialized_gist_same'
+ LANGUAGE 'C';
+
+-- Availability: 2.0.0
+CREATE OR REPLACE FUNCTION geometry_gist_decompress_nd(internal)
+ RETURNS internal
+ AS 'MODULE_PATHNAME' ,'gserialized_gist_decompress'
+ LANGUAGE 'C';
+
+-- Availability: 2.0.0
+--CREATE OR REPLACE FUNCTION geometry_gist_selectivity_nd (internal, oid, internal, int4)
+-- RETURNS float8
+-- AS 'MODULE_PATHNAME', 'geometry_gist_selectivity_nd'
+-- LANGUAGE 'C';
+
+-- Availability: 2.0.0
+--CREATE OR REPLACE FUNCTION geography_gist_join_selectivity_nd(internal, oid, internal, smallint)
+-- RETURNS float8
+-- AS 'MODULE_PATHNAME', 'geometry_gist_join_selectivity_nd'
+-- LANGUAGE 'C';
+
+-- Availability: 2.0.0
+CREATE OR REPLACE FUNCTION geometry_overlaps_nd(geography, geography)
+ RETURNS boolean
+ AS 'MODULE_PATHNAME' ,'gserialized_overlaps'
+ LANGUAGE 'C' IMMUTABLE STRICT;
+
+-- Availability: 2.0.0
+CREATE OPERATOR &&& (
+ LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overlaps,
+ COMMUTATOR = '&&&'
+ ,RESTRICT = contsel, JOIN = contjoinsel
+-- ,RESTRICT = geometry_gist_selectivity_nd
+-- ,JOIN = geometry_gist_join_selectivity_nd
+);
+
+-- Availability: 2.0.0
+CREATE OPERATOR CLASS gist_geometry_ops_nd
+ FOR TYPE geometry USING GIST AS
+ STORAGE gidx,
+ OPERATOR 3 &&& ,
+-- OPERATOR 6 ~= ,
+-- OPERATOR 7 ~ ,
+-- OPERATOR 8 @ ,
+ FUNCTION 1 geometry_gist_consistent_nd (internal, geometry, int4),
+ FUNCTION 2 geometry_gist_union_nd (bytea, internal),
+ FUNCTION 3 geometry_gist_compress_nd (internal),
+ FUNCTION 4 geometry_gist_decompress_nd (internal),
+ FUNCTION 5 geometry_gist_penalty_nd (internal, internal, internal),
+ FUNCTION 6 geometry_gist_picksplit_nd (internal, internal),
+ FUNCTION 7 geometry_gist_same_nd (geometry, geometry, internal);
+
+#endif
-#undef GSERIALIZED_ON
+#define GSERIALIZED_ON
}
}
-
-
/* Calculate the volume of the union of the boxes. Avoids creating an intermediate box. */
static float gidx_union_volume(GIDX *a, GIDX *b)
{
POSTGIS_DEBUG(3, "entered function");
/* Must be able to build box for each arguement (ie, not empty geometry)
- and overlap boxes to return true. */
+ and predicate function to return true. */
if ( (gserialized_datum_get_gidx_p(gs1, gidx1) == LW_SUCCESS) &&
(gserialized_datum_get_gidx_p(gs2, gidx2) == LW_SUCCESS) &&
predicate(gidx1, gidx2) )
return LW_FALSE;
}
-/**
-* Support function. Based on two datums return true if
-* they overlap and false otherwise. Useful for fast exiting
-* in functions doing geocalculation.
-*/
-int
-gserialized_datum_overlaps(Datum gs1, Datum gs2)
-{
- /* Put aside some stack memory and use it for GIDX pointers. */
- char boxmem1[GIDX_MAX_SIZE];
- char boxmem2[GIDX_MAX_SIZE];
- GIDX *gidx1 = (GIDX*)boxmem1;
- GIDX *gidx2 = (GIDX*)boxmem2;
-
- /* Must be able to build box for each arguement (ie, not empty geometry)
- and overlap boxes to return true. */
- if ( (gserialized_datum_get_gidx_p(gs1, gidx1) == LW_SUCCESS) &&
- (gserialized_datum_get_gidx_p(gs2, gidx2) == LW_SUCCESS) &&
- gidx_overlaps(gidx1, gidx2) )
- {
- return LW_TRUE;
- }
-
- return LW_FALSE;
-}
-
-
-
/**
* Return a #GSERIALIZED with an expanded bounding box.
*/
gserialized_datum_get_gidx_p(Datum gsdatum, GIDX *gidx)
{
GSERIALIZED *gpart;
- uchar flags;
int result = LW_SUCCESS;
POSTGIS_DEBUG(4, "entered function");
** bounding box, so 40 bytes.
*/
gpart = (GSERIALIZED*)PG_DETOAST_DATUM_SLICE(gsdatum, 0, 40);
- flags = gpart->flags;
POSTGIS_DEBUGF(4, "got flags %d", gpart->flags);
/* Do we even have a serialized bounding box? */
- if ( FLAGS_GET_BBOX(flags) )
+ if ( FLAGS_GET_BBOX(gpart->flags) )
{
/* Yes! Copy it out into the GIDX! */
- const size_t size = gbox_serialized_size(flags);
+ const size_t size = gbox_serialized_size(gpart->flags);
POSTGIS_DEBUG(4, "copying box out of serialization");
memcpy(gidx->c, gpart->data, size);
SET_VARSIZE(gidx, VARHDRSZ + size);
PG_FUNCTION_INFO_V1(gserialized_overlaps);
Datum gserialized_overlaps(PG_FUNCTION_ARGS)
{
- if ( gserialized_datum_overlaps(PG_GETARG_DATUM(0),PG_GETARG_DATUM(1)) == LW_TRUE )
+ if ( gserialized_datum_predicate(PG_GETARG_DATUM(0),PG_GETARG_DATUM(1), gidx_contains) == LW_TRUE )
{
PG_RETURN_BOOL(TRUE);
}
{
elog(BTREE_SRID_MISMATCH_SEVERITY,
"Operation on two GEOMETRIES with different SRIDs\n");
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 )
- pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 )
- pfree(geom2);
+ PG_FREE_IF_COPY(geom1, 0);
+ PG_FREE_IF_COPY(geom2, 1);
PG_RETURN_NULL();
}
pglwgeom_getbox2d_p(geom1, &box1);
pglwgeom_getbox2d_p(geom2, &box2);
+ PG_FREE_IF_COPY(geom1, 0);
+ PG_FREE_IF_COPY(geom2, 1);
+
POSTGIS_DEBUG(3, "lwgeom_lt getbox2d_p passed");
if ( ! FPeq(box1.xmin , box2.xmin) )
{
elog(BTREE_SRID_MISMATCH_SEVERITY,
"Operation on two GEOMETRIES with different SRIDs\n");
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 )
- pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 )
- pfree(geom2);
+ PG_FREE_IF_COPY(geom1, 0);
+ PG_FREE_IF_COPY(geom2, 1);
PG_RETURN_NULL();
}
pglwgeom_getbox2d_p(geom1, &box1);
pglwgeom_getbox2d_p(geom2, &box2);
+ PG_FREE_IF_COPY(geom1, 0);
+ PG_FREE_IF_COPY(geom2, 1);
+
if ( ! FPeq(box1.xmin , box2.xmin) )
{
if (box1.xmin < box2.xmin)
{
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_BOOL(TRUE);
}
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_BOOL(FALSE);
}
{
if (box1.ymin < box2.ymin)
{
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_BOOL(TRUE);
}
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_BOOL(FALSE);
}
{
if (box1.xmax < box2.xmax)
{
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_BOOL(TRUE);
}
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_BOOL(FALSE);
}
{
if (box1.ymax < box2.ymax)
{
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_BOOL(TRUE);
}
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_BOOL(FALSE);
}
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
-
PG_RETURN_BOOL(TRUE);
}
PG_LWGEOM *geom2 = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
BOX2DFLOAT4 box1;
BOX2DFLOAT4 box2;
+ bool result;
POSTGIS_DEBUG(2, "lwgeom_eq called");
{
elog(BTREE_SRID_MISMATCH_SEVERITY,
"Operation on two GEOMETRIES with different SRIDs\n");
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 )
- pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 )
- pfree(geom2);
+ PG_FREE_IF_COPY(geom1, 0);
+ PG_FREE_IF_COPY(geom2, 1);
PG_RETURN_NULL();
}
pglwgeom_getbox2d_p(geom1, &box1);
pglwgeom_getbox2d_p(geom2, &box2);
+ PG_FREE_IF_COPY(geom1, 0);
+ PG_FREE_IF_COPY(geom2, 1);
- if ( ! FPeq(box1.xmin , box2.xmin) )
- {
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
- PG_RETURN_BOOL(FALSE);
- }
-
- if ( ! FPeq(box1.ymin , box2.ymin) )
- {
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
- PG_RETURN_BOOL(FALSE);
- }
-
- if ( ! FPeq(box1.xmax , box2.xmax) )
+ if ( ! (FPeq(box1.xmin, box2.xmin) && FPeq(box1.ymin, box2.ymin) &&
+ FPeq(box1.xmax, box2.xmax) && FPeq(box1.ymax, box2.ymax)) )
{
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
- PG_RETURN_BOOL(FALSE);
+ result = FALSE;
}
-
- if ( ! FPeq(box1.ymax , box2.ymax) )
+ else
{
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
- PG_RETURN_BOOL(FALSE);
+ result = TRUE;
}
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
-
- PG_RETURN_BOOL(TRUE);
+ PG_RETURN_BOOL(result);
}
PG_FUNCTION_INFO_V1(lwgeom_ge);
{
elog(BTREE_SRID_MISMATCH_SEVERITY,
"Operation on two GEOMETRIES with different SRIDs\n");
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 )
- pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 )
- pfree(geom2);
+ PG_FREE_IF_COPY(geom1, 0);
+ PG_FREE_IF_COPY(geom2, 1);
PG_RETURN_NULL();
}
pglwgeom_getbox2d_p(geom1, &box1);
pglwgeom_getbox2d_p(geom2, &box2);
+ PG_FREE_IF_COPY(geom1, 0);
+ PG_FREE_IF_COPY(geom2, 1);
+
if ( ! FPeq(box1.xmin , box2.xmin) )
{
if (box1.xmin > box2.xmin)
{
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_BOOL(TRUE);
}
PG_RETURN_BOOL(FALSE);
{
if (box1.ymin > box2.ymin)
{
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_BOOL(TRUE);
}
PG_RETURN_BOOL(FALSE);
{
if (box1.xmax > box2.xmax)
{
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_BOOL(TRUE);
}
PG_RETURN_BOOL(FALSE);
{
if (box1.ymax > box2.ymax)
{
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_BOOL(TRUE);
}
PG_RETURN_BOOL(FALSE);
}
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
-
PG_RETURN_BOOL(TRUE);
}
{
elog(BTREE_SRID_MISMATCH_SEVERITY,
"Operation on two GEOMETRIES with different SRIDs\n");
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 )
- pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 )
- pfree(geom2);
+ PG_FREE_IF_COPY(geom1, 0);
+ PG_FREE_IF_COPY(geom2, 1);
PG_RETURN_NULL();
}
pglwgeom_getbox2d_p(geom1, &box1);
pglwgeom_getbox2d_p(geom2, &box2);
+ PG_FREE_IF_COPY(geom1, 0);
+ PG_FREE_IF_COPY(geom2, 1);
+
if ( ! FPeq(box1.xmin , box2.xmin) )
{
if (box1.xmin > box2.xmin)
{
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_BOOL(TRUE);
}
}
{
if (box1.ymin > box2.ymin)
{
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_BOOL(TRUE);
}
}
{
if (box1.xmax > box2.xmax)
{
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_BOOL(TRUE);
}
}
{
if (box1.ymax > box2.ymax)
{
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_BOOL(TRUE);
}
}
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
-
PG_RETURN_BOOL(FALSE);
}
{
elog(BTREE_SRID_MISMATCH_SEVERITY,
"Operation on two GEOMETRIES with different SRIDs\n");
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 )
- pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 )
- pfree(geom2);
+ PG_FREE_IF_COPY(geom1, 0);
+ PG_FREE_IF_COPY(geom2, 1);
PG_RETURN_NULL();
}
pglwgeom_getbox2d_p(geom1, &box1);
pglwgeom_getbox2d_p(geom2, &box2);
+ PG_FREE_IF_COPY(geom1, 0);
+ PG_FREE_IF_COPY(geom2, 1);
+
if ( ! FPeq(box1.xmin , box2.xmin) )
{
if (box1.xmin < box2.xmin)
{
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_INT32(-1);
}
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_INT32(1);
}
{
if (box1.ymin < box2.ymin)
{
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_INT32(-1);
}
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_INT32(1);
}
{
if (box1.xmax < box2.xmax)
{
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_INT32(-1);
}
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_INT32(1);
}
{
if (box1.ymax < box2.ymax)
{
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_INT32(-1);
}
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
PG_RETURN_INT32(1);
}
- if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
- if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
-
PG_RETURN_INT32(0);
}
\r
#ifdef GSERIALIZED_ON\r
-----------------------------------------------------------------------------\r
--- GiST GEOMETRY-over-GSERIALIZED\r
+-- GiST 2D GEOMETRY-over-GSERIALIZED\r
-----------------------------------------------------------------------------\r
--\r
-- Box2Df type is used by the GiST index bindings. \r
-- In/out functions are stubs, as all access should be internal.\r
---\r
--- Availability: 1.5.0\r
+-- Availability: 2.0.0\r
CREATE OR REPLACE FUNCTION box2df_in(cstring)\r
RETURNS box2df\r
AS 'MODULE_PATHNAME','box2df_in'\r
LANGUAGE 'C' IMMUTABLE STRICT; \r
\r
--- Availability: 1.5.0\r
+-- Availability: 2.0.0\r
CREATE OR REPLACE FUNCTION box2df_out(box2df)\r
RETURNS cstring\r
AS 'MODULE_PATHNAME','box2df_out'\r
LANGUAGE 'C' IMMUTABLE STRICT; \r
\r
--- Availability: 1.5.0\r
+-- Availability: 2.0.0\r
CREATE TYPE box2df (\r
internallength = 16,\r
input = box2df_in,\r
LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overlaps,\r
COMMUTATOR = '&&'\r
,RESTRICT = contsel, JOIN = contjoinsel\r
--- ,RESTRICT = geometry_gist_sel, JOIN = geometry_gist_joinsel \r
+-- ,RESTRICT = geometry_gist_sel_2d, JOIN = geometry_gist_joinsel_2d \r
);\r
\r
+-- Availability: 2.0.0\r
CREATE OR REPLACE FUNCTION geometry_same(geometry, geometry) \r
RETURNS boolean \r
AS 'MODULE_PATHNAME' ,'gserialized_same_2d'\r
RESTRICT = contsel, JOIN = contjoinsel\r
);\r
\r
+-- Availability: 2.0.0\r
CREATE OR REPLACE FUNCTION geometry_contains(geometry, geometry)\r
RETURNS bool\r
AS 'MODULE_PATHNAME', 'gserialized_contains_2d'\r
LANGUAGE 'C' IMMUTABLE STRICT;\r
\r
+-- Availability: 2.0.0\r
CREATE OR REPLACE FUNCTION geometry_within(geometry, geometry)\r
RETURNS bool\r
AS 'MODULE_PATHNAME', 'gserialized_within'\r
RESTRICT = contsel, JOIN = contjoinsel\r
);\r
\r
+-- Availability: 2.0.0\r
CREATE OR REPLACE FUNCTION geometry_left(geometry, geometry)\r
RETURNS bool\r
AS 'MODULE_PATHNAME', 'gserialized_left_2d'\r
RESTRICT = positionsel, JOIN = positionjoinsel\r
);\r
\r
+-- Availability: 2.0.0\r
CREATE OR REPLACE FUNCTION geometry_overleft(geometry, geometry)\r
RETURNS bool\r
AS 'MODULE_PATHNAME', 'gserialized_overleft_2d'\r
RESTRICT = positionsel, JOIN = positionjoinsel\r
);\r
\r
+-- Availability: 2.0.0\r
CREATE OR REPLACE FUNCTION geometry_below(geometry, geometry)\r
RETURNS bool\r
AS 'MODULE_PATHNAME', 'gserialized_below_2d'\r
RESTRICT = positionsel, JOIN = positionjoinsel\r
);\r
\r
+-- Availability: 2.0.0\r
CREATE OR REPLACE FUNCTION geometry_overbelow(geometry, geometry)\r
RETURNS bool\r
AS 'MODULE_PATHNAME', 'gserialized_overbelow_2d'\r
RESTRICT = positionsel, JOIN = positionjoinsel\r
);\r
\r
+-- Availability: 2.0.0\r
CREATE OR REPLACE FUNCTION geometry_overright(geometry, geometry)\r
RETURNS bool\r
AS 'MODULE_PATHNAME', 'gserialized_overright_2d'\r
RESTRICT = positionsel, JOIN = positionjoinsel\r
);\r
\r
+-- Availability: 2.0.0\r
CREATE OR REPLACE FUNCTION geometry_right(geometry, geometry)\r
RETURNS bool\r
AS 'MODULE_PATHNAME', 'gserialized_right_2d'\r
RESTRICT = positionsel, JOIN = positionjoinsel\r
);\r
\r
+-- Availability: 2.0.0\r
CREATE OR REPLACE FUNCTION geometry_overabove(geometry, geometry)\r
RETURNS bool\r
AS 'MODULE_PATHNAME', 'gserialized_overabove_2d'\r
RESTRICT = positionsel, JOIN = positionjoinsel\r
);\r
\r
+-- Availability: 2.0.0\r
CREATE OR REPLACE FUNCTION geometry_above(geometry, geometry)\r
RETURNS bool\r
AS 'MODULE_PATHNAME', 'gserialized_above_2d'\r
);\r
\r
-- Availability: 2.0.0\r
-CREATE OPERATOR CLASS gist_geometry_ops\r
+CREATE OPERATOR CLASS gist_geometry_ops_2d\r
DEFAULT FOR TYPE geometry USING GIST AS\r
STORAGE box2df,\r
OPERATOR 1 << ,\r