From: Darafei Praliaskouski Date: Tue, 16 Jan 2018 14:21:44 +0000 (+0000) Subject: Fix warnings. X-Git-Tag: 2.5.0alpha~170 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=51d4c185ad4585bc246dcb53f37366e11b6ca4a4;p=postgis Fix warnings. Remove unreachable code. Fix pointer dereference and null check order. Fix HAS_Z/M and g1/g2 mixup in conditions. Fix typmod variables to be signed. Fix & and && in conditions. Cover ST_AsGML with tests. Check option bitmask for unsupported bits. Cover typmod_in/typmod_out with tests. Reorder *free* to happen before *return*. Closes https://github.com/postgis/postgis/pull/192 git-svn-id: http://svn.osgeo.org/postgis/trunk@16319 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/liblwgeom/g_box.c b/liblwgeom/g_box.c index 2fd53dd6f..4159da291 100644 --- a/liblwgeom/g_box.c +++ b/liblwgeom/g_box.c @@ -22,10 +22,6 @@ * **********************************************************************/ - -#if !HAVE_ISFINITE -#endif - #include "liblwgeom_internal.h" #include "lwgeom_log.h" #include @@ -147,13 +143,12 @@ int gbox_union(const GBOX *g1, const GBOX *g2, GBOX *gout) { if ( ( ! g1 ) && ( ! g2 ) ) return LW_FALSE; - - if ( ! g1 ) + else if (!g1) { memcpy(gout, g2, sizeof(GBOX)); return LW_TRUE; } - if ( ! g2 ) + else if (!g2) { memcpy(gout, g1, sizeof(GBOX)); return LW_TRUE; @@ -590,15 +585,15 @@ int ptarray_calculate_gbox_cartesian(const POINTARRAY *pa, GBOX *gbox ) static int lwcircstring_calculate_gbox_cartesian(LWCIRCSTRING *curve, GBOX *gbox) { - uint8_t flags = gflags(FLAGS_GET_Z(curve->flags), FLAGS_GET_M(curve->flags), 0); GBOX tmp; POINT4D p1, p2, p3; uint32_t i; - if ( ! curve ) return LW_FAILURE; - if ( curve->points->npoints < 3 ) return LW_FAILURE; + if (!curve) return LW_FAILURE; + if (curve->points->npoints < 3) return LW_FAILURE; - tmp.flags = flags; + tmp.flags = + gflags(FLAGS_GET_Z(curve->flags), FLAGS_GET_M(curve->flags), 0); /* Initialize */ gbox->xmin = gbox->ymin = gbox->zmin = gbox->mmin = FLT_MAX; diff --git a/liblwgeom/g_serialized.c b/liblwgeom/g_serialized.c index 55fdfa24c..1649ee1bd 100644 --- a/liblwgeom/g_serialized.c +++ b/liblwgeom/g_serialized.c @@ -354,7 +354,7 @@ int gserialized_cmp(const GSERIALIZED *g1, const GSERIALIZED *g2) return -1; /* Non-empty > Empty */ - if (!g2_is_empty && g2_is_empty) + if (!g1_is_empty && g2_is_empty) return 1; /* Return equality for perfect equality only */ diff --git a/liblwgeom/lwcollection.c b/liblwgeom/lwcollection.c index 9a7efee6b..6b59b3719 100644 --- a/liblwgeom/lwcollection.c +++ b/liblwgeom/lwcollection.c @@ -232,28 +232,29 @@ LWCOLLECTION* lwcollection_add_lwgeom(LWCOLLECTION *col, const LWGEOM *geom) return col; } - -LWCOLLECTION * -lwcollection_segmentize2d(const LWCOLLECTION *col, double dist) +LWCOLLECTION* +lwcollection_segmentize2d(const LWCOLLECTION* col, double dist) { - uint32_t i,j; - LWGEOM **newgeoms; + uint32_t i, j; + LWGEOM** newgeoms; - if ( ! col->ngeoms ) return lwcollection_clone(col); + if (!col->ngeoms) return lwcollection_clone(col); - newgeoms = lwalloc(sizeof(LWGEOM *)*col->ngeoms); - for (i=0; ingeoms; i++) + newgeoms = lwalloc(sizeof(LWGEOM*) * col->ngeoms); + for (i = 0; i < col->ngeoms; i++) { newgeoms[i] = lwgeom_segmentize2d(col->geoms[i], dist); - if ( ! newgeoms[i] ) { - for (j=0; j < i; i++) + if (!newgeoms[i]) + { + for (j = 0; j < i; j++) lwgeom_free(newgeoms[j]); lwfree(newgeoms); return NULL; } } - return lwcollection_construct(col->type, col->srid, NULL, col->ngeoms, newgeoms); + return lwcollection_construct( + col->type, col->srid, NULL, col->ngeoms, newgeoms); } /** @brief check for same geometry composition @@ -367,16 +368,17 @@ void lwcollection_free(LWCOLLECTION *col) * WARNING: the output will contain references to geometries in the input, * so the result must be carefully released, not freed. */ -LWCOLLECTION* lwcollection_extract(LWCOLLECTION *col, int type) +LWCOLLECTION* +lwcollection_extract(LWCOLLECTION* col, int type) { uint32_t i = 0; - LWGEOM **geomlist; - LWCOLLECTION *outcol; + LWGEOM** geomlist; + LWCOLLECTION* outcol; int geomlistsize = 16; int geomlistlen = 0; uint8_t outtype; - if ( ! col ) return NULL; + if (!col) return NULL; switch (type) { @@ -390,74 +392,81 @@ LWCOLLECTION* lwcollection_extract(LWCOLLECTION *col, int type) outtype = MULTIPOLYGONTYPE; break; default: - lwerror("Only POLYGON, LINESTRING and POINT are supported by lwcollection_extract. %s requested.", lwtype_name(type)); + lwerror( + "Only POLYGON, LINESTRING and POINT are supported by " + "lwcollection_extract. %s requested.", + lwtype_name(type)); return NULL; } geomlist = lwalloc(sizeof(LWGEOM*) * geomlistsize); /* Process each sub-geometry */ - for ( i = 0; i < col->ngeoms; i++ ) + for (i = 0; i < col->ngeoms; i++) { int subtype = col->geoms[i]->type; /* Don't bother adding empty sub-geometries */ - if ( lwgeom_is_empty(col->geoms[i]) ) - { - continue; - } + if (lwgeom_is_empty(col->geoms[i])) continue; /* Copy our sub-types into the output list */ - if ( subtype == type ) + if (subtype == type) { - /* We've over-run our buffer, double the memory segment */ - if ( geomlistlen == geomlistsize ) + /* We've over-run our buffer, double the memory segment + */ + if (geomlistlen == geomlistsize) { geomlistsize *= 2; - geomlist = lwrealloc(geomlist, sizeof(LWGEOM*) * geomlistsize); + geomlist = lwrealloc( + geomlist, sizeof(LWGEOM*) * geomlistsize); } geomlist[geomlistlen] = lwgeom_clone(col->geoms[i]); geomlistlen++; } /* Recurse into sub-collections */ - if ( lwtype_is_collection( subtype ) ) + if (lwtype_is_collection(subtype)) { uint32_t j = 0; - LWCOLLECTION *tmpcol = lwcollection_extract((LWCOLLECTION*)col->geoms[i], type); - for ( j = 0; j < tmpcol->ngeoms; j++ ) + LWCOLLECTION* tmpcol = lwcollection_extract( + (LWCOLLECTION*)col->geoms[i], type); + for (j = 0; j < tmpcol->ngeoms; j++) { - /* We've over-run our buffer, double the memory segment */ - if ( geomlistlen == geomlistsize ) + /* We've over-run our buffer, double the memory + * segment */ + if (geomlistlen == geomlistsize) { geomlistsize *= 2; - geomlist = lwrealloc(geomlist, sizeof(LWGEOM*) * geomlistsize); + geomlist = lwrealloc(geomlist, + sizeof(LWGEOM*) * + geomlistsize); } geomlist[geomlistlen] = tmpcol->geoms[j]; geomlistlen++; } - if (tmpcol->geoms) - lwfree(tmpcol->geoms); - if (tmpcol->bbox) - lwfree(tmpcol->bbox); + if (tmpcol->ngeoms) lwfree(tmpcol->geoms); + if (tmpcol->bbox) lwfree(tmpcol->bbox); lwfree(tmpcol); } } - if ( geomlistlen > 0 ) + if (geomlistlen > 0) { GBOX gbox; - outcol = lwcollection_construct(outtype, col->srid, NULL, geomlistlen, geomlist); - lwgeom_calculate_gbox((LWGEOM *) outcol, &gbox); + outcol = lwcollection_construct( + outtype, col->srid, NULL, geomlistlen, geomlist); + lwgeom_calculate_gbox((LWGEOM*)outcol, &gbox); outcol->bbox = gbox_copy(&gbox); } else { lwfree(geomlist); - outcol = lwcollection_construct_empty(outtype, col->srid, FLAGS_GET_Z(col->flags), FLAGS_GET_M(col->flags)); + outcol = lwcollection_construct_empty(outtype, + col->srid, + FLAGS_GET_Z(col->flags), + FLAGS_GET_M(col->flags)); } return outcol; } - LWCOLLECTION* lwcollection_force_dims(const LWCOLLECTION *col, int hasz, int hasm) { diff --git a/liblwgeom/lwgeodetic.c b/liblwgeom/lwgeodetic.c index 83f389e88..b42f590c7 100644 --- a/liblwgeom/lwgeodetic.c +++ b/liblwgeom/lwgeodetic.c @@ -2237,36 +2237,39 @@ double lwgeom_distance_spheroid(const LWGEOM *lwgeom1, const LWGEOM *lwgeom2, co } - /* Polygon/polygon case, if start point-in-poly, return zero, else return distance. */ - if ( ( type1 == POLYGONTYPE && type2 == POLYGONTYPE ) || - ( type2 == POLYGONTYPE && type1 == POLYGONTYPE ) ) + /* Polygon/polygon case, if start point-in-poly, return zero, else + * return distance. */ + if (type1 == POLYGONTYPE && type2 == POLYGONTYPE) { - const POINT2D *p; - LWPOLY *lwpoly1 = (LWPOLY*)lwgeom1; - LWPOLY *lwpoly2 = (LWPOLY*)lwgeom2; + const POINT2D* p; + LWPOLY* lwpoly1 = (LWPOLY*)lwgeom1; + LWPOLY* lwpoly2 = (LWPOLY*)lwgeom2; double distance = FLT_MAX; uint32_t i, j; /* Point of 2 in polygon 1 implies zero distance */ p = getPoint2d_cp(lwpoly1->rings[0], 0); - if ( lwpoly_covers_point2d(lwpoly2, p) ) - return 0.0; + if (lwpoly_covers_point2d(lwpoly2, p)) return 0.0; /* Point of 1 in polygon 2 implies zero distance */ p = getPoint2d_cp(lwpoly2->rings[0], 0); - if ( lwpoly_covers_point2d(lwpoly1, p) ) - return 0.0; + if (lwpoly_covers_point2d(lwpoly1, p)) return 0.0; /* Not contained, so what's the actual distance? */ - for ( i = 0; i < lwpoly1->nrings; i++ ) + for (i = 0; i < lwpoly1->nrings; i++) { - for ( j = 0; j < lwpoly2->nrings; j++ ) + for (j = 0; j < lwpoly2->nrings; j++) { - double ring_distance = ptarray_distance_spheroid(lwpoly1->rings[i], lwpoly2->rings[j], spheroid, tolerance, check_intersection); - if ( ring_distance < distance ) + double ring_distance = + ptarray_distance_spheroid( + lwpoly1->rings[i], + lwpoly2->rings[j], + spheroid, + tolerance, + check_intersection); + if (ring_distance < distance) distance = ring_distance; - if ( distance < tolerance ) - return distance; + if (distance < tolerance) return distance; } } return distance; @@ -2281,7 +2284,8 @@ double lwgeom_distance_spheroid(const LWGEOM *lwgeom1, const LWGEOM *lwgeom2, co for ( i = 0; i < col->ngeoms; i++ ) { - double geom_distance = lwgeom_distance_spheroid(col->geoms[i], lwgeom2, spheroid, tolerance); + double geom_distance = lwgeom_distance_spheroid( + col->geoms[i], lwgeom2, spheroid, tolerance); if ( geom_distance < distance ) distance = geom_distance; if ( distance < tolerance ) diff --git a/liblwgeom/lwgeodetic_tree.c b/liblwgeom/lwgeodetic_tree.c index 81592149f..80a838d12 100644 --- a/liblwgeom/lwgeodetic_tree.c +++ b/liblwgeom/lwgeodetic_tree.c @@ -52,10 +52,12 @@ circ_tree_free(CIRC_NODE* node) uint32_t i; if ( ! node ) return; - for ( i = 0; i < node->num_nodes; i++ ) - circ_tree_free(node->nodes[i]); - - if ( node->nodes ) lwfree(node->nodes); + if (node->nodes) + { + for (i = 0; i < node->num_nodes; i++) + circ_tree_free(node->nodes[i]); + lwfree(node->nodes); + } lwfree(node); } diff --git a/liblwgeom/lwgeom_api.c b/liblwgeom/lwgeom_api.c index 4c728261e..81366b15b 100644 --- a/liblwgeom/lwgeom_api.c +++ b/liblwgeom/lwgeom_api.c @@ -394,19 +394,18 @@ getPoint3dz_cp(const POINTARRAY *pa, uint32_t n) return (const POINT3DZ*)getPoint_internal(pa, n); } - const POINT4D* -getPoint4d_cp(const POINTARRAY *pa, uint32_t n) +getPoint4d_cp(const POINTARRAY* pa, uint32_t n) { - if ( ! pa ) return 0; + if (!pa) return 0; - if ( ! (FLAGS_GET_Z(pa->flags) && FLAGS_GET_Z(pa->flags)) ) + if (!(FLAGS_GET_Z(pa->flags) && FLAGS_GET_M(pa->flags))) { lwerror("getPoint4d_cp: no Z and M coordinates in point array"); return 0; /*error */ } - if ( n>=pa->npoints ) + if (n >= pa->npoints) { lwerror("getPoint4d_cp: point offset out of range"); return 0; /*error */ @@ -415,8 +414,6 @@ getPoint4d_cp(const POINTARRAY *pa, uint32_t n) return (const POINT4D*)getPoint_internal(pa, n); } - - /* * set point N to the given value * NOTE that the pointarray can be of any diff --git a/liblwgeom/lwgeom_geos.c b/liblwgeom/lwgeom_geos.c index a7fdf69a2..0903e3696 100644 --- a/liblwgeom/lwgeom_geos.c +++ b/liblwgeom/lwgeom_geos.c @@ -417,27 +417,25 @@ LWGEOM2GEOS(const LWGEOM *lwgeom, int autofix) break; case POLYGONTYPE: - lwpoly = (LWPOLY *)lwgeom; - if ( lwgeom_is_empty(lwgeom) ) - { + lwpoly = (LWPOLY*)lwgeom; + if (lwgeom_is_empty(lwgeom)) g = GEOSGeom_createEmptyPolygon(); - } else { shell = ptarray_to_GEOSLinearRing(lwpoly->rings[0], autofix); if ( ! shell ) return NULL; /*lwerror("LWGEOM2GEOS: exception during polygon shell conversion"); */ ngeoms = lwpoly->nrings-1; - if ( ngeoms > 0 ) - geoms = malloc(sizeof(GEOSGeom)*ngeoms); + if (ngeoms > 0) + geoms = malloc(sizeof(GEOSGeom) * ngeoms); - for (i=1; inrings; ++i) + for (i = 1; i < lwpoly->nrings; i++) { geoms[i-1] = ptarray_to_GEOSLinearRing(lwpoly->rings[i], autofix); if ( ! geoms[i-1] ) { uint32_t k; - for (k = 0; k < i-1; k++) + for (k = 0; k < i - 1; k++) GEOSGeom_destroy(geoms[k]); free(geoms); GEOSGeom_destroy(shell); @@ -466,8 +464,7 @@ LWGEOM2GEOS(const LWGEOM *lwgeom, int autofix) lwc = (LWCOLLECTION *)lwgeom; ngeoms = lwc->ngeoms; - if ( ngeoms > 0 ) - geoms = malloc(sizeof(GEOSGeom)*ngeoms); + if (ngeoms > 0) geoms = malloc(sizeof(GEOSGeom) * ngeoms); j = 0; for (i=0; i 0) free(geoms); if ( ! g ) return NULL; break; diff --git a/liblwgeom/lwgeom_topo.c b/liblwgeom/lwgeom_topo.c index 1f42ef82f..a11e1ea60 100644 --- a/liblwgeom/lwgeom_topo.c +++ b/liblwgeom/lwgeom_topo.c @@ -3862,19 +3862,21 @@ lwt_RemIsoEdge(LWT_TOPOLOGY* topo, LWT_ELEMID id) n = 2; edge = lwt_be_getEdgeByNode( topo, nid, &n, LWT_COL_EDGE_EDGE_ID ); - if ( n == -1 ) + if ((n == -1) || (edge == NULL)) { - lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface)); - return -1; + lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface)); + return -1; } - for ( i=0; ibe_iface)); return -1; @@ -4428,17 +4430,19 @@ _lwt_HealEdges( LWT_TOPOLOGY* topo, LWT_ELEMID eid1, LWT_ELEMID eid2, } if ( ! e1 ) { - if ( edges ) _lwt_release_edges(edges, nedges); - lwerror("SQL/MM Spatial exception - non-existent edge %" - LWTFMT_ELEMID, eid1); - return -1; + _lwt_release_edges(edges, nedges); + lwerror( + "SQL/MM Spatial exception - non-existent edge %" LWTFMT_ELEMID, + eid1); + return -1; } if ( ! e2 ) { - if ( edges ) _lwt_release_edges(edges, nedges); - lwerror("SQL/MM Spatial exception - non-existent edge %" - LWTFMT_ELEMID, eid2); - return -1; + _lwt_release_edges(edges, nedges); + lwerror( + "SQL/MM Spatial exception - non-existent edge %" LWTFMT_ELEMID, + eid2); + return -1; } /* NOT IN THE SPECS: See if any of the two edges are closed. */ diff --git a/liblwgeom/lwin_twkb.c b/liblwgeom/lwin_twkb.c index 89670d909..a947adbfc 100644 --- a/liblwgeom/lwin_twkb.c +++ b/liblwgeom/lwin_twkb.c @@ -670,13 +670,6 @@ LWGEOM* lwgeom_from_twkb(const uint8_t *twkb, size_t twkb_size, char check) s.check = check; s.coords = coords; - /* Handle the check catch-all values */ - if ( check & LW_PARSER_CHECK_NONE ) - s.check = 0; - else - s.check = check; - - /* Read the rest of the geometry */ return lwgeom_from_twkb_state(&s); } diff --git a/liblwgeom/lwin_wkb.c b/liblwgeom/lwin_wkb.c index 53bb21ec1..8d9910289 100644 --- a/liblwgeom/lwin_wkb.c +++ b/liblwgeom/lwin_wkb.c @@ -783,12 +783,6 @@ LWGEOM* lwgeom_from_wkb(const uint8_t *wkb, const size_t wkb_size, const char ch s.has_srid = LW_FALSE; s.pos = wkb; - /* Hand the check catch-all values */ - if ( check & LW_PARSER_CHECK_NONE ) - s.check = 0; - else - s.check = check; - return lwgeom_from_wkb_state(&s); } diff --git a/liblwgeom/lwlinearreferencing.c b/liblwgeom/lwlinearreferencing.c index d6ab0089d..3ecbd77ca 100644 --- a/liblwgeom/lwlinearreferencing.c +++ b/liblwgeom/lwlinearreferencing.c @@ -555,9 +555,8 @@ lwline_clip_to_ordinate_range(const LWLINE *line, char ordinate, double from, do int added_last_point = 0; POINT4D *p = NULL, *q = NULL, *r = NULL; double ordinate_value_p = 0.0, ordinate_value_q = 0.0; - char hasz = lwgeom_has_z(lwline_as_lwgeom(line)); - char hasm = lwgeom_has_m(lwline_as_lwgeom(line)); - char dims = FLAGS_NDIMS(line->flags); + char hasz, hasm; + char dims; /* Null input, nothing we can do. */ if ( ! line ) @@ -565,6 +564,9 @@ lwline_clip_to_ordinate_range(const LWLINE *line, char ordinate, double from, do lwerror("Null input geometry."); return NULL; } + hasz = lwgeom_has_z(lwline_as_lwgeom(line)); + hasm = lwgeom_has_m(lwline_as_lwgeom(line)); + dims = FLAGS_NDIMS(line->flags); /* Ensure 'from' is less than 'to'. */ if ( to < from ) @@ -800,7 +802,8 @@ lwgeom_clip_to_ordinate_range(const LWGEOM *lwin, char ordinate, double from, do lwerror("lwgeom_clip_to_ordinate_range clipping routine returned NULL"); /* Return if we aren't going to offset the result */ - if ( FP_EQUALS(offset, 0.0) || lwgeom_is_empty(lwcollection_as_lwgeom(out_col)) ) + if (FP_IS_ZERO(offset) || + lwgeom_is_empty(lwcollection_as_lwgeom(out_col))) return out_col; /* Construct a collection to hold our outputs. */ diff --git a/liblwgeom/lwout_wkb.c b/liblwgeom/lwout_wkb.c index 91730a307..4cf4cd319 100644 --- a/liblwgeom/lwout_wkb.c +++ b/liblwgeom/lwout_wkb.c @@ -708,7 +708,7 @@ static uint8_t* lwgeom_to_wkb_buf(const LWGEOM *geom, uint8_t *buf, uint8_t vari { /* Do not simplify empties when outputting to canonical form */ - if ( lwgeom_is_empty(geom) & ! (variant & WKB_EXTENDED) ) + if (lwgeom_is_empty(geom) && !(variant & WKB_EXTENDED)) return empty_to_wkb_buf(geom, buf, variant); switch ( geom->type ) diff --git a/liblwgeom/lwpoly.c b/liblwgeom/lwpoly.c index c0aefb6e6..abfa4625a 100644 --- a/liblwgeom/lwpoly.c +++ b/liblwgeom/lwpoly.c @@ -169,23 +169,21 @@ lwpoly_construct_empty(int srid, char hasz, char hasm) return result; } -void lwpoly_free(LWPOLY *poly) +void +lwpoly_free(LWPOLY* poly) { uint32_t t; - if( ! poly ) return; + if (!poly) return; - if ( poly->bbox ) - lwfree(poly->bbox); - - for (t=0; tnrings; t++) - { - if ( poly->rings[t] ) - ptarray_free(poly->rings[t]); - } + if (poly->bbox) lwfree(poly->bbox); if ( poly->rings ) + { + for (t = 0; t < poly->nrings; t++) + if (poly->rings[t]) ptarray_free(poly->rings[t]); lwfree(poly->rings); + } lwfree(poly); } diff --git a/liblwgeom/measures.c b/liblwgeom/measures.c index f5cf7fa76..fab1d85ce 100644 --- a/liblwgeom/measures.c +++ b/liblwgeom/measures.c @@ -1405,14 +1405,14 @@ lw_dist2d_seg_arc(const POINT2D *A1, const POINT2D *A2, const POINT2D *B1, const /* Closest point is in the arc, but not in the segment, so */ /* one of the segment end points must be the closest. */ - if ( pt_in_arc & ! pt_in_seg ) + if (pt_in_arc && !pt_in_seg) { lw_dist2d_pt_arc(A1, B1, B2, B3, dl); lw_dist2d_pt_arc(A2, B1, B2, B3, dl); return LW_TRUE; } /* or, one of the arc end points is the closest */ - else if ( pt_in_seg && ! pt_in_arc ) + else if (pt_in_seg && !pt_in_arc) { lw_dist2d_pt_seg(B1, A1, A2, dl); lw_dist2d_pt_seg(B3, A1, A2, dl); @@ -1643,7 +1643,7 @@ lw_dist2d_arc_arc(const POINT2D *A1, const POINT2D *A2, const POINT2D *A3, /* Closest point is in the arc A, but not in the arc B, so */ /* one of the B end points must be the closest. */ - if ( pt_in_arc_A & ! pt_in_arc_B ) + if (pt_in_arc_A && !pt_in_arc_B) { lw_dist2d_pt_arc(B1, A1, A2, A3, dl); lw_dist2d_pt_arc(B3, A1, A2, A3, dl); @@ -1915,10 +1915,7 @@ lw_dist2d_seg_seg(const POINT2D *A, const POINT2D *B, const POINT2D *C, const PO dl->p2=theP; } return LW_TRUE; - } - lwerror("unspecified error in function lw_dist2d_seg_seg"); - return LW_FALSE; /*If we have come here something is wrong*/ } diff --git a/liblwgeom/measures3d.c b/liblwgeom/measures3d.c index 591dd689f..1abbd0626 100644 --- a/liblwgeom/measures3d.c +++ b/liblwgeom/measures3d.c @@ -559,9 +559,6 @@ lw_dist3d_distribute_bruteforce(const LWGEOM *lwg1, const LWGEOM *lwg2, DISTPTS3 lwerror("Unsupported geometry type: %s", lwtype_name(t1)); return LW_FALSE; } - /*You shouldn't being able to get here*/ - lwerror("unspecified error in function lw_dist3d_distribute_bruteforce"); - return LW_FALSE; } diff --git a/liblwgeom/ptarray.c b/liblwgeom/ptarray.c index 5ecfb145e..6dc6df012 100644 --- a/liblwgeom/ptarray.c +++ b/liblwgeom/ptarray.c @@ -260,8 +260,6 @@ ptarray_append_ptarray(POINTARRAY *pa1, POINTARRAY *pa2, double gap_tolerance) int ptarray_remove_point(POINTARRAY *pa, uint32_t where) { - size_t ptsize = ptarray_point_size(pa); - /* Check for pathology */ if( ! pa ) { @@ -277,10 +275,10 @@ ptarray_remove_point(POINTARRAY *pa, uint32_t where) } /* If the point is any but the last, we need to copy the data back one point */ - if( where < pa->npoints - 1 ) - { - memmove(getPoint_internal(pa, where), getPoint_internal(pa, where+1), ptsize * (pa->npoints - where - 1)); - } + if (where < pa->npoints - 1) + memmove(getPoint_internal(pa, where), + getPoint_internal(pa, where + 1), + ptarray_point_size(pa) * (pa->npoints - where - 1)); /* We have one less point */ pa->npoints--; diff --git a/libpgcommon/gserialized_gist.c b/libpgcommon/gserialized_gist.c index d7aeddb77..e153d420a 100644 --- a/libpgcommon/gserialized_gist.c +++ b/libpgcommon/gserialized_gist.c @@ -248,7 +248,6 @@ int gserialized_datum_get_gidx_p(Datum gsdatum, GIDX *gidx) { GSERIALIZED *gpart; - int result = LW_SUCCESS; POSTGIS_DEBUG(4, "entered function"); @@ -278,7 +277,6 @@ gserialized_datum_get_gidx_p(Datum gsdatum, GIDX *gidx) GIDX_SET_MAX(gidx,2,FLT_MAX); } SET_VARSIZE(gidx, VARHDRSZ + size); - result = LW_SUCCESS; } else { @@ -296,17 +294,14 @@ gserialized_datum_get_gidx_p(Datum gsdatum, GIDX *gidx) } lwgeom_free(lwgeom); POSTGIS_FREE_IF_COPY_P(g, gsdatum); - result = gidx_from_gbox_p(gbox, gidx); + gidx_from_gbox_p(gbox, gidx); } POSTGIS_FREE_IF_COPY_P(gpart, gsdatum); - if ( result == LW_SUCCESS ) - { - POSTGIS_DEBUGF(4, "got gidx %s", gidx_to_string(gidx)); - } + POSTGIS_DEBUGF(4, "got gidx %s", gidx_to_string(gidx)); - return result; + return LW_SUCCESS; } @@ -318,10 +313,7 @@ gserialized_datum_get_gidx_p(Datum gsdatum, GIDX *gidx) */ int gserialized_get_gidx_p(const GSERIALIZED *g, GIDX *gidx) { - int result = LW_SUCCESS; - POSTGIS_DEBUG(4, "entered function"); - POSTGIS_DEBUGF(4, "got flags %d", g->flags); if ( FLAGS_GET_BBOX(g->flags) ) @@ -344,14 +336,11 @@ int gserialized_get_gidx_p(const GSERIALIZED *g, GIDX *gidx) return LW_FAILURE; } lwgeom_free(lwgeom); - result = gidx_from_gbox_p(gbox, gidx); - } - if ( result == LW_SUCCESS ) - { - POSTGIS_DEBUGF(4, "got gidx %s", gidx_to_string(gidx)); + gidx_from_gbox_p(gbox, gidx); } + POSTGIS_DEBUGF(4, "got gidx %s", gidx_to_string(gidx)); - return result; + return LW_SUCCESS; } diff --git a/libpgcommon/lwgeom_transform.c b/libpgcommon/lwgeom_transform.c index 138639c30..d01dd1a67 100644 --- a/libpgcommon/lwgeom_transform.c +++ b/libpgcommon/lwgeom_transform.c @@ -273,10 +273,10 @@ static void DeletePJHashEntry(MemoryContext mcxt) /* Delete the projection object from the hash */ he = (PJHashEntry *) hash_search(PJHash, key, HASH_REMOVE, NULL); - he->projection = NULL; - if (!he) elog(ERROR, "DeletePJHashEntry: There was an error removing the PROJ4 projection object from this MemoryContext (%p)", (void *)mcxt); + else + he->projection = NULL; } bool diff --git a/loader/shp2pgsql-core.c b/loader/shp2pgsql-core.c index 05586d8f6..3498d3ab3 100644 --- a/loader/shp2pgsql-core.c +++ b/loader/shp2pgsql-core.c @@ -1172,8 +1172,11 @@ ShpLoaderOpenShape(SHPLOADERSTATE *state) { if (strcmp(state->field_names[z], name) == 0) { - strncat(name, "__", MAXFIELDNAMELEN); - snprintf(name + strlen(name), MAXFIELDNAMELEN, "%i", j); + strncat(name, "__", MAXFIELDNAMELEN - 1); + snprintf(name + strlen(name), + MAXFIELDNAMELEN - 1 - strlen(name), + "%i", + j); break; } } diff --git a/postgis/geography_inout.c b/postgis/geography_inout.c index 2b43d577e..558637ecd 100644 --- a/postgis/geography_inout.c +++ b/postgis/geography_inout.c @@ -217,7 +217,7 @@ Datum geography_as_gml(PG_FUNCTION_ARGS) char *srs; int srid = SRID_DEFAULT; int precision = DBL_DIG; - int option=0; + int option = 0; int lwopts = LW_GML_IS_DIMS; static const char *default_prefix = "gml:"; const char *prefix = default_prefix; @@ -306,6 +306,22 @@ Datum geography_as_gml(PG_FUNCTION_ARGS) /* Revert lat/lon only with long SRS */ if (option & 1) lwopts |= LW_GML_IS_DEGREE; if (option & 2) lwopts &= ~LW_GML_IS_DIMS; + if (option & 8) + { + elog(ERROR, + "Options %d passed to ST_AsGML(geography) sets " + "unsupported value 8", + option); + PG_RETURN_NULL(); + } + if ((option & 4) || (option & 16) || (option & 32)) + { + elog(ERROR, + "Options %d passed to ST_AsGML(geography) but are only " + "applicable to ST_AsGML(geometry)", + option); + PG_RETURN_NULL(); + } if (version == 2) gml = lwgeom_to_gml2(lwgeom, srs, precision, prefix); diff --git a/postgis/gserialized_estimate.c b/postgis/gserialized_estimate.c index c6fea2303..e944657a6 100644 --- a/postgis/gserialized_estimate.c +++ b/postgis/gserialized_estimate.c @@ -1918,8 +1918,7 @@ estimate_selectivity(const GBOX *box, const ND_STATS *nd_stats, int mode) double min[ND_DIMS]; double max[ND_DIMS]; double total_count = 0.0; - int ndims_max = Max(nd_stats->ndims, gbox_ndims(box)); - /* int ndims_min = Min(nd_stats->ndims, gbox_ndims(box)); */ + int ndims_max; /* Calculate the overlap of the box on the histogram */ if ( ! nd_stats ) @@ -1928,6 +1927,8 @@ estimate_selectivity(const GBOX *box, const ND_STATS *nd_stats, int mode) return FALLBACK_ND_SEL; } + ndims_max = Max(nd_stats->ndims, gbox_ndims(box)); + /* Initialize nd_box. */ nd_box_from_gbox(box, &nd_box); diff --git a/postgis/gserialized_typmod.c b/postgis/gserialized_typmod.c index 82759eb56..ae00cb5c6 100644 --- a/postgis/gserialized_typmod.c +++ b/postgis/gserialized_typmod.c @@ -64,16 +64,16 @@ Datum postgis_typmod_out(PG_FUNCTION_ARGS) { char *s = (char*)palloc(64); char *str = s; - uint32 typmod = PG_GETARG_INT32(0); - uint32 srid = TYPMOD_GET_SRID(typmod); - uint32 type = TYPMOD_GET_TYPE(typmod); - uint32 hasz = TYPMOD_GET_Z(typmod); - uint32 hasm = TYPMOD_GET_M(typmod); + int32 typmod = PG_GETARG_INT32(0); + int32 srid = TYPMOD_GET_SRID(typmod); + int32 type = TYPMOD_GET_TYPE(typmod); + int32 hasz = TYPMOD_GET_Z(typmod); + int32 hasm = TYPMOD_GET_M(typmod); POSTGIS_DEBUGF(3, "Got typmod(srid = %d, type = %d, hasz = %d, hasm = %d)", srid, type, hasz, hasm); /* No SRID or type or dimensionality? Then no typmod at all. Return empty string. */ - if ( ! ( srid || type || hasz || hasm ) ) + if (!(srid || type || hasz || hasm) || typmod < 0) { *str = '\0'; PG_RETURN_CSTRING(str); @@ -83,26 +83,19 @@ Datum postgis_typmod_out(PG_FUNCTION_ARGS) str += sprintf(str, "("); /* Has type? */ - if ( type ) + if (type) str += sprintf(str, "%s", lwtype_name(type)); - else if ( (!type) && ( srid || hasz || hasm ) ) - str += sprintf(str, "Geometry"); + else if (srid || hasz || hasm) + str += sprintf(str, "Geometry"); /* Has Z? */ - if ( hasz ) - str += sprintf(str, "%s", "Z"); + if (hasz) str += sprintf(str, "%s", "Z"); /* Has M? */ - if ( hasm ) - str += sprintf(str, "%s", "M"); - - /* Comma? */ - if ( srid ) - str += sprintf(str, ","); + if (hasm) str += sprintf(str, "%s", "M"); /* Has SRID? */ - if ( srid ) - str += sprintf(str, "%d", srid); + if (srid) str += sprintf(str, ",%d", srid); /* Closing bracket. */ str += sprintf(str, ")"); @@ -218,7 +211,7 @@ GSERIALIZED* postgis_valid_typmod(GSERIALIZED *gser, int32_t typmod) static uint32 gserialized_typmod_in(ArrayType *arr, int is_geography) { - uint32 typmod = 0; + int32 typmod = 0; Datum *elem_values; int n = 0; int i = 0; @@ -299,7 +292,7 @@ PG_FUNCTION_INFO_V1(geography_typmod_in); Datum geography_typmod_in(PG_FUNCTION_ARGS) { ArrayType *arr = (ArrayType *) DatumGetPointer(PG_GETARG_DATUM(0)); - uint32 typmod = gserialized_typmod_in(arr, LW_TRUE); + int32 typmod = gserialized_typmod_in(arr, LW_TRUE); int srid = TYPMOD_GET_SRID(typmod); /* Check the SRID is legal (geographic coordinates) */ srid_is_latlong(fcinfo, srid); diff --git a/postgis/lwgeom_box3d.c b/postgis/lwgeom_box3d.c index 47df750b5..73cfc2acd 100644 --- a/postgis/lwgeom_box3d.c +++ b/postgis/lwgeom_box3d.c @@ -487,11 +487,9 @@ Datum BOX3D_combine(PG_FUNCTION_ARGS) int rv; /* Can't do anything with null inputs */ - if ( (box == NULL) && (geom == NULL) ) - PG_RETURN_NULL(); - + if ((box == NULL) && (geom == NULL)) { PG_RETURN_NULL(); } /* Null geometry but non-null box, return the box */ - if (geom == NULL) + else if (geom == NULL) { result = palloc(sizeof(BOX3D)); memcpy(result, box, sizeof(BOX3D)); diff --git a/postgis/lwgeom_export.c b/postgis/lwgeom_export.c index 74bf1aafd..20763d637 100644 --- a/postgis/lwgeom_export.c +++ b/postgis/lwgeom_export.c @@ -119,8 +119,7 @@ int getSRIDbySRS(const char* srs) char query[256]; int srid, err; - if (srs == NULL) - return 0; + if (!srs) return 0; if (SPI_OK_CONNECT != SPI_connect ()) { @@ -166,11 +165,6 @@ int getSRIDbySRS(const char* srs) } srid = atoi(SPI_getvalue(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 1)); - if ( ! srs ) - { - SPI_finish(); - return 0; - } SPI_finish(); @@ -215,18 +209,18 @@ Datum LWGEOM_asGML(PG_FUNCTION_ARGS) geom = PG_GETARG_GSERIALIZED_P(1); /* Retrieve precision if any (default is max) */ - if (PG_NARGS() >2 && !PG_ARGISNULL(2)) + if (PG_NARGS() > 2 && !PG_ARGISNULL(2)) { precision = PG_GETARG_INT32(2); /* TODO: leave this to liblwgeom ? */ - if ( precision > DBL_DIG ) + if (precision > DBL_DIG) precision = DBL_DIG; - else if ( precision < 0 ) precision = 0; + else if (precision < 0) + precision = 0; } /* retrieve option */ - if (PG_NARGS() >3 && !PG_ARGISNULL(3)) - option = PG_GETARG_INT32(3); + if (PG_NARGS() > 3 && !PG_ARGISNULL(3)) option = PG_GETARG_INT32(3); /* retrieve prefix */ if (PG_NARGS() >4 && !PG_ARGISNULL(4)) @@ -270,21 +264,38 @@ Datum LWGEOM_asGML(PG_FUNCTION_ARGS) else if (option & 1) srs = getSRSbySRID(srid, false); else srs = getSRSbySRID(srid, true); - if (option & 2) lwopts &= ~LW_GML_IS_DIMS; - if (option & 4) lwopts |= LW_GML_SHORTLINE; + if (option & 2) lwopts &= ~LW_GML_IS_DIMS; + if (option & 4) lwopts |= LW_GML_SHORTLINE; + if (option & 8) + { + elog(ERROR, + "Options %d passed to ST_AsGML(geography) sets " + "unsupported value 8", + option); + PG_RETURN_NULL(); + } if (option & 16) lwopts |= LW_GML_IS_DEGREE; - if (option & 32) lwopts |= LW_GML_EXTENT; + if (option & 32) lwopts |= LW_GML_EXTENT; lwgeom = lwgeom_from_gserialized(geom); - if (version == 2 && lwopts & LW_GML_EXTENT) - gml = lwgeom_extent_to_gml2(lwgeom, srs, precision, prefix); - else if (version == 2) - gml = lwgeom_to_gml2(lwgeom, srs, precision, prefix); - else if (version == 3 && lwopts & LW_GML_EXTENT) - gml = lwgeom_extent_to_gml3(lwgeom, srs, precision, lwopts, prefix); - else if (version == 3) - gml = lwgeom_to_gml3(lwgeom, srs, precision, lwopts, prefix, gml_id); + if (version == 2) + { + if (lwopts & LW_GML_EXTENT) + gml = lwgeom_extent_to_gml2( + lwgeom, srs, precision, prefix); + else + gml = lwgeom_to_gml2(lwgeom, srs, precision, prefix); + } + if (version == 3) + { + if (lwopts & LW_GML_EXTENT) + gml = lwgeom_extent_to_gml3( + lwgeom, srs, precision, lwopts, prefix); + else + gml = lwgeom_to_gml3( + lwgeom, srs, precision, lwopts, prefix, gml_id); + } lwgeom_free(lwgeom); PG_FREE_IF_COPY(geom, 1); diff --git a/postgis/lwgeom_functions_basic.c b/postgis/lwgeom_functions_basic.c index 6cdc574bf..355f93961 100644 --- a/postgis/lwgeom_functions_basic.c +++ b/postgis/lwgeom_functions_basic.c @@ -2720,13 +2720,6 @@ Datum ST_CollectionExtract(PG_FUNCTION_ARGS) lwcol = lwcollection_as_lwgeom(lwcollection_extract((LWCOLLECTION*)lwgeom, type)); } -#if 0 - if (lwgeom_is_empty(lwcollection_as_lwgeom(lwcol))) - { - lwgeom_free(lwgeom); - PG_RETURN_NULL(); - } -#endif output = geometry_serialize((LWGEOM*)lwcol); lwgeom_free(lwgeom); lwgeom_free(lwcol); @@ -2745,10 +2738,10 @@ Datum ST_CollectionHomogenize(PG_FUNCTION_ARGS) lwoutput = lwgeom_homogenize(lwgeom); lwgeom_free(lwgeom); - if ( ! lwoutput ) + if (!lwoutput) { - PG_RETURN_NULL(); PG_FREE_IF_COPY(input, 0); + PG_RETURN_NULL(); } output = geometry_serialize(lwoutput); diff --git a/postgis/lwgeom_geos.c b/postgis/lwgeom_geos.c index 9236c918b..b366a8a0c 100644 --- a/postgis/lwgeom_geos.c +++ b/postgis/lwgeom_geos.c @@ -188,29 +188,22 @@ Datum hausdorffdistance(PG_FUNCTION_ARGS) initGEOS(lwpgnotice, lwgeom_geos_error); g1 = (GEOSGeometry *)POSTGIS2GEOS(geom1); - if ( 0 == g1 ) /* exception thrown at construction */ - { + if (!g1) HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } g2 = (GEOSGeometry *)POSTGIS2GEOS(geom2); - if ( 0 == g2 ) /* exception thrown */ + if (!g2) { - HANDLE_GEOS_ERROR("Second argument geometry could not be converted to GEOS"); GEOSGeom_destroy(g1); - PG_RETURN_NULL(); + HANDLE_GEOS_ERROR( + "Second argument geometry could not be converted to GEOS"); } retcode = GEOSHausdorffDistance(g1, g2, &result); GEOSGeom_destroy(g1); GEOSGeom_destroy(g2); - if (retcode == 0) - { - HANDLE_GEOS_ERROR("GEOSHausdorffDistance"); - PG_RETURN_NULL(); /*never get here */ - } + if (retcode == 0) HANDLE_GEOS_ERROR("GEOSHausdorffDistance"); PG_FREE_IF_COPY(geom1, 0); PG_FREE_IF_COPY(geom2, 1); @@ -247,29 +240,22 @@ Datum hausdorffdistancedensify(PG_FUNCTION_ARGS) initGEOS(lwpgnotice, lwgeom_geos_error); g1 = (GEOSGeometry *)POSTGIS2GEOS(geom1); - if ( 0 == g1 ) /* exception thrown at construction */ - { + if (!g1) HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } g2 = (GEOSGeometry *)POSTGIS2GEOS(geom2); - if ( 0 == g2 ) /* exception thrown at construction */ + if (!g2) { - HANDLE_GEOS_ERROR("Second argument geometry could not be converted to GEOS"); GEOSGeom_destroy(g1); - PG_RETURN_NULL(); + HANDLE_GEOS_ERROR( + "Second argument geometry could not be converted to GEOS"); } retcode = GEOSHausdorffDistanceDensify(g1, g2, densifyFrac, &result); GEOSGeom_destroy(g1); GEOSGeom_destroy(g2); - if (retcode == 0) - { - HANDLE_GEOS_ERROR("GEOSHausdorffDistanceDensify"); - PG_RETURN_NULL(); /*never get here */ - } + if (retcode == 0) HANDLE_GEOS_ERROR("GEOSHausdorffDistanceDensify"); PG_FREE_IF_COPY(geom1, 0); PG_FREE_IF_COPY(geom2, 1); @@ -314,18 +300,15 @@ Datum ST_FrechetDistance(PG_FUNCTION_ARGS) initGEOS(lwpgnotice, lwgeom_geos_error); g1 = (GEOSGeometry *)POSTGIS2GEOS(geom1); - if ( 0 == g1 ) /* exception thrown at construction */ - { + if (!g1) HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } g2 = (GEOSGeometry *)POSTGIS2GEOS(geom2); - if ( 0 == g2 ) /* exception thrown at construction */ + if (!g2) { - HANDLE_GEOS_ERROR("Second argument geometry could not be converted to GEOS"); GEOSGeom_destroy(g1); - PG_RETURN_NULL(); + HANDLE_GEOS_ERROR( + "Second argument geometry could not be converted to GEOS"); } if (densifyFrac <= 0.0) @@ -340,11 +323,7 @@ Datum ST_FrechetDistance(PG_FUNCTION_ARGS) GEOSGeom_destroy(g1); GEOSGeom_destroy(g2); - if (retcode == 0) - { - HANDLE_GEOS_ERROR("GEOSFrechetDistance"); - PG_RETURN_NULL(); /*never get here */ - } + if (retcode == 0) HANDLE_GEOS_ERROR("GEOSFrechetDistance"); PG_FREE_IF_COPY(geom1, 0); PG_FREE_IF_COPY(geom2, 1); @@ -485,9 +464,9 @@ Datum pgis_union_geometry_array(PG_FUNCTION_ARGS) /* Uh oh! Exception thrown at construction... */ if ( ! g ) { - HANDLE_GEOS_ERROR("One of the geometries in the set " - "could not be converted to GEOS"); - PG_RETURN_NULL(); + HANDLE_GEOS_ERROR( + "One of the geometries in the set " + "could not be converted to GEOS"); } /* Ensure we have enough space in our storage array */ @@ -511,19 +490,14 @@ Datum pgis_union_geometry_array(PG_FUNCTION_ARGS) if (curgeom > 0) { g = GEOSGeom_createCollection(GEOS_GEOMETRYCOLLECTION, geoms, curgeom); - if ( ! g ) - { - HANDLE_GEOS_ERROR("Could not create GEOS COLLECTION from geometry array"); - PG_RETURN_NULL(); - } + if (!g) + HANDLE_GEOS_ERROR( + "Could not create GEOS COLLECTION from geometry " + "array"); g_union = GEOSUnaryUnion(g); GEOSGeom_destroy(g); - if ( ! g_union ) - { - HANDLE_GEOS_ERROR("GEOSUnaryUnion"); - PG_RETURN_NULL(); - } + if (!g_union) HANDLE_GEOS_ERROR("GEOSUnaryUnion"); GEOSSetSRID(g_union, srid); gser_out = GEOS2POSTGIS(g_union, is3d); @@ -689,19 +663,15 @@ Datum boundary(PG_FUNCTION_ARGS) g1 = LWGEOM2GEOS(lwgeom, 0); lwgeom_free(lwgeom); - if ( 0 == g1 ) /* exception thrown at construction */ - { + if (!g1) HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } g3 = (GEOSGeometry *)GEOSBoundary(g1); - if (g3 == NULL) + if (!g3) { GEOSGeom_destroy(g1); HANDLE_GEOS_ERROR("GEOSBoundary"); - PG_RETURN_NULL(); /* never get here */ } POSTGIS_DEBUGF(3, "result: %s", GEOSGeomToWKT(g3)); @@ -710,12 +680,13 @@ Datum boundary(PG_FUNCTION_ARGS) result = GEOS2POSTGIS(g3, gserialized_has_z(geom1)); - if (result == NULL) + if (!result) { GEOSGeom_destroy(g1); - GEOSGeom_destroy(g3); - elog(NOTICE,"GEOS2POSTGIS threw an error (result postgis geometry formation)!"); + elog(NOTICE, + "GEOS2POSTGIS threw an error (result postgis geometry " + "formation)!"); PG_RETURN_NULL(); /* never get here */ } @@ -749,20 +720,13 @@ Datum convexhull(PG_FUNCTION_ARGS) g1 = (GEOSGeometry *)POSTGIS2GEOS(geom1); - if ( 0 == g1 ) /* exception thrown at construction */ - { + if (!g1) HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } g3 = (GEOSGeometry *)GEOSConvexHull(g1); GEOSGeom_destroy(g1); - if (g3 == NULL) - { - HANDLE_GEOS_ERROR("GEOSConvexHull"); - PG_RETURN_NULL(); /* never get here */ - } + if (!g3) HANDLE_GEOS_ERROR("GEOSConvexHull"); POSTGIS_DEBUGF(3, "result: %s", GEOSGeomToWKT(g3)); @@ -771,9 +735,10 @@ Datum convexhull(PG_FUNCTION_ARGS) lwout = GEOS2LWGEOM(g3, gserialized_has_z(geom1)); GEOSGeom_destroy(g3); - if (lwout == NULL) + if (!lwout) { - elog(ERROR,"convexhull() failed to convert GEOS geometry to LWGEOM"); + elog(ERROR, + "convexhull() failed to convert GEOS geometry to LWGEOM"); PG_RETURN_NULL(); /* never get here */ } @@ -788,7 +753,7 @@ Datum convexhull(PG_FUNCTION_ARGS) result = geometry_serialize(lwout); lwgeom_free(lwout); - if (result == NULL) + if (!result) { elog(ERROR,"GEOS convexhull() threw an error (result postgis geometry formation)!"); PG_RETURN_NULL(); /* never get here */ @@ -816,20 +781,13 @@ Datum topologypreservesimplify(PG_FUNCTION_ARGS) initGEOS(lwpgnotice, lwgeom_geos_error); g1 = (GEOSGeometry *)POSTGIS2GEOS(geom1); - if ( 0 == g1 ) /* exception thrown at construction */ - { + if (!g1) HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } g3 = GEOSTopologyPreserveSimplify(g1,tolerance); GEOSGeom_destroy(g1); - if (g3 == NULL) - { - HANDLE_GEOS_ERROR("GEOSTopologyPreserveSimplify"); - PG_RETURN_NULL(); /* never get here */ - } + if (!g3) HANDLE_GEOS_ERROR("GEOSTopologyPreserveSimplify"); POSTGIS_DEBUGF(3, "result: %s", GEOSGeomToWKT(g3)); @@ -838,7 +796,7 @@ Datum topologypreservesimplify(PG_FUNCTION_ARGS) result = GEOS2POSTGIS(g3, gserialized_has_z(geom1)); GEOSGeom_destroy(g3); - if (result == NULL) + if (!result) { elog(ERROR,"GEOS topologypreservesimplify() threw an error (result postgis geometry formation)!"); PG_RETURN_NULL(); /* never get here */ @@ -897,11 +855,8 @@ Datum buffer(PG_FUNCTION_ARGS) initGEOS(lwpgnotice, lwgeom_geos_error); g1 = (GEOSGeometry *)POSTGIS2GEOS(geom1); - if ( 0 == g1 ) /* exception thrown at construction */ - { + if (!g1) HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } if (nargs > 2) { @@ -914,12 +869,12 @@ Datum buffer(PG_FUNCTION_ARGS) { char *key, *val; param = strtok(param, " "); - if ( param == NULL ) break; + if (!param) break; POSTGIS_DEBUGF(3, "Param: %s", param); key = param; val = strchr(key, '='); - if ( val == NULL || *(val+1) == '\0' ) + if (!val || *(val + 1) == '\0') { lwpgerror("Missing value for buffer " "parameter %s", key); @@ -1015,11 +970,7 @@ Datum buffer(PG_FUNCTION_ARGS) g3 = GEOSBufferWithStyle(g1, size, quadsegs, endCapStyle, joinStyle, mitreLimit); GEOSGeom_destroy(g1); - if (g3 == NULL) - { - HANDLE_GEOS_ERROR("GEOSBuffer"); - PG_RETURN_NULL(); /* never get here */ - } + if (!g3) HANDLE_GEOS_ERROR("GEOSBuffer"); POSTGIS_DEBUGF(3, "result: %s", GEOSGeomToWKT(g3)); @@ -1028,7 +979,7 @@ Datum buffer(PG_FUNCTION_ARGS) result = GEOS2POSTGIS(g3, gserialized_has_z(geom1)); GEOSGeom_destroy(g3); - if (result == NULL) + if (!result) { elog(ERROR,"GEOS buffer() threw an error (result postgis geometry formation)!"); PG_RETURN_NULL(); /* never get here */ @@ -1149,12 +1100,12 @@ Datum ST_OffsetCurve(PG_FUNCTION_ARGS) { char *key, *val; param = strtok(param, " "); - if ( param == NULL ) break; + if (!param) break; POSTGIS_DEBUGF(3, "Param: %s", param); key = param; val = strchr(key, '='); - if ( val == NULL || *(val+1) == '\0' ) + if (!val || *(val + 1) == '\0') { lwpgerror("ST_OffsetCurve: Missing value for buffer parameter %s", key); break; @@ -1210,7 +1161,7 @@ Datum ST_OffsetCurve(PG_FUNCTION_ARGS) lwgeom_result = lwgeom_offsetcurve(lwgeom_as_lwline(lwgeom_input), size, quadsegs, joinStyle, mitreLimit); - if (lwgeom_result == NULL) + if (!lwgeom_result) lwpgerror("ST_OffsetCurve: lwgeom_offsetcurve returned NULL"); gser_result = gserialized_from_lwgeom(lwgeom_result, 0); @@ -1308,7 +1259,7 @@ Datum pointonsurface(PG_FUNCTION_ARGS) g1 = (GEOSGeometry *)POSTGIS2GEOS(geom); - if ( 0 == g1 ) /* exception thrown at construction */ + if (!g1) { /* Why is this a WARNING rather than an error ? */ /* TODO: use HANDLE_GEOS_ERROR instead */ @@ -1318,11 +1269,10 @@ Datum pointonsurface(PG_FUNCTION_ARGS) g3 = GEOSPointOnSurface(g1); - if (g3 == NULL) + if (!g3) { GEOSGeom_destroy(g1); HANDLE_GEOS_ERROR("GEOSPointOnSurface"); - PG_RETURN_NULL(); /* never get here */ } POSTGIS_DEBUGF(3, "result: %s", GEOSGeomToWKT(g3) ) ; @@ -1331,7 +1281,7 @@ Datum pointonsurface(PG_FUNCTION_ARGS) result = GEOS2POSTGIS(g3, gserialized_has_z(geom)); - if (result == NULL) + if (!result) { GEOSGeom_destroy(g1); GEOSGeom_destroy(g3); @@ -1377,8 +1327,7 @@ Datum centroid(PG_FUNCTION_ARGS) PG_FREE_IF_COPY(geom, 0); /*free memory, we already have a lwgeom geometry copy*/ linear_geom = lwgeom_stroke(igeom, perQuad); lwgeom_free(igeom); - if (linear_geom == NULL) - PG_RETURN_NULL(); + if (!linear_geom) PG_RETURN_NULL(); geom = geometry_serialize(linear_geom); lwgeom_free(linear_geom); @@ -1388,26 +1337,22 @@ Datum centroid(PG_FUNCTION_ARGS) geosgeom = (GEOSGeometry *)POSTGIS2GEOS(geom); - if ( 0 == geosgeom ) /* exception thrown at construction */ - { + if (!geosgeom) HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } geosresult = GEOSGetCentroid(geosgeom); - if ( geosresult == NULL ) + if (!geosresult) { GEOSGeom_destroy(geosgeom); HANDLE_GEOS_ERROR("GEOSGetCentroid"); - PG_RETURN_NULL(); } GEOSSetSRID(geosresult, gserialized_get_srid(geom)); result = GEOS2POSTGIS(geosresult, gserialized_has_z(geom)); - if (result == NULL) + if (!result) { GEOSGeom_destroy(geosgeom); GEOSGeom_destroy(geosresult); @@ -1481,8 +1426,7 @@ Datum ST_ClipByBox2d(PG_FUNCTION_ARGS) lwgeom_free(lwgeom1); PG_FREE_IF_COPY(geom1, 0); - if ( lwresult == NULL ) - PG_RETURN_NULL(); + if (!lwresult) PG_RETURN_NULL(); result = geometry_serialize(lwresult) ; lwgeom_free(lwresult) ; @@ -1607,11 +1551,7 @@ Datum isvalidreason(PG_FUNCTION_ARGS) { reason_str = GEOSisValidReason(g1); GEOSGeom_destroy((GEOSGeometry *)g1); - if (reason_str == NULL) - { - HANDLE_GEOS_ERROR("GEOSisValidReason"); - PG_RETURN_NULL(); /* never get here */ - } + if (!reason_str) HANDLE_GEOS_ERROR("GEOSisValidReason"); result = cstring2text(reason_str); GEOSFree(reason_str); } @@ -1761,30 +1701,22 @@ Datum overlaps(PG_FUNCTION_ARGS) initGEOS(lwpgnotice, lwgeom_geos_error); g1 = (GEOSGeometry *)POSTGIS2GEOS(geom1); - if ( 0 == g1 ) /* exception thrown at construction */ - { + if (!g1) HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } g2 = (GEOSGeometry *)POSTGIS2GEOS(geom2); - if ( 0 == g2 ) /* exception thrown at construction */ + if (!g2) { GEOSGeom_destroy(g1); HANDLE_GEOS_ERROR("Second argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); } result = GEOSOverlaps(g1,g2); GEOSGeom_destroy(g1); GEOSGeom_destroy(g2); - if (result == 2) - { - HANDLE_GEOS_ERROR("GEOSOverlaps"); - PG_RETURN_NULL(); /* never get here */ - } + if (result == 2) HANDLE_GEOS_ERROR("GEOSOverlaps"); PG_FREE_IF_COPY(geom1, 0); PG_FREE_IF_COPY(geom2, 1); @@ -1899,11 +1831,9 @@ Datum contains(PG_FUNCTION_ARGS) if ( prep_cache && prep_cache->prepared_geom && prep_cache->argnum == 1 ) { g1 = (GEOSGeometry *)POSTGIS2GEOS(geom2); - if ( 0 == g1 ) /* exception thrown at construction */ - { + if (!g1) HANDLE_GEOS_ERROR("Geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } + POSTGIS_DEBUG(4, "containsPrepared: cache is live, running preparedcontains"); result = GEOSPreparedContains( prep_cache->prepared_geom, g1); GEOSGeom_destroy(g1); @@ -1911,17 +1841,17 @@ Datum contains(PG_FUNCTION_ARGS) else { g1 = (GEOSGeometry *)POSTGIS2GEOS(geom1); - if ( 0 == g1 ) /* exception thrown at construction */ - { - HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } + if (!g1) + HANDLE_GEOS_ERROR( + "First argument geometry could not be converted to " + "GEOS"); g2 = (GEOSGeometry *)POSTGIS2GEOS(geom2); - if ( 0 == g2 ) /* exception thrown at construction */ + if (!g2) { - HANDLE_GEOS_ERROR("Second argument geometry could not be converted to GEOS"); + HANDLE_GEOS_ERROR( + "Second argument geometry could not be converted " + "to GEOS"); GEOSGeom_destroy(g1); - PG_RETURN_NULL(); } POSTGIS_DEBUG(4, "containsPrepared: cache is not ready, running standard contains"); result = GEOSContains( g1, g2); @@ -1929,11 +1859,7 @@ Datum contains(PG_FUNCTION_ARGS) GEOSGeom_destroy(g2); } - if (result == 2) - { - HANDLE_GEOS_ERROR("GEOSContains"); - PG_RETURN_NULL(); /* never get here */ - } + if (result == 2) HANDLE_GEOS_ERROR("GEOSContains"); PG_FREE_IF_COPY(geom1, 0); PG_FREE_IF_COPY(geom2, 1); @@ -1979,11 +1905,10 @@ Datum containsproperly(PG_FUNCTION_ARGS) if ( prep_cache && prep_cache->prepared_geom && prep_cache->argnum == 1 ) { GEOSGeometry *g = (GEOSGeometry *)POSTGIS2GEOS(geom2); - if ( 0 == g ) /* exception thrown at construction */ - { - HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } + if (!g) + HANDLE_GEOS_ERROR( + "First argument geometry could not be converted to " + "GEOS"); result = GEOSPreparedContainsProperly( prep_cache->prepared_geom, g); GEOSGeom_destroy(g); } @@ -1993,28 +1918,24 @@ Datum containsproperly(PG_FUNCTION_ARGS) GEOSGeometry *g1; g1 = (GEOSGeometry *)POSTGIS2GEOS(geom1); - if ( 0 == g1 ) /* exception thrown at construction */ - { - HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } + if (!g1) + HANDLE_GEOS_ERROR( + "First argument geometry could not be converted to " + "GEOS"); g2 = (GEOSGeometry *)POSTGIS2GEOS(geom2); - if ( 0 == g2 ) /* exception thrown at construction */ + if (!g2) { - HANDLE_GEOS_ERROR("Second argument geometry could not be converted to GEOS"); GEOSGeom_destroy(g1); - PG_RETURN_NULL(); + HANDLE_GEOS_ERROR( + "Second argument geometry could not be converted " + "to GEOS"); } result = GEOSRelatePattern( g1, g2, "T**FF*FF*" ); GEOSGeom_destroy(g1); GEOSGeom_destroy(g2); } - if (result == 2) - { - HANDLE_GEOS_ERROR("GEOSContains"); - PG_RETURN_NULL(); /* never get here */ - } + if (result == 2) HANDLE_GEOS_ERROR("GEOSContains"); PG_FREE_IF_COPY(geom1, 0); PG_FREE_IF_COPY(geom2, 1); @@ -2118,11 +2039,10 @@ Datum covers(PG_FUNCTION_ARGS) if ( prep_cache && prep_cache->prepared_geom && prep_cache->argnum == 1 ) { GEOSGeometry *g1 = (GEOSGeometry *)POSTGIS2GEOS(geom2); - if ( 0 == g1 ) /* exception thrown at construction */ - { - HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } + if (!g1) + HANDLE_GEOS_ERROR( + "First argument geometry could not be converted to " + "GEOS"); result = GEOSPreparedCovers( prep_cache->prepared_geom, g1); GEOSGeom_destroy(g1); } @@ -2132,28 +2052,24 @@ Datum covers(PG_FUNCTION_ARGS) GEOSGeometry *g2; g1 = (GEOSGeometry *)POSTGIS2GEOS(geom1); - if ( 0 == g1 ) /* exception thrown at construction */ - { - HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } + if (!g1) + HANDLE_GEOS_ERROR( + "First argument geometry could not be converted to " + "GEOS"); g2 = (GEOSGeometry *)POSTGIS2GEOS(geom2); - if ( 0 == g2 ) /* exception thrown at construction */ + if (!g2) { - HANDLE_GEOS_ERROR("Second argument geometry could not be converted to GEOS"); GEOSGeom_destroy(g1); - PG_RETURN_NULL(); + HANDLE_GEOS_ERROR( + "Second argument geometry could not be converted " + "to GEOS"); } result = GEOSRelatePattern( g1, g2, "******FF*" ); GEOSGeom_destroy(g1); GEOSGeom_destroy(g2); } - if (result == 2) - { - HANDLE_GEOS_ERROR("GEOSCovers"); - PG_RETURN_NULL(); /* never get here */ - } + if (result == 2) HANDLE_GEOS_ERROR("GEOSCovers"); PG_FREE_IF_COPY(geom1, 0); PG_FREE_IF_COPY(geom2, 1); @@ -2266,19 +2182,16 @@ Datum coveredby(PG_FUNCTION_ARGS) g1 = (GEOSGeometry *)POSTGIS2GEOS(geom1); - if ( 0 == g1 ) /* exception thrown at construction */ - { + if (!g1) HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } g2 = (GEOSGeometry *)POSTGIS2GEOS(geom2); - if ( 0 == g2 ) /* exception thrown at construction */ + if (!g2) { - HANDLE_GEOS_ERROR("Second argument geometry could not be converted to GEOS"); GEOSGeom_destroy(g1); - PG_RETURN_NULL(); + HANDLE_GEOS_ERROR( + "Second argument geometry could not be converted to GEOS"); } result = GEOSRelatePattern(g1,g2,patt); @@ -2286,11 +2199,7 @@ Datum coveredby(PG_FUNCTION_ARGS) GEOSGeom_destroy(g1); GEOSGeom_destroy(g2); - if (result == 2) - { - HANDLE_GEOS_ERROR("GEOSCoveredBy"); - PG_RETURN_NULL(); /* never get here */ - } + if (result == 2) HANDLE_GEOS_ERROR("GEOSCoveredBy"); PG_FREE_IF_COPY(geom1, 0); PG_FREE_IF_COPY(geom2, 1); @@ -2298,8 +2207,6 @@ Datum coveredby(PG_FUNCTION_ARGS) PG_RETURN_BOOL(result); } - - PG_FUNCTION_INFO_V1(crosses); Datum crosses(PG_FUNCTION_ARGS) { @@ -2335,18 +2242,15 @@ Datum crosses(PG_FUNCTION_ARGS) initGEOS(lwpgnotice, lwgeom_geos_error); g1 = (GEOSGeometry *)POSTGIS2GEOS(geom1); - if ( 0 == g1 ) /* exception thrown at construction */ - { + if (!g1) HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } g2 = (GEOSGeometry *)POSTGIS2GEOS(geom2); - if ( 0 == g2 ) /* exception thrown at construction */ + if (!g2) { - HANDLE_GEOS_ERROR("Second argument geometry could not be converted to GEOS"); GEOSGeom_destroy(g1); - PG_RETURN_NULL(); + HANDLE_GEOS_ERROR( + "Second argument geometry could not be converted to GEOS"); } result = GEOSCrosses(g1,g2); @@ -2354,11 +2258,7 @@ Datum crosses(PG_FUNCTION_ARGS) GEOSGeom_destroy(g1); GEOSGeom_destroy(g2); - if (result == 2) - { - HANDLE_GEOS_ERROR("GEOSCrosses"); - PG_RETURN_NULL(); /* never get here */ - } + if (result == 2) HANDLE_GEOS_ERROR("GEOSCrosses"); PG_FREE_IF_COPY(geom1, 0); PG_FREE_IF_COPY(geom2, 1); @@ -2456,22 +2356,16 @@ Datum geos_intersects(PG_FUNCTION_ARGS) if ( prep_cache->argnum == 1 ) { GEOSGeometry *g = (GEOSGeometry *)POSTGIS2GEOS(geom2); - if ( 0 == g ) /* exception thrown at construction */ - { + if (!g) HANDLE_GEOS_ERROR("Geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } result = GEOSPreparedIntersects( prep_cache->prepared_geom, g); GEOSGeom_destroy(g); } else { GEOSGeometry *g = (GEOSGeometry *)POSTGIS2GEOS(geom1); - if ( 0 == g ) /* exception thrown at construction */ - { + if (!g) HANDLE_GEOS_ERROR("Geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } result = GEOSPreparedIntersects( prep_cache->prepared_geom, g); GEOSGeom_destroy(g); } @@ -2481,28 +2375,24 @@ Datum geos_intersects(PG_FUNCTION_ARGS) GEOSGeometry *g1; GEOSGeometry *g2; g1 = (GEOSGeometry *)POSTGIS2GEOS(geom1); - if ( 0 == g1 ) /* exception thrown at construction */ - { - HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } + if (!g1) + HANDLE_GEOS_ERROR( + "First argument geometry could not be converted to " + "GEOS"); g2 = (GEOSGeometry *)POSTGIS2GEOS(geom2); - if ( 0 == g2 ) /* exception thrown at construction */ + if (!g2) { - HANDLE_GEOS_ERROR("Second argument geometry could not be converted to GEOS"); GEOSGeom_destroy(g1); - PG_RETURN_NULL(); + HANDLE_GEOS_ERROR( + "Second argument geometry could not be converted " + "to GEOS"); } result = GEOSIntersects( g1, g2); GEOSGeom_destroy(g1); GEOSGeom_destroy(g2); } - if (result == 2) - { - HANDLE_GEOS_ERROR("GEOSIntersects"); - PG_RETURN_NULL(); /* never get here */ - } + if (result == 2) HANDLE_GEOS_ERROR("GEOSIntersects"); PG_FREE_IF_COPY(geom1, 0); PG_FREE_IF_COPY(geom2, 1); @@ -2546,18 +2436,15 @@ Datum touches(PG_FUNCTION_ARGS) initGEOS(lwpgnotice, lwgeom_geos_error); g1 = (GEOSGeometry *)POSTGIS2GEOS(geom1 ); - if ( 0 == g1 ) /* exception thrown at construction */ - { + if (!g1) HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } g2 = (GEOSGeometry *)POSTGIS2GEOS(geom2 ); - if ( 0 == g2 ) /* exception thrown at construction */ + if (!g2) { - HANDLE_GEOS_ERROR("Second argument geometry could not be converted to GEOS"); GEOSGeom_destroy(g1); - PG_RETURN_NULL(); + HANDLE_GEOS_ERROR( + "Second argument geometry could not be converted to GEOS"); } result = GEOSTouches(g1,g2); @@ -2565,11 +2452,7 @@ Datum touches(PG_FUNCTION_ARGS) GEOSGeom_destroy(g1); GEOSGeom_destroy(g2); - if (result == 2) - { - HANDLE_GEOS_ERROR("GEOSTouches"); - PG_RETURN_NULL(); /* never get here */ - } + if (result == 2) HANDLE_GEOS_ERROR("GEOSTouches"); PG_FREE_IF_COPY(geom1, 0); PG_FREE_IF_COPY(geom2, 1); @@ -2613,18 +2496,15 @@ Datum disjoint(PG_FUNCTION_ARGS) initGEOS(lwpgnotice, lwgeom_geos_error); g1 = (GEOSGeometry *)POSTGIS2GEOS(geom1); - if ( 0 == g1 ) /* exception thrown at construction */ - { + if (!g1) HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } g2 = (GEOSGeometry *)POSTGIS2GEOS(geom2); - if ( 0 == g2 ) /* exception thrown at construction */ + if (!g2) { - HANDLE_GEOS_ERROR("Second argument geometry could not be converted to GEOS"); GEOSGeom_destroy(g1); - PG_RETURN_NULL(); + HANDLE_GEOS_ERROR( + "Second argument geometry could not be converted to GEOS"); } result = GEOSDisjoint(g1,g2); @@ -2632,11 +2512,7 @@ Datum disjoint(PG_FUNCTION_ARGS) GEOSGeom_destroy(g1); GEOSGeom_destroy(g2); - if (result == 2) - { - HANDLE_GEOS_ERROR("GEOSDisjoint"); - PG_RETURN_NULL(); /* never get here */ - } + if (result == 2) HANDLE_GEOS_ERROR("GEOSDisjoint"); PG_FREE_IF_COPY(geom1, 0); PG_FREE_IF_COPY(geom2, 1); @@ -2658,7 +2534,6 @@ Datum relate_pattern(PG_FUNCTION_ARGS) geom1 = PG_GETARG_GSERIALIZED_P(0); geom2 = PG_GETARG_GSERIALIZED_P(1); - /* TODO handle empty */ errorIfGeometryCollection(geom1,geom2); @@ -2667,17 +2542,14 @@ Datum relate_pattern(PG_FUNCTION_ARGS) initGEOS(lwpgnotice, lwgeom_geos_error); g1 = (GEOSGeometry *)POSTGIS2GEOS(geom1); - if ( 0 == g1 ) /* exception thrown at construction */ - { + if (!g1) HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } g2 = (GEOSGeometry *)POSTGIS2GEOS(geom2); - if ( 0 == g2 ) /* exception thrown at construction */ + if (!g2) { - HANDLE_GEOS_ERROR("Second argument geometry could not be converted to GEOS"); GEOSGeom_destroy(g1); - PG_RETURN_NULL(); + HANDLE_GEOS_ERROR( + "Second argument geometry could not be converted to GEOS"); } patt = DatumGetCString(DirectFunctionCall1(textout, @@ -2697,11 +2569,7 @@ Datum relate_pattern(PG_FUNCTION_ARGS) GEOSGeom_destroy(g2); pfree(patt); - if (result == 2) - { - HANDLE_GEOS_ERROR("GEOSRelatePattern"); - PG_RETURN_NULL(); /* never get here */ - } + if (result == 2) HANDLE_GEOS_ERROR("GEOSRelatePattern"); PG_FREE_IF_COPY(geom1, 0); PG_FREE_IF_COPY(geom2, 1); @@ -2739,24 +2607,18 @@ Datum relate_full(PG_FUNCTION_ARGS) initGEOS(lwpgnotice, lwgeom_geos_error); g1 = (GEOSGeometry *)POSTGIS2GEOS(geom1 ); - if ( 0 == g1 ) /* exception thrown at construction */ - { + if (!g1) HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } g2 = (GEOSGeometry *)POSTGIS2GEOS(geom2 ); - if ( 0 == g2 ) /* exception thrown at construction */ + if (!g2) { - HANDLE_GEOS_ERROR("Second argument geometry could not be converted to GEOS"); GEOSGeom_destroy(g1); - PG_RETURN_NULL(); + HANDLE_GEOS_ERROR( + "Second argument geometry could not be converted to GEOS"); } POSTGIS_DEBUG(3, "constructed geometries "); - if ((g1==NULL) || (g2 == NULL)) - elog(NOTICE,"g1 or g2 are null"); - POSTGIS_DEBUGF(3, "%s", GEOSGeomToWKT(g1)); POSTGIS_DEBUGF(3, "%s", GEOSGeomToWKT(g2)); @@ -2765,11 +2627,7 @@ Datum relate_full(PG_FUNCTION_ARGS) GEOSGeom_destroy(g1); GEOSGeom_destroy(g2); - if (relate_str == NULL) - { - HANDLE_GEOS_ERROR("GEOSRelate"); - PG_RETURN_NULL(); /* never get here */ - } + if (!relate_str) HANDLE_GEOS_ERROR("GEOSRelate"); result = cstring2text(relate_str); GEOSFree(relate_str); @@ -2825,19 +2683,16 @@ Datum ST_Equals(PG_FUNCTION_ARGS) g1 = (GEOSGeometry *)POSTGIS2GEOS(geom1); - if ( 0 == g1 ) /* exception thrown at construction */ - { + if (!g1) HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } g2 = (GEOSGeometry *)POSTGIS2GEOS(geom2); - if ( 0 == g2 ) /* exception thrown at construction */ + if (!g2) { - HANDLE_GEOS_ERROR("Second argument geometry could not be converted to GEOS"); GEOSGeom_destroy(g1); - PG_RETURN_NULL(); + HANDLE_GEOS_ERROR( + "Second argument geometry could not be converted to GEOS"); } result = GEOSEquals(g1,g2); @@ -2845,11 +2700,7 @@ Datum ST_Equals(PG_FUNCTION_ARGS) GEOSGeom_destroy(g1); GEOSGeom_destroy(g2); - if (result == 2) - { - HANDLE_GEOS_ERROR("GEOSEquals"); - PG_RETURN_NULL(); /*never get here */ - } + if (result == 2) HANDLE_GEOS_ERROR("GEOSEquals"); PG_FREE_IF_COPY(geom1, 0); PG_FREE_IF_COPY(geom2, 1); @@ -2899,11 +2750,8 @@ Datum isring(PG_FUNCTION_ARGS) initGEOS(lwpgnotice, lwgeom_geos_error); g1 = (GEOSGeometry *)POSTGIS2GEOS(geom); - if ( 0 == g1 ) /* exception thrown at construction */ - { + if (!g1) HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } if ( GEOSGeomTypeId(g1) != GEOS_LINESTRING ) { @@ -2914,11 +2762,7 @@ Datum isring(PG_FUNCTION_ARGS) result = GEOSisRing(g1); GEOSGeom_destroy(g1); - if (result == 2) - { - HANDLE_GEOS_ERROR("GEOSisRing"); - PG_RETURN_NULL(); - } + if (result == 2) HANDLE_GEOS_ERROR("GEOSisRing"); PG_FREE_IF_COPY(geom, 0); PG_RETURN_BOOL(result); @@ -3080,7 +2924,7 @@ GEOSGeometry** ARRAY2GEOS(ArrayType* array, uint32_t nelems, int* is3d, int* sri *is3d = *is3d || gserialized_has_z(geom); geos_geoms[i] = (GEOSGeometry*) POSTGIS2GEOS(geom); - if (!geos_geoms[i]) /* exception thrown at construction */ + if (!geos_geoms[i]) { uint32_t j; lwpgerror("Geometry could not be converted to GEOS"); @@ -3183,7 +3027,7 @@ Datum polygonize_garray(PG_FUNCTION_ARGS) GEOSSetSRID(geos_result, srid); result = GEOS2POSTGIS(geos_result, is3d); GEOSGeom_destroy(geos_result); - if ( result == NULL ) + if (!result) { elog(ERROR, "%s returned an error", __func__); PG_RETURN_NULL(); /*never get here */ @@ -3725,19 +3569,12 @@ Datum ST_MinimumClearance(PG_FUNCTION_ARGS) input = PG_GETARG_GSERIALIZED_P(0); input_geos = POSTGIS2GEOS(input); - if (!input_geos) /* exception thrown at construction */ - { + if (!input_geos) HANDLE_GEOS_ERROR("Geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } error = GEOSMinimumClearance(input_geos, &result); GEOSGeom_destroy(input_geos); - if (error) - { - HANDLE_GEOS_ERROR("Error computing minimum clearance"); - PG_RETURN_NULL(); - } + if (error) HANDLE_GEOS_ERROR("Error computing minimum clearance"); PG_FREE_IF_COPY(input, 0); PG_RETURN_FLOAT8(result); @@ -3773,19 +3610,13 @@ Datum ST_MinimumClearanceLine(PG_FUNCTION_ARGS) input = PG_GETARG_GSERIALIZED_P(0); srid = gserialized_get_srid(input); input_geos = POSTGIS2GEOS(input); - if (!input_geos) /* exception thrown at construction */ - { + if (!input_geos) HANDLE_GEOS_ERROR("Geometry could not be converted to GEOS"); - PG_RETURN_NULL(); - } result_geos = GEOSMinimumClearanceLine(input_geos); GEOSGeom_destroy(input_geos); if (!result_geos) - { HANDLE_GEOS_ERROR("Error computing minimum clearance"); - PG_RETURN_NULL(); - } GEOSSetSRID(result_geos, srid); result = GEOS2POSTGIS(result_geos, LW_FALSE); diff --git a/postgis/lwgeom_in_gml.c b/postgis/lwgeom_in_gml.c index fc8ec6bf7..09e3e4044 100644 --- a/postgis/lwgeom_in_gml.c +++ b/postgis/lwgeom_in_gml.c @@ -681,7 +681,6 @@ static POINTARRAY* parse_gml_coord(xmlNodePtr xnode, bool *hasz) if (!z) *hasz = false; ptarray_append_point(dpa, &p, LW_FALSE); - x = y = z = false; return dpa; /* ptarray_clone_deep(dpa); */ } @@ -1514,9 +1513,9 @@ static LWGEOM* parse_gml_mpoint(xmlNodePtr xnode, bool *hasz, int *root_srid) { for (xb = xa->children ; xb != NULL ; xb = xb->next) { - if (xb != NULL) - geom = (LWGEOM*)lwmpoint_add_lwpoint((LWMPOINT*)geom, - (LWPOINT*)parse_gml(xb, hasz, root_srid)); + geom = (LWGEOM*)lwmpoint_add_lwpoint( + (LWMPOINT*)geom, + (LWPOINT*)parse_gml(xb, hasz, root_srid)); } } else if (!strcmp((char *) xa->name, "pointMember")) diff --git a/regress/geography.sql b/regress/geography.sql index fc0358402..409437ac5 100644 --- a/regress/geography.sql +++ b/regress/geography.sql @@ -121,6 +121,27 @@ SELECT 'segmentize_geography2', st_dwithin(st_pointn(st_segmentize('linestring(1 SELECT 'segmentize_geography_3667', abs(ST_Length(geog) - ST_Length(ST_Segmentize(geog, 30000))) < 0.00001 FROM (SELECT ST_GeographyFromText('LINESTRING(38.769917 10.780694, 38.769917 9.106194)') As geog) AS f; --- Clean up spatial_ref_sys -DELETE FROM spatial_ref_sys WHERE srid IN (4269,4326); +-- typmod checks +select 'typmod_point_4326', geography_typmod_out(geography_typmod_in('{Point,4326}')); +select 'typmod_point_0', geography_typmod_out(geography_typmod_in('{Point,0}')); +select 'typmod_point_-1', geography_typmod_out(geography_typmod_in('{Point,-1}')); +select 'typmod_pointzm_0', geography_typmod_out(geography_typmod_in('{PointZM,0}')); +select 'typmod_geometry_0', geography_typmod_out(geography_typmod_in('{Geometry,0}')); +select 'typmod_geometry_4326', geography_typmod_out(geography_typmod_in('{Geometry,4326}')); +select 'typmod_geography_0', geography_typmod_out(geography_typmod_in('{Geogrpahy,0}')); + +-- ST_DWithin +select 'dwithin_pt_pt_1', ST_DWithin('POINT(0 0)'::geography, 'POINT(1 1)'::geography, 300000); +select 'dwithin_pt_pt_2', ST_DWithin('POINT(0 0)'::geography, 'POINT(1 1)'::geography, 10); +select 'dwithin_pt_line_1', ST_DWithin('POINT(0 0)'::geography, 'LINESTRING(1 1, 2 2)'::geography, 300000); +select 'dwithin_line_pt_1', ST_DWithin('LINESTRING(1 1, 2 2)'::geography, 'POINT(0 0)'::geography, 300000); +select 'dwithin_pt_poly_1', ST_DWithin('POINT(0 0)'::geography, 'POLYGON((1 1, 2 2, 3 0, 1 1))'::geography, 300000); +select 'dwithin_poly_pt_1', ST_DWithin('POLYGON((1 1, 2 2, 3 0, 1 1))'::geography, 'POINT(0 0)'::geography, 300000); +select 'dwithin_line_poly_1', ST_DWithin('LINESTRING(-1 -1, 0 0)'::geography, 'POLYGON((1 1, 2 2, 3 0, 1 1))'::geography, 300000); +select 'dwithin_poly_line_1', ST_DWithin('POLYGON((1 1, 2 2, 3 0, 1 1))'::geography, 'LINESTRING(-1 -1, 0 0)'::geography, 300000); +select 'dwithin_poly_poly_1', ST_DWithin('POLYGON((0 0, -2 -2, -3 0, 0 0))'::geography, 'POLYGON((1 1, 2 2, 3 0, 1 1))'::geography, 10); +select 'dwithin_poly_poly_2', ST_DWithin('POLYGON((0 0, -2 -2, -3 0, 0 0))'::geography, 'POLYGON((1 1, 2 2, 3 0, 1 1))'::geography, 300000); +select 'dwithin_poly_poly_3', ST_DWithin('POLYGON((1 1, -2 -2, -3 0, 1 1))'::geography, 'POLYGON((1 1, 2 2, 3 0, 1 1))'::geography, 300000); +-- Clean up spatial_ref_sys +DELETE FROM spatial_ref_sys WHERE srid IN (4269, 4326); diff --git a/regress/geography_expected b/regress/geography_expected index 8dcdbc669..97846a1a0 100644 --- a/regress/geography_expected +++ b/regress/geography_expected @@ -30,3 +30,22 @@ geog_precision_pazafir|0|0 segmentize_geography|39092 segmentize_geography2|t segmentize_geography_3667|t +typmod_point_4326|(Point,4326) +typmod_point_0|(Point,4326) +NOTICE: SRID value -1 converted to the officially unknown SRID value 0 +typmod_point_-1|(Point,4326) +typmod_pointzm_0|(PointZM,4326) +typmod_geometry_0|(Geometry,4326) +typmod_geometry_4326|(Geometry,4326) +ERROR: Invalid geometry type modifier: Geogrpahy +dwithin_pt_pt_1|t +dwithin_pt_pt_2|f +dwithin_pt_line_1|t +dwithin_line_pt_1|t +dwithin_pt_poly_1|t +dwithin_poly_pt_1|t +dwithin_line_poly_1|t +dwithin_poly_line_1|t +dwithin_poly_poly_1|f +dwithin_poly_poly_2|t +dwithin_poly_poly_3|t diff --git a/regress/lwgeom_regress.sql b/regress/lwgeom_regress.sql index 9f3fdf618..86ab456df 100644 --- a/regress/lwgeom_regress.sql +++ b/regress/lwgeom_regress.sql @@ -136,36 +136,36 @@ SELECT 'BoundingDiagonal6', ST_AsEwkt(ST_BoundingDiagonal( --- ST_Azimuth SELECT 'ST_Azimuth_regular' , round(ST_Azimuth(geom1,geom2)::numeric,4) -FROM CAST('POINT(0 1)' AS geometry) AS geom1, CAST('POINT(1 0)' AS geometry) AS geom2 ; +FROM CAST('POINT(0 1)' AS geometry) AS geom1, CAST('POINT(1 0)' AS geometry) AS geom2 ; SELECT 'ST_Azimuth_same_point' , ST_Azimuth(geom1,geom1) -FROM CAST('POINT(0 1)' AS geometry) AS geom1 ; +FROM CAST('POINT(0 1)' AS geometry) AS geom1 ; SELECT 'ST_Azimuth_mixed_srid' , ST_Azimuth(geom1,geom2) -FROM CAST('POINT(0 1)' AS geometry) AS geom1, ST_GeomFromText('POINT(1 0)',4326) AS geom2; +FROM CAST('POINT(0 1)' AS geometry) AS geom1, ST_GeomFromText('POINT(1 0)',4326) AS geom2; SELECT 'ST_Azimuth_not_point' , ST_Azimuth(geom1,geom2) -FROM CAST('POINT(0 1)' AS geometry) AS geom1, ST_GeomFromText('LINESTRING(1 0 ,2 0)',4326) AS geom2; +FROM CAST('POINT(0 1)' AS geometry) AS geom1, ST_GeomFromText('LINESTRING(1 0 ,2 0)',4326) AS geom2; SELECT 'ST_Azimuth_null_geom' , ST_Azimuth(geom1,geom2) -FROM CAST('POINT(0 1)' AS geometry) AS geom1, ST_GeomFromText('EMPTY') AS geom2; +FROM CAST('POINT(0 1)' AS geometry) AS geom1, ST_GeomFromText('EMPTY') AS geom2; ---- ST_Angle( points) +--- ST_Angle(points) SELECT 'ST_Angle_4_pts', St_Angle(p1,p2,p3,p4) FROM ST_GeomFromtext('POINT(0 1)') AS p1, ST_GeomFromtext('POINT(0 0)') AS p2 - , ST_GeomFromtext('POINT(1 0)') AS p3, ST_GeomFromtext('POINT(2 0)') AS p4 ; + , ST_GeomFromtext('POINT(1 0)') AS p3, ST_GeomFromtext('POINT(2 0)') AS p4; SELECT 'ST_Angle_4_pts', St_Angle(p1,p2,p3,p4) FROM ST_GeomFromtext('POINT(2 0)') AS p1, ST_GeomFromtext('POINT(1 0)') AS p2 - , ST_GeomFromtext('POINT(1 -1)') AS p3, ST_GeomFromtext('POINT(0 0)') AS p4 ; + , ST_GeomFromtext('POINT(1 -1)') AS p3, ST_GeomFromtext('POINT(0 0)') AS p4; SELECT 'ST_Angle_3_pts', St_Angle(p1,p2,p3) FROM ST_GeomFromtext('POINT(0 1)') AS p1, ST_GeomFromtext('POINT(0 0)') AS p2 - , ST_GeomFromtext('POINT(1 0)') AS p3, ST_GeomFromtext('POINT(2 0)') AS p4 ; + , ST_GeomFromtext('POINT(1 0)') AS p3, ST_GeomFromtext('POINT(2 0)') AS p4; SELECT 'ST_Angle_mixed_srid', St_Angle(p1,p2,p3,p4) FROM ST_GeomFromtext('POINT(0 1)') AS p1, ST_GeomFromtext('POINT(0 0)') AS p2 - , ST_GeomFromtext('POINT(1 0)',4326) AS p3, ST_GeomFromtext('POINT(2 0)') AS p4 ; + , ST_GeomFromtext('POINT(1 0)',4326) AS p3, ST_GeomFromtext('POINT(2 0)') AS p4; SELECT 'ST_Angle_empty' , St_Angle(p1,p2,p3,p4) FROM ST_GeomFromtext('POINT EMPTY') AS p1, ST_GeomFromtext('POINT(0 0)') AS p2 - , ST_GeomFromtext('POINT(1 0)',4326) AS p3, ST_GeomFromtext('POINT(2 0)') AS p4 ; ---- ST_Angle( lines) + , ST_GeomFromtext('POINT(1 0)',4326) AS p3, ST_GeomFromtext('POINT(2 0)') AS p4; +--- ST_Angle(lines) SELECT 'ST_Angle_2_lines', St_Angle(l1,l2) FROM ST_GeomFromtext('LINESTRING(0 1,0 0)') AS l1 - , ST_GeomFromtext('LINESTRING(1 0, 2 0)') AS l2 ; + , ST_GeomFromtext('LINESTRING(1 0, 2 0)') AS l2; --- ST_ClusterKMeans @@ -203,3 +203,13 @@ from ( group by cid order by count(*) limit 1; + + +-- typmod checks +select 'typmod_point_4326', geometry_typmod_out(geometry_typmod_in('{Point,4326}')); +select 'typmod_point_0', geometry_typmod_out(geometry_typmod_in('{Point,0}')); +select 'typmod_point_-1', geometry_typmod_out(geometry_typmod_in('{Point,-1}')); +select 'typmod_pointzm_0', geometry_typmod_out(geometry_typmod_in('{PointZM,0}')); +select 'typmod_geometry_0', geometry_typmod_out(geometry_typmod_in('{Geometry,0}')); +select 'typmod_geometry_4326', geometry_typmod_out(geometry_typmod_in('{Geometry,4326}')); +select 'typmod_geography_0', geometry_typmod_out(geometry_typmod_in('{Geogrpahy,0}')); diff --git a/regress/lwgeom_regress_expected b/regress/lwgeom_regress_expected index 66b3b2da3..cefa318ec 100644 --- a/regress/lwgeom_regress_expected +++ b/regress/lwgeom_regress_expected @@ -34,3 +34,11 @@ ERROR: Empty geometry ST_Angle_2_lines|4.71238898038469 #3965|25|25 #3971|t +typmod_point_4326|(Point,4326) +typmod_point_0|(Point) +NOTICE: SRID value -1 converted to the officially unknown SRID value 0 +typmod_point_-1|(Point) +typmod_pointzm_0|(PointZM) +typmod_geometry_0| +typmod_geometry_4326|(Geometry,4326) +ERROR: Invalid geometry type modifier: Geogrpahy diff --git a/regress/out_geography.sql b/regress/out_geography.sql index ba6439557..1c0688389 100644 --- a/regress/out_geography.sql +++ b/regress/out_geography.sql @@ -12,34 +12,40 @@ INSERT INTO "spatial_ref_sys" ("srid", "proj4text") VALUES (102189, '+proj=tmerc -- -- Empty Geometry -SELECT 'gml_empty_geom', ST_AsGML(geography(GeomFromEWKT(NULL))); +SELECT 'gml_empty_geom', ST_AsGML(geography(ST_GeomFromEWKT('GEOMETRYCOLLECTION EMPTY'))); -- Precision -SELECT 'gml_precision_01', ST_AsGML(geography(GeomFromEWKT('SRID=4326;POINT(1.1111111 1.1111111)')), -2); -SELECT 'gml_precision_02', ST_AsGML(geography(GeomFromEWKT('SRID=4326;POINT(1.1111111 1.1111111)')), 19); +SELECT 'gml_precision_01', ST_AsGML(geography(ST_GeomFromEWKT('SRID=4326;POINT(1.1111111 1.1111111)')), -2); +SELECT 'gml_precision_02', ST_AsGML(geography(ST_GeomFromEWKT('SRID=4326;POINT(1.1111111 1.1111111)')), 19); -- Version -SELECT 'gml_version_01', ST_AsGML(2, geography(GeomFromEWKT('SRID=4326;POINT(1 1)'))); -SELECT 'gml_version_02', ST_AsGML(3, geography(GeomFromEWKT('SRID=4326;POINT(1 1)'))); -SELECT 'gml_version_03', ST_AsGML(21, geography(GeomFromEWKT('SRID=4326;POINT(1 1)'))); -SELECT 'gml_version_04', ST_AsGML(-4, geography(GeomFromEWKT('SRID=4326;POINT(1 1)'))); +SELECT 'gml_version_01', ST_AsGML(2, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 1)'))); +SELECT 'gml_version_02', ST_AsGML(3, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 1)'))); +SELECT 'gml_version_03', ST_AsGML(21, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 1)'))); +SELECT 'gml_version_04', ST_AsGML(-4, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 1)'))); -- Option -SELECT 'gml_option_01', ST_AsGML(2, geography(GeomFromEWKT('SRID=4326;POINT(1 1)')), 0, 0); -SELECT 'gml_option_02', ST_AsGML(3, geography(GeomFromEWKT('SRID=4326;POINT(1 1)')), 0, 1); -SELECT 'gml_option_03', ST_AsGML(3, geography(GeomFromEWKT('SRID=4326;POINT(1 1)')), 0, 2); +SELECT 'gml_option_01', ST_AsGML(2, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 0); +SELECT 'gml_option_02', ST_AsGML(3, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 1); +SELECT 'gml_option_03', ST_AsGML(3, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 2); +SELECT 'gml_option_04', ST_AsGML(3, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 4); + +-- These are geometry-only +SELECT 'gml_option_05', ST_AsGML(3, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 16); +SELECT 'gml_option_06', ST_AsGML(2, geography(ST_GeomFromEWKT('SRID=4326;LINESTRING(1 2, 3 4)')), 0, 32); +SELECT 'gml_option_07', ST_AsGML(3, geography(ST_GeomFromEWKT('SRID=4326;LINESTRING(1 2, 3 4)')), 0, 32); -- Deegree data -SELECT 'gml_deegree_01', ST_AsGML(2, geography(GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 0); -SELECT 'gml_deegree_02', ST_AsGML(2, geography(GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 1); -SELECT 'gml_deegree_03', ST_AsGML(3, geography(GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 0); -SELECT 'gml_deegree_04', ST_AsGML(3, geography(GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 1); +SELECT 'gml_deegree_01', ST_AsGML(2, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 0); +SELECT 'gml_deegree_02', ST_AsGML(2, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 1); +SELECT 'gml_deegree_03', ST_AsGML(3, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 0); +SELECT 'gml_deegree_04', ST_AsGML(3, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 1); -- Prefix -SELECT 'gml_prefix_01', ST_AsGML(2, geography(GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 0, ''); -SELECT 'gml_prefix_02', ST_AsGML(3, geography(GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 0, ''); -SELECT 'gml_prefix_03', ST_AsGML(2, geography(GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 0, 'foo'); -SELECT 'gml_prefix_04', ST_AsGML(3, geography(GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 0, 'foo'); +SELECT 'gml_prefix_01', ST_AsGML(2, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 0, ''); +SELECT 'gml_prefix_02', ST_AsGML(3, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 0, ''); +SELECT 'gml_prefix_03', ST_AsGML(2, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 0, 'foo'); +SELECT 'gml_prefix_04', ST_AsGML(3, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 0, 'foo'); -- @@ -47,28 +53,28 @@ SELECT 'gml_prefix_04', ST_AsGML(3, geography(GeomFromEWKT('SRID=4326;POINT(1 2) -- -- SRID -SELECT 'kml_srid_01', ST_AsKML(geography(GeomFromEWKT('SRID=10;POINT(0 1)'))); -SELECT 'kml_srid_02', ST_AsKML(geography(GeomFromEWKT('POINT(0 1)'))); +SELECT 'kml_srid_01', ST_AsKML(geography(ST_GeomFromEWKT('SRID=10;POINT(0 1)'))); +SELECT 'kml_srid_02', ST_AsKML(geography(ST_GeomFromEWKT('POINT(0 1)'))); -- Empty Geometry -SELECT 'kml_empty_geom', ST_AsKML(geography(GeomFromEWKT(NULL))); +SELECT 'kml_empty_geom', ST_AsKML(geography(ST_GeomFromEWKT(NULL))); -- Precision -SELECT 'kml_precision_01', ST_AsKML(geography(GeomFromEWKT('SRID=4326;POINT(1.1111111 1.1111111)')), -2); -SELECT 'kml_precision_02', ST_AsKML(geography(GeomFromEWKT('SRID=4326;POINT(1.1111111 1.1111111)')), 19); +SELECT 'kml_precision_01', ST_AsKML(geography(ST_GeomFromEWKT('SRID=4326;POINT(1.1111111 1.1111111)')), -2); +SELECT 'kml_precision_02', ST_AsKML(geography(ST_GeomFromEWKT('SRID=4326;POINT(1.1111111 1.1111111)')), 19); -- Version -SELECT 'kml_version_01', ST_AsKML(2, geography(GeomFromEWKT('SRID=4326;POINT(1 1)'))); -SELECT 'kml_version_02', ST_AsKML(3, geography(GeomFromEWKT('SRID=4326;POINT(1 1)'))); -SELECT 'kml_version_03', ST_AsKML(-4, geography(GeomFromEWKT('SRID=4326;POINT(1 1)'))); +SELECT 'kml_version_01', ST_AsKML(2, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 1)'))); +SELECT 'kml_version_02', ST_AsKML(3, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 1)'))); +SELECT 'kml_version_03', ST_AsKML(-4, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 1)'))); -- Prefix -SELECT 'kml_prefix_01', ST_AsKML(2, geography(GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, ''); -SELECT 'kml_prefix_02', ST_AsKML(2, geography(GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 'kml'); +SELECT 'kml_prefix_01', ST_AsKML(2, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, ''); +SELECT 'kml_prefix_02', ST_AsKML(2, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 'kml'); -- Projected -- National Astronomical Observatory of Colombia - Bogota, Colombia (Placemark) -SELECT 'kml_projection_01', ST_AsKML(geography(GeomFromEWKT('SRID=102189;POINT(1000000 1000000)')), 3); +SELECT 'kml_projection_01', ST_AsKML(geography(ST_GeomFromEWKT('SRID=102189;POINT(1000000 1000000)')), 3); -- @@ -76,66 +82,66 @@ SELECT 'kml_projection_01', ST_AsKML(geography(GeomFromEWKT('SRID=102189;POINT(1 -- -- Empty Geometry -SELECT 'svg_empty_geom', ST_AsSVG(geography(GeomFromEWKT(NULL))); +SELECT 'svg_empty_geom', ST_AsSVG(geography(ST_GeomFromEWKT(NULL))); -- Option -SELECT 'svg_option_01', ST_AsSVG(geography(GeomFromEWKT('LINESTRING(1 1, 4 4, 5 7)')), 0); -SELECT 'svg_option_02', ST_AsSVG(geography(GeomFromEWKT('LINESTRING(1 1, 4 4, 5 7)')), 1); -SELECT 'svg_option_03', ST_AsSVG(geography(GeomFromEWKT('LINESTRING(1 1, 4 4, 5 7)')), 0, 0); -SELECT 'svg_option_04', ST_AsSVG(geography(GeomFromEWKT('LINESTRING(1 1, 4 4, 5 7)')), 1, 0); +SELECT 'svg_option_01', ST_AsSVG(geography(ST_GeomFromEWKT('LINESTRING(1 1, 4 4, 5 7)')), 0); +SELECT 'svg_option_02', ST_AsSVG(geography(ST_GeomFromEWKT('LINESTRING(1 1, 4 4, 5 7)')), 1); +SELECT 'svg_option_03', ST_AsSVG(geography(ST_GeomFromEWKT('LINESTRING(1 1, 4 4, 5 7)')), 0, 0); +SELECT 'svg_option_04', ST_AsSVG(geography(ST_GeomFromEWKT('LINESTRING(1 1, 4 4, 5 7)')), 1, 0); -- Precision -SELECT 'svg_precision_01', ST_AsSVG(geography(GeomFromEWKT('POINT(1.1111111 1.1111111)')), 1, -2); -SELECT 'svg_precision_02', ST_AsSVG(geography(GeomFromEWKT('POINT(1.1111111 1.1111111)')), 1, 19); +SELECT 'svg_precision_01', ST_AsSVG(geography(ST_GeomFromEWKT('POINT(1.1111111 1.1111111)')), 1, -2); +SELECT 'svg_precision_02', ST_AsSVG(geography(ST_GeomFromEWKT('POINT(1.1111111 1.1111111)')), 1, 19); -- --- GeoJson +-- GeoJSON -- -- Empty Geometry -SELECT 'geojson_empty_geom', ST_AsGeoJson(geography(GeomFromEWKT(NULL))); +SELECT 'geojson_empty_geom', ST_AsGeoJSON(geography(ST_GeomFromEWKT(NULL))); -- Precision -SELECT 'geojson_precision_01', ST_AsGeoJson(geography(GeomFromEWKT('SRID=4326;POINT(1.1111111 1.1111111)')), -2); -SELECT 'geojson_precision_02', ST_AsGeoJson(geography(GeomFromEWKT('SRID=4326;POINT(1.1111111 1.1111111)')), 19); +SELECT 'geojson_precision_01', ST_AsGeoJSON(geography(ST_GeomFromEWKT('SRID=4326;POINT(1.1111111 1.1111111)')), -2); +SELECT 'geojson_precision_02', ST_AsGeoJSON(geography(ST_GeomFromEWKT('SRID=4326;POINT(1.1111111 1.1111111)')), 19); -- Version -SELECT 'geojson_version_01', ST_AsGeoJson(1, geography(GeomFromEWKT('SRID=4326;POINT(1 1)'))); -SELECT 'geojson_version_02', ST_AsGeoJson(21, geography(GeomFromEWKT('SRID=4326;POINT(1 1)'))); -SELECT 'geojson_version_03', ST_AsGeoJson(-4, geography(GeomFromEWKT('SRID=4326;POINT(1 1)'))); +SELECT 'geojson_version_01', ST_AsGeoJSON(1, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 1)'))); +SELECT 'geojson_version_02', ST_AsGeoJSON(21, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 1)'))); +SELECT 'geojson_version_03', ST_AsGeoJSON(-4, geography(ST_GeomFromEWKT('SRID=4326;POINT(1 1)'))); -- CRS -SELECT 'geojson_crs_01', ST_AsGeoJson(geography(GeomFromEWKT('SRID=4326;POINT(1 1)')), 0, 2); -SELECT 'geojson_crs_02', ST_AsGeoJson(geography(GeomFromEWKT('POINT(1 1)')), 0, 2); -SELECT 'geojson_crs_03', ST_AsGeoJson(geography(GeomFromEWKT('SRID=4326;POINT(1 1)')), 0, 4); -SELECT 'geojson_crs_04', ST_AsGeoJson(geography(GeomFromEWKT('POINT(1 1)')), 0, 4); -SELECT 'geojson_crs_05', ST_AsGeoJson(geography(GeomFromEWKT('SRID=1;POINT(1 1)')), 0, 2); -SELECT 'geojson_crs_06', ST_AsGeoJson(geography(GeomFromEWKT('SRID=1;POINT(1 1)')), 0, 4); +SELECT 'geojson_crs_01', ST_AsGeoJSON(geography(ST_GeomFromEWKT('SRID=4326;POINT(1 1)')), 0, 2); +SELECT 'geojson_crs_02', ST_AsGeoJSON(geography(ST_GeomFromEWKT('POINT(1 1)')), 0, 2); +SELECT 'geojson_crs_03', ST_AsGeoJSON(geography(ST_GeomFromEWKT('SRID=4326;POINT(1 1)')), 0, 4); +SELECT 'geojson_crs_04', ST_AsGeoJSON(geography(ST_GeomFromEWKT('POINT(1 1)')), 0, 4); +SELECT 'geojson_crs_05', ST_AsGeoJSON(geography(ST_GeomFromEWKT('SRID=1;POINT(1 1)')), 0, 2); +SELECT 'geojson_crs_06', ST_AsGeoJSON(geography(ST_GeomFromEWKT('SRID=1;POINT(1 1)')), 0, 4); -- Bbox -SELECT 'geojson_bbox_01', ST_AsGeoJson(geography(GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0); -SELECT 'geojson_bbox_02', ST_AsGeoJson(geography(GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 1); -SELECT 'geojson_bbox_03', ST_AsGeoJson(geography(GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 3); -SELECT 'geojson_bbox_04', ST_AsGeoJson(geography(GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 5); +SELECT 'geojson_bbox_01', ST_AsGeoJSON(geography(ST_GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0); +SELECT 'geojson_bbox_02', ST_AsGeoJSON(geography(ST_GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 1); +SELECT 'geojson_bbox_03', ST_AsGeoJSON(geography(ST_GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 3); +SELECT 'geojson_bbox_04', ST_AsGeoJSON(geography(ST_GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 5); -- CRS and Bbox -SELECT 'geojson_options_01', ST_AsGeoJson(geography(GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 0); -SELECT 'geojson_options_02', ST_AsGeoJson(geography(GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0); -SELECT 'geojson_options_03', ST_AsGeoJson(geography(GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 1); -SELECT 'geojson_options_04', ST_AsGeoJson(geography(GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 1); -SELECT 'geojson_options_05', ST_AsGeoJson(geography(GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 2); -SELECT 'geojson_options_06', ST_AsGeoJson(geography(GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 2); -SELECT 'geojson_options_07', ST_AsGeoJson(geography(GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 3); -SELECT 'geojson_options_08', ST_AsGeoJson(geography(GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 3); -SELECT 'geojson_options_09', ST_AsGeoJson(geography(GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 4); -SELECT 'geojson_options_10', ST_AsGeoJson(geography(GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 4); -SELECT 'geojson_options_11', ST_AsGeoJson(geography(GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 5); -SELECT 'geojson_options_12', ST_AsGeoJson(geography(GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 5); -SELECT 'geojson_options_13', ST_AsGeoJson(geography(GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 6); -SELECT 'geojson_options_14', ST_AsGeoJson(geography(GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 6); -SELECT 'geojson_options_15', ST_AsGeoJson(geography(GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 7); -SELECT 'geojson_options_16', ST_AsGeoJson(geography(GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 7); +SELECT 'geojson_options_01', ST_AsGeoJSON(geography(ST_GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 0); +SELECT 'geojson_options_02', ST_AsGeoJSON(geography(ST_GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0); +SELECT 'geojson_options_03', ST_AsGeoJSON(geography(ST_GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 1); +SELECT 'geojson_options_04', ST_AsGeoJSON(geography(ST_GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 1); +SELECT 'geojson_options_05', ST_AsGeoJSON(geography(ST_GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 2); +SELECT 'geojson_options_06', ST_AsGeoJSON(geography(ST_GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 2); +SELECT 'geojson_options_07', ST_AsGeoJSON(geography(ST_GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 3); +SELECT 'geojson_options_08', ST_AsGeoJSON(geography(ST_GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 3); +SELECT 'geojson_options_09', ST_AsGeoJSON(geography(ST_GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 4); +SELECT 'geojson_options_10', ST_AsGeoJSON(geography(ST_GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 4); +SELECT 'geojson_options_11', ST_AsGeoJSON(geography(ST_GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 5); +SELECT 'geojson_options_12', ST_AsGeoJSON(geography(ST_GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 5); +SELECT 'geojson_options_13', ST_AsGeoJSON(geography(ST_GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 6); +SELECT 'geojson_options_14', ST_AsGeoJSON(geography(ST_GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 6); +SELECT 'geojson_options_15', ST_AsGeoJSON(geography(ST_GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 7); +SELECT 'geojson_options_16', ST_AsGeoJSON(geography(ST_GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)')), 0, 7); -- diff --git a/regress/out_geography_expected b/regress/out_geography_expected index 987ec57b9..c0b0201ad 100644 --- a/regress/out_geography_expected +++ b/regress/out_geography_expected @@ -5,9 +5,13 @@ gml_version_01|1,11 1 ERROR: Only GML 2 and GML 3 are supported ERROR: Only GML 2 and GML 3 are supported -gml_option_01|1,1 -gml_option_02|1 1 -gml_option_03|1 1 +gml_option_01|1,2 +gml_option_02|2 1 +gml_option_03|1 2 +ERROR: Options 4 passed to ST_AsGML(geography) but are only applicable to ST_AsGML(geometry) +ERROR: Options 16 passed to ST_AsGML(geography) but are only applicable to ST_AsGML(geometry) +ERROR: Options 32 passed to ST_AsGML(geography) but are only applicable to ST_AsGML(geometry) +ERROR: Options 32 passed to ST_AsGML(geography) but are only applicable to ST_AsGML(geometry) gml_deegree_01|1,2 gml_deegree_02|1,2 gml_deegree_03|1 2 diff --git a/regress/out_geometry.sql b/regress/out_geometry.sql index 065424629..20778ba47 100644 --- a/regress/out_geometry.sql +++ b/regress/out_geometry.sql @@ -13,73 +13,77 @@ INSERT INTO "spatial_ref_sys" ("srid", "proj4text") VALUES (102189, '+proj=tmerc -- -- Empty Geometry -SELECT 'gml_empty_geom', ST_AsGML(GeomFromEWKT(NULL)); +SELECT 'gml_empty_geom', ST_AsGML(ST_GeomFromEWKT(NULL)); -- Precision -SELECT 'gml_precision_01', ST_AsGML(GeomFromEWKT('SRID=4326;POINT(1.1111111 1.1111111)'), -2); -SELECT 'gml_precision_02', ST_AsGML(GeomFromEWKT('SRID=4326;POINT(1.1111111 1.1111111)'), 19); +SELECT 'gml_precision_01', ST_AsGML(ST_GeomFromEWKT('SRID=4326;POINT(1.1111111 1.1111111)'), -2); +SELECT 'gml_precision_02', ST_AsGML(ST_GeomFromEWKT('SRID=4326;POINT(1.1111111 1.1111111)'), 19); -- Version -SELECT 'gml_version_01', ST_AsGML(2, GeomFromEWKT('SRID=4326;POINT(1 1)')); -SELECT 'gml_version_02', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 1)')); -SELECT 'gml_version_03', ST_AsGML(21, GeomFromEWKT('SRID=4326;POINT(1 1)')); -SELECT 'gml_version_04', ST_AsGML(-4, GeomFromEWKT('SRID=4326;POINT(1 1)')); +SELECT 'gml_version_01', ST_AsGML(2, ST_GeomFromEWKT('SRID=4326;POINT(1 1)')); +SELECT 'gml_version_02', ST_AsGML(3, ST_GeomFromEWKT('SRID=4326;POINT(1 1)')); +SELECT 'gml_version_03', ST_AsGML(21, ST_GeomFromEWKT('SRID=4326;POINT(1 1)')); +SELECT 'gml_version_04', ST_AsGML(-4, ST_GeomFromEWKT('SRID=4326;POINT(1 1)')); -- Option -SELECT 'gml_option_01', ST_AsGML(2, GeomFromEWKT('SRID=4326;POINT(1 1)'), 0, 0); -SELECT 'gml_option_02', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 1)'), 0, 1); -SELECT 'gml_option_03', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 1)'), 0, 2); +SELECT 'gml_option_01', ST_AsGML(2, ST_GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 0); +SELECT 'gml_option_02', ST_AsGML(3, ST_GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 1); +SELECT 'gml_option_03', ST_AsGML(3, ST_GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 2); +SELECT 'gml_option_04', ST_AsGML(3, ST_GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 4); +SELECT 'gml_option_05', ST_AsGML(3, ST_GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 16); +SELECT 'gml_option_06', ST_AsGML(2, ST_GeomFromEWKT('SRID=4326;LINESTRING(1 2, 3 4)'), 0, 32); +SELECT 'gml_option_07', ST_AsGML(3, ST_GeomFromEWKT('SRID=4326;LINESTRING(1 2, 3 4)'), 0, 32); -- Deegree data -SELECT 'gml_deegree_01', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 0); -SELECT 'gml_deegree_02', ST_AsGML(2, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 16); -SELECT 'gml_deegree_03', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 16); -SELECT 'gml_deegree_04', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 2 3)'), 0, 0); -SELECT 'gml_deegree_05', ST_AsGML(2, GeomFromEWKT('SRID=4326;POINT(1 2 3)'), 0, 16); -SELECT 'gml_deegree_06', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 2 3)'), 0, 16); +SELECT 'gml_deegree_01', ST_AsGML(3, ST_GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 0); +SELECT 'gml_deegree_02', ST_AsGML(2, ST_GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 16); +SELECT 'gml_deegree_03', ST_AsGML(3, ST_GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 16); +SELECT 'gml_deegree_04', ST_AsGML(3, ST_GeomFromEWKT('SRID=4326;POINT(1 2 3)'), 0, 0); +SELECT 'gml_deegree_05', ST_AsGML(2, ST_GeomFromEWKT('SRID=4326;POINT(1 2 3)'), 0, 16); +SELECT 'gml_deegree_06', ST_AsGML(3, ST_GeomFromEWKT('SRID=4326;POINT(1 2 3)'), 0, 16); -- Prefix -SELECT 'gml_prefix_01', ST_AsGML(2, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 16, ''); -SELECT 'gml_prefix_02', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 16, ''); -SELECT 'gml_prefix_03', ST_AsGML(2, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 16, 'foo'); -SELECT 'gml_prefix_04', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 16, 'foo'); +SELECT 'gml_prefix_01', ST_AsGML(2, ST_GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 16, ''); +SELECT 'gml_prefix_02', ST_AsGML(3, ST_GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 16, ''); +SELECT 'gml_prefix_03', ST_AsGML(2, ST_GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 16, 'foo'); +SELECT 'gml_prefix_04', ST_AsGML(3, ST_GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 16, 'foo'); -- LineString -SELECT 'gml_shortline_01', ST_AsGML(3, GeomFromEWKT('LINESTRING(1 2, 3 4)'), 0, 6, ''); -SELECT 'gml_shortline_02', ST_AsGML(3, GeomFromEWKT('LINESTRING(1 2, 3 4)'), 0, 2, ''); -SELECT 'gml_shortline_03', ST_AsGML(3, GeomFromEWKT('MULTILINESTRING((1 2, 3 4), (5 6, 7 8))'), 0, 6, ''); -SELECT 'gml_shortline_04', ST_AsGML(3, GeomFromEWKT('MULTILINESTRING((1 2, 3 4), (5 6, 7 8))'), 0, 2, ''); +SELECT 'gml_shortline_01', ST_AsGML(3, ST_GeomFromEWKT('LINESTRING(1 2, 3 4)'), 0, 6, ''); +SELECT 'gml_shortline_02', ST_AsGML(3, ST_GeomFromEWKT('LINESTRING(1 2, 3 4)'), 0, 2, ''); +SELECT 'gml_shortline_03', ST_AsGML(3, ST_GeomFromEWKT('MULTILINESTRING((1 2, 3 4), (5 6, 7 8))'), 0, 6, ''); +SELECT 'gml_shortline_04', ST_AsGML(3, ST_GeomFromEWKT('MULTILINESTRING((1 2, 3 4), (5 6, 7 8))'), 0, 2, ''); -- CIRCULARSTRING / COMPOUNDCURVE / CURVEPOLYGON / MULTISURFACE / MULTICURVE -SELECT 'gml_out_curve_01', ST_AsGML( 3, GeomFromEWKT('CIRCULARSTRING(-2 0,0 2,2 0,0 2,2 4)')); -SELECT 'gml_out_curve_02', ST_ASGML( 3, GeomFromEWKT('COMPOUNDCURVE(CIRCULARSTRING(0 0,1 1,1 0),(1 0,0 1))')); -SELECT 'gml_out_curve_03', ST_AsGML( 3, GeomFromEWKT('CURVEPOLYGON(CIRCULARSTRING(-2 0,-1 -1,0 0,1 -1,2 0,0 2,-2 0),(-1 0,0 0.5,1 0,0 1,-1 0))')); -SELECT 'gml_out_curve_04', ST_AsGML( 3, GeomFromEWKT('MULTICURVE((5 5,3 5,3 3,0 3),CIRCULARSTRING(0 0,2 1,2 2))')); -SELECT 'gml_out_curve_05', ST_AsGML( 3, GeomFromEWKT('MULTISURFACE(CURVEPOLYGON(CIRCULARSTRING(-2 0,-1 -1,0 0,1 -1,2 0,0 2,-2 0),(-1 0,0 0.5,1 0,0 1,-1 0)),((7 8,10 10,6 14,4 11,7 8)))')); +SELECT 'gml_out_curve_01', ST_AsGML(3, ST_GeomFromEWKT('CIRCULARSTRING(-2 0,0 2,2 0,0 2,2 4)')); +SELECT 'gml_out_curve_02', ST_ASGML(3, ST_GeomFromEWKT('COMPOUNDCURVE(CIRCULARSTRING(0 0,1 1,1 0),(1 0,0 1))')); +SELECT 'gml_out_curve_03', ST_AsGML(3, ST_GeomFromEWKT('CURVEPOLYGON(CIRCULARSTRING(-2 0,-1 -1,0 0,1 -1,2 0,0 2,-2 0),(-1 0,0 0.5,1 0,0 1,-1 0))')); +SELECT 'gml_out_curve_04', ST_AsGML(3, ST_GeomFromEWKT('MULTICURVE((5 5,3 5,3 3,0 3),CIRCULARSTRING(0 0,2 1,2 2))')); +SELECT 'gml_out_curve_05', ST_AsGML(3, ST_GeomFromEWKT('MULTISURFACE(CURVEPOLYGON(CIRCULARSTRING(-2 0,-1 -1,0 0,1 -1,2 0,0 2,-2 0),(-1 0,0 0.5,1 0,0 1,-1 0)),((7 8,10 10,6 14,4 11,7 8)))')); -- -- KML -- -- SRID -SELECT 'kml_srid_01', ST_AsKML(GeomFromEWKT('SRID=10;POINT(0 1)')); -SELECT 'kml_srid_02', ST_AsKML(GeomFromEWKT('POINT(0 1)')); +SELECT 'kml_srid_01', ST_AsKML(ST_GeomFromEWKT('SRID=10;POINT(0 1)')); +SELECT 'kml_srid_02', ST_AsKML(ST_GeomFromEWKT('POINT(0 1)')); -- Empty Geometry -SELECT 'kml_empty_geom', ST_AsKML(GeomFromEWKT(NULL)); +SELECT 'kml_empty_geom', ST_AsKML(ST_GeomFromEWKT(NULL)); -- Precision SELECT 'kml_precision_01', ST_AsKML(ST_GeomFromEWKT('SRID=4326;POINT(1.1111111 1.1111111)'), -2); SELECT 'kml_precision_02', ST_AsKML(ST_GeomFromEWKT('SRID=4326;POINT(1.1111111 1.1111111)'), 19); -- Version -SELECT 'kml_version_01', ST_AsKML(2, GeomFromEWKT('SRID=4326;POINT(1 1)')); -SELECT 'kml_version_02', ST_AsKML(3, GeomFromEWKT('SRID=4326;POINT(1 1)')); -SELECT 'kml_version_03', ST_AsKML(-4, GeomFromEWKT('SRID=4326;POINT(1 1)')); +SELECT 'kml_version_01', ST_AsKML(2, ST_GeomFromEWKT('SRID=4326;POINT(1 1)')); +SELECT 'kml_version_02', ST_AsKML(3, ST_GeomFromEWKT('SRID=4326;POINT(1 1)')); +SELECT 'kml_version_03', ST_AsKML(-4, ST_GeomFromEWKT('SRID=4326;POINT(1 1)')); -- Prefix -SELECT 'kml_prefix_01', ST_AsKML(2, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, ''); -SELECT 'kml_prefix_02', ST_AsKML(2, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 'kml'); +SELECT 'kml_prefix_01', ST_AsKML(2, ST_GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, ''); +SELECT 'kml_prefix_02', ST_AsKML(2, ST_GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 'kml'); -- Projected -- National Astronomical Observatory of Colombia - Bogota, Colombia (Placemark) @@ -88,76 +92,76 @@ SELECT 'kml_projection_01', ST_AsKML(ST_GeomFromEWKT('SRID=102189;POINT(1000000 -- -- Encoded Polyline -- -SELECT 'encoded_polyline_01', ST_AsEncodedPolyline(GeomFromEWKT('SRID=4326;LINESTRING(-120.2 38.5,-120.95 40.7,-126.453 43.252)')); -SELECT 'encoded_polyline_02', ST_AsEncodedPolyline(GeomFromEWKT('SRID=4326;MULTIPOINT(-120.2 38.5,-120.95 40.7,-126.453 43.252)')); -SELECT 'encoded_polyline_03', ST_AsEncodedPolyline(GeomFromEWKT('LINESTRING(-120.2 38.5,-120.95 40.7,-126.453 43.252)')); -SELECT 'encoded_polyline_04', ST_AsEncodedPolyline(GeomFromEWKT('SRID=4326;LINESTRING(-120.234467 38.5,-120.95 40.7343495,-126.453 43.252)'), 6); +SELECT 'encoded_polyline_01', ST_AsEncodedPolyline(ST_GeomFromEWKT('SRID=4326;LINESTRING(-120.2 38.5,-120.95 40.7,-126.453 43.252)')); +SELECT 'encoded_polyline_02', ST_AsEncodedPolyline(ST_GeomFromEWKT('SRID=4326;MULTIPOINT(-120.2 38.5,-120.95 40.7,-126.453 43.252)')); +SELECT 'encoded_polyline_03', ST_AsEncodedPolyline(ST_GeomFromEWKT('LINESTRING(-120.2 38.5,-120.95 40.7,-126.453 43.252)')); +SELECT 'encoded_polyline_04', ST_AsEncodedPolyline(ST_GeomFromEWKT('SRID=4326;LINESTRING(-120.234467 38.5,-120.95 40.7343495,-126.453 43.252)'), 6); -- -- SVG -- -- Empty Geometry -SELECT 'svg_empty_geom', ST_AsSVG(GeomFromEWKT(NULL)); +SELECT 'svg_empty_geom', ST_AsSVG(ST_GeomFromEWKT(NULL)); -- Option -SELECT 'svg_option_01', ST_AsSVG(GeomFromEWKT('LINESTRING(1 1, 4 4, 5 7)'), 0); -SELECT 'svg_option_02', ST_AsSVG(GeomFromEWKT('LINESTRING(1 1, 4 4, 5 7)'), 1); -SELECT 'svg_option_03', ST_AsSVG(GeomFromEWKT('LINESTRING(1 1, 4 4, 5 7)'), 0, 0); -SELECT 'svg_option_04', ST_AsSVG(GeomFromEWKT('LINESTRING(1 1, 4 4, 5 7)'), 1, 0); +SELECT 'svg_option_01', ST_AsSVG(ST_GeomFromEWKT('LINESTRING(1 1, 4 4, 5 7)'), 0); +SELECT 'svg_option_02', ST_AsSVG(ST_GeomFromEWKT('LINESTRING(1 1, 4 4, 5 7)'), 1); +SELECT 'svg_option_03', ST_AsSVG(ST_GeomFromEWKT('LINESTRING(1 1, 4 4, 5 7)'), 0, 0); +SELECT 'svg_option_04', ST_AsSVG(ST_GeomFromEWKT('LINESTRING(1 1, 4 4, 5 7)'), 1, 0); -- Precision -SELECT 'svg_precision_01', ST_AsSVG(GeomFromEWKT('POINT(1.1111111 1.1111111)'), 1, -2); -SELECT 'svg_precision_02', ST_AsSVG(GeomFromEWKT('POINT(1.1111111 1.1111111)'), 1, 19); +SELECT 'svg_precision_01', ST_AsSVG(ST_GeomFromEWKT('POINT(1.1111111 1.1111111)'), 1, -2); +SELECT 'svg_precision_02', ST_AsSVG(ST_GeomFromEWKT('POINT(1.1111111 1.1111111)'), 1, 19); -- --- GeoJson +-- GeoJSON -- -- Empty Geometry -SELECT 'geojson_empty_geom', ST_AsGeoJson(GeomFromEWKT(NULL)); +SELECT 'geojson_empty_geom', ST_AsGeoJSON(ST_GeomFromEWKT(NULL)); -- Precision -SELECT 'geojson_precision_01', ST_AsGeoJson(GeomFromEWKT('SRID=4326;POINT(1.1111111 1.1111111)'), -2); -SELECT 'geojson_precision_02', ST_AsGeoJson(GeomFromEWKT('SRID=4326;POINT(1.1111111 1.1111111)'), 19); +SELECT 'geojson_precision_01', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=4326;POINT(1.1111111 1.1111111)'), -2); +SELECT 'geojson_precision_02', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=4326;POINT(1.1111111 1.1111111)'), 19); -- Version -SELECT 'geojson_version_01', ST_AsGeoJson(1, GeomFromEWKT('SRID=4326;POINT(1 1)')); -SELECT 'geojson_version_02', ST_AsGeoJson(21, GeomFromEWKT('SRID=4326;POINT(1 1)')); -SELECT 'geojson_version_03', ST_AsGeoJson(-4, GeomFromEWKT('SRID=4326;POINT(1 1)')); +SELECT 'geojson_version_01', ST_AsGeoJSON(1, ST_GeomFromEWKT('SRID=4326;POINT(1 1)')); +SELECT 'geojson_version_02', ST_AsGeoJSON(21, ST_GeomFromEWKT('SRID=4326;POINT(1 1)')); +SELECT 'geojson_version_03', ST_AsGeoJSON(-4, ST_GeomFromEWKT('SRID=4326;POINT(1 1)')); -- CRS -SELECT 'geojson_crs_01', ST_AsGeoJson(GeomFromEWKT('SRID=4326;POINT(1 1)'), 0, 2); -SELECT 'geojson_crs_02', ST_AsGeoJson(GeomFromEWKT('SRID=0;POINT(1 1)'), 0, 2); -SELECT 'geojson_crs_03', ST_AsGeoJson(GeomFromEWKT('SRID=4326;POINT(1 1)'), 0, 4); -SELECT 'geojson_crs_04', ST_AsGeoJson(GeomFromEWKT('SRID=0;POINT(1 1)'), 0, 4); -SELECT 'geojson_crs_05', ST_AsGeoJson(GeomFromEWKT('SRID=1;POINT(1 1)'), 0, 2); -SELECT 'geojson_crs_06', ST_AsGeoJson(GeomFromEWKT('SRID=1;POINT(1 1)'), 0, 4); +SELECT 'geojson_crs_01', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=4326;POINT(1 1)'), 0, 2); +SELECT 'geojson_crs_02', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=0;POINT(1 1)'), 0, 2); +SELECT 'geojson_crs_03', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=4326;POINT(1 1)'), 0, 4); +SELECT 'geojson_crs_04', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=0;POINT(1 1)'), 0, 4); +SELECT 'geojson_crs_05', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=1;POINT(1 1)'), 0, 2); +SELECT 'geojson_crs_06', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=1;POINT(1 1)'), 0, 4); -- Bbox -SELECT 'geojson_bbox_01', ST_AsGeoJson(GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0); -SELECT 'geojson_bbox_02', ST_AsGeoJson(GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 1); -SELECT 'geojson_bbox_03', ST_AsGeoJson(GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 3); -SELECT 'geojson_bbox_04', ST_AsGeoJson(GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 5); +SELECT 'geojson_bbox_01', ST_AsGeoJSON(ST_GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0); +SELECT 'geojson_bbox_02', ST_AsGeoJSON(ST_GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 1); +SELECT 'geojson_bbox_03', ST_AsGeoJSON(ST_GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 3); +SELECT 'geojson_bbox_04', ST_AsGeoJSON(ST_GeomFromEWKT('LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 5); -- CRS and Bbox -SELECT 'geojson_options_01', ST_AsGeoJson(GeomFromEWKT('SRID=0;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 0); -SELECT 'geojson_options_02', ST_AsGeoJson(GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0); -SELECT 'geojson_options_03', ST_AsGeoJson(GeomFromEWKT('SRID=0;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 1); -SELECT 'geojson_options_04', ST_AsGeoJson(GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 1); -SELECT 'geojson_options_05', ST_AsGeoJson(GeomFromEWKT('SRID=0;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 2); -SELECT 'geojson_options_06', ST_AsGeoJson(GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 2); -SELECT 'geojson_options_07', ST_AsGeoJson(GeomFromEWKT('SRID=0;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 3); -SELECT 'geojson_options_08', ST_AsGeoJson(GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 3); -SELECT 'geojson_options_09', ST_AsGeoJson(GeomFromEWKT('SRID=0;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 4); -SELECT 'geojson_options_10', ST_AsGeoJson(GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 4); -SELECT 'geojson_options_11', ST_AsGeoJson(GeomFromEWKT('SRID=0;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 5); -SELECT 'geojson_options_12', ST_AsGeoJson(GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 5); -SELECT 'geojson_options_13', ST_AsGeoJson(GeomFromEWKT('SRID=0;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 6); -SELECT 'geojson_options_14', ST_AsGeoJson(GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 6); -SELECT 'geojson_options_15', ST_AsGeoJson(GeomFromEWKT('SRID=0;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 7); -SELECT 'geojson_options_16', ST_AsGeoJson(GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 7); +SELECT 'geojson_options_01', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=0;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 0); +SELECT 'geojson_options_02', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0); +SELECT 'geojson_options_03', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=0;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 1); +SELECT 'geojson_options_04', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 1); +SELECT 'geojson_options_05', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=0;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 2); +SELECT 'geojson_options_06', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 2); +SELECT 'geojson_options_07', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=0;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 3); +SELECT 'geojson_options_08', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 3); +SELECT 'geojson_options_09', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=0;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 4); +SELECT 'geojson_options_10', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 4); +SELECT 'geojson_options_11', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=0;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 5); +SELECT 'geojson_options_12', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 5); +SELECT 'geojson_options_13', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=0;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 6); +SELECT 'geojson_options_14', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 6); +SELECT 'geojson_options_15', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=0;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 7); +SELECT 'geojson_options_16', ST_AsGeoJSON(ST_GeomFromEWKT('SRID=4326;LINESTRING(1 1, 2 2, 3 3, 4 4)'), 0, 7); -- Out and in to PostgreSQL native geometric types WITH p AS ( SELECT '((0,0),(0,1),(1,1),(1,0),(0,0))'::text AS p ) diff --git a/regress/out_geometry_expected b/regress/out_geometry_expected index f045640f1..adb3d0c12 100644 --- a/regress/out_geometry_expected +++ b/regress/out_geometry_expected @@ -5,9 +5,13 @@ gml_version_01|1,11 1 ERROR: Only GML 2 and GML 3 are supported ERROR: Only GML 2 and GML 3 are supported -gml_option_01|1,1 -gml_option_02|1 1 -gml_option_03|1 1 +gml_option_01|1,2 +gml_option_02|1 2 +gml_option_03|1 2 +gml_option_04|1 2 +gml_option_05|2 1 +gml_option_06|1,2 3,4 +gml_option_07|1 23 4 gml_deegree_01|1 2 gml_deegree_02|1,2 gml_deegree_03|2 1 diff --git a/topology/postgis_topology.c b/topology/postgis_topology.c index 64ea58916..ba7b43139 100644 --- a/topology/postgis_topology.c +++ b/topology/postgis_topology.c @@ -170,11 +170,11 @@ cb_loadTopologyByName(const LWT_BE_DATA* be, const char *name) static SPIPlanPtr plan = NULL; argtypes[0] = CSTRINGOID; + sql = + "SELECT id,srid,precision,null::geometry " + "FROM topology.topology WHERE name = $1::varchar"; if ( ! plan ) /* prepare on first call */ { - sql = "SELECT id,srid,precision,null::geometry" - " FROM topology.topology " - "WHERE name = $1::varchar"; plan = SPI_prepare(sql, 1, argtypes); if ( ! plan ) {