Skip to content

Commit 85dca2f

Browse files
committed
CAY-2887 Expressions: Incorrect serialization to string of numeric literals
1 parent 3edd4bf commit 85dca2f

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
@@ -28,6 +28,7 @@ CAY-2876 Memory leak in the ObjectStore
2828
CAY-2879 Negative number for non parameterized ObjectSelect query not processed correctly
2929
CAY-2883 License and notice templates are not processed by the Gradle build
3030
CAY-2885 Modeler: DbImport fails to load DB schema view
31+
CAY-2887 Expressions: Incorrect serialization to string of numeric literals
3132
CAY-2889 Make subclassing a PK Generator easier
3233
CAY-2895 Incorrect Lazy Pagination Comparison for BigInteger PK
3334
CAY-2896 Inserting two identical objects into two datamaps stores both objects in the last used datamap

cayenne/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/src/test/java/org/apache/cayenne/exp/ExpressionTest.java

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

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

6060
@Test
@@ -483,4 +483,19 @@ public void testAppendAsEJBQLCaseWhen() throws IOException {
483483
List.of(ExpressionFactory.pathExp("x")));
484484
caseWhen.appendAsEJBQL(null, null, "x");
485485
}
486+
487+
@Test
488+
public void testNumericsToString() {
489+
Expression exp1 = ExpressionFactory.exp("a = 123");
490+
assertEquals("a = 123", exp1.toString());
491+
492+
Expression exp2 = ExpressionFactory.exp("a = 123L");
493+
assertEquals("a = 123L", exp2.toString());
494+
495+
Expression exp3 = ExpressionFactory.exp("a = 123.0");
496+
assertEquals("a = 123.0", exp3.toString());
497+
498+
Expression exp4 = ExpressionFactory.exp("a = 123.0f");
499+
assertEquals("a = 123.0f", exp4.toString());
500+
}
486501
}

0 commit comments

Comments
 (0)