Datum BOX3D_combine(PG_FUNCTION_ARGS) { BOX3D *box = (BOX3D*)PG_GETARG_POINTER(0); GSERIALIZED *geom = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_POINTER(1)); LWGEOM *lwgeom = NULL; BOX3D *result = NULL; GBOX gbox; int rv; /* Can't do anything with null inputs */ if ( (box == NULL) && (geom == NULL) ) PG_RETURN_NULL(); /* Null geometry but non-null box, return the box */ if (geom == NULL) { result = palloc(sizeof(BOX3D)); memcpy(result, box, sizeof(BOX3D)); PG_RETURN_POINTER(result); } /* Deserialize geometry and *calculate( the box */ /* We can't use the cached box because it's fload, we *must* calculate */ lwgeom = lwgeom_from_gserialized(geom); rv = lwgeom_calculate_gbox(lwgeom, &gbox); lwgeom_free(lwgeom); /* If we couldn't calculate the box, return what we know */ if ( rv == LW_FAILURE ) { PG_FREE_IF_COPY(geom, 1); /* No geom box, no input box, so null return */ if ( box == NULL ) PG_RETURN_NULL(); result = palloc(sizeof(BOX3D)); memcpy(result, box, sizeof(BOX3D)); PG_RETURN_POINTER(result); } /* Null box and non-null geometry, just return the geometry box */ if ( box == NULL ) { PG_FREE_IF_COPY(geom, 1); result = box3d_from_gbox(&gbox); PG_RETURN_POINTER(result); } result = palloc(sizeof(BOX3D)); result->xmax = Max(box->xmax, gbox.xmax); result->ymax = Max(box->ymax, gbox.ymax); result->zmax = Max(box->zmax, gbox.zmax); result->xmin = Min(box->xmin, gbox.xmin); result->ymin = Min(box->ymin, gbox.ymin); result->zmin = Min(box->zmin, gbox.zmin); PG_FREE_IF_COPY(geom, 1); PG_RETURN_POINTER(result); }
Datum LWGEOM_to_BOX3D(PG_FUNCTION_ARGS) { GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); LWGEOM *lwgeom = lwgeom_from_gserialized(geom); GBOX gbox; BOX3D *result; int rv = lwgeom_calculate_gbox(lwgeom, &gbox); if ( rv == LW_FAILURE ) PG_RETURN_NULL(); result = box3d_from_gbox(&gbox); PG_RETURN_POINTER(result); }
Datum BOX2D_to_BOX3D(PG_FUNCTION_ARGS) { GBOX *box = (GBOX *)PG_GETARG_POINTER(0); BOX3D *result = box3d_from_gbox(box); PG_RETURN_POINTER(result); }