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 85dca2fda CAY-2887 Expressions: Incorrect serialization to string of
numeric literals
85dca2fda is described below
commit 85dca2fda5787239bec80f68fae108f29e7106f2
Author: Nikita Timofeev <[email protected]>
AuthorDate: Tue Oct 28 12:59:33 2025 +0400
CAY-2887 Expressions: Incorrect serialization to string of numeric literals
---
RELEASE-NOTES.txt | 1 +
.../org/apache/cayenne/exp/parser/SimpleNode.java | 15 ++++++++++++---
.../java/org/apache/cayenne/exp/ExpressionTest.java | 19 +++++++++++++++++--
3 files changed, 30 insertions(+), 5 deletions(-)
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index d92e28d50..0bcd2458a 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -28,6 +28,7 @@ CAY-2876 Memory leak in the ObjectStore
CAY-2879 Negative number for non parameterized ObjectSelect query not
processed correctly
CAY-2883 License and notice templates are not processed by the Gradle build
CAY-2885 Modeler: DbImport fails to load DB schema view
+CAY-2887 Expressions: Incorrect serialization to string of numeric literals
CAY-2889 Make subclassing a PK Generator easier
CAY-2895 Incorrect Lazy Pagination Comparison for BigInteger PK
CAY-2896 Inserting two identical objects into two datamaps stores both objects
in the last used datamap
diff --git
a/cayenne/src/main/java/org/apache/cayenne/exp/parser/SimpleNode.java
b/cayenne/src/main/java/org/apache/cayenne/exp/parser/SimpleNode.java
index 61808b001..579235739 100644
--- a/cayenne/src/main/java/org/apache/cayenne/exp/parser/SimpleNode.java
+++ b/cayenne/src/main/java/org/apache/cayenne/exp/parser/SimpleNode.java
@@ -22,12 +22,10 @@
package org.apache.cayenne.exp.parser;
import java.io.IOException;
-import java.io.PrintWriter;
import java.util.Collections;
import java.util.List;
import java.util.Map;
-import org.apache.cayenne.CayenneRuntimeException;
import org.apache.cayenne.ObjectId;
import org.apache.cayenne.Persistent;
import org.apache.cayenne.exp.Expression;
@@ -88,7 +86,7 @@ public abstract class SimpleNode extends Expression
implements Node {
}
if (scalar instanceof Integer || scalar instanceof Long ||
scalar instanceof Float || scalar instanceof Double) {
- out.append(scalar.toString());
+ out.append(numericToString((Number)scalar));
return;
}
@@ -139,6 +137,8 @@ public abstract class SimpleNode extends Expression
implements Node {
Enum<?> e = (Enum<?>) scalar;
out.append("enum:");
out.append(e.getClass().getName()).append(".").append(e.name());
+ } else if (scalar instanceof Number) {
+ appendAsEscapedString(out,
numericToString((Number)scalar));
} else {
appendAsEscapedString(out, String.valueOf(scalar));
}
@@ -148,6 +148,15 @@ public abstract class SimpleNode extends Expression
implements Node {
}
}
+ protected static String numericToString(Number number) {
+ if(number instanceof Long) {
+ return number + "L";
+ } else if(number instanceof Float) {
+ return number + "f";
+ }
+ return String.valueOf(number);
+ }
+
/**
* Utility method that prints a string to the provided Appendable,
escaping special characters.
*/
diff --git a/cayenne/src/test/java/org/apache/cayenne/exp/ExpressionTest.java
b/cayenne/src/test/java/org/apache/cayenne/exp/ExpressionTest.java
index 067580f07..734662c8f 100644
--- a/cayenne/src/test/java/org/apache/cayenne/exp/ExpressionTest.java
+++ b/cayenne/src/test/java/org/apache/cayenne/exp/ExpressionTest.java
@@ -48,13 +48,13 @@ public class ExpressionTest {
@Test
public void testToEJBQL_numericType_long() {
Expression e = ExpressionFactory.matchExp("consignment.parts",
1418342400L);
- assertEquals("x.consignment.parts = 1418342400",
e.toEJBQL("x"));
+ assertEquals("x.consignment.parts = 1418342400L",
e.toEJBQL("x"));
}
@Test
public void testToEJBQL_numericType_float() {
Expression e =
ExpressionFactory.greaterOrEqualExp("consignment.parts",
Float.valueOf("3.145"));
- assertEquals("x.consignment.parts >= 3.145", e.toEJBQL("x"));
+ assertEquals("x.consignment.parts >= 3.145f", e.toEJBQL("x"));
}
@Test
@@ -483,4 +483,19 @@ public class ExpressionTest {
List.of(ExpressionFactory.pathExp("x")));
caseWhen.appendAsEJBQL(null, null, "x");
}
+
+ @Test
+ public void testNumericsToString() {
+ Expression exp1 = ExpressionFactory.exp("a = 123");
+ assertEquals("a = 123", exp1.toString());
+
+ Expression exp2 = ExpressionFactory.exp("a = 123L");
+ assertEquals("a = 123L", exp2.toString());
+
+ Expression exp3 = ExpressionFactory.exp("a = 123.0");
+ assertEquals("a = 123.0", exp3.toString());
+
+ Expression exp4 = ExpressionFactory.exp("a = 123.0f");
+ assertEquals("a = 123.0f", exp4.toString());
+ }
}