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