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