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

Reply via email to