/* Install PosgreSQL handlers for liblwgeom use */
void pg_install_lwgeom_handlers(void);
-#define PG_GETARG_GSERIALIZED(varno) ((GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(varno)))
+#define PG_GETARG_GSERIALIZED_P(varno) ((GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(varno)))
/* Debugging macros */
#if POSTGIS_DEBUG_LEVEL > 0
Datum geography_eq(PG_FUNCTION_ARGS)
{
/* Perfect equals test based on hash */
- GSERIALIZED *g1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *g2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *g1 = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *g2 = PG_GETARG_GSERIALIZED_P(1);
uint32 h1 = geography_hash(g1);
uint32 h2 = geography_hash(g2);
GSERIALIZED *g = NULL;
char *hexwkb;
- g = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ g = PG_GETARG_GSERIALIZED_P(0);
lwgeom = lwgeom_from_gserialized(g);
hexwkb = lwgeom_to_hexwkb(lwgeom, WKB_EXTENDED, 0);
lwgeom_free(lwgeom);
/* Get the geography */
if ( PG_ARGISNULL(1) ) PG_RETURN_NULL();
- g = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ g = PG_GETARG_GSERIALIZED_P(1);
/* Convert to lwgeom so we can run the old functions */
lwgeom = lwgeom_from_gserialized(g);
/* Get the geometry */
if ( PG_ARGISNULL(1) ) PG_RETURN_NULL();
- g = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ g = PG_GETARG_GSERIALIZED_P(1);
/* Convert to lwgeom so we can run the old functions */
lwgeom = lwgeom_from_gserialized(g);
if ( PG_ARGISNULL(0) ) PG_RETURN_NULL();
- g = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ g = PG_GETARG_GSERIALIZED_P(0);
/* Convert to lwgeom so we can run the old functions */
lwgeom = lwgeom_from_gserialized(g);
/* Get the geography */
if (PG_ARGISNULL(1) ) PG_RETURN_NULL();
- g = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ g = PG_GETARG_GSERIALIZED_P(1);
/* Convert to lwgeom so we can run the old functions */
lwgeom = lwgeom_from_gserialized(g);
{
LWGEOM *lwgeom = NULL;
GSERIALIZED *ret = NULL;
- GSERIALIZED *g_ser = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *g_ser = PG_GETARG_GSERIALIZED_P(0);
lwgeom = lwgeom_from_gserialized(g_ser);
uint8_t *wkb;
bytea *result;
- g = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ g = PG_GETARG_GSERIALIZED_P(0);
lwgeom = lwgeom_from_gserialized(g);
wkb = lwgeom_to_wkb(lwgeom, WKB_EXTENDED, &size_result);
lwgeom_free(lwgeom);
SPHEROID s;
/* Get our geometry objects loaded into memory. */
- g1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- g2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ g1 = PG_GETARG_GSERIALIZED_P(0);
+ g2 = PG_GETARG_GSERIALIZED_P(1);
/* Read our tolerance value. */
/* tolerance = PG_GETARG_FLOAT8(2); */
SPHEROID s;
/* Get our geometry objects loaded into memory. */
- g1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- g2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ g1 = PG_GETARG_GSERIALIZED_P(0);
+ g2 = PG_GETARG_GSERIALIZED_P(1);
/* Read our tolerance value. */
tolerance = PG_GETARG_FLOAT8(2);
int dwithin = LW_FALSE;
/* Get our geometry objects loaded into memory. */
- g1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- g2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ g1 = PG_GETARG_GSERIALIZED_P(0);
+ g2 = PG_GETARG_GSERIALIZED_P(1);
/* Read our tolerance value. */
tolerance = PG_GETARG_FLOAT8(2);
SPHEROID s;
/* Get our geometry objects loaded into memory. */
- g1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- g2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ g1 = PG_GETARG_GSERIALIZED_P(0);
+ g2 = PG_GETARG_GSERIALIZED_P(1);
/* Return FALSE on empty arguments. */
if ( gserialized_is_empty(g1) || gserialized_is_empty(g2) )
SPHEROID s;
/* Get our geometry objects loaded into memory. */
- g1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- g2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ g1 = PG_GETARG_GSERIALIZED_P(0);
+ g2 = PG_GETARG_GSERIALIZED_P(1);
/* Read our tolerance value. */
tolerance = PG_GETARG_FLOAT8(2);
SPHEROID s;
/* Get our geometry object loaded into memory. */
- g = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ g = PG_GETARG_GSERIALIZED_P(0);
/* Read our calculation type */
use_spheroid = PG_GETARG_BOOL(1);
int type;
/* Get our geometry object loaded into memory. */
- g = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ g = PG_GETARG_GSERIALIZED_P(0);
/* Only return for area features. */
type = gserialized_get_type(g);
SPHEROID s;
/* Get our geometry object loaded into memory. */
- g = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ g = PG_GETARG_GSERIALIZED_P(0);
lwgeom = lwgeom_from_gserialized(g);
/* EMPTY things have no length */
POINT2D pt;
/* Get our geometry object loaded into memory. */
- g = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ g = PG_GETARG_GSERIALIZED_P(0);
/* We need the bounding box to get an outside point for area algorithm */
if ( gserialized_get_gbox_p(g, &gbox) == LW_FAILURE )
int result = LW_FALSE;
/* Get our geometry objects loaded into memory. */
- g1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- g2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ g1 = PG_GETARG_GSERIALIZED_P(0);
+ g2 = PG_GETARG_GSERIALIZED_P(1);
type1 = gserialized_get_type(g1);
type2 = gserialized_get_type(g2);
PG_RETURN_NULL();
/* Get our geometry object loaded into memory. */
- g = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ g = PG_GETARG_GSERIALIZED_P(0);
/* Only return for points. */
type = gserialized_get_type(g);
uint32_t type1, type2;
/* Get our geometry object loaded into memory. */
- g1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- g2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ g1 = PG_GETARG_GSERIALIZED_P(0);
+ g2 = PG_GETARG_GSERIALIZED_P(1);
/* Only return for points. */
type1 = gserialized_get_type(g1);
uint32_t type1;
/* Get our geometry object loaded into memory. */
- g1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ g1 = PG_GETARG_GSERIALIZED_P(0);
type1 = gserialized_get_type(g1);
/* Convert max_seg_length from metric units to radians */
if ( PG_ARGISNULL(0) )
PG_RETURN_NULL();
- geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
if ( gserialized_get_type(geom) != POINTTYPE )
elog(ERROR, "geometry_to_point only accepts Points");
if ( PG_ARGISNULL(0) )
PG_RETURN_NULL();
- geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
if ( gserialized_get_type(geom) != LINETYPE )
elog(ERROR, "geometry_to_path only accepts LineStrings");
if ( PG_ARGISNULL(0) )
PG_RETURN_NULL();
- geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
if ( gserialized_get_type(geom) != POLYGONTYPE )
elog(ERROR, "geometry_to_polygon only accepts Polygons");
PG_FUNCTION_INFO_V1(geography_enforce_typmod);
Datum geography_enforce_typmod(PG_FUNCTION_ARGS)
{
- GSERIALIZED *arg = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *arg = PG_GETARG_GSERIALIZED_P(0);
int32 typmod = PG_GETARG_INT32(1);
/* We don't need to have different behavior based on explicitness. */
/* bool isExplicit = PG_GETARG_BOOL(2); */
PG_FUNCTION_INFO_V1(geometry_enforce_typmod);
Datum geometry_enforce_typmod(PG_FUNCTION_ARGS)
{
- GSERIALIZED *arg = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *arg = PG_GETARG_GSERIALIZED_P(0);
int32 typmod = PG_GETARG_INT32(1);
/* We don't need to have different behavior based on explicitness. */
/* bool isExplicit = PG_GETARG_BOOL(2); */
#include "postgres.h"
#include "fmgr.h"
-#include "../liblwgeom/liblwgeom.h"
-
-/* for custom variables */
-#include "utils/guc.h"
+#include "utils/guc.h" /* for custom variables */
#include "../postgis_config.h"
+#include "lwgeom_pg.h"
+#include "liblwgeom.h"
+
#include "lwgeom_backend_api.h"
#include "lwgeom_geos.h"
#if HAVE_SFCGAL
Datum intersects3d_dwithin(PG_FUNCTION_ARGS)
{
double mindist;
- GSERIALIZED *geom1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *geom2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *geom1 = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
PG_FUNCTION_INFO_V1(LWGEOM_to_BOX2D);
Datum LWGEOM_to_BOX2D(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
GBOX gbox;
PG_FUNCTION_INFO_V1(LWGEOM_to_BOX2DF);
Datum LWGEOM_to_BOX2DF(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
GBOX gbox;
if ( gserialized_get_gbox_p(geom, &gbox) == LW_FAILURE )
if (box2d_ptr == NULL)
{
- lwgeom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ lwgeom = PG_GETARG_GSERIALIZED_P(1);
/* empty geom would make getbox2d_p return NULL */
if ( ! gserialized_get_gbox_p(lwgeom, &box) ) PG_RETURN_NULL();
memcpy(result, &box, sizeof(GBOX));
/*combine_bbox(BOX3D, geometry) => union(BOX3D, geometry->bvol) */
- lwgeom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ lwgeom = PG_GETARG_GSERIALIZED_P(1);
if ( ! gserialized_get_gbox_p(lwgeom, &box) )
{
/* must be the empty geom */
PG_FUNCTION_INFO_V1(BOX2D_construct);
Datum BOX2D_construct(PG_FUNCTION_ARGS)
{
- GSERIALIZED *pgmin = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *pgmax = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *pgmin = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *pgmax = PG_GETARG_GSERIALIZED_P(1);
GBOX *result;
LWPOINT *minpoint, *maxpoint;
double min, max, tmp;
PG_FUNCTION_INFO_V1(LWGEOM_to_BOX3D);
Datum LWGEOM_to_BOX3D(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
GBOX gbox;
BOX3D *result;
PG_FUNCTION_INFO_V1(BOX3D_construct);
Datum BOX3D_construct(PG_FUNCTION_ARGS)
{
- GSERIALIZED *min = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *max = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *min = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *max = PG_GETARG_GSERIALIZED_P(1);
BOX3D *result = palloc(sizeof(BOX3D));
LWGEOM *minpoint, *maxpoint;
POINT3DZ minp, maxp;
/* Get the geometry */
if ( PG_ARGISNULL(1) ) PG_RETURN_NULL();
- geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ geom = PG_GETARG_GSERIALIZED_P(1);
/* Retrieve precision if any (default is max) */
if (PG_NARGS() >2 && !PG_ARGISNULL(2))
/* Get the geometry */
if ( PG_ARGISNULL(1) ) PG_RETURN_NULL();
- geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ geom = PG_GETARG_GSERIALIZED_P(1);
/* Retrieve precision if any (default is max) */
if (PG_NARGS() >2 && !PG_ARGISNULL(2))
/* Get the geometry */
if (PG_ARGISNULL(1) ) PG_RETURN_NULL();
- geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ geom = PG_GETARG_GSERIALIZED_P(1);
/* Retrieve precision if any (default is max) */
if (PG_NARGS() >2 && !PG_ARGISNULL(2))
if ( PG_ARGISNULL(0) ) PG_RETURN_NULL();
- geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
/* check for relative path notation */
if ( PG_NARGS() > 1 && ! PG_ARGISNULL(1) )
/* Get the geometry */
if ( PG_ARGISNULL(1) ) PG_RETURN_NULL();
- geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ geom = PG_GETARG_GSERIALIZED_P(1);
/* Retrieve precision if any (default is max) */
if (PG_NARGS() >2 && !PG_ARGISNULL(2))
if ( PG_ARGISNULL(0) ) PG_RETURN_NULL();
- geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
if (gserialized_get_srid(geom) != 4326) {
PG_FREE_IF_COPY(geom, 0);
elog(ERROR, "Only SRID 4326 is supported.");
PG_FUNCTION_INFO_V1(LWGEOM_simplify2d);
Datum LWGEOM_simplify2d(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
GSERIALIZED *result;
int type = gserialized_get_type(geom);
LWGEOM *in;
PG_FUNCTION_INFO_V1(LWGEOM_SetEffectiveArea);
Datum LWGEOM_SetEffectiveArea(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
GSERIALIZED *result;
int type = gserialized_get_type(geom);
LWGEOM *in;
PG_FUNCTION_INFO_V1(LWGEOM_line_interpolate_point);
Datum LWGEOM_line_interpolate_point(PG_FUNCTION_ARGS)
{
- GSERIALIZED *gser = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *gser = PG_GETARG_GSERIALIZED_P(0);
GSERIALIZED *result;
double distance = PG_GETARG_FLOAT8(1);
LWLINE *line;
LWGEOM *out_lwgeom;
gridspec grid;
- GSERIALIZED *in_geom = PG_GETARG_GSERIALIZED(0);
+ GSERIALIZED *in_geom = PG_GETARG_GSERIALIZED_P(0);
/* Set grid values to zero to start */
memset(&grid, 0, sizeof(gridspec));
/* BOX3D box3d; */
POINT4D offsetpoint;
- in_geom = PG_GETARG_GSERIALIZED(0);
+ in_geom = PG_GETARG_GSERIALIZED_P(0);
/* Return input geometry if input geometry is empty */
if ( gserialized_is_empty(in_geom) )
PG_RETURN_POINTER(in_geom);
}
- in_point = PG_GETARG_GSERIALIZED(1);
+ in_point = PG_GETARG_GSERIALIZED_P(1);
in_lwpoint = lwgeom_as_lwpoint(lwgeom_from_gserialized(in_point));
if ( in_lwpoint == NULL )
{
int type1, type2, rv;
LWLINE *l1 = NULL;
LWLINE *l2 = NULL;
- GSERIALIZED *geom1 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *geom2 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *geom1 = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
PG_FUNCTION_INFO_V1(LWGEOM_line_substring);
Datum LWGEOM_line_substring(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
double from = PG_GETARG_FLOAT8(1);
double to = PG_GETARG_FLOAT8(2);
LWGEOM *olwgeom;
PG_FUNCTION_INFO_V1(LWGEOM_summary);
Datum LWGEOM_summary(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
char *result;
text *mytext;
LWGEOM *lwgeom;
PG_FUNCTION_INFO_V1(LWGEOM_npoints);
Datum LWGEOM_npoints(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
int npoints = 0;
PG_FUNCTION_INFO_V1(LWGEOM_nrings);
Datum LWGEOM_nrings(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
int nrings = 0;
PG_FUNCTION_INFO_V1(LWGEOM_area_polygon);
Datum LWGEOM_area_polygon(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
double area = 0.0;
PG_FUNCTION_INFO_V1(LWGEOM_length2d_linestring);
Datum LWGEOM_length2d_linestring(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
double dist = lwgeom_length_2d(lwgeom);
lwgeom_free(lwgeom);
PG_FUNCTION_INFO_V1(LWGEOM_length_linestring);
Datum LWGEOM_length_linestring(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
double dist = lwgeom_length(lwgeom);
lwgeom_free(lwgeom);
PG_FUNCTION_INFO_V1(LWGEOM_perimeter_poly);
Datum LWGEOM_perimeter_poly(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
double perimeter = 0.0;
PG_FUNCTION_INFO_V1(LWGEOM_perimeter2d_poly);
Datum LWGEOM_perimeter2d_poly(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
double perimeter = 0.0;
PG_FUNCTION_INFO_V1(LWGEOM_force_2d);
Datum LWGEOM_force_2d(PG_FUNCTION_ARGS)
{
- GSERIALIZED *pg_geom_in = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *pg_geom_in = PG_GETARG_GSERIALIZED_P(0);
GSERIALIZED *pg_geom_out;
LWGEOM *lwg_in, *lwg_out;
PG_FUNCTION_INFO_V1(LWGEOM_force_3dz);
Datum LWGEOM_force_3dz(PG_FUNCTION_ARGS)
{
- GSERIALIZED *pg_geom_in = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *pg_geom_in = PG_GETARG_GSERIALIZED_P(0);
GSERIALIZED *pg_geom_out;
LWGEOM *lwg_in, *lwg_out;
PG_FUNCTION_INFO_V1(LWGEOM_force_3dm);
Datum LWGEOM_force_3dm(PG_FUNCTION_ARGS)
{
- GSERIALIZED *pg_geom_in = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *pg_geom_in = PG_GETARG_GSERIALIZED_P(0);
GSERIALIZED *pg_geom_out;
LWGEOM *lwg_in, *lwg_out;
PG_FUNCTION_INFO_V1(LWGEOM_force_4d);
Datum LWGEOM_force_4d(PG_FUNCTION_ARGS)
{
- GSERIALIZED *pg_geom_in = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *pg_geom_in = PG_GETARG_GSERIALIZED_P(0);
GSERIALIZED *pg_geom_out;
LWGEOM *lwg_in, *lwg_out;
PG_FUNCTION_INFO_V1(LWGEOM_force_collection);
Datum LWGEOM_force_collection(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
GSERIALIZED *result;
LWGEOM **lwgeoms;
LWGEOM *lwgeom;
PG_FUNCTION_INFO_V1(LWGEOM_force_multi);
Datum LWGEOM_force_multi(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
GSERIALIZED *result;
LWGEOM *lwgeom;
LWGEOM *ogeom;
PG_FUNCTION_INFO_V1(LWGEOM_force_curve);
Datum LWGEOM_force_curve(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
GSERIALIZED *result;
LWGEOM *lwgeom;
LWGEOM *ogeom;
PG_FUNCTION_INFO_V1(LWGEOM_force_sfs);
Datum LWGEOM_force_sfs(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
GSERIALIZED *result;
LWGEOM *lwgeom;
LWGEOM *ogeom;
Datum LWGEOM_closestpoint(PG_FUNCTION_ARGS)
{
GSERIALIZED *result;
- GSERIALIZED *geom1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *geom2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *geom1 = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
LWGEOM *point;
LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
Datum LWGEOM_shortestline2d(PG_FUNCTION_ARGS)
{
GSERIALIZED *result;
- GSERIALIZED *geom1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *geom2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *geom1 = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
LWGEOM *theline;
LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
Datum LWGEOM_longestline2d(PG_FUNCTION_ARGS)
{
GSERIALIZED *result;
- GSERIALIZED *geom1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *geom2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *geom1 = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
LWGEOM *theline;
LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
Datum LWGEOM_mindistance2d(PG_FUNCTION_ARGS)
{
double mindist;
- GSERIALIZED *geom1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *geom2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *geom1 = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
Datum LWGEOM_dwithin(PG_FUNCTION_ARGS)
{
double mindist;
- GSERIALIZED *geom1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *geom2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *geom1 = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
double tolerance = PG_GETARG_FLOAT8(2);
LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
Datum LWGEOM_dfullywithin(PG_FUNCTION_ARGS)
{
double maxdist;
- GSERIALIZED *geom1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *geom2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *geom1 = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
double tolerance = PG_GETARG_FLOAT8(2);
LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
Datum LWGEOM_maxdistance2d_linestring(PG_FUNCTION_ARGS)
{
double maxdist;
- GSERIALIZED *geom1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *geom2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *geom1 = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
Datum LWGEOM_closestpoint3d(PG_FUNCTION_ARGS)
{
GSERIALIZED *result;
- GSERIALIZED *geom1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *geom2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *geom1 = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
LWGEOM *point;
LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
Datum LWGEOM_shortestline3d(PG_FUNCTION_ARGS)
{
GSERIALIZED *result;
- GSERIALIZED *geom1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *geom2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *geom1 = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
LWGEOM *theline;
LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
Datum LWGEOM_longestline3d(PG_FUNCTION_ARGS)
{
GSERIALIZED *result;
- GSERIALIZED *geom1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *geom2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *geom1 = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
LWGEOM *theline;
LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
Datum LWGEOM_mindistance3d(PG_FUNCTION_ARGS)
{
double mindist;
- GSERIALIZED *geom1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *geom2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *geom1 = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
Datum LWGEOM_dwithin3d(PG_FUNCTION_ARGS)
{
double mindist;
- GSERIALIZED *geom1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *geom2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *geom1 = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
double tolerance = PG_GETARG_FLOAT8(2);
LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
Datum LWGEOM_dfullywithin3d(PG_FUNCTION_ARGS)
{
double maxdist;
- GSERIALIZED *geom1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *geom2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *geom1 = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
double tolerance = PG_GETARG_FLOAT8(2);
LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
Datum LWGEOM_maxdistance3d(PG_FUNCTION_ARGS)
{
double maxdist;
- GSERIALIZED *geom1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *geom2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *geom1 = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
LWGEOM *lwgeom;
int inside;
- geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
lwgeom = lwgeom_from_gserialized(geom);
lwpoint = lwgeom_as_lwpoint(lwgeom);
if ( lwpoint == NULL || lwgeom_is_empty(lwgeom) )
if (PG_ARGISNULL(1))
PG_RETURN_DATUM(PG_GETARG_DATUM(0));
- gser1 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- gser2 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ gser1 = PG_GETARG_GSERIALIZED_P(0);
+ gser2 = PG_GETARG_GSERIALIZED_P(1);
POSTGIS_DEBUGF(3, "LWGEOM_collect(%s, %s): call", lwtype_name(gserialized_get_type(gser1)), lwtype_name(gserialized_get_type(gser2)));
POSTGIS_DEBUG(2, "LWGEOM_line_from_mpoint called");
/* Get input GSERIALIZED and deserialize it */
- ingeom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ ingeom = PG_GETARG_GSERIALIZED_P(0);
if ( gserialized_get_type(ingeom) != MULTIPOINTTYPE )
{
POSTGIS_DEBUG(2, "LWGEOM_makeline called.");
/* Get input datum */
- pglwg1 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- pglwg2 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ pglwg1 = PG_GETARG_GSERIALIZED_P(0);
+ pglwg2 = PG_GETARG_GSERIALIZED_P(1);
if ( (gserialized_get_type(pglwg1) != POINTTYPE && gserialized_get_type(pglwg1) != LINETYPE) ||
(gserialized_get_type(pglwg2) != POINTTYPE && gserialized_get_type(pglwg2) != LINETYPE) )
POSTGIS_DEBUG(2, "LWGEOM_makepoly called.");
/* Get input shell */
- pglwg1 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ pglwg1 = PG_GETARG_GSERIALIZED_P(0);
if ( gserialized_get_type(pglwg1) != LINETYPE )
{
lwerror("Shell is not a line");
PG_FUNCTION_INFO_V1(LWGEOM_expand);
Datum LWGEOM_expand(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
double d = PG_GETARG_FLOAT8(1);
POINT4D pt;
PG_FUNCTION_INFO_V1(LWGEOM_to_BOX);
Datum LWGEOM_to_BOX(PG_FUNCTION_ARGS)
{
- GSERIALIZED *pg_lwgeom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *pg_lwgeom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom = lwgeom_from_gserialized(pg_lwgeom);
GBOX gbox;
int result;
PG_FUNCTION_INFO_V1(LWGEOM_envelope);
Datum LWGEOM_envelope(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
int srid = lwgeom->srid;
POINT4D pt;
POSTGIS_DEBUG(2, "LWGEOM_segmentize2d called");
- ingeom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ ingeom = PG_GETARG_GSERIALIZED_P(0);
dist = PG_GETARG_FLOAT8(1);
type = gserialized_get_type(ingeom);
POSTGIS_DEBUG(2, "LWGEOM_noop called");
- in = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ in = PG_GETARG_GSERIALIZED_P(0);
lwgeom = lwgeom_from_gserialized(in);
GSERIALIZED *in;
int ret = 0;
- in = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ in = PG_GETARG_GSERIALIZED_P(0);
if ( gserialized_has_z(in) ) ret += 2;
if ( gserialized_has_m(in) ) ret += 1;
PG_FREE_IF_COPY(in, 0);
PG_FUNCTION_INFO_V1(LWGEOM_hasz);
Datum LWGEOM_hasz(PG_FUNCTION_ARGS)
{
- GSERIALIZED *in = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *in = PG_GETARG_GSERIALIZED_P(0);
PG_RETURN_BOOL(gserialized_has_z(in));
}
PG_FUNCTION_INFO_V1(LWGEOM_hasm);
Datum LWGEOM_hasm(PG_FUNCTION_ARGS)
{
- GSERIALIZED *in = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *in = PG_GETARG_GSERIALIZED_P(0);
PG_RETURN_BOOL(gserialized_has_m(in));
}
PG_FUNCTION_INFO_V1(LWGEOM_hasBBOX);
Datum LWGEOM_hasBBOX(PG_FUNCTION_ARGS)
{
- GSERIALIZED *in = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *in = PG_GETARG_GSERIALIZED_P(0);
char res = gserialized_has_bbox(in);
PG_FREE_IF_COPY(in, 0);
PG_RETURN_BOOL(res);
GSERIALIZED *in;
int ret;
- in = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ in = PG_GETARG_GSERIALIZED_P(0);
ret = (gserialized_ndims(in));
PG_FREE_IF_COPY(in, 0);
PG_RETURN_INT16(ret);
PG_FUNCTION_INFO_V1(LWGEOM_same);
Datum LWGEOM_same(PG_FUNCTION_ARGS)
{
- GSERIALIZED *g1 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *g2 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *g1 = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *g2 = PG_GETARG_GSERIALIZED_P(1);
LWGEOM *lwg1, *lwg2;
bool result;
POSTGIS_DEBUG(2, "LWGEOM_addpoint called.");
- pglwg1 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- pglwg2 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ pglwg1 = PG_GETARG_GSERIALIZED_P(0);
+ pglwg2 = PG_GETARG_GSERIALIZED_P(1);
if ( PG_NARGS() > 2 )
{
POSTGIS_DEBUG(2, "LWGEOM_removepoint called.");
- pglwg1 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ pglwg1 = PG_GETARG_GSERIALIZED_P(0);
which = PG_GETARG_INT32(1);
if ( gserialized_get_type(pglwg1) != LINETYPE )
pglwg1 = (GSERIALIZED *)PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0));
which = PG_GETARG_INT32(1);
- pglwg2 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(2));
+ pglwg2 = PG_GETARG_GSERIALIZED_P(2);
/* Extract a POINT4D from the point */
POSTGIS_DEBUG(2, "LWGEOM_asEWKT called.");
- geom = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
lwgeom = lwgeom_from_gserialized(geom);
/* Write to WKT and free the geometry */
int srid;
/* Extract first point */
- geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
lwpoint = lwgeom_as_lwpoint(lwgeom_from_gserialized(geom));
if ( ! lwpoint )
{
PG_FREE_IF_COPY(geom, 0);
/* Extract second point */
- geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ geom = PG_GETARG_GSERIALIZED_P(1);
lwpoint = lwgeom_as_lwpoint(lwgeom_from_gserialized(geom));
if ( ! lwpoint )
{
PG_FUNCTION_INFO_V1(optimistic_overlap);
Datum optimistic_overlap(PG_FUNCTION_ARGS)
{
- GSERIALIZED *pg_geom1 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *pg_geom2 = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *pg_geom1 = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *pg_geom2 = PG_GETARG_GSERIALIZED_P(1);
double dist = PG_GETARG_FLOAT8(2);
GBOX g1_bvol;
double calc_dist;
PG_RETURN_NULL();
}
- geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
if ( ! PG_ARGISNULL(1) )
{
PG_FUNCTION_INFO_V1(ST_CollectionExtract);
Datum ST_CollectionExtract(PG_FUNCTION_ARGS)
{
- GSERIALIZED *input = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *input = PG_GETARG_GSERIALIZED_P(0);
GSERIALIZED *output;
LWGEOM *lwgeom = lwgeom_from_gserialized(input);
LWGEOM *lwcol = NULL;
PG_FUNCTION_INFO_V1(ST_CollectionHomogenize);
Datum ST_CollectionHomogenize(PG_FUNCTION_ARGS)
{
- GSERIALIZED *input = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *input = PG_GETARG_GSERIALIZED_P(0);
GSERIALIZED *output;
LWGEOM *lwgeom = lwgeom_from_gserialized(input);
LWGEOM *lwoutput = NULL;
PG_FUNCTION_INFO_V1(ST_AddMeasure);
Datum ST_AddMeasure(PG_FUNCTION_ARGS)
{
- GSERIALIZED *gin = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *gin = PG_GETARG_GSERIALIZED_P(0);
GSERIALIZED *gout;
double start_measure = PG_GETARG_FLOAT8(1);
double end_measure = PG_GETARG_FLOAT8(2);
PG_FUNCTION_INFO_V1(ST_LocateAlong);
Datum ST_LocateAlong(PG_FUNCTION_ARGS)
{
- GSERIALIZED *gin = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *gin = PG_GETARG_GSERIALIZED_P(0);
GSERIALIZED *gout;
LWGEOM *lwin = NULL, *lwout = NULL;
double measure = PG_GETARG_FLOAT8(1);
PG_FUNCTION_INFO_V1(ST_LocateBetween);
Datum ST_LocateBetween(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom_in = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom_in = PG_GETARG_GSERIALIZED_P(0);
double from = PG_GETARG_FLOAT8(1);
double to = PG_GETARG_FLOAT8(2);
double offset = PG_GETARG_FLOAT8(3);
PG_FUNCTION_INFO_V1(ST_LocateBetweenElevations);
Datum ST_LocateBetweenElevations(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom_in = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom_in = PG_GETARG_GSERIALIZED_P(0);
double from = PG_GETARG_FLOAT8(1);
double to = PG_GETARG_FLOAT8(2);
LWCOLLECTION *geom_out = NULL;
PG_FUNCTION_INFO_V1(ST_InterpolatePoint);
Datum ST_InterpolatePoint(PG_FUNCTION_ARGS)
{
- GSERIALIZED *gser_line = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *gser_point = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *gser_line = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *gser_point = PG_GETARG_GSERIALIZED_P(1);
LWGEOM *lwline;
LWPOINT *lwpoint;
PG_FUNCTION_INFO_V1(LWGEOM_line_locate_point);
Datum LWGEOM_line_locate_point(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom1 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *geom2 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *geom1 = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
LWLINE *lwline;
LWPOINT *lwpoint;
POINTARRAY *pa;
PG_FUNCTION_INFO_V1(LWGEOM_locate_between_m);
Datum LWGEOM_locate_between_m(PG_FUNCTION_ARGS)
{
- GSERIALIZED *gin = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *gin = PG_GETARG_GSERIALIZED_P(0);
GSERIALIZED *gout;
double start_measure = PG_GETARG_FLOAT8(1);
double end_measure = PG_GETARG_FLOAT8(2);
GSERIALIZED *result;
LWGEOM *lwgeom1, *lwgeom2, *lwresult ;
- geom1 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- geom2 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ geom1 = PG_GETARG_GSERIALIZED_P(0);
+ geom2 = PG_GETARG_GSERIALIZED_P(1);
lwgeom1 = lwgeom_from_gserialized(geom1) ;
lwgeom2 = lwgeom_from_gserialized(geom2) ;
GSERIALIZED *result;
LWGEOM *lwgeom1, *lwgeom2, *lwresult ;
- geom1 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- geom2 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ geom1 = PG_GETARG_GSERIALIZED_P(0);
+ geom2 = PG_GETARG_GSERIALIZED_P(1);
lwgeom1 = lwgeom_from_gserialized(geom1) ;
lwgeom2 = lwgeom_from_gserialized(geom2) ;
int srid;
- geom1 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom1 = PG_GETARG_GSERIALIZED_P(0);
/* Empty.Boundary() == Empty */
if ( gserialized_is_empty(geom1) )
GEOSGeometry *g1, *g3;
GSERIALIZED *result;
- geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
/* Empty.PointOnSurface == Point Empty */
if ( gserialized_is_empty(geom) )
GBOX box1;
#endif
- geom1 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom1 = PG_GETARG_GSERIALIZED_P(0);
/* Empty.IsValid() == TRUE */
if ( gserialized_is_empty(geom1) )
GBOX box;
#endif
- geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
#if POSTGIS_GEOS_VERSION < 33
/* Short circuit and return if we have infinite coordinates */
*/
attinmeta = TupleDescGetAttInMetadata(tupdesc);
- geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
if ( PG_NARGS() > 1 && ! PG_ARGISNULL(1) ) {
flags = PG_GETARG_INT32(1);
bool result;
GBOX box1, box2;
- geom1 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- geom2 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ geom1 = PG_GETARG_GSERIALIZED_P(0);
+ geom2 = PG_GETARG_GSERIALIZED_P(1);
errorIfGeometryCollection(geom1,geom2);
error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
RTREE_POLY_CACHE *poly_cache;
char *patt = "**F**F***";
- geom1 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- geom2 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ geom1 = PG_GETARG_GSERIALIZED_P(0);
+ geom2 = PG_GETARG_GSERIALIZED_P(1);
errorIfGeometryCollection(geom1,geom2);
error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
int result;
GBOX box1, box2;
- geom1 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- geom2 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ geom1 = PG_GETARG_GSERIALIZED_P(0);
+ geom2 = PG_GETARG_GSERIALIZED_P(1);
errorIfGeometryCollection(geom1,geom2);
error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
RTREE_POLY_CACHE *poly_cache;
PrepGeomCache *prep_cache;
- geom1 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- geom2 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ geom1 = PG_GETARG_GSERIALIZED_P(0);
+ geom2 = PG_GETARG_GSERIALIZED_P(1);
errorIfGeometryCollection(geom1,geom2);
error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
bool result;
GBOX box1, box2;
- geom1 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- geom2 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ geom1 = PG_GETARG_GSERIALIZED_P(0);
+ geom2 = PG_GETARG_GSERIALIZED_P(1);
errorIfGeometryCollection(geom1,geom2);
error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
bool result;
GBOX box1, box2;
- geom1 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- geom2 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ geom1 = PG_GETARG_GSERIALIZED_P(0);
+ geom2 = PG_GETARG_GSERIALIZED_P(1);
errorIfGeometryCollection(geom1,geom2);
error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
/* TODO handle empty */
- geom1 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- geom2 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ geom1 = PG_GETARG_GSERIALIZED_P(0);
+ geom2 = PG_GETARG_GSERIALIZED_P(1);
if ( PG_NARGS() > 2 ) {
#if POSTGIS_GEOS_VERSION >= 33
bool result;
GBOX box1, box2;
- geom1 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- geom2 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ geom1 = PG_GETARG_GSERIALIZED_P(0);
+ geom2 = PG_GETARG_GSERIALIZED_P(1);
errorIfGeometryCollection(geom1,geom2);
error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
GEOSGeometry *g1;
int result;
- geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
if (gserialized_get_type(geom) != LINETYPE)
{
initGEOS(lwnotice, lwgeom_geos_error);
- geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
geosgeom = (GEOSGeometry *)POSTGIS2GEOS(geom);
GSERIALIZED *geom;
LWGEOM *lwgeom_in, *lwgeom_out;
- geom = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
lwgeom_in = lwgeom_from_gserialized(geom);
lwgeom_out = lwgeom_buildarea(lwgeom_in);
double tolerance = 0.0;
int flags = 0;
- geom = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
tolerance = PG_GETARG_FLOAT8(1);
flags = PG_GETARG_INT32(2);
GSERIALIZED *in, *blade_in, *out;
LWGEOM *lwgeom_in, *lwblade_in, *lwgeom_out;
- in = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ in = PG_GETARG_GSERIALIZED_P(0);
lwgeom_in = lwgeom_from_gserialized(in);
- blade_in = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ blade_in = PG_GETARG_GSERIALIZED_P(1);
lwblade_in = lwgeom_from_gserialized(blade_in);
error_if_srid_mismatch(lwgeom_in->srid, lwblade_in->srid);
GSERIALIZED *in, *out;
LWGEOM *lwgeom_in, *lwgeom_out;
- in = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ in = PG_GETARG_GSERIALIZED_P(0);
lwgeom_in = lwgeom_from_gserialized(in);
switch ( lwgeom_in->type )
GSERIALIZED *in, *out;
LWGEOM *lwgeom_in, *lwgeom_out;
- in = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ in = PG_GETARG_GSERIALIZED_P(0);
lwgeom_in = lwgeom_from_gserialized(in);
/* Short-circuit: empty geometry are the cleanest ! */
PG_FUNCTION_INFO_V1(LWGEOM_out);
Datum LWGEOM_out(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom;
char *hexwkb;
size_t hexwkb_size;
PG_FUNCTION_INFO_V1(LWGEOM_asHEXEWKB);
Datum LWGEOM_asHEXEWKB(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom;
char *hexwkb;
size_t hexwkb_size;
PG_FUNCTION_INFO_V1(LWGEOM_to_text);
Datum LWGEOM_to_text(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom;
char *hexwkb;
size_t hexwkb_size;
PG_FUNCTION_INFO_V1(WKBFromLWGEOM);
Datum WKBFromLWGEOM(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom;
uint8_t *wkb;
size_t wkb_size;
/*check for null input since we cannot have the sql-function as strict.
That is because we use null as default for optional ID*/
if ( PG_ARGISNULL(0) ) PG_RETURN_NULL();
- geom = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
/* If user specified precision, respect it */
if ( (PG_NARGS()>1) && (!PG_ARGISNULL(1)) )
PG_FUNCTION_INFO_V1(LWGEOM_addBBOX);
Datum LWGEOM_addBBOX(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
GSERIALIZED *result;
LWGEOM *lwgeom;
PG_FUNCTION_INFO_V1(LWGEOM_dropBBOX);
Datum LWGEOM_dropBBOX(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
/* No box? we're done already! */
if ( ! gserialized_has_bbox(geom) )
PG_FUNCTION_INFO_V1(LWGEOM_get_srid);
Datum LWGEOM_get_srid(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom=(GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom=PG_GETARG_GSERIALIZED_P(0);
int srid = gserialized_get_srid (geom);
PG_FREE_IF_COPY(geom,0);
PG_RETURN_INT32(srid);
Datum LWGEOM_set_srid(PG_FUNCTION_ARGS)
{
GSERIALIZED *result;
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
int srid = PG_GETARG_INT32(1);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
lwgeom_set_srid(lwgeom, srid);
PG_FUNCTION_INFO_V1(LWGEOM_numpoints_linestring);
Datum LWGEOM_numpoints_linestring(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
int count = -1;
PG_FUNCTION_INFO_V1(LWGEOM_numgeometries_collection);
Datum LWGEOM_numgeometries_collection(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom;
int32 ret = 1;
PG_FUNCTION_INFO_V1(LWGEOM_geometryn_collection);
Datum LWGEOM_geometryn_collection(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
GSERIALIZED *result;
int type = gserialized_get_type(geom);
int32 idx;
PG_FUNCTION_INFO_V1(LWGEOM_dimension);
Datum LWGEOM_dimension(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
int dimension = -1;
PG_FUNCTION_INFO_V1(LWGEOM_exteriorring_polygon);
Datum LWGEOM_exteriorring_polygon(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
GSERIALIZED *result;
POINTARRAY *extring;
LWGEOM *lwgeom;
PG_FUNCTION_INFO_V1(LWGEOM_numinteriorrings_polygon);
Datum LWGEOM_numinteriorrings_polygon(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
LWPOLY *poly = NULL;
LWCURVEPOLY *curvepoly = NULL;
PG_RETURN_NULL(); /* index out of range */
}
- geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
type = gserialized_get_type(geom);
if ( (type != POLYGONTYPE) && (type != CURVEPOLYTYPE) )
PG_FUNCTION_INFO_V1(LWGEOM_pointn_linestring);
Datum LWGEOM_pointn_linestring(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
int where = PG_GETARG_INT32(1);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
LWPOINT *lwpoint = NULL;
LWPOINT *point = NULL;
POINT2D p;
- geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
if ( gserialized_get_type(geom) != POINTTYPE )
lwerror("Argument to X() must be a point");
LWGEOM *lwgeom;
POINT2D p;
- geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
if ( gserialized_get_type(geom) != POINTTYPE )
lwerror("Argument to Y() must be a point");
LWGEOM *lwgeom;
POINT3DZ p;
- geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
if ( gserialized_get_type(geom) != POINTTYPE )
lwerror("Argument to Z() must be a point");
LWGEOM *lwgeom;
POINT3DM p;
- geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
if ( gserialized_get_type(geom) != POINTTYPE )
lwerror("Argument to M() must be a point");
PG_FUNCTION_INFO_V1(LWGEOM_startpoint_linestring);
Datum LWGEOM_startpoint_linestring(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
LWPOINT *lwpoint = NULL;
int type = lwgeom->type;
PG_FUNCTION_INFO_V1(LWGEOM_endpoint_linestring);
Datum LWGEOM_endpoint_linestring(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
LWPOINT *lwpoint = NULL;
int type = lwgeom->type;
POSTGIS_DEBUG(2, "Called.");
- geom = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
lwgeom = lwgeom_from_gserialized(geom);
/* Write to WKT and free the geometry */
uint8_t variant = WKB_ISO;
/* Get a 2D version of the geometry */
- geom = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
lwgeom = lwgeom_from_gserialized(geom);
/* If user specified endianness, respect it */
PG_FUNCTION_INFO_V1(LWGEOM_isclosed);
Datum LWGEOM_isclosed(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
int closed = lwgeom_is_closed(lwgeom);
PG_FUNCTION_INFO_V1(LWGEOM_length2d_ellipsoid);
Datum LWGEOM_length2d_ellipsoid(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
SPHEROID *sphere = (SPHEROID *) PG_GETARG_POINTER(1);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
double dist = lwgeom_length_spheroid(lwgeom, sphere);
PG_FUNCTION_INFO_V1(LWGEOM_length_ellipsoid_linestring);
Datum LWGEOM_length_ellipsoid_linestring(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
SPHEROID *sphere = (SPHEROID *) PG_GETARG_POINTER(1);
double length = 0.0;
PG_FUNCTION_INFO_V1(geometry_distance_spheroid);
Datum geometry_distance_spheroid(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom1 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- GSERIALIZED *geom2 = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ GSERIALIZED *geom1 = PG_GETARG_GSERIALIZED_P(0);
+ GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
SPHEROID *sphere = (SPHEROID *)PG_GETARG_POINTER(2);
int type1 = gserialized_get_type(geom1);
int type2 = gserialized_get_type(geom2);
PG_FUNCTION_INFO_V1(LWGEOM_has_arc);
Datum LWGEOM_has_arc(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
uint32 result = lwgeom_has_arc(lwgeom);
lwgeom_free(lwgeom);
PG_FUNCTION_INFO_V1(LWGEOM_curve_segmentize);
Datum LWGEOM_curve_segmentize(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
int32 perQuad = PG_GETARG_INT32(1);
GSERIALIZED *ret;
LWGEOM *igeom = NULL, *ogeom = NULL;
PG_FUNCTION_INFO_V1(LWGEOM_line_desegmentize);
Datum LWGEOM_line_desegmentize(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
GSERIALIZED *ret;
LWGEOM *igeom = NULL, *ogeom = NULL;