Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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
6 changes: 6 additions & 0 deletions tsql/TSqlParser.g4
Original file line number Diff line number Diff line change
Expand Up @@ -4201,6 +4201,7 @@ function_call
| freetext_function #FREE_TEXT
| partition_function #PARTITION_FUNC
| hierarchyid_static_method #HIERARCHYID_METHOD
| spatial_static_method #SPATIAL_METHOD
;

partition_function
Expand Down Expand Up @@ -4733,6 +4734,10 @@ hierarchyid_static_method
: HIERARCHYID DOUBLE_COLON (GETROOT '(' ')' | PARSE '(' input=expression ')')
;

spatial_static_method
: (GEOGRAPHY | GEOMETRY) DOUBLE_COLON id_ '(' expression_list_? ')'
;

nodes_method
: (loc_id=LOCAL_ID | value_id=full_column_name | '(' subquery ')') '.' NODES '(' xquery=STRING ')'
;
Expand Down Expand Up @@ -5541,6 +5546,7 @@ keyword
| PAGECOUNT
| PAGLOCK
| PARAMETERIZATION
| PARSE
| PARSENAME
| PARSEONLY
| PARTITION
Expand Down
61 changes: 61 additions & 0 deletions tsql/examples/spatial_static_methods.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
-- Spatial Static Method Test Cases
-- Testing GEOGRAPHY::method() and GEOMETRY::method() static method calls

-- Basic geography static methods
SELECT geography::STGeomFromText('POINT(1 2)', 4326);
SELECT geography::STPointFromText('POINT(-122.34900 47.65100)', 4326);
SELECT geography::STLineFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326);
SELECT geography::STPolyFromText('POLYGON((-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))', 4326);
SELECT geography::Point(47.65100, -122.34900, 4326);
SELECT geography::Parse('POINT(-122.34900 47.65100)');

-- Basic geometry static methods
SELECT geometry::STGeomFromText('POINT(1 2)', 0);
SELECT geometry::STGeomFromText('POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))', 0);
SELECT geometry::STPointFromText('POINT(3 4)', 0);
SELECT geometry::STLineFromText('LINESTRING(0 0, 1 1, 2 1, 2 2)', 0);
SELECT geometry::STPolyFromText('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))', 0);
SELECT geometry::Parse('LINESTRING(0 0, 1 1)');
SELECT geometry::STGeomFromWKB(0x0101000000000000000000F03F0000000000000040, 0);

-- Multi-geometry methods
SELECT geometry::STMPointFromText('MULTIPOINT((1 1), (2 2), (3 3))', 0);
SELECT geometry::STMLineFromText('MULTILINESTRING((0 0, 1 1), (2 2, 3 3))', 0);
SELECT geometry::STMPolyFromText('MULTIPOLYGON(((0 0, 1 0, 1 1, 0 1, 0 0)), ((2 2, 3 2, 3 3, 2 3, 2 2)))', 0);
SELECT geometry::STGeomCollFromText('GEOMETRYCOLLECTION(POINT(1 1), LINESTRING(0 0, 1 1))', 0);

-- Spatial methods in variable assignments
DECLARE @g geography = geography::STGeomFromText('POINT(1 2)', 4326);
DECLARE @point geometry = geometry::Point(3, 4, 0);

-- Spatial methods in INSERT statements
INSERT INTO GeoTable (Location) VALUES (geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326));
INSERT INTO GeoTable (Shape) VALUES (geometry::STGeomFromText('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))', 0));

-- Spatial methods in UPDATE statements
UPDATE GeoTable SET Location = geography::STGeomFromText('POINT(-122.35 47.65)', 4326) WHERE ID = 1;
UPDATE GeoTable SET Shape = geometry::Parse('POINT(5 5)') WHERE ID = 2;

-- Multiple spatial calls in single statement
SELECT
geography::Point(47.65, -122.35, 4326) AS Point1,
geography::Point(47.66, -122.36, 4326) AS Point2,
geometry::STGeomFromText('POINT(0 0)', 0) AS Origin;

-- Spatial methods in expressions
SELECT 1 WHERE geography::STGeomFromText('POINT(1 2)', 4326) IS NOT NULL;

-- Spatial methods in CASE expressions
SELECT CASE WHEN 1=1 THEN geography::Point(1, 2, 4326) ELSE geography::Point(0, 0, 4326) END;

-- Spatial methods with variables
DECLARE @lat float = 47.65;
DECLARE @lon float = -122.35;
DECLARE @srid int = 4326;
SELECT geography::Point(@lat, @lon, @srid);

-- Spatial methods in subqueries
SELECT * FROM (SELECT geography::Point(1, 2, 4326) AS Location) AS sub;

-- Spatial methods with column references in function arguments
SELECT geography::STGeomFromText(WKTColumn, SRIDColumn) FROM GeoTable;
26 changes: 26 additions & 0 deletions tsql/parser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,32 @@ func TestDDLIndexParser(t *testing.T) {
require.Equal(t, 0, parserErrors.errors)
}

func TestSpatialStaticMethodsParser(t *testing.T) {
Comment thread
RainbowDashy marked this conversation as resolved.
Outdated
filePath := "examples/spatial_static_methods.sql"
input, err := antlr.NewFileStream(filePath)
require.NoError(t, err)

lexer := tsql.NewTSqlLexer(input)

stream := antlr.NewCommonTokenStream(lexer, 0)
p := tsql.NewTSqlParser(stream)

lexerErrors := &CustomErrorListener{}
lexer.RemoveErrorListeners()
lexer.AddErrorListener(lexerErrors)

parserErrors := &CustomErrorListener{}
p.RemoveErrorListeners()
p.AddErrorListener(parserErrors)

p.BuildParseTrees = true

_ = p.Tsql_file()

require.Equal(t, 0, lexerErrors.errors)
require.Equal(t, 0, parserErrors.errors)
}

func TestSpatialComprehensiveParser(t *testing.T) {
filePath := "examples/spatial_comprehensive.sql"
input, err := antlr.NewFileStream(filePath)
Expand Down
Loading