Skip to content

Commit 0306080

Browse files
committed
MSQL-74 fix parsing error
patch from rfscholte applied after testing it locally on a fat project git-svn-id: file:///home/tiste/MOJOHAUS-TO-GIT/SVN-MOJO-WIP/trunk/mojo/sql-maven-plugin@14523 52ab4f32-60fc-0310-b215-8acea882cd1b
1 parent 94e3f56 commit 0306080

3 files changed

Lines changed: 26 additions & 7 deletions

File tree

src/main/java/org/codehaus/mojo/sql/SqlExecMojo.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -699,9 +699,8 @@ public void execute()
699699
}
700700
}
701701

702-
getLog().info(
703-
getSuccessfulStatements() + " of " + getTotalStatements()
704-
+ " SQL statements executed successfully" );
702+
getLog().info( getSuccessfulStatements() + " of " + getTotalStatements()
703+
+ " SQL statements executed successfully" );
705704

706705
if ( ON_ERROR_ABORT_AFTER.equalsIgnoreCase( getOnError() )
707706
&& totalStatements != successfulStatements )

src/main/java/org/codehaus/mojo/sql/SqlSplitter.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ else if ( overflowValue == OVERFLOW_DOUBLE_QUOTE )
125125
continue;
126126
}
127127
}
128-
128+
129129
if ( quoteChar != null || c1 == '\'' || c1 == '\"' )
130130
{
131131
if ( quoteChar == null ) // start quoted block
@@ -137,17 +137,24 @@ else if ( quoteChar.equals( String.valueOf( c1 ) ) ) // end quoted block
137137
{
138138
ret = NO_END;
139139
}
140+
else
141+
{
142+
//re-evaluate character at first position, could be an escape character
143+
pos--;
144+
}
140145
// else stay in quoted block
141146

142-
String quoteEscape = "\\" + quoteChar;
143147
String doubleQuote = quoteChar + quoteChar;
144148

149+
// already discovered a quoteChar at 'pos'
145150
while ( !startsWith( line, quoteChar, ++pos ) )
146151
{
147-
if ( startsWith( line, quoteEscape, pos ) || startsWith( line, doubleQuote, pos ) )
152+
if ( startsWith( line, "\\", pos ) || startsWith( line, doubleQuote, pos ) )
148153
{
149-
pos += 2;
154+
//skip next character
155+
pos++;
150156
}
157+
151158
if ( pos > maxpos )
152159
{
153160
return ret;

src/test/java/org/codehaus/mojo/sql/SqlSplitterTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,14 +220,27 @@ public void testOverflows()
220220
assertEquals( SqlSplitter.OVERFLOW_SINGLE_QUOTE, SqlSplitter.containsSqlEnd( "", ";", SqlSplitter.OVERFLOW_SINGLE_QUOTE ) );
221221
assertEquals( SqlSplitter.OVERFLOW_SINGLE_QUOTE, SqlSplitter.containsSqlEnd( "\"", ";", SqlSplitter.OVERFLOW_SINGLE_QUOTE ) );
222222
assertEquals( SqlSplitter.OVERFLOW_SINGLE_QUOTE, SqlSplitter.containsSqlEnd( "/*", ";", SqlSplitter.OVERFLOW_SINGLE_QUOTE ) );
223+
assertEquals( SqlSplitter.OVERFLOW_SINGLE_QUOTE, SqlSplitter.containsSqlEnd( "*/", ";", SqlSplitter.OVERFLOW_SINGLE_QUOTE ) );
224+
assertEquals( SqlSplitter.OVERFLOW_SINGLE_QUOTE, SqlSplitter.containsSqlEnd( "''", ";", SqlSplitter.OVERFLOW_SINGLE_QUOTE ) );
225+
assertEquals( SqlSplitter.OVERFLOW_SINGLE_QUOTE, SqlSplitter.containsSqlEnd( "\"\"", ";", SqlSplitter.OVERFLOW_SINGLE_QUOTE ) );
223226

224227
assertEquals( SqlSplitter.OVERFLOW_DOUBLE_QUOTE, SqlSplitter.containsSqlEnd( "", ";", SqlSplitter.OVERFLOW_DOUBLE_QUOTE ) );
225228
assertEquals( SqlSplitter.OVERFLOW_DOUBLE_QUOTE, SqlSplitter.containsSqlEnd( "'", ";", SqlSplitter.OVERFLOW_DOUBLE_QUOTE ) );
226229
assertEquals( SqlSplitter.OVERFLOW_DOUBLE_QUOTE, SqlSplitter.containsSqlEnd( "/*", ";", SqlSplitter.OVERFLOW_DOUBLE_QUOTE ) );
230+
assertEquals( SqlSplitter.OVERFLOW_DOUBLE_QUOTE, SqlSplitter.containsSqlEnd( "*/", ";", SqlSplitter.OVERFLOW_DOUBLE_QUOTE ) );
231+
assertEquals( SqlSplitter.OVERFLOW_DOUBLE_QUOTE, SqlSplitter.containsSqlEnd( "''", ";", SqlSplitter.OVERFLOW_DOUBLE_QUOTE ) );
232+
assertEquals( SqlSplitter.OVERFLOW_DOUBLE_QUOTE, SqlSplitter.containsSqlEnd( "\"\"", ";", SqlSplitter.OVERFLOW_DOUBLE_QUOTE ) );
227233

228234
assertEquals( SqlSplitter.OVERFLOW_COMMENT, SqlSplitter.containsSqlEnd( "", ";", SqlSplitter.OVERFLOW_COMMENT ) );
229235
assertEquals( SqlSplitter.OVERFLOW_COMMENT, SqlSplitter.containsSqlEnd( "'", ";", SqlSplitter.OVERFLOW_COMMENT ) );
230236
assertEquals( SqlSplitter.OVERFLOW_COMMENT, SqlSplitter.containsSqlEnd( "\"", ";", SqlSplitter.OVERFLOW_COMMENT ) );
237+
assertEquals( SqlSplitter.OVERFLOW_COMMENT, SqlSplitter.containsSqlEnd( "/*", ";", SqlSplitter.OVERFLOW_COMMENT ) );
238+
assertEquals( SqlSplitter.OVERFLOW_COMMENT, SqlSplitter.containsSqlEnd( "''", ";", SqlSplitter.OVERFLOW_COMMENT ) );
239+
assertEquals( SqlSplitter.OVERFLOW_COMMENT, SqlSplitter.containsSqlEnd( "\"\"", ";", SqlSplitter.OVERFLOW_COMMENT ) );
240+
241+
//escaped escape character
242+
assertEquals( SqlSplitter.NO_END, SqlSplitter.containsSqlEnd( "\\\\'", ";", SqlSplitter.OVERFLOW_SINGLE_QUOTE ) );
243+
assertEquals( SqlSplitter.OVERFLOW_SINGLE_QUOTE, SqlSplitter.containsSqlEnd( "\\'", ";", SqlSplitter.OVERFLOW_SINGLE_QUOTE ) );
231244
}
232245

233246
public void testAlphaDelimiter() throws Exception

0 commit comments

Comments
 (0)