From b263a5b8f5a18a71f2a8fbc0ce00f2eddb51e4de Mon Sep 17 00:00:00 2001 From: Luca Santarelli Date: Fri, 29 Aug 2014 14:16:33 +0200 Subject: [PATCH 1/2] Properly split SQL script; fixes #47 This adds support for single quote string delimiters (as is the default with SQLite's own .dump command) and for escaped delimiters inside strings. --- .../com/readystatesoftware/sqliteasset/Utils.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/library/src/main/java/com/readystatesoftware/sqliteasset/Utils.java b/library/src/main/java/com/readystatesoftware/sqliteasset/Utils.java index 67cecaf..1fddc25 100644 --- a/library/src/main/java/com/readystatesoftware/sqliteasset/Utils.java +++ b/library/src/main/java/com/readystatesoftware/sqliteasset/Utils.java @@ -20,9 +20,19 @@ public static List splitSqlScript(String script, char delim) { StringBuilder sb = new StringBuilder(); boolean inLiteral = false; char[] content = script.toCharArray(); + int openDelimiter = -1, lastCharacter = -1; for (int i = 0; i < script.length(); i++) { - if (content[i] == '"') { - inLiteral = !inLiteral; + if (content[i] == '"' || content[i] == '\'') { + if (openDelimiter == -1) { + // We were not inside a literal; store the delimiter's value. + openDelimiter = content[i]; + inLiteral = true; + } else if (openDelimiter == content[i] && lastCharacter != '\\') { + // We exit from the literal only on the same character + // AND unless we're being escaped by a bachslash. + inLiteral = false; + openDelimiter = -1; + } } if (content[i] == delim && !inLiteral) { if (sb.length() > 0) { @@ -32,6 +42,7 @@ public static List splitSqlScript(String script, char delim) { } else { sb.append(content[i]); } + lastCharacter = content[i]; } if (sb.length() > 0) { statements.add(sb.toString().trim()); From 53575a4c47d890c3d5aa51abb2ee1a39a1869fd4 Mon Sep 17 00:00:00 2001 From: Luca Santarelli Date: Fri, 29 Aug 2014 14:26:42 +0200 Subject: [PATCH 2/2] Handle multiple backslashes in splitSqlScript() This adds support for input such as INSERT INTO t1(c1) VALUES("Unlikely, but you never know what you find in the wild\\"); --- .../java/com/readystatesoftware/sqliteasset/Utils.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/library/src/main/java/com/readystatesoftware/sqliteasset/Utils.java b/library/src/main/java/com/readystatesoftware/sqliteasset/Utils.java index 1fddc25..3f114ac 100644 --- a/library/src/main/java/com/readystatesoftware/sqliteasset/Utils.java +++ b/library/src/main/java/com/readystatesoftware/sqliteasset/Utils.java @@ -42,7 +42,12 @@ public static List splitSqlScript(String script, char delim) { } else { sb.append(content[i]); } - lastCharacter = content[i]; + if (lastCharacter == '\\' && content[i] == '\\') { + // It was an escaped backslash, don't accumulate. + lastCharacter = -1; + } else { + lastCharacter = content[i]; + } } if (sb.length() > 0) { statements.add(sb.toString().trim());