提交 f67db592 authored 作者: Thomas Mueller's avatar Thomas Mueller

The SQL state of the following exceptions has been changed: From 90009, 90010,…

The SQL state of the following exceptions has been changed: From 90009, 90010, 90011 to 22007: "Cannot parse DATE/TIME/TIMESTAMP constant ...".
上级 f5bb771c
......@@ -18,7 +18,9 @@ Change Log
<h1>Change Log</h1>
<h2>Next Version (unreleased)</h2>
<ul><li>There is a problem when opening a database file in a timezone that has different
<ul><li>The SQL state of the following exceptions has been changed:
From 90009, 90010, 90011 to 22007: "Cannot parse DATE/TIME/TIMESTAMP constant ...".
</li><li>There is a problem when opening a database file in a timezone that has different
daylight saving rules: the time part of dates where the daylight saving doesn't match
will differ. This is not a problem within regions that use the same rules (such as, within
USA, or within Europe), even if the timezone itself is different. As a workaround, export the
......
......@@ -462,34 +462,16 @@ public class ErrorCode {
public static final int INVALID_VALUE_2 = 90008;
/**
* The error with code <code>90009</code> is thrown when
* a text can not be converted to a date constant.
* Example:
* The error with code <code>22007</code> is thrown when
* a text can not be converted to a date, time, or timestamp constant.
* Examples:
* <pre>
* CALL DATE '2007-January-01';
* </pre>
*/
public static final int DATE_CONSTANT_2 = 90009;
/**
* The error with code <code>90010</code> is thrown when
* a text can not be converted to a time constant.
* Example:
* <pre>
* CALL TIME '14:61:00';
* </pre>
*/
public static final int TIME_CONSTANT_2 = 90010;
/**
* The error with code <code>90011</code> is thrown when
* a text can not be converted to a timestamp constant.
* Example:
* <pre>
* CALL TIMESTAMP '2001-02-30 12:00:00';
* </pre>
*/
public static final int TIMESTAMP_CONSTANT_2 = 90011;
public static final int INVALID_DATETIME_CONSTANT_2 = 22007;
/**
* The error with code <code>90012</code> is thrown when
......@@ -1867,7 +1849,7 @@ public class ErrorCode {
*/
public static final int RESULT_SET_READONLY = 90140;
// next are 90005, 90006, 90021, 90039, 90051, 90056, 90110, 90122, 90141
// next are 90005, 90006, 90009, 90010, 90011, 90021, 90039, 90051, 90056, 90110, 90122, 90141
private ErrorCode() {
// utility class
......
......@@ -5,6 +5,7 @@
21S02=Počet sloupců nesouhlasí
22001=Příliš dlouhá hodnota pro sloupec {0}: {1}
22003=Číselná hodnota je mimo rozsah: {0}
22007=Nelze zpracovat konstantu {0} {1}
22012=Dělení nulou: {0}
22018=Chyba při převodu dat {0}
22025=Chyba v LIKE escapování: {0}
......@@ -33,9 +34,6 @@
90004=Hexadecimální řetězec obsahuje neplatný znak: {0}
90007=Tento objekt byl již uzavřen
90008=Neplatná hodnota {0} pro parametr {1}
90009=Nelze zpracovat konstantu datumu {0}, příčina: {1}
90010=Nelze zpracovat konstantu času {0}, příčina: {1}
90011=Nelze zpracovat konstantu časového razítka {0}, příčina: {1}
90012=Parametr {0} není nastaven
90013=Databáze {0} nenalezena
90014=Chyba zpracování {0}
......
......@@ -5,6 +5,7 @@
21S02=Anzahl der Felder stimmt nicht überein
22001=Wert zu gross / lang für Feld {0}: {1}
22003=Zahlenwert ausserhalb des Bereichs: {0}
22007=Kann {0} {1} nicht umwandeln
22012=Division durch 0: {0}
22018=Datenumwandlungsfehler beim Umwandeln von {0}
22025=Fehler in LIKE ESCAPE: {0}
......@@ -33,9 +34,6 @@
90004=Hexadezimal Zahl enthält unerlaubtes Zeichen: {0}
90007=Das Objekt wurde bereits geschlossen
90008=Unerlaubter Wert {0} für Parameter {1}
90009=Kann Datum {0} nicht umwandeln, Grund: {1}
90010=Kann Zeit {0} nicht umwandeln, Grund: {1}
90011=Kann Zeitstempel {0} nicht umwandeln, Grund: {1}
90012=Parameter {0} wurde nicht gesetzt
90013=Datenbank {0} nicht gefunden
90014=Fehler beim Parsen von {0}
......
......@@ -5,6 +5,7 @@
21S02=Column count does not match
22001=Value too long for column {0}: {1}
22003=Numeric value out of range: {0}
22007=Cannot parse {0} constant {1}
22012=Division by zero: {0}
22018=Data conversion error converting {0}
22025=Error in LIKE ESCAPE: {0}
......@@ -33,9 +34,6 @@
90004=Hexadecimal string contains non-hex character: {0}
90007=The object is already closed
90008=Invalid value {0} for parameter {1}
90009=Cannot parse date constant {0}, cause: {1}
90010=Cannot parse time constant {0}, cause: {1}
90011=Cannot parse timestamp constant {0}, cause: {1}
90012=Parameter {0} is not set
90013=Database {0} not found
90014=Error parsing {0}
......
......@@ -5,6 +5,7 @@
21S02=La cantidad de columnas no coincide
22001=Valor demasiado largo para la columna {0}: {1}
22003=Valor numerico fuera de rango: {0}
22007=Imposible interpretar la constante {0} {1}
22012=División por cero: {0}
22018=Conversión de datos fallida, convirtiendo {0}
22025=Error en LIKE ESCAPE: {0}
......@@ -33,9 +34,6 @@
90004=Cadena Hexadecimal contiene caracteres invalidos: {0}
90007=El objeto ya está cerrado
90008=Valor Invalido {0} para el parametro {1}
90009=Imposible interpretar la constante de fecha {0}, causa: {1}
90010=Imposible interpretar la constante de hora {0}, causa: {1}
90011=Imposible interpretar la constante de fecha y hora timestamp {0}, causa: {1}
90012=Parametro {0} no está fijado
90013=Database {0} no encontrada
90014=Error interpretando {0}
......
......@@ -5,6 +5,7 @@
21S02=列番号が一致しません
22001=列 {0} の値が長過ぎます: {1}
22003=範囲外の数値です: {0}
22007={0} 定数 {1} を解析できません
22012=ゼロで除算しました: {0}
22018=データ変換中にエラーが発生しました {0}
22025=LIKE ESCAPE にエラーがあります: {0}
......@@ -33,9 +34,6 @@
90004=16進文字列に不正な文字が含まれています: {0}
90007=オブジェクトはすでに閉じられています
90008=パラメータ {1} に対する値 {0} が不正です
90009=日付定数 {0} を解析できません
90010=時間定数 {0} を解析できません
90011=タイムスタンプ定数 {0} を解析できません
90012=パラメータ {0} がセットされていません
90013=データベース {0} が見つかりません
90014=解析エラー {0}
......
......@@ -5,6 +5,7 @@
21S02=Niezgodna ilosc kolumn
22001=Wartosc za dluga dla kolumny {0}: {1}
22003=Wartosc numeryczna poza zakresem: {0}
22007=#Cannot parse {0} constant {1}
22012=Dzielenie przez zero: {0}
22018=Blad konwersji danych {0}
22025=Blad w LIKE ESCAPE: {0}
......@@ -33,9 +34,6 @@
90004=Hexadecimal string contains non hex character: {0}
90007=Objekt jest zamkniety
90008=Nieprawidlowa wartosc {0} parametru {1}
90009=#Cannot parse date constant {0}, cause: {1}
90010=#Cannot parse time constant {0}, cause: {1}
90011=#Cannot parse timestamp constant {0}, cause: {1}
90012=Parametr o numerze {0} nie jest ustalony
90013=Baza danych {0} nie znaleziona
90014=Blad parsowania {0}
......
......@@ -5,6 +5,7 @@
21S02=A quantidade de colunas não corresponde
22001=Valor muito longo para a coluna {0}: {1}
22003=Valor númerico não esta dentro do limite: {0}
22007=Não é possível converter {1} para {0}
22012=Divisão por zero: {0}
22018=Erro na conversão de dado, convertendo {0}
22025=Erro em LIKE ESCAPE: {0}
......@@ -33,9 +34,6 @@
90004=Sequência Hexadecimal contêm caracteres inválidos: {0}
90007=O objeto está fechado
90008=Valor inválido {0} para o parâmetro {1}
90009=Não é possível converter {0} para date, causa: {1}
90010=Não é possível converter {0} para time, causa: {1}
90011=Não é possível converter {0} para timestamp, causa: {1}
90012=Parâmetro {0} não esta definido
90013=Base de dados {0} não encontrada
90014=Erro na conversão {0}
......
......@@ -5,6 +5,7 @@
21S02=Неверное количество столбцов
22001=Значение слишком длинное для поля {0}: {1}
22003=Численное значение вне допустимого диапазона: {0}
22007=Невозможно преобразование строки {1} в тип {0}
22012=Деление на ноль: {0}
22018=Ошибка преобразования данных при конвертации {0}
22025=Ошибка в LIKE ESCAPE: {0}
......@@ -33,9 +34,6 @@
90004=Шестнадцатиричная строка содержит нешестнадцатиричные символы: {0}
90007=Объект уже закрыт
90008=Недопустимое значение {0} для параметра {1}
90009=Невозможно преобразование строки {0} в тип date, причина: {1}
90010=Невозможно преобразование строки {0} в тип time, причина: {1}
90011=Невозможно преобразование строки {0} в тип timestamp, причина: {1}
90012=Параметр {0} не установлен
90013=База данных {0} не найдена
90014=Ошибка при разборе {0}
......
......@@ -5,6 +5,7 @@
21S02=Počet stĺpcov sa nezhoduje
22001=Hodnota je príliš dlhá pre stĺpec {0}: {1}
22003=Číselná hodnota mimo rozsah: {0}
22007=Nemožem rozobrať {0} konštantu {1}
22012=Delenie nulou: {0}
22018=Chyba konverzie dát pre {0}
22025=Chyba v LIKE ESCAPE: {0}
......@@ -33,9 +34,6 @@
90004=Hexadecimálny reťazec obsahuje nepovolené znaky pre šestnáskovú sústavu: {0}
90007=Objekt už je zatvorený
90008=Nesprávna hodnota {0} parametra {1}
90009=Nemožem rozobrať dátumovú (date) konštantu {0}, dôvod: {1}
90010=Nemožem rozobrať časovú (time) konštantu {0}, dôvod: {1}
90011=Nemožem rozobrať časovú pečiatku (timestamp) {0}, dôvod: {1}
90012=Parameter {0} nie je nastavený
90013=Databáza {0} nenájdená
90014=Chyba rozobrania (parse) {0}
......
......@@ -18,6 +18,7 @@ import java.util.Locale;
import java.util.TimeZone;
import org.h2.constant.ErrorCode;
import org.h2.message.DbException;
import org.h2.value.DataType;
import org.h2.value.Value;
import org.h2.value.ValueDate;
import org.h2.value.ValueTime;
......@@ -232,10 +233,9 @@ public class DateTimeUtils {
*
* @param original the original string
* @param type the value type (Value.TIME, TIMESTAMP, or DATE)
* @param errorCode the error code to use if an error occurs
* @return the date object
*/
public static java.util.Date parseDateTime(String original, int type, int errorCode) {
public static java.util.Date parseDateTime(String original, int type) {
String s = original;
if (s == null) {
return null;
......@@ -263,7 +263,8 @@ public class DateTimeUtils {
int s1 = s.indexOf('-', 1);
int s2 = s.indexOf('-', s1 + 1);
if (s1 <= 0 || s2 <= s1) {
throw DbException.get(errorCode, s, "format yyyy-mm-dd");
throw DbException.get(ErrorCode.INVALID_DATETIME_CONSTANT_2,
DataType.getDataType(type).name, s);
}
year = Integer.parseInt(s.substring(0, s1));
month = Integer.parseInt(s.substring(s1 + 1, s2));
......@@ -276,7 +277,8 @@ public class DateTimeUtils {
int s2 = s.indexOf(':', s1 + 1);
int s3 = s.indexOf('.', s2 + 1);
if (s1 <= 0 || s2 <= s1) {
throw DbException.get(errorCode, s, "format hh:mm:ss");
throw DbException.get(ErrorCode.INVALID_DATETIME_CONSTANT_2,
DataType.getDataType(type).name, original);
}
if (s.endsWith("Z")) {
......@@ -291,7 +293,9 @@ public class DateTimeUtils {
String tzName = "GMT" + s.substring(timeZoneStart);
tz = TimeZone.getTimeZone(tzName);
if (!tz.getID().startsWith(tzName)) {
throw DbException.get(errorCode, new String[] { s, tz.getID() + " <>" + tzName });
throw DbException.get(ErrorCode.INVALID_DATETIME_CONSTANT_2,
DataType.getDataType(type).name,
original + " (" + tz.getID() + " <>" + tzName + ")");
}
s = s.substring(0, timeZoneStart).trim();
}
......@@ -352,7 +356,8 @@ public class DateTimeUtils {
throw DbException.throwInternalError("type:" + type);
}
} catch (IllegalArgumentException e) {
throw DbException.get(errorCode, e, original, e.toString());
throw DbException.get(ErrorCode.INVALID_DATETIME_CONSTANT_2,
e, DataType.getDataType(type).name, original);
}
}
......
......@@ -10,7 +10,6 @@ import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Calendar;
import org.h2.constant.ErrorCode;
import org.h2.util.DateTimeUtils;
/**
......@@ -42,7 +41,7 @@ public class ValueDate extends Value {
* @return the date
*/
public static Date parseDate(String s) {
return (Date) DateTimeUtils.parseDateTime(s, Value.DATE, ErrorCode.DATE_CONSTANT_2);
return (Date) DateTimeUtils.parseDateTime(s, Value.DATE);
}
public Date getDate() {
......
......@@ -9,7 +9,6 @@ package org.h2.value;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Time;
import org.h2.constant.ErrorCode;
import org.h2.util.DateTimeUtils;
/**
......@@ -41,7 +40,7 @@ public class ValueTime extends Value {
* @return the time
*/
public static Time parseTime(String s) {
return (Time) DateTimeUtils.parseDateTime(s, Value.TIME, ErrorCode.TIME_CONSTANT_2);
return (Time) DateTimeUtils.parseDateTime(s, Value.TIME);
}
public Time getTime() {
......
......@@ -12,8 +12,6 @@ import java.sql.SQLException;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Calendar;
import org.h2.constant.ErrorCode;
import org.h2.message.DbException;
import org.h2.util.DateTimeUtils;
import org.h2.util.MathUtils;
......@@ -79,7 +77,7 @@ public class ValueTimestamp extends Value {
* @return the timestamp
*/
public static Timestamp parseTimestamp(String s) {
return (Timestamp) DateTimeUtils.parseDateTime(s, Value.TIMESTAMP, ErrorCode.TIMESTAMP_CONSTANT_2);
return (Timestamp) DateTimeUtils.parseDateTime(s, Value.TIMESTAMP);
}
public int getType() {
......
......@@ -339,13 +339,7 @@ java org.h2.test.TestAll timer
System.setProperty("h2.delayWrongPasswordMin", "0");
System.setProperty("h2.delayWrongPasswordMax", "0");
// System.setProperty("h2.lobInDatabase", "true");
// test.nestedJoins = true;
// System.setProperty("h2.largeTransactions", "true");
// System.setProperty("h2.analyzeAuto", "100");
// System.setProperty("h2.optimizeOr", "true");
// System.setProperty("h2.queryCacheSize", "100");
// System.setProperty("h2.dropRestrict", "true");
System.setProperty("h2.storeLocalTime", "true");
// speedup
// System.setProperty("h2.syncMethod", "");
......
......@@ -14,7 +14,6 @@ import java.sql.Statement;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.TimeZone;
import org.h2.constant.ErrorCode;
import org.h2.constant.SysProperties;
import org.h2.test.TestBase;
import org.h2.test.unit.TestDate;
......@@ -123,7 +122,7 @@ public class TestDateStorage extends TestBase {
private static void test(int year, int month, int day, int hour) {
DateTimeUtils.parseDateTime(year + "-" + month + "-" + day + " " + hour + ":00:00",
Value.TIMESTAMP, ErrorCode.TIMESTAMP_CONSTANT_2);
Value.TIMESTAMP);
}
private void testAllTimeZones() throws SQLException {
......
......@@ -124,8 +124,8 @@ public class TestDate extends TestBase {
}
private void testDateTimeUtils() {
java.sql.Timestamp ts1 = (Timestamp) DateTimeUtils.parseDateTime("-999-08-07 13:14:15.16", Value.TIMESTAMP, 0);
java.sql.Timestamp ts2 = (Timestamp) DateTimeUtils.parseDateTime("19999-08-07 13:14:15.16", Value.TIMESTAMP, 0);
java.sql.Timestamp ts1 = (Timestamp) DateTimeUtils.parseDateTime("-999-08-07 13:14:15.16", Value.TIMESTAMP);
java.sql.Timestamp ts2 = (Timestamp) DateTimeUtils.parseDateTime("19999-08-07 13:14:15.16", Value.TIMESTAMP);
java.sql.Time t1 = DateTimeUtils.cloneAndNormalizeTime(new java.sql.Time(ts1.getTime()));
java.sql.Time t2 = DateTimeUtils.cloneAndNormalizeTime(new java.sql.Time(ts2.getTime()));
java.sql.Date d1 = DateTimeUtils.cloneAndNormalizeDate(new java.sql.Date(ts1.getTime()));
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论