Skip to content

TRIM with FROM clause in RETURN statement fails to parse #188

@masmgr

Description

@masmgr

Summary

ScriptDom fails to parse valid T-SQL when TRIM function with FROM clause is used inside a RETURN statement. The same syntax parses correctly in SELECT or SET statements.

Version

Microsoft.SqlServer.TransactSql.ScriptDom: 170.157.0

Steps to Reproduce

Parse the following valid T-SQL:

CREATE FUNCTION dbo.TrimTest(@str NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    RETURN TRIM('x' FROM @str);
END

Expected Result

The SQL should parse successfully, as it is valid T-SQL syntax that executes correctly on SQL Server.

Actual Result

Parse error: Incorrect syntax near 'TRIM'.

Error Messages

Line 5, Column 12: Incorrect syntax near 'TRIM'.

Additional Information

This issue affects all TRIM variations using the FROM clause inside a RETURN statement:

Case RETURN SELECT / SET
TRIM(@str) OK OK
TRIM('x' FROM @str) FAIL OK
TRIM(NCHAR(12288) FROM @str) FAIL OK
TRIM(LEADING ... FROM @str) FAIL OK
TRIM(TRAILING ... FROM @str) FAIL OK
TRIM(BOTH ... FROM @str) FAIL OK

Workaround

Using a variable as an intermediate step parses successfully:

CREATE FUNCTION dbo.TrimTest(@str NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @result NVARCHAR(MAX);
    SET @result = TRIM('x' FROM @str);
    RETURN @result;
END

Minimal Reproduction Code

using Microsoft.SqlServer.TransactSql.ScriptDom;

var sql = """
    CREATE FUNCTION dbo.Test(@str NVARCHAR(MAX))
    RETURNS NVARCHAR(MAX)
    AS
    BEGIN
        RETURN TRIM('x' FROM @str);
    END
    """;

var parser = new TSql170Parser(initialQuotedIdentifiers: false);
using var reader = new StringReader(sql);
parser.Parse(reader, out var errors);

foreach (var e in errors)
    Console.WriteLine($"Line {e.Line}, Col {e.Column}: {e.Message}");

Tested with both TSql160Parser and TSql170Parser - same result.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions