From 645631ad2e454074eca1a35c677be7c4e5964dde Mon Sep 17 00:00:00 2001 From: David Syer Date: Thu, 2 Jun 2011 14:28:58 +0000 Subject: [PATCH] SPR-6688: Add tests and explicit detection of \ in sql script extractor --- .../init/ResourceDatabasePopulator.java | 12 +++++++ .../init/DatabasePopulatorTests.java | 35 +++++++++++++++++-- .../jdbc/datasource/init/db-schema.sql | 3 ++ .../init/db-test-data-escaped-literal.sql | 1 + .../db-test-data-mysql-escaped-literal.sql | 1 + 5 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 org.springframework.jdbc/src/test/resources/org/springframework/jdbc/datasource/init/db-schema.sql create mode 100644 org.springframework.jdbc/src/test/resources/org/springframework/jdbc/datasource/init/db-test-data-escaped-literal.sql create mode 100644 org.springframework.jdbc/src/test/resources/org/springframework/jdbc/datasource/init/db-test-data-mysql-escaped-literal.sql diff --git a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/datasource/init/ResourceDatabasePopulator.java b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/datasource/init/ResourceDatabasePopulator.java index 08bc769066f..7bc21ef8f7f 100644 --- a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/datasource/init/ResourceDatabasePopulator.java +++ b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/datasource/init/ResourceDatabasePopulator.java @@ -251,9 +251,21 @@ public class ResourceDatabasePopulator implements DatabasePopulator { private void splitSqlScript(String script, char delim, List statements) { StringBuilder sb = new StringBuilder(); boolean inLiteral = false; + boolean inEscape = false; char[] content = script.toCharArray(); for (int i = 0; i < script.length(); i++) { char c = content[i]; + if (inEscape) { + inEscape = false; + sb.append(c); + continue; + } + // MySQL style escapes + if (c == '\\') { + inEscape = true; + sb.append(c); + continue; + } if (c == '\'') { inLiteral = !inLiteral; } diff --git a/org.springframework.jdbc/src/test/java/org/springframework/jdbc/datasource/init/DatabasePopulatorTests.java b/org.springframework.jdbc/src/test/java/org/springframework/jdbc/datasource/init/DatabasePopulatorTests.java index 90113f952f1..1720abe2281 100644 --- a/org.springframework.jdbc/src/test/java/org/springframework/jdbc/datasource/init/DatabasePopulatorTests.java +++ b/org.springframework.jdbc/src/test/java/org/springframework/jdbc/datasource/init/DatabasePopulatorTests.java @@ -23,7 +23,6 @@ import java.sql.Connection; import javax.sql.DataSource; import org.junit.After; -import org.junit.Ignore; import org.junit.Test; import org.springframework.core.io.ClassRelativeResourceLoader; import org.springframework.jdbc.core.JdbcTemplate; @@ -43,7 +42,11 @@ public class DatabasePopulatorTests { private final JdbcTemplate jdbcTemplate = new JdbcTemplate(db); private void assertTestDatabaseCreated() { - assertEquals("Keith", jdbcTemplate.queryForObject("select NAME from T_TEST", String.class)); + assertTestDatabaseCreated("Keith"); + } + + private void assertTestDatabaseCreated(String name) { + assertEquals(name, jdbcTemplate.queryForObject("select NAME from T_TEST", String.class)); } private void assertUsersDatabaseCreated(DataSource db) { @@ -71,6 +74,34 @@ public class DatabasePopulatorTests { assertTestDatabaseCreated(); } + @Test + public void testBuildWithNormalEscapedLiteral() throws Exception { + databasePopulator.addScript(resourceLoader.getResource("db-schema.sql")); + databasePopulator.addScript(resourceLoader.getResource("db-test-data-escaped-literal.sql")); + Connection connection = db.getConnection(); + try { + databasePopulator.populate(connection); + } finally { + connection.close(); + } + + assertTestDatabaseCreated("'Keith'"); + } + + @Test + public void testBuildWithMySQLEscapedLiteral() throws Exception { + databasePopulator.addScript(resourceLoader.getResource("db-schema.sql")); + databasePopulator.addScript(resourceLoader.getResource("db-test-data-mysql-escaped-literal.sql")); + Connection connection = db.getConnection(); + try { + databasePopulator.populate(connection); + } finally { + connection.close(); + } + + assertTestDatabaseCreated("\\$Keith\\$"); + } + @Test public void scriptWithEolBetweenTokens() throws Exception { databasePopulator.addScript(resourceLoader.getResource("users-schema.sql")); diff --git a/org.springframework.jdbc/src/test/resources/org/springframework/jdbc/datasource/init/db-schema.sql b/org.springframework.jdbc/src/test/resources/org/springframework/jdbc/datasource/init/db-schema.sql new file mode 100644 index 00000000000..73d0feb406e --- /dev/null +++ b/org.springframework.jdbc/src/test/resources/org/springframework/jdbc/datasource/init/db-schema.sql @@ -0,0 +1,3 @@ +drop table T_TEST if exists; + +create table T_TEST (NAME varchar(50) not null); \ No newline at end of file diff --git a/org.springframework.jdbc/src/test/resources/org/springframework/jdbc/datasource/init/db-test-data-escaped-literal.sql b/org.springframework.jdbc/src/test/resources/org/springframework/jdbc/datasource/init/db-test-data-escaped-literal.sql new file mode 100644 index 00000000000..c7b5bde4ff1 --- /dev/null +++ b/org.springframework.jdbc/src/test/resources/org/springframework/jdbc/datasource/init/db-test-data-escaped-literal.sql @@ -0,0 +1 @@ +insert into T_TEST (NAME) values ('''Keith'''); \ No newline at end of file diff --git a/org.springframework.jdbc/src/test/resources/org/springframework/jdbc/datasource/init/db-test-data-mysql-escaped-literal.sql b/org.springframework.jdbc/src/test/resources/org/springframework/jdbc/datasource/init/db-test-data-mysql-escaped-literal.sql new file mode 100644 index 00000000000..c1ee14e614d --- /dev/null +++ b/org.springframework.jdbc/src/test/resources/org/springframework/jdbc/datasource/init/db-test-data-mysql-escaped-literal.sql @@ -0,0 +1 @@ +insert into T_TEST (NAME) values ('\$Keith\$'); \ No newline at end of file