src/share/classes/java/sql/Timestamp.java
Print this page
rev 10459 : 8055055: Improve numeric parsing in java.sql
*** 169,234 ****
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;
- String date_s;
- String time_s;
- String nanos_s;
int year = 0;
int month = 0;
int day = 0;
int hour;
int minute;
int second;
int a_nanos = 0;
int firstDash;
int secondDash;
int dividingSpace;
! int firstColon = 0;
! int secondColon = 0;
! int period = 0;
String formatError = "Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]";
- String zeros = "000000000";
- String delimiterDate = "-";
- String delimiterTime = ":";
if (s == null) throw new java.lang.IllegalArgumentException("null string");
// Split the string into date and time components
s = s.trim();
dividingSpace = s.indexOf(' ');
! if (dividingSpace > 0) {
! date_s = s.substring(0,dividingSpace);
! time_s = s.substring(dividingSpace+1);
! } else {
throw new java.lang.IllegalArgumentException(formatError);
}
// Parse the date
! firstDash = date_s.indexOf('-');
! secondDash = date_s.indexOf('-', firstDash+1);
// Parse the time
! if (time_s == null)
! throw new java.lang.IllegalArgumentException(formatError);
! firstColon = time_s.indexOf(':');
! secondColon = time_s.indexOf(':', firstColon+1);
! period = time_s.indexOf('.', secondColon+1);
// Convert the date
boolean parsedDate = false;
! if ((firstDash > 0) && (secondDash > 0) && (secondDash < date_s.length() - 1)) {
! String yyyy = date_s.substring(0, firstDash);
! String mm = date_s.substring(firstDash + 1, secondDash);
! String dd = date_s.substring(secondDash + 1);
! if (yyyy.length() == YEAR_LENGTH &&
! (mm.length() >= 1 && mm.length() <= MONTH_LENGTH) &&
! (dd.length() >= 1 && dd.length() <= DAY_LENGTH)) {
! year = Integer.parseInt(yyyy);
! month = Integer.parseInt(mm);
! day = Integer.parseInt(dd);
if ((month >= 1 && month <= MAX_MONTH) && (day >= 1 && day <= MAX_DAY)) {
parsedDate = true;
}
}
--- 169,220 ----
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 year = 0;
int month = 0;
int day = 0;
int hour;
int minute;
int second;
int a_nanos = 0;
int firstDash;
int secondDash;
int dividingSpace;
! int firstColon;
! int secondColon;
! int period;
String formatError = "Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]";
if (s == null) throw new java.lang.IllegalArgumentException("null string");
// Split the string into date and time components
s = s.trim();
dividingSpace = s.indexOf(' ');
! if (dividingSpace < 0) {
throw new java.lang.IllegalArgumentException(formatError);
}
// Parse the date
! firstDash = s.indexOf('-');
! secondDash = s.indexOf('-', firstDash+1);
// Parse the time
! firstColon = s.indexOf(':', dividingSpace + 1);
! secondColon = s.indexOf(':', firstColon + 1);
! period = s.indexOf('.', secondColon + 1);
// Convert the date
boolean parsedDate = false;
! if ((firstDash > 0) && (secondDash > 0) && (secondDash < dividingSpace - 1)) {
! if (firstDash == YEAR_LENGTH &&
! (secondDash - firstDash >= 2 && secondDash - firstDash - 1 <= MONTH_LENGTH) &&
! (dividingSpace - secondDash >= 2 && dividingSpace - secondDash - 1 <= DAY_LENGTH)) {
! year = Integer.parseInt(s, 10, 0, firstDash);
! month = Integer.parseInt(s, 10, firstDash + 1, secondDash);
! day = Integer.parseInt(s, 10, secondDash + 1, dividingSpace);
if ((month >= 1 && month <= MAX_MONTH) && (day >= 1 && day <= MAX_DAY)) {
parsedDate = true;
}
}
*** 236,264 ****
if (! parsedDate) {
throw new java.lang.IllegalArgumentException(formatError);
}
// Convert the time; default missing nanos
! if ((firstColon > 0) & (secondColon > 0) &
! (secondColon < time_s.length()-1)) {
! hour = Integer.parseInt(time_s.substring(0, firstColon));
! minute =
! Integer.parseInt(time_s.substring(firstColon+1, secondColon));
! if ((period > 0) & (period < time_s.length()-1)) {
! second =
! Integer.parseInt(time_s.substring(secondColon+1, period));
! nanos_s = time_s.substring(period+1);
! if (nanos_s.length() > 9)
! throw new java.lang.IllegalArgumentException(formatError);
! if (!Character.isDigit(nanos_s.charAt(0)))
! throw new java.lang.IllegalArgumentException(formatError);
! nanos_s = nanos_s + zeros.substring(0,9-nanos_s.length());
! a_nanos = Integer.parseInt(nanos_s);
} else if (period > 0) {
throw new java.lang.IllegalArgumentException(formatError);
} else {
! second = Integer.parseInt(time_s.substring(secondColon+1));
}
} else {
throw new java.lang.IllegalArgumentException(formatError);
}
--- 222,251 ----
if (! parsedDate) {
throw new java.lang.IllegalArgumentException(formatError);
}
// Convert the time; default missing nanos
! if (firstColon > 0 && secondColon > 0 && secondColon < s.length() - 1) {
! hour = Integer.parseInt(s, 10, dividingSpace + 1, firstColon);
! minute = Integer.parseInt(s, 10, firstColon + 1, secondColon);
! if (period > 0 && period < s.length() - 1) {
! second = Integer.parseInt(s, 10, secondColon + 1, period);
! int nanoPrecision = s.length() - (period + 1);
! if (nanoPrecision > 9)
! throw new java.lang.IllegalArgumentException(formatError);
! if (!Character.isDigit(s.charAt(period + 1)))
! throw new java.lang.IllegalArgumentException(formatError);
! int tmpNanos = Integer.parseInt(s, 10, period + 1);
! while (nanoPrecision < 9) {
! tmpNanos *= 10;
! nanoPrecision++;
! }
! a_nanos = tmpNanos;
} else if (period > 0) {
throw new java.lang.IllegalArgumentException(formatError);
} else {
! second = Integer.parseInt(s, 10, secondColon + 1);
}
} else {
throw new java.lang.IllegalArgumentException(formatError);
}