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);

Reply via email to