Skip to content

Commit

Permalink
0002231: ; in sql scripts in sql content aren't properly parsed
Browse files Browse the repository at this point in the history
  • Loading branch information
chenson42 committed Mar 10, 2015
1 parent d8c6531 commit 7cf7f23
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 22 deletions.
37 changes: 19 additions & 18 deletions symmetric-db/src/main/java/org/jumpmind/db/sql/SqlScriptReader.java
Expand Up @@ -79,29 +79,25 @@ public String readSqlStatement() {
if (line != null) {
do {
line = trimComments(line);
if (StringUtils.isNotBlank(line)) {
if (sql == null) {
sql = new StringBuilder();
}
if (checkStatementEnds(line)) {
if (sql.length() > 0) {
sql.append("\n");
}
sql.append(line.substring(0, line.lastIndexOf(delimiter)).trim());
String toExecute = prepareForExecute(sql);
sql.append("\n");
sql.append(line);

if (checkStatementEnds(sql.toString())) {
String toExecute = sql.substring(0, sql.lastIndexOf(delimiter));
toExecute = prepareForExecute(toExecute);
if (StringUtils.isNotBlank(toExecute)) {
return toExecute;
}
} else {
sql.append("\n");
sql.append(line);
}
}
}
line = readLine();
} while (line != null);

if (sql != null) {
return prepareForExecute(sql);
String toExecute = sql.toString();
if (StringUtils.isNotBlank(toExecute)) {
return prepareForExecute(toExecute);
} else {
return null;
}
Expand All @@ -115,8 +111,7 @@ public String readSqlStatement() {

}

protected String prepareForExecute(StringBuilder sql) {
String toExecute = sql.toString();
protected String prepareForExecute(String toExecute) {
toExecute = FormatUtils.replaceTokens(toExecute, replacementTokens,
usePrefixSuffixForReplacementTokens);
if (StringUtils.isNotBlank(toExecute)) {
Expand Down Expand Up @@ -160,9 +155,15 @@ protected boolean betweenOccurences(char q, int i, char[] content) {
}
return false;
}


protected boolean inQuotedArea(String s) {
return StringUtils.countMatches(s, "'") % 2 != 0
|| StringUtils.countMatches(s, "\"") % 2 != 0
|| StringUtils.countMatches(s, "`") % 2 != 0;
}

protected boolean checkStatementEnds(String s) {
return s.trim().endsWith("" + delimiter);
return s.trim().endsWith("" + delimiter) && !inQuotedArea(s);
}

}
Expand Up @@ -30,8 +30,9 @@ public class SqlScriptReaderTest {

@Test
public void testReadScript() throws Exception {
SqlScriptReader reader = new SqlScriptReader(new InputStreamReader(getClass().getResourceAsStream("/test-script-1.sql")));
assertEquals("select * from \n TEST where\nid = 'someid'", reader.readSqlStatement());
SqlScriptReader reader = new SqlScriptReader(new InputStreamReader(getClass().getResourceAsStream("/test-script-1.sql")));
String sql = reader.readSqlStatement();
assertEquals("select * from \n TEST where\n \n id = 'someid'", sql);
assertEquals("select * from test", reader.readSqlStatement());
assertEquals("insert into test (one, two, three) values('1','1','2')", reader.readSqlStatement());
for (int i = 0; i < 4; i++) {
Expand All @@ -40,8 +41,16 @@ public void testReadScript() throws Exception {
assertEquals("update sym_node set sync_url='http://localhost:8080/test' where node_id='test'", reader.readSqlStatement());
assertEquals("update something set oops=';' where whoops='test'", reader.readSqlStatement());
assertEquals("update test set one = '''', two='\\\\##--''' where one is null", reader.readSqlStatement());
assertEquals("update test\n set one = '1', two = '2'\nwhere one = 'one'", reader.readSqlStatement());
assertEquals("update test\n set one = '1', two = '2'\n where one = 'one'", reader.readSqlStatement());
assertEquals("create table \"TE--ST\" (\"ID##2\" VARCHAR(100))", reader.readSqlStatement());
sql = reader.readSqlStatement();
assertEquals("insert into test (col) values('import org.x.Test;\n" +
"import com.y.Testy;\n" +
"\n" +
"class A {\n" +
" int x, y = 0;\n" +
"}\n" +
"')",sql);
assertNull(reader.readSqlStatement());
reader.close();
}
Expand Down
9 changes: 8 additions & 1 deletion symmetric-db/src/test/resources/test-script-1.sql
Expand Up @@ -38,4 +38,11 @@ update test
set one = '1', two = '2'
where one = 'one';
## last comment
create table "TE--ST" ("ID##2" VARCHAR(100));
create table "TE--ST" ("ID##2" VARCHAR(100));
insert into test (col) values('import org.x.Test;
import com.y.Testy;
class A {
int x, y = 0;
}
');

0 comments on commit 7cf7f23

Please sign in to comment.