diff options
author | lancea <none@none> | 2010-08-10 10:07:33 -0400 |
---|---|---|
committer | lancea <none@none> | 2010-08-10 10:07:33 -0400 |
commit | 995026ee6af4f43112e175aa70ea4679a606f127 (patch) | |
tree | 884f9ed1d70c0648b0b28cc3351cd160573aa7a9 /src/share/classes/java/sql | |
parent | a04eba6a0ddaac1c8b14ac3892cfe091f3fb7338 (diff) | |
download | jdk8u_jdk-995026ee6af4f43112e175aa70ea4679a606f127.tar.gz |
6898593: java.sql.Date.valueOf no exception if date given is not in the JDBC date escape syntax
Reviewed-by: minqi
Diffstat (limited to 'src/share/classes/java/sql')
-rw-r--r-- | src/share/classes/java/sql/Date.java | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/src/share/classes/java/sql/Date.java b/src/share/classes/java/sql/Date.java index 39cf98ce93..7c2356e75c 100644 --- a/src/share/classes/java/sql/Date.java +++ b/src/share/classes/java/sql/Date.java @@ -103,27 +103,46 @@ public class Date extends java.util.Date { * JDBC date escape format (yyyy-mm-dd) */ public static Date valueOf(String s) { - int year; - int month; - int day; + final int YEAR_LENGTH = 4; + final int MONTH_LENGTH = 2; + final int DAY_LENGTH = 2; + final int MAX_MONTH = 12; + final int MAX_DAY = 31; int firstDash; int secondDash; + Date d = null; - if (s == null) throw new java.lang.IllegalArgumentException(); + if (s == null) { + throw new java.lang.IllegalArgumentException(); + } firstDash = s.indexOf('-'); - secondDash = s.indexOf('-', firstDash+1); - if ((firstDash > 0) & (secondDash > 0) & (secondDash < s.length()-1)) { - year = Integer.parseInt(s.substring(0, firstDash)) - 1900; - month = Integer.parseInt(s.substring(firstDash+1, secondDash)) - 1; - day = Integer.parseInt(s.substring(secondDash+1)); - } else { + secondDash = s.indexOf('-', firstDash + 1); + + if ((firstDash > 0) && (secondDash > 0) && (secondDash < s.length() - 1)) { + String yyyy = s.substring(0, firstDash); + String mm = s.substring(firstDash + 1, secondDash); + String dd = s.substring(secondDash + 1); + if (yyyy.length() == YEAR_LENGTH && mm.length() == MONTH_LENGTH && + dd.length() == DAY_LENGTH) { + int year = Integer.parseInt(yyyy); + int month = Integer.parseInt(mm); + int day = Integer.parseInt(dd); + + if ((month >= 1 && month <= MAX_MONTH) && (day >= 1 && day <= MAX_DAY)) { + d = new Date(year - 1900, month - 1, day); + } + } + } + if (d == null) { throw new java.lang.IllegalArgumentException(); } - return new Date(year, month, day); + return d; + } + /** * Formats a date in the date escape format yyyy-mm-dd. * <P> |