HHH-1706 - Named parameters ignored when single apostrophe encountered within an SQL comment
This commit is contained in:
parent
a32372d751
commit
e4d102c5b1
|
@ -84,17 +84,71 @@ public class ParameterParser {
|
||||||
boolean foundMainOutputParam = false;
|
boolean foundMainOutputParam = false;
|
||||||
|
|
||||||
final int stringLength = sqlString.length();
|
final int stringLength = sqlString.length();
|
||||||
boolean inQuote = false;
|
|
||||||
|
boolean inSingleQuotes = false;
|
||||||
|
boolean inDoubleQuotes = false;
|
||||||
|
boolean inLineComment = false;
|
||||||
|
boolean inDelimitedComment = false;
|
||||||
|
|
||||||
for ( int indx = 0; indx < stringLength; indx++ ) {
|
for ( int indx = 0; indx < stringLength; indx++ ) {
|
||||||
final char c = sqlString.charAt( indx );
|
final char c = sqlString.charAt( indx );
|
||||||
if ( inQuote ) {
|
final boolean lastCharacter = indx == stringLength-1;
|
||||||
|
|
||||||
|
if ( inLineComment ) {
|
||||||
|
// see if the character ends the line
|
||||||
|
if ( '\n' == c ) {
|
||||||
|
inLineComment = false;
|
||||||
|
recognizer.other( c );
|
||||||
|
}
|
||||||
|
else if ( '\r' == c ) {
|
||||||
|
inLineComment = false;
|
||||||
|
recognizer.other( c );
|
||||||
|
if ( !lastCharacter && '\n' == sqlString.charAt( indx+1 ) ) {
|
||||||
|
recognizer.other( sqlString.charAt( indx+1 ) );
|
||||||
|
indx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( '-' == c ) {
|
||||||
|
recognizer.other( c );
|
||||||
|
if ( !lastCharacter && '-' == sqlString.charAt( indx+1 ) ) {
|
||||||
|
inLineComment = true;
|
||||||
|
recognizer.other( sqlString.charAt( indx+1 ) );
|
||||||
|
indx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( inDelimitedComment ) {
|
||||||
|
recognizer.other( c );
|
||||||
|
if ( !lastCharacter && '*' == c && '/' == sqlString.charAt( indx+1 ) ) {
|
||||||
|
inDelimitedComment = true;
|
||||||
|
recognizer.other( sqlString.charAt( indx+1 ) );
|
||||||
|
indx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( !lastCharacter && '/' == c && '*' == sqlString.charAt( indx+1 ) ) {
|
||||||
|
inDelimitedComment = true;
|
||||||
|
recognizer.other( c );
|
||||||
|
recognizer.other( sqlString.charAt( indx+1 ) );
|
||||||
|
indx++;
|
||||||
|
}
|
||||||
|
else if ( inDoubleQuotes ) {
|
||||||
|
if ( '\"' == c ) {
|
||||||
|
inDoubleQuotes = false;
|
||||||
|
}
|
||||||
|
recognizer.other( c );
|
||||||
|
}
|
||||||
|
else if ( '\"' == c ) {
|
||||||
|
inDoubleQuotes = true;
|
||||||
|
recognizer.other( c );
|
||||||
|
}
|
||||||
|
else if ( inSingleQuotes ) {
|
||||||
if ( '\'' == c ) {
|
if ( '\'' == c ) {
|
||||||
inQuote = false;
|
inSingleQuotes = false;
|
||||||
}
|
}
|
||||||
recognizer.other( c );
|
recognizer.other( c );
|
||||||
}
|
}
|
||||||
else if ( '\'' == c ) {
|
else if ( '\'' == c ) {
|
||||||
inQuote = true;
|
inSingleQuotes = true;
|
||||||
recognizer.other( c );
|
recognizer.other( c );
|
||||||
}
|
}
|
||||||
else if ( '\\' == c ) {
|
else if ( '\\' == c ) {
|
||||||
|
|
|
@ -8,6 +8,7 @@ package org.hibernate.engine.query;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.hibernate.engine.query.spi.ParamLocationRecognizer;
|
||||||
import org.hibernate.engine.query.spi.ParameterParser;
|
import org.hibernate.engine.query.spi.ParameterParser;
|
||||||
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
||||||
|
|
||||||
|
@ -27,4 +28,32 @@ public class ParameterParserTest extends BaseUnitTestCase {
|
||||||
"from User u where u.userName = ? and u.userType = 'call'"
|
"from User u where u.userName = ? and u.userType = 'call'"
|
||||||
) );
|
) );
|
||||||
}
|
}
|
||||||
|
@Test
|
||||||
|
public void testQuotedTextInComment() {
|
||||||
|
ParamLocationRecognizer recognizer = new ParamLocationRecognizer();
|
||||||
|
|
||||||
|
ParameterParser.parse("-- 'This' should not fail the test.\n"
|
||||||
|
+ "SELECT column FROM Table WHERE column <> :param", recognizer);
|
||||||
|
|
||||||
|
assertTrue(recognizer.getNamedParameterDescriptionMap().containsKey("param"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testContractionInComment() {
|
||||||
|
ParamLocationRecognizer recognizer = new ParamLocationRecognizer();
|
||||||
|
|
||||||
|
ParameterParser.parse("-- This shouldn't fail the test.\n" + "SELECT column FROM Table WHERE column <> :param",
|
||||||
|
recognizer);
|
||||||
|
|
||||||
|
assertTrue(recognizer.getNamedParameterDescriptionMap().containsKey("param"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testApostropheInOracleAlias() {
|
||||||
|
ParamLocationRecognizer recognizer = new ParamLocationRecognizer();
|
||||||
|
|
||||||
|
ParameterParser.parse("SELECT column as \"Table's column\" FROM Table WHERE column <> :param", recognizer);
|
||||||
|
|
||||||
|
assertTrue(recognizer.getNamedParameterDescriptionMap().containsKey("param"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue