Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions contrib/babelfishpg_common/sql/geography.sql
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,66 @@ CREATE OR REPLACE FUNCTION sys.STDimension(geom sys.GEOGRAPHY)
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;

--MAKEVALID
CREATE OR REPLACE FUNCTION sys.MakeValid(geog sys.GEOGRAPHY)
RETURNS sys.GEOGRAPHY
AS $$
BEGIN
IF sys.STIsEmpty(geog) = 1 THEN
RETURN geog;
ELSEIF sys.STIsValid(geog) = 1 THEN
RETURN geog;
ELSE
RETURN sys.makevalid_helper(geog);
END IF;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;

--STNumPoints
CREATE OR REPLACE FUNCTION sys.STNumPoints(geog sys.GEOGRAPHY)
RETURNS integer
AS $$
BEGIN
IF sys.STIsValid(geog) = 0 THEN
RAISE EXCEPTION 'The geography instance is not valid';
ELSE
RETURN sys.STNumPoints_helper(geog);
END IF;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;

--Parse
CREATE OR REPLACE FUNCTION sys.Geography__Parse(geography_tagged_text sys.NVARCHAR)
RETURNS sys.GEOGRAPHY
AS $$
BEGIN
IF UPPER(geography_tagged_text COLLATE sys.DATABASE_DEFAULT) = 'NULL' THEN
RETURN NULL;
END IF;

RETURN sys.geogfromtext_helper(geography_tagged_text, 4326);
END;
$$ LANGUAGE plpgsql STRICT IMMUTABLE PARALLEL SAFE;

--STGeomType
CREATE OR REPLACE FUNCTION sys.STGeometryType(geog sys.GEOGRAPHY)
RETURNS sys.NVARCHAR(4000)
AS $$
DECLARE
geom_type text;
BEGIN
IF STIsValid(geog) = 0 THEN
RAISE EXCEPTION 'This operation cannot be completed because the instance is not valid';
END IF;
geom_type := sys.ST_GeometryType(geog);

IF geom_type LIKE 'ST\_%' ESCAPE '\' THEN
RETURN substr(geom_type, 4);
END IF;
RAISE EXCEPTION 'Unexpected geometry type format: %. Expected ST_* prefix.', geom_type;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;

-- STDisjoint
-- Checks if two geometries have no points in common
CREATE OR REPLACE FUNCTION sys.STDisjoint(geom1 sys.GEOGRAPHY, geom2 sys.GEOGRAPHY)
Expand Down Expand Up @@ -633,6 +693,16 @@ CREATE OR REPLACE FUNCTION sys.STDimension_helper(sys.GEOGRAPHY)
AS '$libdir/postgis-3','LWGEOM_dimension'
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;

CREATE OR REPLACE FUNCTION sys.makevalid_helper(geog sys.GEOGRAPHY)
RETURNS sys.GEOGRAPHY
AS '$libdir/postgis-3', 'ST_MakeValid'
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;

CREATE OR REPLACE FUNCTION sys.STNumPoints_helper(sys.GEOGRAPHY)
RETURNS integer
AS '$libdir/postgis-3', 'LWGEOM_npoints'
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;

CREATE OR REPLACE FUNCTION sys.STIntersects_helper(geom1 sys.GEOGRAPHY, geom2 sys.GEOGRAPHY)
RETURNS sys.BIT
AS '$libdir/postgis-3','ST_Intersects'
Expand Down
72 changes: 72 additions & 0 deletions contrib/babelfishpg_common/sql/geometry.sql
Original file line number Diff line number Diff line change
Expand Up @@ -427,7 +427,69 @@ CREATE OR REPLACE FUNCTION sys.STDimension(geom sys.GEOMETRY)
END IF;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;

--STGeomType
CREATE OR REPLACE FUNCTION sys.STGeometryType(geom sys.GEOMETRY)
RETURNS sys.NVARCHAR(4000)
AS $$
DECLARE
geom_type text;
BEGIN
IF STIsValid(geom) = 0 THEN
RAISE EXCEPTION 'This operation cannot be completed because the instance is not valid';
END IF;

geom_type := sys.ST_GeometryType(geom);

IF geom_type LIKE 'ST\_%' ESCAPE '\' THEN
RETURN substr(geom_type, 4);
END IF;

RAISE EXCEPTION 'Unexpected geometry type format: %. Expected ST_* prefix.', geom_type;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;

--MAKE VALID
CREATE OR REPLACE FUNCTION sys.MakeValid(geom sys.GEOMETRY)
RETURNS sys.GEOMETRY
AS $$
BEGIN
IF sys.STIsEmpty(geom) = 1 THEN
RETURN geom;
ELSEIF sys.STIsValid(geom) = 1 THEN
RETURN geom;
ELSE
RETURN sys.STMakeValid_helper(geom);
END IF;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;

--Parse
CREATE OR REPLACE FUNCTION sys.Geometry__Parse(geometry_tagged_text sys.NVARCHAR)
RETURNS sys.GEOMETRY
AS $$
BEGIN
IF UPPER(geometry_tagged_text COLLATE sys.DATABASE_DEFAULT) = 'NULL' THEN
RETURN NULL;
END IF;

RETURN sys.geomfromtext_helper(geometry_tagged_text, 0);
END;
$$ LANGUAGE plpgsql STRICT IMMUTABLE PARALLEL SAFE;

--STNumPoints
CREATE OR REPLACE FUNCTION sys.STNumPoints(geom sys.GEOMETRY)
RETURNS integer
AS $$
BEGIN
IF STIsValid(geom) = 0 THEN
RAISE EXCEPTION 'The geometry instance is not valid';
ELSE
RETURN sys.STNumPoints_helper(geom);
END IF;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;

-- STDisjoint
-- Checks if two geometries have no points in common
CREATE OR REPLACE FUNCTION sys.STDisjoint(geom1 sys.GEOMETRY, geom2 sys.GEOMETRY)
Expand Down Expand Up @@ -622,7 +684,17 @@ CREATE OR REPLACE FUNCTION sys.STDimension_helper(sys.GEOMETRY)
RETURNS integer
AS '$libdir/postgis-3','LWGEOM_dimension'
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;

CREATE OR REPLACE FUNCTION sys.STNumPoints_helper(sys.GEOMETRY)
RETURNS integer
AS '$libdir/postgis-3','LWGEOM_npoints'
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;

CREATE OR REPLACE FUNCTION sys.STMakeValid_helper(sys.GEOMETRY)
RETURNS sys.GEOMETRY
AS '$libdir/postgis-3','ST_MakeValid'
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;

CREATE OR REPLACE FUNCTION sys.STIntersects_helper(geom1 sys.GEOMETRY, geom2 sys.GEOMETRY)
RETURNS sys.BIT
AS '$libdir/postgis-3','ST_Intersects'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,151 @@
-------------------------------------------------------
---- Include changes related to spatial types here ----
-------------------------------------------------------
--geometry
CREATE OR REPLACE FUNCTION sys.MakeValid(geom sys.GEOMETRY)
RETURNS sys.GEOMETRY
AS $$
BEGIN
IF sys.STIsEmpty(geom) = 1 THEN
RETURN geom;
ELSEIF sys.STIsValid(geom) = 1 THEN
RETURN geom;
ELSE
RETURN sys.STMakeValid_helper(geom);
END IF;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;

CREATE OR REPLACE FUNCTION sys.STMakeValid_helper(sys.GEOMETRY)
RETURNS sys.GEOMETRY
AS '$libdir/postgis-3','ST_MakeValid'
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;

--geography
CREATE OR REPLACE FUNCTION sys.MakeValid(geog sys.GEOGRAPHY)
RETURNS sys.GEOGRAPHY
AS $$
BEGIN
IF sys.STIsEmpty(geog) = 1 THEN
RETURN geog;
ELSEIF sys.STIsValid(geog) = 1 THEN
RETURN geog;
ELSE
RETURN sys.makevalid_helper(geog);
END IF;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;

CREATE OR REPLACE FUNCTION sys.makevalid_helper(geog sys.GEOGRAPHY)
RETURNS sys.GEOGRAPHY
AS '$libdir/postgis-3', 'ST_MakeValid'
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;

--STNumPoints
-- geometry

CREATE OR REPLACE FUNCTION sys.STNumPoints(geom sys.GEOMETRY)
RETURNS integer
AS $$
BEGIN
IF STIsValid(geom) = 0 THEN
RAISE EXCEPTION 'The geometry instance is not valid';
ELSE
RETURN sys.STNumPoints_helper(geom);
END IF;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;

CREATE OR REPLACE FUNCTION sys.STNumPoints_helper(sys.GEOMETRY)
RETURNS integer
AS '$libdir/postgis-3','LWGEOM_npoints'
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;

-- Geography

CREATE OR REPLACE FUNCTION sys.STNumPoints(geog sys.GEOGRAPHY)
RETURNS integer
AS $$
BEGIN
IF sys.STIsValid(geog) = 0 THEN
RAISE EXCEPTION 'The geography instance is not valid';
ELSE
RETURN sys.STNumPoints_helper(geog);
END IF;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;

CREATE OR REPLACE FUNCTION sys.STNumPoints_helper(sys.GEOGRAPHY)
RETURNS integer
AS '$libdir/postgis-3', 'LWGEOM_npoints'
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;

--parse
--Geometry
CREATE OR REPLACE FUNCTION sys.Geometry__Parse(geometry_tagged_text sys.NVARCHAR)
RETURNS sys.GEOMETRY
AS $$
BEGIN
IF UPPER(geometry_tagged_text COLLATE sys.DATABASE_DEFAULT) = 'NULL' THEN
RETURN NULL;
END IF;

RETURN sys.geomfromtext_helper(geometry_tagged_text, 0);
END;
$$ LANGUAGE plpgsql STRICT IMMUTABLE PARALLEL SAFE;

--Geography
CREATE OR REPLACE FUNCTION sys.Geography__Parse(geography_tagged_text sys.NVARCHAR)
RETURNS sys.GEOGRAPHY
AS $$
BEGIN
IF UPPER(geography_tagged_text COLLATE sys.DATABASE_DEFAULT) = 'NULL' THEN
RETURN NULL;
END IF;

RETURN sys.geogfromtext_helper(geography_tagged_text, 4326);
END;
$$ LANGUAGE plpgsql STRICT IMMUTABLE PARALLEL SAFE;

--STGeomType
--Geometry
CREATE OR REPLACE FUNCTION sys.STGeometryType(geom sys.GEOMETRY)
RETURNS sys.NVARCHAR(4000)
AS $$
DECLARE
geom_type text;
BEGIN
IF STIsValid(geom) = 0 THEN
RAISE EXCEPTION 'This operation cannot be completed because the instance is not valid';
END IF;

geom_type := sys.ST_GeometryType(geom);

IF geom_type LIKE 'ST\_%' ESCAPE '\' THEN
RETURN substr(geom_type, 4);
END IF;

RAISE EXCEPTION 'Unexpected geometry type format: %. Expected ST_* prefix.', geom_type;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;

--Geography

CREATE OR REPLACE FUNCTION sys.STGeometryType(geog sys.GEOGRAPHY)
RETURNS sys.NVARCHAR(4000)
AS $$
DECLARE
geom_type text;
BEGIN
IF STIsValid(geog) = 0 THEN
RAISE EXCEPTION 'This operation cannot be completed because the instance is not valid';
END IF;
geom_type := sys.ST_GeometryType(geog);

IF geom_type LIKE 'ST\_%' ESCAPE '\' THEN
RETURN substr(geom_type, 4);
END IF;

RAISE EXCEPTION 'Unexpected geometry type format: %. Expected ST_* prefix.', geom_type;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;
3 changes: 3 additions & 0 deletions contrib/babelfishpg_tsql/antlr/TSqlLexer.g4
Original file line number Diff line number Diff line change
Expand Up @@ -555,6 +555,7 @@ M: [Mm];
M_DOUBLE_QUOTE: ["] M ["] {pltsql_quoted_identifier == true}?;
M_SQBRACKET: '[' M ']';
MANUAL: M A N U A L;
MAKEVALID: M A K E V A L I D;
MARK: M A R K;
MASK: M A S K;
MASKED: M A S K E D;
Expand Down Expand Up @@ -980,11 +981,13 @@ STDISJOINT: 'STDisjoint';
STDISTANCE: 'STDistance';
STEQUALS: 'STEquals';
STGEOMFROMTEXT: 'STGeomFromText';
STGEOMETRYTYPE: 'STGeometryType';
STINTERSECTS: 'STIntersects';
STISCLOSED: 'STIsClosed';
STISEMPTY: 'STIsEmpty';
STISVALID: 'STIsValid';
STLINEFROMTEXT: 'STLineFromText';
STNUMPOINTS: 'STNumPoints';
STOP: S T O P;
STOPAT: S T O P A T;
STOPATMARK: S T O P A T M A R K;
Expand Down
8 changes: 7 additions & 1 deletion contrib/babelfishpg_tsql/antlr/TSqlParser.g4
Original file line number Diff line number Diff line change
Expand Up @@ -3941,10 +3941,13 @@ geospatial_func_no_arg
: STASTEXT
| STASBINARY
| STAREA
| MAKEVALID
| STDIMENSION
| STGEOMETRYTYPE
| STISCLOSED
| STISEMPTY
| STISVALID
| STNUMPOINTS
;

geospatial_func_arg
Expand All @@ -3961,6 +3964,7 @@ geospatial_static_method
| STLINEFROMTEXT
| STPOLYFROMTEXT
| POINT
| PARSE
;

hierarchyid_methods
Expand All @@ -3969,7 +3973,6 @@ hierarchyid_methods

hierarchyid_static_method
: GETROOT
| PARSE
;

datatype_static_method
Expand Down Expand Up @@ -4724,6 +4727,7 @@ keyword
| M
| M_DOUBLE_QUOTE
| M_SQBRACKET
| MAKEVALID
| MANUAL
| MARK
| MASK
Expand Down Expand Up @@ -5080,12 +5084,14 @@ keyword
| STDISJOINT
| STDISTANCE
| STEQUALS
| STGEOMETRYTYPE
| STGEOMFROMTEXT
| STINTERSECTS
| STISCLOSED
| STISEMPTY
| STISVALID
| STLINEFROMTEXT
| STNUMPOINTS
| STOP
| STOPAT
| STOPATMARK
Expand Down
Loading
Loading