This is an automated email from the ASF dual-hosted git repository. ntimofeev pushed a commit to branch STABLE-4.2 in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit 9ac905173c530de70e3336564e035be3ccbe53f8 Author: Nikita Timofeev <[email protected]> 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 (cherry picked from commit 0e79a606d20ecd1d31dd9be4fad28da37c14f3a2) --- RELEASE-NOTES.txt | 1 + .../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, 22 insertions(+), 1 deletion(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index f29952482..2be62e069 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -16,6 +16,7 @@ Changes/New Features: Bug Fixes: 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 ---------------------------------- Release: 4.2 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());
