MSSQL Backslash Handled Incorrectly?

Still working on upgrading from 1.9.5 to 4.7.1 and the latest hurdle has to do with how Liquibase interprets the backslash in MSSQL.

Here is a simple example of how we create multiple functions in one SQL File change set. Since each one ends with a semicolon, they should be sent to the DB as 2 statements. However, as you can see from the logs they are sent as one and causes the error Incorrect syntax near the keyword ‘create’. If I change the backslash to another character, then everything works fine.

--- Sample parsing error
create function backToForward(@str varchar(100))
returns varchar(100)
as begin
	return REPLACE(@str, '\', '/')
end;

create function secondFunction(@s varchar(100))
returns varchar(100)
as begin
	return 'does nothing'
end;

This is the output when the error happens:

16:14:34,690 ERROR org.jdbcdslog.StatementLogger (ServerService Thread Pool -- 93) java.sql.Statement.execute --- Sample parsing error
create function backToForward(@str varchar(100))
returns varchar(100)
as begin
	return REPLACE(@str, '\', '/')
end;

create function secondFunction(@s varchar(100))
returns varchar(100)
as begin
	return 'does nothing'
end throws exception: com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near the keyword 'create'.
com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near the keyword 'create'.
	at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:262) ~[mssql-jdbc-9.2.1.jre8.jar:?]
	at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1632) ~[mssql-jdbc-9.2.1.jre8.jar:?]
	at com.microsoft.sqlserver.jdbc.SQLServerStatement.doExecuteStatement(SQLServerStatement.java:872) ~[mssql-jdbc-9.2.1.jre8.jar:?]
	at com.microsoft.sqlserver.jdbc.SQLServerStatement$StmtExecCmd.doExecute(SQLServerStatement.java:767) ~[mssql-jdbc-9.2.1.jre8.jar:?]
	at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7418) ~[mssql-jdbc-9.2.1.jre8.jar:?]
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:3272) ~[mssql-jdbc-9.2.1.jre8.jar:?]
	at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:247) ~[mssql-jdbc-9.2.1.jre8.jar:?]
	at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:222) ~[mssql-jdbc-9.2.1.jre8.jar:?]
	at com.microsoft.sqlserver.jdbc.SQLServerStatement.execute(SQLServerStatement.java:743) ~[mssql-jdbc-9.2.1.jre8.jar:?]
	at org.jboss.jca.adapters.jdbc.WrappedStatement.execute(WrappedStatement.java:198) ~[?:?]
	at sun.reflect.GeneratedMethodAccessor38.invoke(Unknown Source) ~[?:?]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_242]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_242]
	at org.jdbcdslog.StatementLoggingProxy.invoke(StatementLoggingProxy.java:38) ~[jdbcdslog-1.0.5.jar:?]
	at com.sun.proxy.$Proxy51.execute(Unknown Source) ~[?:?]
	at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:393) ~[liquibase-4.7.1.jar:?]
	at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:83) ~[liquibase-4.7.1.jar:?]
	at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:151) ~[liquibase-4.7.1.jar:?]
	at liquibase.database.AbstractJdbcDatabase.execute(AbstractJdbcDatabase.java:1279) ~[liquibase-4.7.1.jar:?]
	at liquibase.database.AbstractJdbcDatabase.executeStatements(AbstractJdbcDatabase.java:1261) ~[liquibase-4.7.1.jar:?]
	at liquibase.changelog.ChangeSet.execute(ChangeSet.java:660) ~[liquibase-4.7.1.jar:?]
	at liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.java:56) ~[liquibase-4.7.1.jar:?]
	at liquibase.changelog.ChangeLogIterator$2.lambda$null$0(ChangeLogIterator.java:111) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.lambda$child$0(Scope.java:180) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.child(Scope.java:189) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.child(Scope.java:179) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.child(Scope.java:158) ~[liquibase-4.7.1.jar:?]
	at liquibase.changelog.ChangeLogIterator$2.lambda$run$1(ChangeLogIterator.java:110) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.lambda$child$0(Scope.java:180) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.child(Scope.java:189) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.child(Scope.java:179) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.child(Scope.java:158) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.child(Scope.java:243) ~[liquibase-4.7.1.jar:?]
	at liquibase.changelog.ChangeLogIterator$2.run(ChangeLogIterator.java:94) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.lambda$child$0(Scope.java:180) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.child(Scope.java:189) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.child(Scope.java:179) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.child(Scope.java:158) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.child(Scope.java:243) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.child(Scope.java:247) ~[liquibase-4.7.1.jar:?]
	at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:66) ~[liquibase-4.7.1.jar:?]
	at liquibase.Liquibase.lambda$null$0(Liquibase.java:265) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.lambda$child$0(Scope.java:180) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.child(Scope.java:189) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.child(Scope.java:179) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.child(Scope.java:158) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.child(Scope.java:243) ~[liquibase-4.7.1.jar:?]
	at liquibase.Liquibase.lambda$update$1(Liquibase.java:264) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.lambda$child$0(Scope.java:180) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.child(Scope.java:189) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.child(Scope.java:179) ~[liquibase-4.7.1.jar:?]
	at liquibase.Scope.child(Scope.java:158) ~[liquibase-4.7.1.jar:?]
	at liquibase.Liquibase.runInScope(Liquibase.java:2405) ~[liquibase-4.7.1.jar:?]
	at liquibase.Liquibase.update(Liquibase.java:211) ~[liquibase-4.7.1.jar:?]
	at liquibase.Liquibase.update(Liquibase.java:197) ~[liquibase-4.7.1.jar:?]
	at liquibase.Liquibase.update(Liquibase.java:193) ~[liquibase-4.7.1.jar:?]
	at liquibase.Liquibase.update(Liquibase.java:185) ~[liquibase-4.7.1.jar:?]

What is likely happening here is the backslash character is being interpreted as an escape character.

A good workaround would be to specifically reference the character by its ASCII code - 92 in the case of the backslash. So, the function would become:

create function backToForward(@str varchar(100))
    returns varchar(100)
as begin
    return REPLACE(@str, char(92), '/')
end;

@dzentgraf thanks for the idea, it worked well and got me past this issue. It still feels like Liquibase is parsing things wrong, but I am able to move forward.