Spring-framework: ScriptUtils#splitSqlScript cannot deal with semicolons in stored procedures [SPR-15438]

Created on 11 Apr 2017  路  6Comments  路  Source: spring-projects/spring-framework

Phil Webb opened SPR-15438 and commented

Originally raised with Spring Boot the org.springframework.jdbc.datasource.init.ScriptUtils#splitSqlScript method cannot deal with semicolons that are part of a stored procedure.

For example:

CREATE FUNCTION count_clients() RETURNS integer
    LANGUAGE plpgsql
    AS $$begin
  select count(*) from clients;
end;$$;

Affects: 4.3.7

Issue Links:

  • #19952 Oracle SQL hints are ignored as comments in ScriptUtils

2 votes, 5 watchers

data enhancement

Most helpful comment

vrnsky commented

jhvhs hm...looks like acceptable for me. But I think that spring community will be glad if we fix this ticket

All 6 comments

Juergen Hoeller commented

Like #19952, this is hard to address by default. Using a different quoting syntax or a different separator configuration is the easiest way out here for the time being.

vrnsky commented

Juergen Hoeller聽 fake separator is not cool. For example in my case app get schema sql file outside from app. And schema valid, but have sql triggers which does not correct compile by聽

ResourceDatabasePopulator

jhvhs commented

I wonder whether the聽org.flywaydb.core.internal.database package can be leveraged. I believe there's about 6K+ lines of code the sole purpose of which is just to deal with this issue for about a dozen database engines.

See https://github.com/flyway/flyway/tree/e3c9adaac18f46017ad524cbe0df26d13ab33c00/flyway-core/src/main/java/org/flywaydb/core/internal/database聽for more details.

vrnsky commented

jhvhs hm...looks like acceptable for me. But I think that spring community will be glad if we fix this ticket

My solution: set spring.datasource.separator=^^^ END OF SCRIPT ^^^ .

By this setting, ScriptUtils does not separate the content of the SQL file into multiple statements.

ScriptUtils (spring version 5.2.5.RELEASE) failed parsing the following:

CREATE FUNCTION public.add_user(user_name character varying, user_id integer) RETURNS void
    LANGUAGE plpgsql SECURITY DEFINER
    AS $$DECLARE
BEGIN
    INSERT INTO tbl_users (username, id) VALUES(user_name, user_id);
END$$;

with error:

org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement....nested exception is org.postgresql.util.PSQLException: Unterminated dollar quote started at position....Expected terminating $$

Is there a solution for this, yet?

Was this page helpful?
0 / 5 - 0 ratings

Related issues

davidjgoss picture davidjgoss  路  4Comments

gurudatta11 picture gurudatta11  路  4Comments

sbrannen picture sbrannen  路  4Comments

anborg picture anborg  路  4Comments

alvaro-nogueira picture alvaro-nogueira  路  3Comments