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
The following commit(s) were added to refs/heads/STABLE-4.2 by this push:
new cd58cdd2c CAY-2887 Expressions: Incorrect serialization to string of
numeric literals
cd58cdd2c is described below
commit cd58cdd2c6dd44b33215a07411aba0ac9bbfc15d
Author: Nikita Timofeev <[email protected]>
AuthorDate: Tue Oct 28 12:59:33 2025 +0400
CAY-2887 Expressions: Incorrect serialization to string of numeric literals
(cherry picked from commit 85dca2fda5787239bec80f68fae108f29e7106f2)
---
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 c3875de88..14c0c80f5 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -21,6 +21,7 @@ Bug Fixes:
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-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
CAY-2898 Crypto: NPE in a ColumnQuery
diff --git
a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/SimpleNode.java
b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/SimpleNode.java
index 95646d370..85c2a609d 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/SimpleNode.java
+++ b/cayenne-server/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-server/src/test/java/org/apache/cayenne/exp/ExpressionTest.java
b/cayenne-server/src/test/java/org/apache/cayenne/exp/ExpressionTest.java
index 5af763f74..2d9ebdbd1 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/exp/ExpressionTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/exp/ExpressionTest.java
@@ -45,13 +45,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
@@ -464,4 +464,19 @@ public class ExpressionTest {
exp.appendAsString(buffer);
assertEquals("db:year.month.day.avg", buffer.toString());
}
+
+ @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());
+ }
}