From bc8797f642a4b1a62728ff8517f2c98cd1e85ae3 Mon Sep 17 00:00:00 2001 From: Sebastian Beigel Date: Tue, 12 Jan 2016 08:08:41 +0100 Subject: [PATCH] "double semicolon" as escape "double semicolon" used to escape a semicolon and avoid splitting --- framework/src/play/db/SQLSplitter.java | 13 +++++++++---- framework/test-src/play/db/SQLSplitterTest.java | 6 ++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/framework/src/play/db/SQLSplitter.java b/framework/src/play/db/SQLSplitter.java index cb10c7f153..75a721c6cb 100644 --- a/framework/src/play/db/SQLSplitter.java +++ b/framework/src/play/db/SQLSplitter.java @@ -193,14 +193,19 @@ public CharSequence next() { while ( i < sql.length() ) { if ( sql.charAt(i) == ';' ) { ++i; - CharSequence ret = sql.subSequence(prev, i); - prev = i; - return ret; + // check "double semicolon" -> used to escape a semicolon and avoid splitting + if ((i < sql.length() && sql.charAt(i) == ';')) { + ++i; + } else { + CharSequence ret = sql.subSequence(prev, i).toString().replace(";;", ";"); + prev = i; + return ret; + } } i = nextChar(sql, i); } if ( prev != i ) { - CharSequence ret = sql.subSequence(prev, i); + CharSequence ret = sql.subSequence(prev, i).toString().replace(";;", ";"); prev = i; return ret; } diff --git a/framework/test-src/play/db/SQLSplitterTest.java b/framework/test-src/play/db/SQLSplitterTest.java index 35baedf868..fb55e27ddc 100644 --- a/framework/test-src/play/db/SQLSplitterTest.java +++ b/framework/test-src/play/db/SQLSplitterTest.java @@ -88,6 +88,12 @@ public void verifyTrailingParenthesis() { assertEquals(3, SQLSplitter.consumeParentheses("(()", 0)); } + @Test + public void verifyDoubleSemicolonHandling() { + assertEquals(2, SQLSplitter.splitSQL("a;\nb;;\nc;").size()); + assertEquals(3, SQLSplitter.splitSQL("a;\nb;\nc;").size()); + } + String readFile(final String filename) throws Exception { final File src = new File(getClass().getResource(filename).toURI()); final byte [] srcbytes = new byte[(int)src.length()];