/* Install PosgreSQL handlers for liblwgeom use */
void pg_install_lwgeom_handlers(void);
+/* Argument handling macros */
#define PG_GETARG_GSERIALIZED_P(varno) ((GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(varno)))
+#define PG_GETARG_GSERIALIZED_P_COPY(varno) ((GSERIALIZED *)PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(varno)))
+#define PG_GETARG_GSERIALIZED_P_SLICE(varno, start, size) ((GSERIALIZED *)PG_DETOAST_DATUM_SLICE(PG_GETARG_DATUM(varno), start, size))
/* Debugging macros */
#if POSTGIS_DEBUG_LEVEL > 0
PG_FUNCTION_INFO_V1(geography_from_geometry);
Datum geography_from_geometry(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED*)PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P_COPY(0);
LWGEOM *lwgeom = NULL;
GSERIALIZED *g_ser = NULL;
double distance;
/* Get a wholly-owned pointer to the geography */
- g = (GSERIALIZED*)PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0));
+ g = PG_GETARG_GSERIALIZED_P_COPY(0);
/* Read our distance value and normalize to unit-sphere. */
distance = PG_GETARG_FLOAT8(1) / WGS84_RADIUS;
PG_FUNCTION_INFO_V1(lwgeom_lt);
Datum lwgeom_lt(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);
GBOX box1;
GBOX box2;
PG_FUNCTION_INFO_V1(lwgeom_le);
Datum lwgeom_le(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);
GBOX box1;
GBOX box2;
PG_FUNCTION_INFO_V1(lwgeom_eq);
Datum lwgeom_eq(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);
GBOX box1;
GBOX box2;
bool empty1, empty2;
PG_FUNCTION_INFO_V1(lwgeom_ge);
Datum lwgeom_ge(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);
GBOX box1;
GBOX box2;
PG_FUNCTION_INFO_V1(lwgeom_gt);
Datum lwgeom_gt(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);
GBOX box1;
GBOX box2;
PG_FUNCTION_INFO_V1(lwgeom_cmp);
Datum lwgeom_cmp(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);
GBOX box1;
GBOX box2;
oldcontext = MemoryContextSwitchTo(newcontext);
- pglwgeom = (GSERIALIZED *)PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0));
+ pglwgeom = PG_GETARG_GSERIALIZED_P_COPY(0);
lwgeom = lwgeom_from_gserialized(pglwgeom);
/* Create function state */
oldcontext = MemoryContextSwitchTo(newcontext);
- pglwgeom = (GSERIALIZED *)PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0));
+ pglwgeom = PG_GETARG_GSERIALIZED_P_COPY(0);
if ( gserialized_get_type(pglwgeom) != POLYGONTYPE )
{
lwerror("Input is not a polygon");
#include "funcapi.h"
#include "../postgis_config.h"
+#include "lwgeom_pg.h"
#if POSTGIS_PGSQL_VERSION > 92
#include "access/htup_details.h"
#endif
oldcontext = MemoryContextSwitchTo(newcontext);
/* get a local copy of what we're doing a dump points on */
- pglwgeom = (GSERIALIZED *)PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0));
+ pglwgeom = PG_GETARG_GSERIALIZED_P_COPY(0);
lwgeom = lwgeom_from_gserialized(pglwgeom);
/* return early if nothing to do */
PG_FUNCTION_INFO_V1(LWGEOM_mem_size);
Datum LWGEOM_mem_size(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
size_t size = VARSIZE(geom);
PG_FREE_IF_COPY(geom,0);
PG_RETURN_INT32(size);
POSTGIS_DEBUG(2, "LWGEOM_longitude_shift called.");
- geom = (GSERIALIZED *)PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P_COPY(0);
lwgeom = lwgeom_from_gserialized(geom);
/* Drop bbox, will be recomputed */
PG_FUNCTION_INFO_V1(LWGEOM_isempty);
Datum LWGEOM_isempty(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);
bool empty = lwgeom_is_empty(lwgeom);
POSTGIS_DEBUG(2, "LWGEOM_reverse called");
- geom = (GSERIALIZED *)PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P_COPY(0);
lwgeom = lwgeom_from_gserialized(geom);
lwgeom_reverse(lwgeom);
POSTGIS_DEBUG(2, "LWGEOM_force_clockwise_poly called");
- ingeom = (GSERIALIZED *)PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0));
+ ingeom = PG_GETARG_GSERIALIZED_P_COPY(0);
lwgeom = lwgeom_from_gserialized(ingeom);
lwgeom_force_clockwise(lwgeom);
/* header + srid/flags + bbox? + type number */
size = VARHDRSZ + 8 + 32 + 4;
- geom = (GSERIALIZED*)PG_DETOAST_DATUM_SLICE(PG_GETARG_DATUM(0), 0, size);
+ geom = PG_GETARG_GSERIALIZED_P_SLICE(0, 0, size);
type = gserialized_get_type(geom);
PG_RETURN_BOOL(lwtype_is_collection(type));
POSTGIS_DEBUG(2, "LWGEOM_setpoint_linestring called.");
/* we copy input as we're going to modify it */
- pglwg1 = (GSERIALIZED *)PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0));
+ pglwg1 = PG_GETARG_GSERIALIZED_P_COPY(0);
which = PG_GETARG_INT32(1);
pglwg2 = PG_GETARG_GSERIALIZED_P(2);
PG_FUNCTION_INFO_V1(LWGEOM_affine);
Datum LWGEOM_affine(PG_FUNCTION_ARGS)
{
- GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0));
+ GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P_COPY(0);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
GSERIALIZED *ret;
AFFINE affine;
PG_FUNCTION_INFO_V1(ST_RemoveRepeatedPoints);
Datum ST_RemoveRepeatedPoints(PG_FUNCTION_ARGS)
{
- GSERIALIZED *input = (GSERIALIZED *)PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0));
+ GSERIALIZED *input = PG_GETARG_GSERIALIZED_P_COPY(0);
GSERIALIZED *output;
LWGEOM *lwgeom_in = lwgeom_from_gserialized(input);
LWGEOM *lwgeom_out;
PG_FUNCTION_INFO_V1(ST_FlipCoordinates);
Datum ST_FlipCoordinates(PG_FUNCTION_ARGS)
{
- GSERIALIZED *in = (GSERIALIZED *)PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0));
+ GSERIALIZED *in = PG_GETARG_GSERIALIZED_P_COPY(0);
GSERIALIZED *out;
LWGEOM *lwgeom = lwgeom_from_gserialized(in);
o1 = ordname2ordval( ospec[0] );
o2 = ordname2ordval( ospec[1] );
- in = (GSERIALIZED *)PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0));
+ in = PG_GETARG_GSERIALIZED_P_COPY(0);
/* Check presence of given ordinates */
if ( ( o1 == LWORD_M || o2 == LWORD_M ) && ! gserialized_has_m(in) )
/* Read SQL arguments */
nargs = PG_NARGS();
- gser_input = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ gser_input = PG_GETARG_GSERIALIZED_P(0);
size = PG_GETARG_FLOAT8(1);
/* Check for a useable type */
GSERIALIZED *geom, *result;
GEOSGeometry *geosgeom, *geosresult;
- geom = (GSERIALIZED *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P(0);
/* Empty.Centroid() == Point Empty */
if ( gserialized_is_empty(geom) )
Datum LWGEOM_to_latlon(PG_FUNCTION_ARGS)
{
/* Get the parameters */
- GSERIALIZED *pg_lwgeom = (GSERIALIZED *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ GSERIALIZED *pg_lwgeom = PG_GETARG_GSERIALIZED_P(0);
text *format_text = PG_GETARG_TEXT_P(1);
LWGEOM *lwgeom;
uint8_t type;
static int maxtyplen = 20;
- gser = (GSERIALIZED*)PG_DETOAST_DATUM_SLICE(PG_GETARG_DATUM(0), 0, gserialized_max_header_size());
+ gser = PG_GETARG_GSERIALIZED_P_SLICE(0, 0, gserialized_max_header_size());
text_ob = palloc0(VARHDRSZ + maxtyplen);
result = VARDATA(text_ob);
char type_str[type_str_len];
/* Read just the header from the toasted tuple */
- gser = (GSERIALIZED*)PG_DETOAST_DATUM_SLICE(PG_GETARG_DATUM(0), 0, gserialized_max_header_size());
+ gser = PG_GETARG_GSERIALIZED_P_SLICE(0, 0, gserialized_max_header_size());
/* Make it empty string to start */
type_str[0] = 0;
sfcgal_postgis_init();
- input = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ input = PG_GETARG_GSERIALIZED_P(0);
geom = POSTGIS2SFCGALGeometry(input);
result = sfcgal_geometry_area(geom);
sfcgal_postgis_init();
- input = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ input = PG_GETARG_GSERIALIZED_P(0);
geom = POSTGIS2SFCGALGeometry(input);
result = sfcgal_geometry_area_3d(geom);
sfcgal_postgis_init();
- input = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ input = PG_GETARG_GSERIALIZED_P(0);
geom = POSTGIS2SFCGALGeometry(input);
result = sfcgal_geometry_is_planar(geom);
sfcgal_postgis_init();
- input = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ input = PG_GETARG_GSERIALIZED_P(0);
geom = POSTGIS2SFCGALGeometry(input);
result = sfcgal_geometry_orientation(geom);
sfcgal_postgis_init();
- input0 = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- input1 = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ input0 = PG_GETARG_GSERIALIZED_P(0);
+ input1 = PG_GETARG_GSERIALIZED_P(1);
geom0 = POSTGIS2SFCGALGeometry(input0);
PG_FREE_IF_COPY(input0, 0);
geom1 = POSTGIS2SFCGALGeometry(input1);
sfcgal_postgis_init();
- input0 = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- input1 = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ input0 = PG_GETARG_GSERIALIZED_P(0);
+ input1 = PG_GETARG_GSERIALIZED_P(1);
geom0 = POSTGIS2SFCGALGeometry(input0);
PG_FREE_IF_COPY(input0, 0);
geom1 = POSTGIS2SFCGALGeometry(input1);
sfcgal_postgis_init();
- input0 = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- input1 = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ input0 = PG_GETARG_GSERIALIZED_P(0);
+ input1 = PG_GETARG_GSERIALIZED_P(1);
geom0 = POSTGIS2SFCGALGeometry(input0);
PG_FREE_IF_COPY(input0, 0);
geom1 = POSTGIS2SFCGALGeometry(input1);
sfcgal_postgis_init();
- input0 = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- input1 = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ input0 = PG_GETARG_GSERIALIZED_P(0);
+ input1 = PG_GETARG_GSERIALIZED_P(1);
geom0 = POSTGIS2SFCGALGeometry(input0);
PG_FREE_IF_COPY(input0, 0);
geom1 = POSTGIS2SFCGALGeometry(input1);
sfcgal_postgis_init();
- input = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ input = PG_GETARG_GSERIALIZED_P(0);
srid = gserialized_get_srid(input);
geom = POSTGIS2SFCGALGeometry(input);
PG_FREE_IF_COPY(input, 0);
sfcgal_postgis_init();
- input = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ input = PG_GETARG_GSERIALIZED_P(0);
srid = gserialized_get_srid(input);
geom = POSTGIS2SFCGALGeometry(input);
PG_FREE_IF_COPY(input, 0);
sfcgal_postgis_init();
- input = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ input = PG_GETARG_GSERIALIZED_P(0);
srid = gserialized_get_srid(input);
geom = POSTGIS2SFCGALGeometry(input);
PG_FREE_IF_COPY(input, 0);
sfcgal_postgis_init();
- input = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ input = PG_GETARG_GSERIALIZED_P(0);
srid = gserialized_get_srid(input);
geom = POSTGIS2SFCGALGeometry(input);
PG_FREE_IF_COPY(input, 0);
sfcgal_postgis_init();
- input0 = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ input0 = PG_GETARG_GSERIALIZED_P(0);
srid = gserialized_get_srid(input0);
- input1 = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ input1 = PG_GETARG_GSERIALIZED_P(1);
geom0 = POSTGIS2SFCGALGeometry(input0);
PG_FREE_IF_COPY(input0, 0);
geom1 = POSTGIS2SFCGALGeometry(input1);
sfcgal_postgis_init();
- input0 = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ input0 = PG_GETARG_GSERIALIZED_P(0);
srid = gserialized_get_srid(input0);
- input1 = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ input1 = PG_GETARG_GSERIALIZED_P(1);
geom0 = POSTGIS2SFCGALGeometry(input0);
PG_FREE_IF_COPY(input0, 0);
geom1 = POSTGIS2SFCGALGeometry(input1);
sfcgal_postgis_init();
- input0 = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ input0 = PG_GETARG_GSERIALIZED_P(0);
srid = gserialized_get_srid(input0);
- input1 = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ input1 = PG_GETARG_GSERIALIZED_P(1);
geom0 = POSTGIS2SFCGALGeometry(input0);
PG_FREE_IF_COPY(input0, 0);
geom1 = POSTGIS2SFCGALGeometry(input1);
sfcgal_postgis_init();
- input = (GSERIALIZED*) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ input = PG_GETARG_GSERIALIZED_P(0);
srid = gserialized_get_srid(input);
geom = POSTGIS2SFCGALGeometry(input);
PG_RETURN_NULL();
}
- geom = (GSERIALIZED *)PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P_COPY(0);
input_srid = gserialized_get_srid(geom);
if ( input_srid == SRID_UNKNOWN )
{
PG_RETURN_NULL();
}
- geom = (GSERIALIZED *)PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0));
+ geom = PG_GETARG_GSERIALIZED_P_COPY(0);
if (gserialized_get_srid(geom) == SRID_UNKNOWN)
{
pfree(geom);
if (PG_ARGISNULL(0))
PG_RETURN_NULL();
- gser = (GSERIALIZED *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ gser = PG_GETARG_GSERIALIZED_P(0);
geom = lwgeom_from_gserialized(gser);
/* Get a 2D version of the geometry if necessary */
srid = clamp_srid(rt_raster_get_srid(arg->raster));
/* geometry (2) */
- gser = (GSERIALIZED *) PG_DETOAST_DATUM(PG_GETARG_DATUM(2));
+ gser = PG_GETARG_GSERIALIZED_P(2);
geom = lwgeom_from_gserialized(gser);
/* Get a 2D version of the geometry if necessary */
#include "catalog/pg_type.h" /* for INT2OID, INT4OID, FLOAT4OID, FLOAT8OID and TEXTOID */
#include "../../postgis_config.h"
+#include "lwgeom_pg.h"
+
#if POSTGIS_PGSQL_VERSION > 92
#include "access/htup_details.h" /* for heap_form_tuple() */
}
/* point */
- geom = (GSERIALIZED *) PG_DETOAST_DATUM(PG_GETARG_DATUM(2));
+ geom = PG_GETARG_GSERIALIZED_P(2);
if (gserialized_get_type(geom) != POINTTYPE) {
elog(NOTICE, "Geometry provided must be a point");
rt_raster_destroy(raster);