Skip to content

Commit cd58cdd

Browse files
committed
CAY-2887 Expressions: Incorrect serialization to string of numeric literals
(cherry picked from commit 85dca2f)
1 parent bc1d354 commit cd58cdd

3 files changed

Lines changed: 30 additions & 5 deletions

File tree

RELEASE-NOTES.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ Bug Fixes:
2121

2222
CAY-2883 License and notice templates are not processed by the Gradle build
2323
CAY-2885 Modeler: DbImport fails to load DB schema view
24+
CAY-2887 Expressions: Incorrect serialization to string of numeric literals
2425
CAY-2895 Incorrect Lazy Pagination Comparison for BigInteger PK
2526
CAY-2896 Inserting two identical objects into two datamaps stores both objects in the last used datamap
2627
CAY-2898 Crypto: NPE in a ColumnQuery

cayenne-server/src/main/java/org/apache/cayenne/exp/parser/SimpleNode.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,10 @@
2222
package org.apache.cayenne.exp.parser;
2323

2424
import java.io.IOException;
25-
import java.io.PrintWriter;
2625
import java.util.Collections;
2726
import java.util.List;
2827
import java.util.Map;
2928

30-
import org.apache.cayenne.CayenneRuntimeException;
3129
import org.apache.cayenne.ObjectId;
3230
import org.apache.cayenne.Persistent;
3331
import org.apache.cayenne.exp.Expression;
@@ -88,7 +86,7 @@ protected static void encodeScalarAsEJBQL(List<Object> parameterAccumulator, App
8886
}
8987

9088
if (scalar instanceof Integer || scalar instanceof Long || scalar instanceof Float || scalar instanceof Double) {
91-
out.append(scalar.toString());
89+
out.append(numericToString((Number)scalar));
9290
return;
9391
}
9492

@@ -139,6 +137,8 @@ protected static void appendScalarAsString(Appendable out, Object scalar, char q
139137
Enum<?> e = (Enum<?>) scalar;
140138
out.append("enum:");
141139
out.append(e.getClass().getName()).append(".").append(e.name());
140+
} else if (scalar instanceof Number) {
141+
appendAsEscapedString(out, numericToString((Number)scalar));
142142
} else {
143143
appendAsEscapedString(out, String.valueOf(scalar));
144144
}
@@ -148,6 +148,15 @@ protected static void appendScalarAsString(Appendable out, Object scalar, char q
148148
}
149149
}
150150

151+
protected static String numericToString(Number number) {
152+
if(number instanceof Long) {
153+
return number + "L";
154+
} else if(number instanceof Float) {
155+
return number + "f";
156+
}
157+
return String.valueOf(number);
158+
}
159+
151160
/**
152161
* Utility method that prints a string to the provided Appendable, escaping special characters.
153162
*/

cayenne-server/src/test/java/org/apache/cayenne/exp/ExpressionTest.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,13 @@ public void testToEJBQL_numericType_integer() {
4545
@Test
4646
public void testToEJBQL_numericType_long() {
4747
Expression e = ExpressionFactory.matchExp("consignment.parts", 1418342400L);
48-
assertEquals("x.consignment.parts = 1418342400", e.toEJBQL("x"));
48+
assertEquals("x.consignment.parts = 1418342400L", e.toEJBQL("x"));
4949
}
5050

5151
@Test
5252
public void testToEJBQL_numericType_float() {
5353
Expression e = ExpressionFactory.greaterOrEqualExp("consignment.parts", Float.valueOf("3.145"));
54-
assertEquals("x.consignment.parts >= 3.145", e.toEJBQL("x"));
54+
assertEquals("x.consignment.parts >= 3.145f", e.toEJBQL("x"));
5555
}
5656

5757
@Test
@@ -464,4 +464,19 @@ public void testDbPathFunctionName() throws IOException {
464464
exp.appendAsString(buffer);
465465
assertEquals("db:year.month.day.avg", buffer.toString());
466466
}
467+
468+
@Test
469+
public void testNumericsToString() {
470+
Expression exp1 = ExpressionFactory.exp("a = 123");
471+
assertEquals("a = 123", exp1.toString());
472+
473+
Expression exp2 = ExpressionFactory.exp("a = 123L");
474+
assertEquals("a = 123L", exp2.toString());
475+
476+
Expression exp3 = ExpressionFactory.exp("a = 123.0");
477+
assertEquals("a = 123.0", exp3.toString());
478+
479+
Expression exp4 = ExpressionFactory.exp("a = 123.0f");
480+
assertEquals("a = 123.0f", exp4.toString());
481+
}
467482
}

0 commit comments

Comments
 (0)