Fix a bug in Timestamp.compareTo where the result could be wrong if the timestamps differed by more than 2^31 milliseconds. Patch by: jat Review by: jimbrooks git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9506 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/super/com/google/gwt/emul/java/sql/Timestamp.java b/user/super/com/google/gwt/emul/java/sql/Timestamp.java index 8e2c62a..cfa4fa4 100644 --- a/user/super/com/google/gwt/emul/java/sql/Timestamp.java +++ b/user/super/com/google/gwt/emul/java/sql/Timestamp.java
@@ -116,8 +116,8 @@ } public int compareTo(Timestamp o) { - int delta = (int) (getTime() - o.getTime()); - return delta == 0 ? getNanos() - o.getNanos() : delta; + int sign = Long.signum(getTime() - o.getTime()); + return sign == 0 ? getNanos() - o.getNanos() : sign; } @Override
diff --git a/user/super/com/google/gwt/emul/java/util/Date.java b/user/super/com/google/gwt/emul/java/util/Date.java index dafbe17..08190bc 100644 --- a/user/super/com/google/gwt/emul/java/util/Date.java +++ b/user/super/com/google/gwt/emul/java/util/Date.java
@@ -125,15 +125,7 @@ } public int compareTo(Date other) { - long thisTime = getTime(); - long otherTime = other.getTime(); - if (thisTime < otherTime) { - return -1; - } else if (thisTime > otherTime) { - return 1; - } else { - return 0; - } + return Long.signum(getTime() - other.getTime()); } @Override
diff --git a/user/test/com/google/gwt/emultest/java/sql/SqlTimestampTest.java b/user/test/com/google/gwt/emultest/java/sql/SqlTimestampTest.java index 052ec45..a6598c0 100644 --- a/user/test/com/google/gwt/emultest/java/sql/SqlTimestampTest.java +++ b/user/test/com/google/gwt/emultest/java/sql/SqlTimestampTest.java
@@ -36,6 +36,14 @@ return "com.google.gwt.emultest.EmulSuite"; } + public void testCompareTo() { + Timestamp now = Timestamp.valueOf("2011-01-05 12:45:18.000000000"); + // add 1.5 << 31 so coercing the ms difference to int results in a + // sign change + Timestamp later = new Timestamp(now.getTime() + (3L << 30)); + assertTrue("later <= now", later.compareTo(now) > 0); + } + /** * Timestamps have some non-obvious comparison semantics when compared to * dates.