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

Reply via email to