Repository: olingo-odata2 Updated Branches: refs/heads/master 18d677b5c -> 1577e4ea1
[OLINGO-1098]Incorrect handling of SQL wildcards '_' and '%' Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/1577e4ea Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/1577e4ea Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/1577e4ea Branch: refs/heads/master Commit: 1577e4ea169f1a859a2c1d5b6b61f393e9576ad9 Parents: 18d677b Author: Archana Rai <[email protected]> Authored: Tue Jan 2 13:11:44 2018 +0530 Committer: Archana Rai <[email protected]> Committed: Tue Jan 2 13:11:44 2018 +0530 ---------------------------------------------------------------------- .../jpa/processor/core/ODataExpressionParser.java | 6 ++++++ .../core/ODataFilterExpressionParserTest.java | 17 +++++++++-------- .../core/access/data/JPAQueryBuilderTest.java | 3 +++ 3 files changed, 18 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/1577e4ea/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java index 4673675..ca4f55d 100644 --- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java +++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java @@ -152,6 +152,12 @@ public class ODataExpressionParser { + JPQLStatement.Operator.OR + JPQLStatement.DELIMITER.SPACE + right + JPQLStatement.DELIMITER.PARENTHESIS_RIGHT; case EQ: + EdmSimpleType type = (EdmSimpleType)((BinaryExpression)whereExpression).getLeftOperand().getEdmType(); + if(EdmSimpleTypeKind.String.getEdmSimpleTypeInstance().isCompatible(type)){ + return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left + JPQLStatement.DELIMITER.SPACE + + (!"null".equals(right) ? JPQLStatement.Operator.LIKE : "IS") + JPQLStatement.DELIMITER.SPACE + right + + " ESCAPE '\\'" + JPQLStatement.DELIMITER.PARENTHESIS_RIGHT; + } return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left + JPQLStatement.DELIMITER.SPACE + (!"null".equals(right) ? JPQLStatement.Operator.EQ : "IS") + JPQLStatement.DELIMITER.SPACE + right + JPQLStatement.DELIMITER.PARENTHESIS_RIGHT; http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/1577e4ea/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataFilterExpressionParserTest.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataFilterExpressionParserTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataFilterExpressionParserTest.java index 02baae6..bd15849 100644 --- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataFilterExpressionParserTest.java +++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataFilterExpressionParserTest.java @@ -48,7 +48,7 @@ public class ODataFilterExpressionParserTest { private static final String NAMESPACE = "SalesOrderProcessing"; private static final String ENTITY_NOTE = "Note"; // Index 0 - Is test input and Index 1 - Is expected output - private static final String[] EXPRESSION_EQ = { "id eq '123'", "(E1.id = '123')" }; + private static final String[] EXPRESSION_EQ = { "id eq '123'", "(E1.id LIKE '123' ESCAPE '\\')" }; private static final String[] EXPRESSION_NE = { "id ne '123'", "(E1.id <> '123')" }; private static final String[] EXPRESSION_ESCAPE = { "id ne '123''22'", "(E1.id <> '123''22')" }; private static final String[] EXPRESSION_BINARY_AND = @@ -60,7 +60,7 @@ public class ODataFilterExpressionParserTest { private static final String[] EXPRESSION_BINARY_OR = { "id ge '123' or soId gt 123L", "((E1.id >= '123') OR (E1.soId > 123))" }; private static final String[] EXPRESSION_MEMBER_OR = { "id lt '123' or oValue/Currency eq 'INR'", - "((E1.id < '123') OR (E1.oValue.Currency = 'INR'))" }; + "((E1.id < '123') OR (E1.oValue.Currency LIKE 'INR' ESCAPE '\\'))" }; private static final String[] EXPRESSION_STARTS_WITH = { "startswith(oValue/Currency,'INR')", "E1.oValue.Currency LIKE CONCAT('INR','%') ESCAPE '\\'" }; private static final String[] EXPRESSION_STARTS_WITH_EQUAL = { "startswith(oValue/Currency,'INR') eq true", @@ -77,7 +77,7 @@ public class ODataFilterExpressionParserTest { "((CASE WHEN ('123' LIKE CONCAT('%',CONCAT(E1.id,'%')) ESCAPE '\\') THEN TRUE ELSE FALSE END) <> true)" }; private static final String[] EXPRESSION_STARTS_WITH_WRONG_OP = { "startswith(oValue/Currency,'INR') lt true", "" }; private static final String[] EXPRESSION_SUBSTRING_ALL_OP = { "substring(oValue/Currency,1,3) eq 'INR'", - "(SUBSTRING(E1.oValue.Currency, 1 + 1 , 3) = 'INR')" }; + "(SUBSTRING(E1.oValue.Currency, 1 + 1 , 3) LIKE 'INR' ESCAPE '\\')" }; private static final String[] EXPRESSION_SUBSTRINGOF_INJECTION1 = { "substringof('a'' OR 1=1 OR E1.id LIKE ''b',id) eq true", "((CASE WHEN (E1.id LIKE CONCAT('%',CONCAT('a'' OR 1=1 OR E1.id LIKE ''b','%')) ESCAPE '\\') " @@ -97,7 +97,8 @@ public class ODataFilterExpressionParserTest { "(E1.id LIKE CONCAT('%','Str''eet') ESCAPE '\\' )" }; private static final String[] EXPRESSION_PRECEDENCE = { "id eq '123' and id ne '123' or (id eq '123' and id ne '123')", - "(((E1.id = '123') AND (E1.id <> '123')) OR ((E1.id = '123') AND (E1.id <> '123')))" }; + "(((E1.id LIKE '123' ESCAPE '\\') AND (E1.id <> '123')) OR ((E1.id LIKE '123' ESCAPE '\\') " + + "AND (E1.id <> '123')))" }; private static final String[] EXPRESSION_DATETIME = { "date eq datetime'2000-01-01T00:00:00'", "(E1.date = 2000-01-01 00:00:00.000)" }; @@ -106,16 +107,16 @@ public class ODataFilterExpressionParserTest { private static final String[] EXPRESSION_NOT_NULL = { "date ne null", "(E1.date IS NOT null)" }; private static final String[] EXPRESSION_STARTSWITH_EQBINARY = { "startswith(id,'123') and text eq 'abc'", - "(E1.id LIKE CONCAT('123','%') ESCAPE '\\' AND (E1.text = 'abc'))" }; + "(E1.id LIKE CONCAT('123','%') ESCAPE '\\' AND (E1.text LIKE 'abc' ESCAPE '\\'))" }; private static final String[] EXPRESSION_STARTSWITHEQ_EQBINARY = { "startswith(id,'123') eq true and text eq 'abc'", - "((E1.id LIKE CONCAT('123','%') ESCAPE '\\' ) AND (E1.text = 'abc'))" }; + "((E1.id LIKE CONCAT('123','%') ESCAPE '\\' ) AND (E1.text LIKE 'abc' ESCAPE '\\'))" }; private static final String[] EXPRESSION_EQBINARY_STARTSWITH = { "text eq 'abc' and startswith(id,'123')", - "((E1.text = 'abc') AND E1.id LIKE CONCAT('123','%') ESCAPE '\\')" }; + "((E1.text LIKE 'abc' ESCAPE '\\') AND E1.id LIKE CONCAT('123','%') ESCAPE '\\')" }; private static final String[] EXPRESSION_EQBINARY_STARTSWITHEQ = { "text eq 'abc' and startswith(id,'123') eq true", - "((E1.text = 'abc') AND (E1.id LIKE CONCAT('123','%') ESCAPE '\\' ))" }; + "((E1.text LIKE 'abc' ESCAPE '\\') AND (E1.id LIKE CONCAT('123','%') ESCAPE '\\' ))" }; private static final String[] EXPRESSION_STARTSWITH_STARTSWITH = { "startswith(text,'abc') and startswith(id,'123')", "(E1.text LIKE CONCAT('abc','%') ESCAPE '\\' AND E1.id LIKE CONCAT('123','%') ESCAPE '\\')" }; http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/1577e4ea/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAQueryBuilderTest.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAQueryBuilderTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAQueryBuilderTest.java index a3b9ec5..6d19148 100644 --- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAQueryBuilderTest.java +++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAQueryBuilderTest.java @@ -35,6 +35,7 @@ import org.apache.olingo.odata2.api.edm.EdmException; import org.apache.olingo.odata2.api.edm.EdmMapping; import org.apache.olingo.odata2.api.edm.EdmNavigationProperty; import org.apache.olingo.odata2.api.edm.EdmProperty; +import org.apache.olingo.odata2.api.edm.EdmSimpleType; import org.apache.olingo.odata2.api.edm.EdmSimpleTypeKind; import org.apache.olingo.odata2.api.exception.ODataException; import org.apache.olingo.odata2.api.processor.ODataContext; @@ -506,6 +507,8 @@ public class JPAQueryBuilderTest { EasyMock.expect(commonExpression.getKind()).andStubReturn(ExpressionKind.BINARY); MethodExpression methodExp = EasyMock.createMock(MethodExpression.class); EasyMock.expect(commonExpression.getLeftOperand()).andStubReturn(methodExp); + EdmSimpleType type = EasyMock.createMock(EdmSimpleType.class);; + EasyMock.expect(methodExp.getEdmType()).andStubReturn(type ); LiteralExpression literalValueExp = EasyMock.createMock(LiteralExpression.class); EasyMock.expect(commonExpression.getRightOperand()).andStubReturn(literalValueExp);
