Skip to content

Commit fea7f92

Browse files
author
Rucha Kulkarni
committed
Merge remote-tracking branch 'upstream/BABEL_6_X_DEV' into jira-babel-5966
2 parents ba425e9 + 193c03d commit fea7f92

File tree

52 files changed

+9822
-120
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+9822
-120
lines changed

contrib/babelfishpg_common/sql/geography.sql

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,66 @@ CREATE OR REPLACE FUNCTION sys.STDimension(geom sys.GEOGRAPHY)
433433
END;
434434
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;
435435

436+
--MAKEVALID
437+
CREATE OR REPLACE FUNCTION sys.MakeValid(geog sys.GEOGRAPHY)
438+
RETURNS sys.GEOGRAPHY
439+
AS $$
440+
BEGIN
441+
IF sys.STIsEmpty(geog) = 1 THEN
442+
RETURN geog;
443+
ELSEIF sys.STIsValid(geog) = 1 THEN
444+
RETURN geog;
445+
ELSE
446+
RETURN sys.makevalid_helper(geog);
447+
END IF;
448+
END;
449+
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;
450+
451+
--STNumPoints
452+
CREATE OR REPLACE FUNCTION sys.STNumPoints(geog sys.GEOGRAPHY)
453+
RETURNS integer
454+
AS $$
455+
BEGIN
456+
IF sys.STIsValid(geog) = 0 THEN
457+
RAISE EXCEPTION 'The geography instance is not valid';
458+
ELSE
459+
RETURN sys.STNumPoints_helper(geog);
460+
END IF;
461+
END;
462+
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;
463+
464+
--Parse
465+
CREATE OR REPLACE FUNCTION sys.Geography__Parse(geography_tagged_text sys.NVARCHAR)
466+
RETURNS sys.GEOGRAPHY
467+
AS $$
468+
BEGIN
469+
IF UPPER(geography_tagged_text COLLATE sys.DATABASE_DEFAULT) = 'NULL' THEN
470+
RETURN NULL;
471+
END IF;
472+
473+
RETURN sys.geogfromtext_helper(geography_tagged_text, 4326);
474+
END;
475+
$$ LANGUAGE plpgsql STRICT IMMUTABLE PARALLEL SAFE;
476+
477+
--STGeomType
478+
CREATE OR REPLACE FUNCTION sys.STGeometryType(geog sys.GEOGRAPHY)
479+
RETURNS sys.NVARCHAR(4000)
480+
AS $$
481+
DECLARE
482+
geom_type text;
483+
BEGIN
484+
IF STIsValid(geog) = 0 THEN
485+
RAISE EXCEPTION 'This operation cannot be completed because the instance is not valid';
486+
END IF;
487+
geom_type := sys.ST_GeometryType(geog);
488+
489+
IF geom_type LIKE 'ST\_%' ESCAPE '\' THEN
490+
RETURN substr(geom_type, 4);
491+
END IF;
492+
RAISE EXCEPTION 'Unexpected geometry type format: %. Expected ST_* prefix.', geom_type;
493+
END;
494+
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;
495+
436496
-- STDisjoint
437497
-- Checks if two geometries have no points in common
438498
CREATE OR REPLACE FUNCTION sys.STDisjoint(geom1 sys.GEOGRAPHY, geom2 sys.GEOGRAPHY)
@@ -633,6 +693,16 @@ CREATE OR REPLACE FUNCTION sys.STDimension_helper(sys.GEOGRAPHY)
633693
AS '$libdir/postgis-3','LWGEOM_dimension'
634694
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;
635695
696+
CREATE OR REPLACE FUNCTION sys.makevalid_helper(geog sys.GEOGRAPHY)
697+
RETURNS sys.GEOGRAPHY
698+
AS '$libdir/postgis-3', 'ST_MakeValid'
699+
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;
700+
701+
CREATE OR REPLACE FUNCTION sys.STNumPoints_helper(sys.GEOGRAPHY)
702+
RETURNS integer
703+
AS '$libdir/postgis-3', 'LWGEOM_npoints'
704+
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;
705+
636706
CREATE OR REPLACE FUNCTION sys.STIntersects_helper(geom1 sys.GEOGRAPHY, geom2 sys.GEOGRAPHY)
637707
RETURNS sys.BIT
638708
AS '$libdir/postgis-3','ST_Intersects'

contrib/babelfishpg_common/sql/geometry.sql

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,69 @@ CREATE OR REPLACE FUNCTION sys.STDimension(geom sys.GEOMETRY)
427427
END IF;
428428
END;
429429
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;
430+
431+
--STGeomType
432+
CREATE OR REPLACE FUNCTION sys.STGeometryType(geom sys.GEOMETRY)
433+
RETURNS sys.NVARCHAR(4000)
434+
AS $$
435+
DECLARE
436+
geom_type text;
437+
BEGIN
438+
IF STIsValid(geom) = 0 THEN
439+
RAISE EXCEPTION 'This operation cannot be completed because the instance is not valid';
440+
END IF;
441+
442+
geom_type := sys.ST_GeometryType(geom);
443+
444+
IF geom_type LIKE 'ST\_%' ESCAPE '\' THEN
445+
RETURN substr(geom_type, 4);
446+
END IF;
447+
448+
RAISE EXCEPTION 'Unexpected geometry type format: %. Expected ST_* prefix.', geom_type;
449+
END;
450+
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;
451+
452+
--MAKE VALID
453+
CREATE OR REPLACE FUNCTION sys.MakeValid(geom sys.GEOMETRY)
454+
RETURNS sys.GEOMETRY
455+
AS $$
456+
BEGIN
457+
IF sys.STIsEmpty(geom) = 1 THEN
458+
RETURN geom;
459+
ELSEIF sys.STIsValid(geom) = 1 THEN
460+
RETURN geom;
461+
ELSE
462+
RETURN sys.STMakeValid_helper(geom);
463+
END IF;
464+
END;
465+
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;
430466
467+
--Parse
468+
CREATE OR REPLACE FUNCTION sys.Geometry__Parse(geometry_tagged_text sys.NVARCHAR)
469+
RETURNS sys.GEOMETRY
470+
AS $$
471+
BEGIN
472+
IF UPPER(geometry_tagged_text COLLATE sys.DATABASE_DEFAULT) = 'NULL' THEN
473+
RETURN NULL;
474+
END IF;
475+
476+
RETURN sys.geomfromtext_helper(geometry_tagged_text, 0);
477+
END;
478+
$$ LANGUAGE plpgsql STRICT IMMUTABLE PARALLEL SAFE;
479+
480+
--STNumPoints
481+
CREATE OR REPLACE FUNCTION sys.STNumPoints(geom sys.GEOMETRY)
482+
RETURNS integer
483+
AS $$
484+
BEGIN
485+
IF STIsValid(geom) = 0 THEN
486+
RAISE EXCEPTION 'The geometry instance is not valid';
487+
ELSE
488+
RETURN sys.STNumPoints_helper(geom);
489+
END IF;
490+
END;
491+
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;
492+
431493
-- STDisjoint
432494
-- Checks if two geometries have no points in common
433495
CREATE OR REPLACE FUNCTION sys.STDisjoint(geom1 sys.GEOMETRY, geom2 sys.GEOMETRY)
@@ -622,7 +684,17 @@ CREATE OR REPLACE FUNCTION sys.STDimension_helper(sys.GEOMETRY)
622684
RETURNS integer
623685
AS '$libdir/postgis-3','LWGEOM_dimension'
624686
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;
687+
688+
CREATE OR REPLACE FUNCTION sys.STNumPoints_helper(sys.GEOMETRY)
689+
RETURNS integer
690+
AS '$libdir/postgis-3','LWGEOM_npoints'
691+
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;
625692
693+
CREATE OR REPLACE FUNCTION sys.STMakeValid_helper(sys.GEOMETRY)
694+
RETURNS sys.GEOMETRY
695+
AS '$libdir/postgis-3','ST_MakeValid'
696+
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;
697+
626698
CREATE OR REPLACE FUNCTION sys.STIntersects_helper(geom1 sys.GEOMETRY, geom2 sys.GEOMETRY)
627699
RETURNS sys.BIT
628700
AS '$libdir/postgis-3','ST_Intersects'
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,151 @@
11
-------------------------------------------------------
22
---- Include changes related to spatial types here ----
33
-------------------------------------------------------
4+
--geometry
5+
CREATE OR REPLACE FUNCTION sys.MakeValid(geom sys.GEOMETRY)
6+
RETURNS sys.GEOMETRY
7+
AS $$
8+
BEGIN
9+
IF sys.STIsEmpty(geom) = 1 THEN
10+
RETURN geom;
11+
ELSEIF sys.STIsValid(geom) = 1 THEN
12+
RETURN geom;
13+
ELSE
14+
RETURN sys.STMakeValid_helper(geom);
15+
END IF;
16+
END;
17+
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;
18+
19+
CREATE OR REPLACE FUNCTION sys.STMakeValid_helper(sys.GEOMETRY)
20+
RETURNS sys.GEOMETRY
21+
AS '$libdir/postgis-3','ST_MakeValid'
22+
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;
23+
24+
--geography
25+
CREATE OR REPLACE FUNCTION sys.MakeValid(geog sys.GEOGRAPHY)
26+
RETURNS sys.GEOGRAPHY
27+
AS $$
28+
BEGIN
29+
IF sys.STIsEmpty(geog) = 1 THEN
30+
RETURN geog;
31+
ELSEIF sys.STIsValid(geog) = 1 THEN
32+
RETURN geog;
33+
ELSE
34+
RETURN sys.makevalid_helper(geog);
35+
END IF;
36+
END;
37+
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;
38+
39+
CREATE OR REPLACE FUNCTION sys.makevalid_helper(geog sys.GEOGRAPHY)
40+
RETURNS sys.GEOGRAPHY
41+
AS '$libdir/postgis-3', 'ST_MakeValid'
42+
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;
43+
44+
--STNumPoints
45+
-- geometry
46+
47+
CREATE OR REPLACE FUNCTION sys.STNumPoints(geom sys.GEOMETRY)
48+
RETURNS integer
49+
AS $$
50+
BEGIN
51+
IF STIsValid(geom) = 0 THEN
52+
RAISE EXCEPTION 'The geometry instance is not valid';
53+
ELSE
54+
RETURN sys.STNumPoints_helper(geom);
55+
END IF;
56+
END;
57+
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;
58+
59+
CREATE OR REPLACE FUNCTION sys.STNumPoints_helper(sys.GEOMETRY)
60+
RETURNS integer
61+
AS '$libdir/postgis-3','LWGEOM_npoints'
62+
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;
63+
64+
-- Geography
65+
66+
CREATE OR REPLACE FUNCTION sys.STNumPoints(geog sys.GEOGRAPHY)
67+
RETURNS integer
68+
AS $$
69+
BEGIN
70+
IF sys.STIsValid(geog) = 0 THEN
71+
RAISE EXCEPTION 'The geography instance is not valid';
72+
ELSE
73+
RETURN sys.STNumPoints_helper(geog);
74+
END IF;
75+
END;
76+
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;
77+
78+
CREATE OR REPLACE FUNCTION sys.STNumPoints_helper(sys.GEOGRAPHY)
79+
RETURNS integer
80+
AS '$libdir/postgis-3', 'LWGEOM_npoints'
81+
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;
82+
83+
--parse
84+
--Geometry
85+
CREATE OR REPLACE FUNCTION sys.Geometry__Parse(geometry_tagged_text sys.NVARCHAR)
86+
RETURNS sys.GEOMETRY
87+
AS $$
88+
BEGIN
89+
IF UPPER(geometry_tagged_text COLLATE sys.DATABASE_DEFAULT) = 'NULL' THEN
90+
RETURN NULL;
91+
END IF;
92+
93+
RETURN sys.geomfromtext_helper(geometry_tagged_text, 0);
94+
END;
95+
$$ LANGUAGE plpgsql STRICT IMMUTABLE PARALLEL SAFE;
96+
97+
--Geography
98+
CREATE OR REPLACE FUNCTION sys.Geography__Parse(geography_tagged_text sys.NVARCHAR)
99+
RETURNS sys.GEOGRAPHY
100+
AS $$
101+
BEGIN
102+
IF UPPER(geography_tagged_text COLLATE sys.DATABASE_DEFAULT) = 'NULL' THEN
103+
RETURN NULL;
104+
END IF;
105+
106+
RETURN sys.geogfromtext_helper(geography_tagged_text, 4326);
107+
END;
108+
$$ LANGUAGE plpgsql STRICT IMMUTABLE PARALLEL SAFE;
109+
110+
--STGeomType
111+
--Geometry
112+
CREATE OR REPLACE FUNCTION sys.STGeometryType(geom sys.GEOMETRY)
113+
RETURNS sys.NVARCHAR(4000)
114+
AS $$
115+
DECLARE
116+
geom_type text;
117+
BEGIN
118+
IF STIsValid(geom) = 0 THEN
119+
RAISE EXCEPTION 'This operation cannot be completed because the instance is not valid';
120+
END IF;
121+
122+
geom_type := sys.ST_GeometryType(geom);
123+
124+
IF geom_type LIKE 'ST\_%' ESCAPE '\' THEN
125+
RETURN substr(geom_type, 4);
126+
END IF;
127+
128+
RAISE EXCEPTION 'Unexpected geometry type format: %. Expected ST_* prefix.', geom_type;
129+
END;
130+
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;
131+
132+
--Geography
133+
134+
CREATE OR REPLACE FUNCTION sys.STGeometryType(geog sys.GEOGRAPHY)
135+
RETURNS sys.NVARCHAR(4000)
136+
AS $$
137+
DECLARE
138+
geom_type text;
139+
BEGIN
140+
IF STIsValid(geog) = 0 THEN
141+
RAISE EXCEPTION 'This operation cannot be completed because the instance is not valid';
142+
END IF;
143+
geom_type := sys.ST_GeometryType(geog);
144+
145+
IF geom_type LIKE 'ST\_%' ESCAPE '\' THEN
146+
RETURN substr(geom_type, 4);
147+
END IF;
148+
149+
RAISE EXCEPTION 'Unexpected geometry type format: %. Expected ST_* prefix.', geom_type;
150+
END;
151+
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;

contrib/babelfishpg_tsql/antlr/TSqlLexer.g4

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,7 @@ M: [Mm];
555555
M_DOUBLE_QUOTE: ["] M ["] {pltsql_quoted_identifier == true}?;
556556
M_SQBRACKET: '[' M ']';
557557
MANUAL: M A N U A L;
558+
MAKEVALID: M A K E V A L I D;
558559
MARK: M A R K;
559560
MASK: M A S K;
560561
MASKED: M A S K E D;
@@ -980,11 +981,13 @@ STDISJOINT: 'STDisjoint';
980981
STDISTANCE: 'STDistance';
981982
STEQUALS: 'STEquals';
982983
STGEOMFROMTEXT: 'STGeomFromText';
984+
STGEOMETRYTYPE: 'STGeometryType';
983985
STINTERSECTS: 'STIntersects';
984986
STISCLOSED: 'STIsClosed';
985987
STISEMPTY: 'STIsEmpty';
986988
STISVALID: 'STIsValid';
987989
STLINEFROMTEXT: 'STLineFromText';
990+
STNUMPOINTS: 'STNumPoints';
988991
STOP: S T O P;
989992
STOPAT: S T O P A T;
990993
STOPATMARK: S T O P A T M A R K;

contrib/babelfishpg_tsql/antlr/TSqlParser.g4

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3941,10 +3941,13 @@ geospatial_func_no_arg
39413941
: STASTEXT
39423942
| STASBINARY
39433943
| STAREA
3944+
| MAKEVALID
39443945
| STDIMENSION
3946+
| STGEOMETRYTYPE
39453947
| STISCLOSED
39463948
| STISEMPTY
39473949
| STISVALID
3950+
| STNUMPOINTS
39483951
;
39493952

39503953
geospatial_func_arg
@@ -3961,6 +3964,7 @@ geospatial_static_method
39613964
| STLINEFROMTEXT
39623965
| STPOLYFROMTEXT
39633966
| POINT
3967+
| PARSE
39643968
;
39653969

39663970
hierarchyid_methods
@@ -3969,7 +3973,6 @@ hierarchyid_methods
39693973

39703974
hierarchyid_static_method
39713975
: GETROOT
3972-
| PARSE
39733976
;
39743977

39753978
datatype_static_method
@@ -4724,6 +4727,7 @@ keyword
47244727
| M
47254728
| M_DOUBLE_QUOTE
47264729
| M_SQBRACKET
4730+
| MAKEVALID
47274731
| MANUAL
47284732
| MARK
47294733
| MASK
@@ -5080,12 +5084,14 @@ keyword
50805084
| STDISJOINT
50815085
| STDISTANCE
50825086
| STEQUALS
5087+
| STGEOMETRYTYPE
50835088
| STGEOMFROMTEXT
50845089
| STINTERSECTS
50855090
| STISCLOSED
50865091
| STISEMPTY
50875092
| STISVALID
50885093
| STLINEFROMTEXT
5094+
| STNUMPOINTS
50895095
| STOP
50905096
| STOPAT
50915097
| STOPATMARK

0 commit comments

Comments
 (0)