]> granicus.if.org Git - postgis/commitdiff
Added nrings(geom), multi(geom) and all of <type>FromText(geom, [srid])
authorSandro Santilli <strk@keybit.net>
Thu, 26 Aug 2004 16:44:01 +0000 (16:44 +0000)
committerSandro Santilli <strk@keybit.net>
Thu, 26 Aug 2004 16:44:01 +0000 (16:44 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@755 b70326c6-7e19-0410-871a-916f4a2858ee

lwgeom/MISSING_OBJECTS
lwgeom/lwgeom_functions_basic.c
lwgeom/lwpostgis.sql.in

index 330eb18a6059c0706cf6bf29b5e635c2d5d6011c..82df60b63f017b48735d45c3ddc702a447c8d594 100644 (file)
 # This is a list of objects still missing lwgeom support
 
-FUNC: KEEPING FUNCTION: [box3d_in(cstring)]
-FUNC: KEEPING FUNCTION: [box3d_out(box3d)]
-FUNC: KEEPING FUNCTION: [chip_in(cstring)]
-FUNC: KEEPING FUNCTION: [chip_out(chip)]
-FUNC: KEEPING FUNCTION: [srid(chip)]
-FUNC: KEEPING FUNCTION: [height(chip)]
-FUNC: KEEPING FUNCTION: [factor(chip)]
-FUNC: KEEPING FUNCTION: [width(chip)]
-FUNC: KEEPING FUNCTION: [datatype(chip)]
-FUNC: KEEPING FUNCTION: [compression(chip)]
-FUNC: KEEPING FUNCTION: [setsrid(chip, integer)]
-FUNC: KEEPING FUNCTION: [setfactor(chip, real)]
-FUNC: KEEPING FUNCTION: [geometry(chip)]
-FUNC: KEEPING FUNCTION: [box3d(geometry)]
-FUNC: KEEPING FUNCTION: [box(geometry)]
-FUNC: KEEPING FUNCTION: [geometry(box3d)]
-FUNC: KEEPING FUNCTION: [expand(box3d, double precision)]
+AGGREGATE: KEEPING AGGREGATE [collect(geometry)]
+AGGREGATE: KEEPING AGGREGATE [geomunion(geometry)]
+AGGREGATE: KEEPING AGGREGATE [memcollect(geometry)]
+AGGREGATE: KEEPING AGGREGATE [memgeomunion(geometry)]
+FNCAST: KEEPING FNCAST geometry(text) (see CAST)
+FUNC: KEEPING FUNCTION: [line_interpolate_point(geometry, double precision)]
+FUNC: KEEPING FUNCTION: [simplify(geometry, double precision)]
 FUNC: KEEPING FUNCTION: [asbinary(geometry)]
 FUNC: KEEPING FUNCTION: [asbinary(geometry, text)]
-FUNC: KEEPING FUNCTION: [nrings(geometry)]
-FUNC: KEEPING FUNCTION: [translate(geometry, double precision, double precision, double precision)]
+FUNC: KEEPING FUNCTION: [boundary(geometry)]
+FUNC: KEEPING FUNCTION: [box(geometry)]
+FUNC: KEEPING FUNCTION: [collect_garray(geometry[])]
+FUNC: KEEPING FUNCTION: [collector(geometry, geometry)]
 FUNC: KEEPING FUNCTION: [envelope(geometry)]
-
-
-FUNC: KEEPING FUNCTION: [optimistic_overlap(geometry, geometry, double precision)]
-FUNC: KEEPING FUNCTION: [segmentize(geometry, double precision)]
-FUNC: KEEPING FUNCTION: [polyfromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [polygonfromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [polygonfromtext(geometry)]
-FUNC: KEEPING FUNCTION: [mpolyfromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [linefromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [mlinefromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [multilinestringfromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [multilinestringfromtext(geometry)]
-FUNC: KEEPING FUNCTION: [pointfromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [mpointfromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [multipointfromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [multipointfromtext(geometry)]
-FUNC: KEEPING FUNCTION: [geomcollfromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [polyfromtext(geometry)]
-FUNC: KEEPING FUNCTION: [mpolyfromtext(geometry)]
-FUNC: KEEPING FUNCTION: [multipolygonfromtext(geometry)]
-FUNC: KEEPING FUNCTION: [multipolygonfromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [linefromtext(geometry)]
-FUNC: KEEPING FUNCTION: [linestringfromtext(geometry)]
-FUNC: KEEPING FUNCTION: [linestringfromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [mlinefromtext(geometry)]
-FUNC: KEEPING FUNCTION: [pointfromtext(geometry)]
-FUNC: KEEPING FUNCTION: [mpointfromtext(geometry)]
-FUNC: KEEPING FUNCTION: [geomcollfromtext(geometry)]
-FUNC: KEEPING FUNCTION: [isempty(geometry)]
-FUNC: KEEPING FUNCTION: [issimple(geometry)]
 FUNC: KEEPING FUNCTION: [equals(geometry, geometry)]
-FUNC: KEEPING FUNCTION: [xmin(box3d)]
-FUNC: KEEPING FUNCTION: [ymin(box3d)]
-FUNC: KEEPING FUNCTION: [zmin(box3d)]
-FUNC: KEEPING FUNCTION: [xmax(box3d)]
-FUNC: KEEPING FUNCTION: [ymax(box3d)]
-FUNC: KEEPING FUNCTION: [zmax(box3d)]
-FUNC: KEEPING FUNCTION: [box3dtobox(box3d)]
-FUNC: KEEPING FUNCTION: [combine_bbox(box3d, geometry)]
-TYPE: KEEPING TYPE [box3d]
-TYPE: KEEPING TYPE [chip]
-FNCAST: KEEPING FNCAST geometry(chip) (see CAST)
-FNCAST: KEEPING FNCAST geometry(box3d) (see CAST)
-FNCAST: KEEPING FNCAST geometry(text) (see CAST)
-FNCAST: KEEPING FNCAST box3dtobox(box3d) (see CAST)
+FUNC: KEEPING FUNCTION: [expand(geometry, double precision)]
+FUNC: KEEPING FUNCTION: [geom_accum(geometry[], geometry)]
+FUNC: KEEPING FUNCTION: [geometry_size(geometry, internal)]
+FUNC: KEEPING FUNCTION: [isempty(geometry)]
+FUNC: KEEPING FUNCTION: [optimistic_overlap(geometry, geometry, double precision)]
 FUNC: KEEPING FUNCTION: [point_inside_circle(geometry, double precision, double precision, double precision)]
-FUNC: KEEPING FUNCTION: [centroid(geometry)]
+FUNC: KEEPING FUNCTION: [segmentize(geometry, double precision)]
+FUNC: KEEPING FUNCTION: [translate(geometry, double precision, double precision, double precision)]
+FUNC: KEEPING FUNCTION: [unite_garray(geometry[])]
+
+--- GEOS
+FUNC: KEEPING FUNCTION: [centroid(geometry)]  (Also !GEOS implementation)
 FUNC: KEEPING FUNCTION: [isring(geometry)]
 FUNC: KEEPING FUNCTION: [pointonsurface(geometry)]
-FUNC: KEEPING FUNCTION: [collector(geometry, geometry)]
-FUNC: KEEPING FUNCTION: [intersection(geometry, geometry)]
 FUNC: KEEPING FUNCTION: [buffer(geometry, double precision)]
+FUNC: KEEPING FUNCTION: [contains(geometry, geometry)]
 FUNC: KEEPING FUNCTION: [convexhull(geometry)]
+FUNC: KEEPING FUNCTION: [crosses(geometry, geometry)]
 FUNC: KEEPING FUNCTION: [difference(geometry, geometry)]
-FUNC: KEEPING FUNCTION: [boundary(geometry)]
+FUNC: KEEPING FUNCTION: [disjoint(geometry, geometry)]
+FUNC: KEEPING FUNCTION: [within(geometry, geometry)]
 FUNC: KEEPING FUNCTION: [symdifference(geometry, geometry)]
 FUNC: KEEPING FUNCTION: [symmetricdifference(geometry, geometry)]
-FUNC: KEEPING FUNCTION: [geomunion(geometry, geometry)]
+FUNC: KEEPING FUNCTION: [touches(geometry, geometry)]
 FUNC: KEEPING FUNCTION: [relate(geometry, geometry)]
 FUNC: KEEPING FUNCTION: [relate(geometry, geometry, text)]
-FUNC: KEEPING FUNCTION: [disjoint(geometry, geometry)]
-FUNC: KEEPING FUNCTION: [touches(geometry, geometry)]
-FUNC: KEEPING FUNCTION: [intersects(geometry, geometry)]
-FUNC: KEEPING FUNCTION: [crosses(geometry, geometry)]
-FUNC: KEEPING FUNCTION: [within(geometry, geometry)]
-FUNC: KEEPING FUNCTION: [contains(geometry, geometry)]
 FUNC: KEEPING FUNCTION: [overlaps(geometry, geometry)]
+FUNC: KEEPING FUNCTION: [issimple(geometry)]
 FUNC: KEEPING FUNCTION: [isvalid(geometry)]
-FUNC: KEEPING FUNCTION: [simplify(geometry, double precision)]
-FUNC: KEEPING FUNCTION: [geom_accum(geometry[], geometry)]
-FUNC: KEEPING FUNCTION: [makeswflayer(character varying)]
-FUNC: KEEPING FUNCTION: [apply_grid(geometry, double precision, double precision, double precision, double precision)]
-FUNC: KEEPING FUNCTION: [nptsinbox(geometry, box3d)]
-FUNC: KEEPING FUNCTION: [collect_garray(geometry[])]
-FUNC: KEEPING FUNCTION: [unite_garray(geometry[])]
-FUNC: KEEPING FUNCTION: [line_interpolate_point(geometry, double precision)]
-FUNC: KEEPING FUNCTION: [normalizelocation(character varying)]
-FUNC: KEEPING FUNCTION: [localdef(text, character varying)]
-FUNC: KEEPING FUNCTION: [updateindicatorcache()]
-FUNC: KEEPING FUNCTION: [updateindicatorcache(numeric)]
-FUNC: KEEPING FUNCTION: [apply_grid(geometry, double precision, double precision, double precision, double precision)]
-FUNC: KEEPING FUNCTION: [nptsinbox(geometry, box3d)]
-FUNC: KEEPING FUNCTION: [makeswflayer(character varying)]
-FUNC: KEEPING FUNCTION: [unite_garray(geometry[])]
-FUNC: KEEPING FUNCTION: [geom_accum(geometry[], geometry)]
-FUNC: KEEPING FUNCTION: [expand(geometry, double precision)]
-FUNC: KEEPING FUNCTION: [multi(geometry)]
-FUNC: KEEPING FUNCTION: [collect_garray(geometry[])]
+FUNC: KEEPING FUNCTION: [geomunion(geometry, geometry)]
 FUNC: KEEPING FUNCTION: [geosnoop(geometry)]
-FUNC: KEEPING FUNCTION: [line_interpolate_point(geometry, double precision)]
-FUNC: KEEPING FUNCTION: [geometry_size(geometry, internal)]
-AGGREGATE: KEEPING AGGREGATE [collect(geometry)]
-AGGREGATE: KEEPING AGGREGATE [collect(geometry)]
-AGGREGATE: KEEPING AGGREGATE [geomunion(geometry)]
-AGGREGATE: KEEPING AGGREGATE [geomunion(geometry)]
-AGGREGATE: KEEPING AGGREGATE [memgeomunion(geometry)]
-AGGREGATE: KEEPING AGGREGATE [memgeomunion(geometry)]
-AGGREGATE: KEEPING AGGREGATE [memcollect(geometry)]
+FUNC: KEEPING FUNCTION: [intersection(geometry, geometry)]
+FUNC: KEEPING FUNCTION: [intersects(geometry, geometry)]
+
+--- CHIP
+FUNC: KEEPING FUNCTION: [chip_in(cstring)]
+FUNC: KEEPING FUNCTION: [chip_out(chip)]
+TYPE: KEEPING TYPE [chip]
+FUNC: KEEPING FUNCTION: [width(chip)]
+FUNC: KEEPING FUNCTION: [height(chip)]
+FUNC: KEEPING FUNCTION: [srid(chip)]
+FUNC: KEEPING FUNCTION: [setsrid(chip, integer)]
+FUNC: KEEPING FUNCTION: [factor(chip)]
+FUNC: KEEPING FUNCTION: [setfactor(chip, real)]
+FUNC: KEEPING FUNCTION: [geometry(chip)]
+FUNC: KEEPING FUNCTION: [datatype(chip)]
+FUNC: KEEPING FUNCTION: [compression(chip)]
+FNCAST: KEEPING FNCAST geometry(chip) (see CAST)
 
+--- BOX3D
+FUNC: KEEPING FUNCTION: [box3d_in(cstring)]
+FUNC: KEEPING FUNCTION: [box3d_out(box3d)]
+TYPE: KEEPING TYPE [box3d]
+FUNC: KEEPING FUNCTION: [xmax(box3d)]
+FUNC: KEEPING FUNCTION: [xmin(box3d)]
+FUNC: KEEPING FUNCTION: [ymax(box3d)]
+FUNC: KEEPING FUNCTION: [ymin(box3d)]
+FUNC: KEEPING FUNCTION: [zmax(box3d)]
+FUNC: KEEPING FUNCTION: [zmin(box3d)]
+FNCAST: KEEPING FNCAST box3dtobox(box3d) (see CAST)
+FNCAST: KEEPING FNCAST geometry(box3d) (see CAST)
+FUNC: KEEPING FUNCTION: [box3d(geometry)]
+FUNC: KEEPING FUNCTION: [box3dtobox(box3d)]
+FUNC: KEEPING FUNCTION: [combine_bbox(box3d, geometry)]
+FUNC: KEEPING FUNCTION: [expand(box3d, double precision)]
+FUNC: KEEPING FUNCTION: [geometry(box3d)]
index 8a32a295e818ab1369a80e5ab64aec697357e92e..78e3dd38573b14289b6ec185ae1598a44eb0a96d 100644 (file)
@@ -17,6 +17,7 @@ Datum combine_box2d(PG_FUNCTION_ARGS);
 Datum LWGEOM_mem_size(PG_FUNCTION_ARGS);
 Datum LWGEOM_summary(PG_FUNCTION_ARGS);
 Datum LWGEOM_npoints(PG_FUNCTION_ARGS);
+Datum LWGEOM_nrings(PG_FUNCTION_ARGS);
 Datum LWGEOM_area_polygon(PG_FUNCTION_ARGS);
 Datum postgis_uses_stats(PG_FUNCTION_ARGS);
 Datum postgis_scripts_released(PG_FUNCTION_ARGS);
@@ -28,12 +29,14 @@ Datum LWGEOM_perimeter_poly(PG_FUNCTION_ARGS);
 Datum LWGEOM_force_2d(PG_FUNCTION_ARGS);
 Datum LWGEOM_force_3d(PG_FUNCTION_ARGS);
 Datum LWGEOM_force_collection(PG_FUNCTION_ARGS);
+Datum LWGEOM_force_multi(PG_FUNCTION_ARGS);
 Datum LWGEOM_mindistance2d(PG_FUNCTION_ARGS);
 Datum LWGEOM_maxdistance2d_linestring(PG_FUNCTION_ARGS);
 
 // internal
 char * lwgeom_summary_recursive(char *serialized, int offset);
 int32 lwgeom_npoints_recursive(char *serialized);
+int32 lwgeom_nrings_recursive(char *serialized);
 
 // general utilities (might be moved in lwgeom_api.c)
 double lwgeom_polygon_area(LWPOLY *poly);
@@ -1011,6 +1014,45 @@ lwgeom_npoints_recursive(char *serialized)
        return npoints;
 }
 
+/*
+ * Recursively count rings in a SERIALIZED lwgeom
+ */
+int32
+lwgeom_nrings_recursive(char *serialized)
+{
+       LWGEOM_INSPECTED *inspected;
+       int i;
+       int nrings=0;
+
+       inspected = lwgeom_inspect(serialized);
+
+       //now have to do a scan of each object
+       for (i=0; i<inspected->ngeometries; i++)
+       {
+               LWPOLY *poly=NULL;
+               char *subgeom=NULL;
+
+               subgeom = lwgeom_getsubgeometry_inspected(inspected, i);
+
+               if ( lwgeom_getType(subgeom[0]) == POLYGONTYPE )
+               {
+                       poly = lwpoly_deserialize(subgeom);
+                       nrings += poly->nrings;
+                       continue;
+               }
+
+               if ( lwgeom_getType(subgeom[0]) == COLLECTIONTYPE )
+               {
+                       nrings += lwgeom_nrings_recursive(subgeom);
+                       continue;
+               }
+       }
+
+       pfree_inspected(inspected);
+
+       return nrings;
+}
+
 //number of points in an object
 PG_FUNCTION_INFO_V1(LWGEOM_npoints);
 Datum LWGEOM_npoints(PG_FUNCTION_ARGS)
@@ -1023,6 +1065,18 @@ Datum LWGEOM_npoints(PG_FUNCTION_ARGS)
        PG_RETURN_INT32(npoints);
 }
 
+//number of rings in an object
+PG_FUNCTION_INFO_V1(LWGEOM_nrings);
+Datum LWGEOM_nrings(PG_FUNCTION_ARGS)
+{
+       LWGEOM *geom = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+       int32 nrings = 0;
+
+       nrings = lwgeom_nrings_recursive(SERIALIZED_FORM(geom));
+
+       PG_RETURN_INT32(nrings);
+}
+
 // Calculate the area of all the subobj in a polygon
 // area(point) = 0
 // area (line) = 0
@@ -1580,6 +1634,72 @@ Datum LWGEOM_force_collection(PG_FUNCTION_ARGS)
        PG_RETURN_POINTER(result);
 }
 
+// transform input geometry to a multi* type
+PG_FUNCTION_INFO_V1(LWGEOM_force_multi);
+Datum LWGEOM_force_multi(PG_FUNCTION_ARGS)
+{
+       LWGEOM *geom = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+       LWGEOM *result;
+       int oldtype, newtype;
+       int32 size = 0;
+       char *iptr, *optr;
+       int32 nsubgeoms = 1;
+
+       oldtype = lwgeom_getType(geom->type);
+       
+       // already a multi
+       if ( oldtype >= 4 ) PG_RETURN_POINTER(geom);
+
+       // not a multi*, must add header and 
+       // transfer eventual BBOX and SRID to first object
+
+       newtype = oldtype+3; // see defines
+
+       size = geom->size+5; // 4 for numgeoms, 1 for type
+
+       result = (LWGEOM *)palloc(size); // 4 for numgeoms, 1 for type
+       result->size = size;
+
+       result->type = TYPE_SETTYPE(geom->type, newtype);
+       iptr = geom->data;
+       optr = result->data;
+
+       // reset size to bare serialized input
+       size = geom->size - 4;
+
+       // transfer bbox
+       if ( lwgeom_hasBBOX(geom->type) )
+       {
+               memcpy(optr, iptr, sizeof(BOX2DFLOAT4));
+               optr += sizeof(BOX2DFLOAT4);
+               iptr += sizeof(BOX2DFLOAT4);
+               size -= sizeof(BOX2DFLOAT4);
+       }
+
+       // transfer SRID
+       if ( lwgeom_hasSRID(geom->type) )
+       {
+               memcpy(optr, iptr, 4);
+               optr += 4;
+               iptr += 4;
+               size -= 4;
+       }
+
+       // write number of geometries (1)
+       memcpy(optr, &nsubgeoms, 4);
+       optr+=4;
+
+       // write type of first geometry w/out BBOX and SRID
+       optr[0] = TYPE_SETHASSRID(geom->type, 0);
+       optr[0] = TYPE_SETHASBBOX(optr[0], 0);
+       optr++;
+
+       // write remaining stuff
+       memcpy(optr, iptr, size);
+
+       PG_RETURN_POINTER(result);
+}
+
 // Minimum 2d distance between objects in geom1 and geom2.
 PG_FUNCTION_INFO_V1(LWGEOM_mindistance2d);
 Datum LWGEOM_mindistance2d(PG_FUNCTION_ARGS)
index 0b696d3184b26245f0d3f0727ef45cffcd08a4d5..d844b1eefa0ad2635a5c852336bf644f41fe9921 100644 (file)
@@ -107,26 +107,6 @@ CREATE TYPE geometry (
         storage = main
 );
 
-CREATEFUNCTION geometryfromtext(geometry)
-        RETURNS geometry
-        AS '@MODULE_FILENAME@','LWGEOM_from_text'
-        LANGUAGE 'C' WITH (isstrict,iscachable);
-
-CREATEFUNCTION geometryfromtext(geometry, int4)
-        RETURNS geometry
-        AS '@MODULE_FILENAME@','LWGEOM_from_text'
-        LANGUAGE 'C' WITH (isstrict,iscachable);
-
-CREATEFUNCTION geomfromtext(geometry)
-RETURNS geometry AS '
-SELECT geometryfromtext($1)
-' LANGUAGE 'SQL' WITH (isstrict,iscachable);
-
-CREATEFUNCTION geomfromtext(geometry, int4)
-RETURNS geometry AS '
-SELECT geometryfromtext($1, $2)
-' LANGUAGE 'SQL' WITH (isstrict,iscachable);
-
 
 -----------------------------------------------------------------------
 --
@@ -822,6 +802,11 @@ CREATEFUNCTION npoints(geometry)
        AS '@MODULE_FILENAME@', 'LWGEOM_npoints'
        LANGUAGE 'C' WITH (isstrict);
 
+CREATEFUNCTION nrings(geometry)
+       RETURNS int4
+       AS '@MODULE_FILENAME@', 'LWGEOM_nrings'
+       LANGUAGE 'C' WITH (isstrict);
+
 ------------------------------------------------------------------------
 -- OGC defined
 ------------------------------------------------------------------------
@@ -921,6 +906,161 @@ CREATEFUNCTION GeometryFromText(geometry, int4)
         AS '@MODULE_FILENAME@','LWGEOM_from_text'
         LANGUAGE 'C' WITH (isstrict,iscachable);
 
+CREATEFUNCTION GeometryFromText(geometry)
+        RETURNS geometry
+        AS '@MODULE_FILENAME@','LWGEOM_from_text'
+        LANGUAGE 'C' WITH (isstrict,iscachable);
+
+CREATEFUNCTION GeometryFromText(geometry, int4)
+        RETURNS geometry
+        AS '@MODULE_FILENAME@','LWGEOM_from_text'
+        LANGUAGE 'C' WITH (isstrict,iscachable);
+
+CREATEFUNCTION GeomFromText(geometry)
+RETURNS geometry AS '
+SELECT geometryfromtext($1)
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION GeomFromText(geometry, int4)
+RETURNS geometry AS '
+SELECT geometryfromtext($1, $2)
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION PointFromText(geometry)
+RETURNS geometry
+AS ' SELECT CASE WHEN geometrytype($1) = ''POINT'' THEN $1
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION PointFromText(geometry, int4)
+RETURNS geometry
+AS ' SELECT CASE WHEN geometrytype($1) = ''POINT'' THEN setSRID($1,$2)
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION LineFromText(geometry)
+RETURNS geometry
+AS ' SELECT CASE WHEN geometrytype($1) = ''LINESTRING'' THEN $1
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION LineFromText(geometry, int4)
+RETURNS geometry
+AS ' SELECT CASE WHEN geometrytype($1) = ''LINESTRING'' THEN setSRID($1,$2)
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION LineStringFromText(geometry)
+RETURNS geometry
+AS 'SELECT LineFromText($1)'
+LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION LineStringFromText(geometry, int4)
+RETURNS geometry
+AS 'SELECT LineFromText($1, $2)'
+LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION PolyFromText(geometry)
+RETURNS geometry
+AS ' SELECT CASE WHEN geometrytype($1) = ''POLYGON'' THEN $1
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION PolyFromText(geometry, int4)
+RETURNS geometry
+AS ' SELECT CASE WHEN geometrytype($1) = ''POLYGON'' THEN setSRID($1,$2)
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION PolygonFromText(geometry, int4)
+RETURNS geometry
+AS 'SELECT PolyFromText($1, $2)'
+LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION PolygonFromText(geometry)
+RETURNS geometry
+AS 'SELECT PolyFromText($1)'
+LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MLineFromText(geometry, int4)
+RETURNS geometry
+AS 'SELECT CASE WHEN geometrytype($1) = ''MULTILINESTRING'' THEN setSRID($1,$2)
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MLineFromText(geometry)
+RETURNS geometry
+AS 'SELECT CASE WHEN geometrytype($1) = ''MULTILINESTRING'' THEN $1
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MultiLineStringFromText(geometry)
+RETURNS geometry
+AS 'SELECT MLineFromText($1)'
+LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MultiLineStringFromText(geometry, int4)
+RETURNS geometry
+AS 'SELECT MLineFromText($1, $2)'
+LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MPointFromText(geometry, int4)
+RETURNS geometry
+AS 'SELECT CASE WHEN geometrytype($1) = ''MULTIPOINT'' THEN setSRID($1,$2)
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MPointFromText(geometry)
+RETURNS geometry
+AS 'SELECT CASE WHEN geometrytype($1) = ''MULTIPOINT'' THEN $1
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MultiPointFromText(geometry, int4)
+RETURNS geometry
+AS 'SELECT MPointFromText($1, $2)'
+LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MultiPointFromText(geometry)
+RETURNS geometry
+AS 'SELECT MPointFromText($1)'
+LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MPolyFromText(geometry, int4)
+RETURNS geometry
+AS 'SELECT CASE WHEN geometrytype($1) = ''MULTIPOLYGON'' THEN setSRID($1,$2)
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MPolyFromText(geometry)
+RETURNS geometry
+AS 'SELECT CASE WHEN geometrytype($1) = ''MULTIPOLYGON'' THEN $1
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MultiPolygonFromText(geometry, int4)
+RETURNS geometry
+AS 'SELECT MPolyFromText($1, $2)'
+LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MultiPolygonFromText(geometry)
+RETURNS geometry
+AS 'SELECT MPolyFromText($1)'
+LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION GeomCollFromText(geometry, int4)
+RETURNS geometry
+AS 'SELECT CASE WHEN geometrytype($1) = ''GEOMETRYCOLLECTION'' THEN
+setSRID($1,$2)
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION GeomCollFromText(geometry)
+RETURNS geometry
+AS 'SELECT CASE WHEN geometrytype($1) = ''GEOMETRYCOLLECTION'' THEN $1
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
 ------------------------------------------------------------------------
 -- Misures
 ------------------------------------------------------------------------
@@ -1026,6 +1166,11 @@ CREATEFUNCTION force_collection(geometry)
        AS '@MODULE_FILENAME@', 'LWGEOM_force_collection'
        LANGUAGE 'C' WITH (isstrict);
 
+CREATEFUNCTION multi(geometry) 
+       RETURNS geometry
+       AS '@MODULE_FILENAME@', 'LWGEOM_force_multi'
+       LANGUAGE 'C' WITH (isstrict);
+
 ------------------------------------------------------------------------
 
 --