This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git


The following commit(s) were added to refs/heads/master by this push:
     new 0e79a606d CAY-2809 Cayenne Expression grammar doesn't allow custom 
function as an argument for string functions
0e79a606d is described below

commit 0e79a606d20ecd1d31dd9be4fad28da37c14f3a2
Author: Nikita Timofeev <stari...@gmail.com>
AuthorDate: Wed Jul 5 18:37:12 2023 +0300

    CAY-2809 Cayenne Expression grammar doesn't allow custom function as an 
argument for string functions
---
 RELEASE-NOTES.txt                                              |  3 ++-
 .../java/org/apache/cayenne/exp/parser/ExpressionParser.java   | 10 +++++++++-
 .../jjtree/org/apache/cayenne/exp/parser/ExpressionParser.jjt  |  4 ++++
 .../org/apache/cayenne/exp/parser/ASTCustomFunctionTest.java   |  8 ++++++++
 4 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 9f6fe7c5e..32d2feed8 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -57,4 +57,5 @@ CAY-2783 DbEntity to ObjEntity synchronization should check 
mandatory flag for p
 CAY-2792 Fix Insertion Order For Reflexive DataObjects
 CAY-2800 Modeler saves map.xml files with schema ordering error
 CAY-2801 Incorrect equals() implementation in IdGenerationMarker could cause 
data missing in the commit
-CAY-2806 Incorrect processing of unicode escape syntax in JSON
\ No newline at end of file
+CAY-2806 Incorrect processing of unicode escape syntax in JSON
+CAY-2809 Cayenne Expression grammar doesn't allow custom function as an 
argument for string functions
\ No newline at end of file
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ExpressionParser.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ExpressionParser.java
index 4c710a485..5470adc87 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ExpressionParser.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ExpressionParser.java
@@ -955,6 +955,14 @@ if (jjtc001) {
       stringExpression();
       break;
       }
+    case FUNCTION:{
+      customFunction();
+      break;
+      }
+    case OPERATOR:{
+      customOperator();
+      break;
+      }
     default:
       jj_la1[15] = jj_gen;
       jj_consume_token(-1);
@@ -3058,7 +3066,7 @@ if (jjtc005) {
           jj_la1_1 = new int[] 
{0x0,0x0,0x0,0xfffffdfe,0x0,0x0,0x0,0x0,0x0,0xfffffdfe,0x0,0x0,0x0,0x0,0xfffffdf2,0x7c00,0x0,0x7c00,0xfffffdfe,0xc,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xff8f8000,0x0,0xff8f8000,0xff8f8000,0x7c00,0x0,0xff8ffc00,0x0,0xff8ffc00,0x0,0x0,0xff8f8000,0x0,0x1f0,0x200,0x700000,0xff800000,0x0,0xfdfffff0,};
        }
        private static void jj_la1_init_2() {
-          jj_la1_2 = new int[] 
{0x0,0x0,0x0,0xe402ff,0x0,0x0,0x8,0x0,0x0,0xe402ff,0x0,0x8,0x0,0x0,0xe402ff,0x2402f0,0x240000,0x240000,0xe402ff,0xe40008,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x100,0x100,0xc002ff,0x0,0xc002ff,0xc002ff,0x0,0x0,0xe402ff,0x0,0xe402ff,0x0,0x0,0x1,0x0,0x0,0x3f0,0x0,0x1,0x2f0,0x201,};
+          jj_la1_2 = new int[] 
{0x0,0x0,0x0,0xe402ff,0x0,0x0,0x8,0x0,0x0,0xe402ff,0x0,0x8,0x0,0x0,0xe402ff,0x2402f6,0x240000,0x240000,0xe402ff,0xe40008,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x100,0x100,0xc002ff,0x0,0xc002ff,0xc002ff,0x0,0x0,0xe402ff,0x0,0xe402ff,0x0,0x0,0x1,0x0,0x0,0x3f0,0x0,0x1,0x2f0,0x201,};
        }
 
   /** Constructor with InputStream. */
diff --git 
a/cayenne-server/src/main/jjtree/org/apache/cayenne/exp/parser/ExpressionParser.jjt
 
b/cayenne-server/src/main/jjtree/org/apache/cayenne/exp/parser/ExpressionParser.jjt
index 0b3200340..d31bfdcf6 100644
--- 
a/cayenne-server/src/main/jjtree/org/apache/cayenne/exp/parser/ExpressionParser.jjt
+++ 
b/cayenne-server/src/main/jjtree/org/apache/cayenne/exp/parser/ExpressionParser.jjt
@@ -151,6 +151,10 @@ void stringParameter() : {}
         pathExpression()
     |
         stringExpression()
+    |
+        customFunction()
+    |
+        customOperator()
 }
 
 void stringLiteral() :  {}
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ASTCustomFunctionTest.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ASTCustomFunctionTest.java
index 3ad0d2b25..7843907e1 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ASTCustomFunctionTest.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ASTCustomFunctionTest.java
@@ -39,6 +39,14 @@ public class ASTCustomFunctionTest {
         assertEquals("fn(\"MY_FUNCTION\", 1, \"abc\")", exp.toString());
     }
 
+    @Test
+    public void testCustomFunctionAsFunctionArg() {
+        Expression exp = ExpressionFactory.exp("length(fn('MY_FUNCTION', 1, 
'abc'))");
+        assertTrue(exp instanceof ASTFunctionCall);
+
+        assertEquals("length(fn(\"MY_FUNCTION\", 1, \"abc\"))", 
exp.toString());
+    }
+
     @Test(expected = ExpressionException.class)
     public void testEvaluate() {
         new ASTCustomFunction("test").evaluate(new Object());

Reply via email to