diff --git a/WHATSNEW b/WHATSNEW index 75b440491..9f8962d10 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -137,6 +137,12 @@ Other changes: database. Bugzilla Report 36712. + * A new attribute strictDelimiterMatching can be used to ignore case + or whitespace differences when searches for delimiters. + This is useful if you execute a SQL script that has contains "GO" + and "go" as delimiters. + Bugzilla Report 26459. + Changes from Ant 1.7.0 TO Ant 1.7.1 ============================================= diff --git a/src/main/org/apache/tools/ant/taskdefs/SQLExec.java b/src/main/org/apache/tools/ant/taskdefs/SQLExec.java index 73b09ad68..2b71e116e 100644 --- a/src/main/org/apache/tools/ant/taskdefs/SQLExec.java +++ b/src/main/org/apache/tools/ant/taskdefs/SQLExec.java @@ -853,12 +853,11 @@ public class SQLExec extends JDBCTask { public int lastDelimiterPosition(StringBuffer buf, String currentLine) { if (strictDelimiterMatching) { - if (delimiterType.equals(DelimiterType.NORMAL) - && StringUtils.endsWith(buf, delimiter)) { + if ((delimiterType.equals(DelimiterType.NORMAL) + && StringUtils.endsWith(buf, delimiter)) || + (delimiterType.equals(DelimiterType.ROW) + && currentLine.equals(delimiter))) { return buf.length() - delimiter.length(); - } else if (delimiterType.equals(DelimiterType.ROW) - && currentLine.equals(delimiter)) { - return 0; } // no match return -1; @@ -877,17 +876,18 @@ public class SQLExec extends JDBCTask { return -1; } while (endIndex >= 0) { - if (buf.substring(bufferIndex, 1).toLowerCase(Locale.US) - .charAt(0) != d.charAt(endIndex)) { + if (buf.substring(bufferIndex, bufferIndex + 1) + .toLowerCase(Locale.US).charAt(0) + != d.charAt(endIndex)) { return -1; } bufferIndex--; endIndex--; } - return bufferIndex; + return bufferIndex + 1; } else { return currentLine.trim().toLowerCase(Locale.US).equals(d) - ? 0 : -1; + ? buf.length() - currentLine.length() : -1; } } } diff --git a/src/tests/junit/org/apache/tools/ant/taskdefs/SQLExecTest.java b/src/tests/junit/org/apache/tools/ant/taskdefs/SQLExecTest.java index 91c440e51..96f18e4dc 100644 --- a/src/tests/junit/org/apache/tools/ant/taskdefs/SQLExecTest.java +++ b/src/tests/junit/org/apache/tools/ant/taskdefs/SQLExecTest.java @@ -252,4 +252,57 @@ public class SQLExecTest extends TestCase { assertEquals(0, s.lastDelimiterPosition(new StringBuffer("GO"), null)); } + + public void testLastDelimiterPositionNormalModeNonStrict() { + SQLExec s = new SQLExec(); + s.setStrictDelimiterMatching(false); + assertEquals(-1, + s.lastDelimiterPosition(new StringBuffer(), null)); + assertEquals(-1, + s.lastDelimiterPosition(new StringBuffer("GO"), null)); + assertEquals(0, + s.lastDelimiterPosition(new StringBuffer("; "), null)); + assertEquals(2, + s.lastDelimiterPosition(new StringBuffer("ab;"), null)); + s.setDelimiter("GO"); + assertEquals(0, + s.lastDelimiterPosition(new StringBuffer("GO "), null)); + assertEquals(0, + s.lastDelimiterPosition(new StringBuffer("go"), null)); + assertEquals(0, + s.lastDelimiterPosition(new StringBuffer("GO"), null)); + } + + public void testLastDelimiterPositionRowModeStrict() { + SQLExec s = new SQLExec(); + SQLExec.DelimiterType t = new SQLExec.DelimiterType(); + t.setValue("row"); + s.setDelimiterType(t); + assertEquals(-1, s.lastDelimiterPosition(null, "")); + assertEquals(-1, s.lastDelimiterPosition(null, "GO")); + assertEquals(-1, s.lastDelimiterPosition(null, "; ")); + assertEquals(1, s.lastDelimiterPosition(new StringBuffer("ab"), ";")); + s.setDelimiter("GO"); + assertEquals(-1, s.lastDelimiterPosition(null, "GO ")); + assertEquals(-1, s.lastDelimiterPosition(null, "go")); + assertEquals(0, s.lastDelimiterPosition(new StringBuffer("ab"), "GO")); + } + + public void testLastDelimiterPositionRowModeNonStrict() { + SQLExec s = new SQLExec(); + SQLExec.DelimiterType t = new SQLExec.DelimiterType(); + t.setValue("row"); + s.setDelimiterType(t); + s.setStrictDelimiterMatching(false); + assertEquals(-1, s.lastDelimiterPosition(null, "")); + assertEquals(-1, s.lastDelimiterPosition(null, "GO")); + assertEquals(0, s.lastDelimiterPosition(new StringBuffer("; "), "; ")); + assertEquals(1, s.lastDelimiterPosition(new StringBuffer("ab"), ";")); + s.setDelimiter("GO"); + assertEquals(1, + s.lastDelimiterPosition(new StringBuffer("abcd"), "GO ")); + assertEquals(0, s.lastDelimiterPosition(new StringBuffer("go"), "go")); + assertEquals(0, s.lastDelimiterPosition(new StringBuffer("ab"), "GO")); + } + }