提交 d78d54cd authored 作者: Noel Grandin's avatar Noel Grandin

Remove the "TIMESTAMP UTC" datatype, an experiment that was never finished.

上级 9f69e3cb
...@@ -25,6 +25,8 @@ Change Log ...@@ -25,6 +25,8 @@ Change Log
</li> </li>
<li>PR #364: fix compare TIMESTAMP WITH TIMEZONE <li>PR #364: fix compare TIMESTAMP WITH TIMEZONE
</li> </li>
<li>Remove the "TIMESTAMP UTC" datatype, an experiment that was never finished.
</li>
<li>PR #363: Added support to define last IDENTIFIER on a Trigger. <li>PR #363: Added support to define last IDENTIFIER on a Trigger.
</li> </li>
<li>PR #366: Tests for timestamps <li>PR #366: Tests for timestamps
......
...@@ -46,7 +46,6 @@ import org.h2.value.ValueStringIgnoreCase; ...@@ -46,7 +46,6 @@ import org.h2.value.ValueStringIgnoreCase;
import org.h2.value.ValueTime; import org.h2.value.ValueTime;
import org.h2.value.ValueTimestamp; import org.h2.value.ValueTimestamp;
import org.h2.value.ValueTimestampTimeZone; import org.h2.value.ValueTimestampTimeZone;
import org.h2.value.ValueTimestampUtc;
import org.h2.value.ValueUuid; import org.h2.value.ValueUuid;
/** /**
...@@ -278,12 +277,6 @@ public class ValueDataType implements DataType { ...@@ -278,12 +277,6 @@ public class ValueDataType implements DataType {
putVarLong(nanos); putVarLong(nanos);
break; break;
} }
case Value.TIMESTAMP_UTC: {
ValueTimestampUtc ts = (ValueTimestampUtc) v;
long dateTimeValue = ts.getUtcDateTimeNanos();
buff.put((byte) type).putVarLong(dateTimeValue);
break;
}
case Value.TIMESTAMP_TZ: { case Value.TIMESTAMP_TZ: {
ValueTimestampTimeZone ts = (ValueTimestampTimeZone) v; ValueTimestampTimeZone ts = (ValueTimestampTimeZone) v;
long dateValue = ts.getDateValue(); long dateValue = ts.getDateValue();
...@@ -502,10 +495,6 @@ public class ValueDataType implements DataType { ...@@ -502,10 +495,6 @@ public class ValueDataType implements DataType {
long nanos = readVarLong(buff) * 1000000 + readVarLong(buff); long nanos = readVarLong(buff) * 1000000 + readVarLong(buff);
return ValueTimestamp.fromDateValueAndNanos(dateValue, nanos); return ValueTimestamp.fromDateValueAndNanos(dateValue, nanos);
} }
case Value.TIMESTAMP_UTC: {
long dateTimeValue = readVarLong(buff);
return ValueTimestampUtc.fromNanos(dateTimeValue);
}
case Value.TIMESTAMP_TZ: { case Value.TIMESTAMP_TZ: {
long dateValue = readVarLong(buff); long dateValue = readVarLong(buff);
long nanos = readVarLong(buff) * 1000000 + readVarLong(buff); long nanos = readVarLong(buff) * 1000000 + readVarLong(buff);
......
...@@ -50,7 +50,6 @@ import org.h2.value.ValueStringIgnoreCase; ...@@ -50,7 +50,6 @@ import org.h2.value.ValueStringIgnoreCase;
import org.h2.value.ValueTime; import org.h2.value.ValueTime;
import org.h2.value.ValueTimestamp; import org.h2.value.ValueTimestamp;
import org.h2.value.ValueTimestampTimeZone; import org.h2.value.ValueTimestampTimeZone;
import org.h2.value.ValueTimestampUtc;
import org.h2.value.ValueUuid; import org.h2.value.ValueUuid;
/** /**
...@@ -539,12 +538,6 @@ public class Data { ...@@ -539,12 +538,6 @@ public class Data {
} }
break; break;
} }
case Value.TIMESTAMP_UTC: {
ValueTimestampUtc ts = (ValueTimestampUtc) v;
writeByte((byte) type);
writeVarLong(ts.getUtcDateTimeNanos());
break;
}
case Value.TIMESTAMP_TZ: { case Value.TIMESTAMP_TZ: {
ValueTimestampTimeZone ts = (ValueTimestampTimeZone) v; ValueTimestampTimeZone ts = (ValueTimestampTimeZone) v;
writeByte((byte) type); writeByte((byte) type);
...@@ -787,9 +780,6 @@ public class Data { ...@@ -787,9 +780,6 @@ public class Data {
DateTimeUtils.getTimeUTCWithoutDst(readVarLong()), DateTimeUtils.getTimeUTCWithoutDst(readVarLong()),
readVarInt()); readVarInt());
} }
case Value.TIMESTAMP_UTC: {
return ValueTimestampUtc.fromNanos(readVarLong());
}
case Value.TIMESTAMP_TZ: { case Value.TIMESTAMP_TZ: {
long dateValue = readVarLong(); long dateValue = readVarLong();
long nanos = readVarLong(); long nanos = readVarLong();
...@@ -1044,10 +1034,6 @@ public class Data { ...@@ -1044,10 +1034,6 @@ public class Data {
return 1 + getVarLongLen(DateTimeUtils.getTimeLocalWithoutDst(ts)) + return 1 + getVarLongLen(DateTimeUtils.getTimeLocalWithoutDst(ts)) +
getVarIntLen(ts.getNanos() % 1000000); getVarIntLen(ts.getNanos() % 1000000);
} }
case Value.TIMESTAMP_UTC: {
ValueTimestampUtc ts = (ValueTimestampUtc) v;
return 1 + getVarLongLen(ts.getUtcDateTimeNanos());
}
case Value.TIMESTAMP_TZ: { case Value.TIMESTAMP_TZ: {
ValueTimestampTimeZone ts = (ValueTimestampTimeZone) v; ValueTimestampTimeZone ts = (ValueTimestampTimeZone) v;
long dateValue = ts.getDateValue(); long dateValue = ts.getDateValue();
......
...@@ -33,7 +33,6 @@ import org.h2.value.ValueString; ...@@ -33,7 +33,6 @@ import org.h2.value.ValueString;
import org.h2.value.ValueTime; import org.h2.value.ValueTime;
import org.h2.value.ValueTimestamp; import org.h2.value.ValueTimestamp;
import org.h2.value.ValueTimestampTimeZone; import org.h2.value.ValueTimestampTimeZone;
import org.h2.value.ValueTimestampUtc;
import org.h2.value.ValueUuid; import org.h2.value.ValueUuid;
/** /**
...@@ -296,8 +295,6 @@ public class Column { ...@@ -296,8 +295,6 @@ public class Column {
value = ValueInt.get(0).convertTo(type); value = ValueInt.get(0).convertTo(type);
} else if (dt.type == Value.TIMESTAMP) { } else if (dt.type == Value.TIMESTAMP) {
value = ValueTimestamp.fromMillis(session.getTransactionStart()); value = ValueTimestamp.fromMillis(session.getTransactionStart());
} else if (dt.type == Value.TIMESTAMP_UTC) {
value = ValueTimestampUtc.fromMillis(session.getTransactionStart());
} else if (dt.type == Value.TIMESTAMP_TZ) { } else if (dt.type == Value.TIMESTAMP_TZ) {
long ms = session.getTransactionStart(); long ms = session.getTransactionStart();
value = ValueTimestampTimeZone.fromDateValueAndNanos( value = ValueTimestampTimeZone.fromDateValueAndNanos(
......
...@@ -65,7 +65,7 @@ public class DataType { ...@@ -65,7 +65,7 @@ public class DataType {
*/ */
private static final ArrayList<DataType> TYPES = New.arrayList(); private static final ArrayList<DataType> TYPES = New.arrayList();
private static final HashMap<String, DataType> TYPES_BY_NAME = New.hashMap(); private static final HashMap<String, DataType> TYPES_BY_NAME = New.hashMap();
private static final ArrayList<DataType> TYPES_BY_VALUE_TYPE = New.arrayList(); private static final HashMap<Integer, DataType> TYPES_BY_VALUE_TYPE = New.hashMap();
/** /**
* The value type of this data type. * The value type of this data type.
...@@ -185,9 +185,6 @@ public class DataType { ...@@ -185,9 +185,6 @@ public class DataType {
} }
static { static {
for (int i = 0; i < Value.TYPE_COUNT; i++) {
TYPES_BY_VALUE_TYPE.add(null);
}
add(Value.NULL, Types.NULL, "Null", add(Value.NULL, Types.NULL, "Null",
new DataType(), new DataType(),
new String[]{"NULL"}, new String[]{"NULL"},
...@@ -316,13 +313,6 @@ public class DataType { ...@@ -316,13 +313,6 @@ public class DataType {
// 24 for ValueTimestamp, 32 for java.sql.Timestamp // 24 for ValueTimestamp, 32 for java.sql.Timestamp
56 56
); );
add(Value.TIMESTAMP_UTC, Types.TIMESTAMP, "TimestampUtc",
createDate(ValueTimestamp.PRECISION, "TIMESTAMP_UTC",
ValueTimestamp.DEFAULT_SCALE, ValueTimestamp.DISPLAY_SIZE),
new String[]{"TIMESTAMP_UTC"},
// 24 for ValueTimestampUtc, 32 for java.sql.Timestamp
56
);
add(Value.TIMESTAMP_TZ, Types.OTHER, "TimestampTimeZone", add(Value.TIMESTAMP_TZ, Types.OTHER, "TimestampTimeZone",
createDate(ValueTimestampTimeZone.PRECISION, "TIMESTAMP_TZ", createDate(ValueTimestampTimeZone.PRECISION, "TIMESTAMP_TZ",
ValueTimestampTimeZone.DEFAULT_SCALE, ValueTimestampTimeZone.DISPLAY_SIZE), ValueTimestampTimeZone.DEFAULT_SCALE, ValueTimestampTimeZone.DISPLAY_SIZE),
...@@ -388,11 +378,7 @@ public class DataType { ...@@ -388,11 +378,7 @@ public class DataType {
new String[]{"RESULT_SET"}, new String[]{"RESULT_SET"},
400 400
); );
for (int i = 0, size = TYPES_BY_VALUE_TYPE.size(); i < size; i++) { for (Integer i : TYPES_BY_VALUE_TYPE.keySet()) {
DataType dt = TYPES_BY_VALUE_TYPE.get(i);
if (dt == null) {
DbException.throwInternalError("unmapped type " + i);
}
Value.getOrder(i); Value.getOrder(i);
} }
} }
...@@ -428,7 +414,7 @@ public class DataType { ...@@ -428,7 +414,7 @@ public class DataType {
} }
TYPES_BY_NAME.put(dt.name, dt); TYPES_BY_NAME.put(dt.name, dt);
if (TYPES_BY_VALUE_TYPE.get(type) == null) { if (TYPES_BY_VALUE_TYPE.get(type) == null) {
TYPES_BY_VALUE_TYPE.set(type, dt); TYPES_BY_VALUE_TYPE.put(type, dt);
} }
TYPES.add(dt); TYPES.add(dt);
} }
...@@ -554,12 +540,6 @@ public class DataType { ...@@ -554,12 +540,6 @@ public class DataType {
ValueTimestamp.get(value); ValueTimestamp.get(value);
break; break;
} }
case Value.TIMESTAMP_UTC: {
Timestamp value = rs.getTimestamp(columnIndex);
v = value == null ? (Value) ValueNull.INSTANCE :
ValueTimestampUtc.fromMillisNanos(value.getTime(), value.getNanos());
break;
}
case Value.TIMESTAMP_TZ: { case Value.TIMESTAMP_TZ: {
TimestampWithTimeZone value = (TimestampWithTimeZone) rs.getObject(columnIndex); TimestampWithTimeZone value = (TimestampWithTimeZone) rs.getObject(columnIndex);
v = value == null ? (Value) ValueNull.INSTANCE : v = value == null ? (Value) ValueNull.INSTANCE :
...@@ -738,7 +718,6 @@ public class DataType { ...@@ -738,7 +718,6 @@ public class DataType {
// "java.sql.Date"; // "java.sql.Date";
return Date.class.getName(); return Date.class.getName();
case Value.TIMESTAMP: case Value.TIMESTAMP:
case Value.TIMESTAMP_UTC:
// "java.sql.Timestamp"; // "java.sql.Timestamp";
return Timestamp.class.getName(); return Timestamp.class.getName();
case Value.TIMESTAMP_TZ: case Value.TIMESTAMP_TZ:
......
...@@ -387,11 +387,6 @@ public class Transfer { ...@@ -387,11 +387,6 @@ public class Transfer {
} }
break; break;
} }
case Value.TIMESTAMP_UTC: {
ValueTimestampUtc ts = (ValueTimestampUtc) v;
writeLong(ts.getUtcDateTimeNanos());
break;
}
case Value.TIMESTAMP_TZ: { case Value.TIMESTAMP_TZ: {
ValueTimestampTimeZone ts = (ValueTimestampTimeZone) v; ValueTimestampTimeZone ts = (ValueTimestampTimeZone) v;
writeLong(ts.getDateValue()); writeLong(ts.getDateValue());
...@@ -585,9 +580,6 @@ public class Transfer { ...@@ -585,9 +580,6 @@ public class Transfer {
return ValueTimestamp.fromMillisNanos(readLong(), return ValueTimestamp.fromMillisNanos(readLong(),
readInt() % 1000000); readInt() % 1000000);
} }
case Value.TIMESTAMP_UTC: {
return ValueTimestampUtc.fromNanos(readLong());
}
case Value.TIMESTAMP_TZ: { case Value.TIMESTAMP_TZ: {
return ValueTimestampTimeZone.fromDateValueAndNanos(readLong(), return ValueTimestampTimeZone.fromDateValueAndNanos(readLong(),
readLong(), (short) readInt()); readLong(), (short) readInt());
......
...@@ -159,9 +159,8 @@ public abstract class Value { ...@@ -159,9 +159,8 @@ public abstract class Value {
*/ */
public static final int GEOMETRY = 22; public static final int GEOMETRY = 22;
/** /**
* The value type for TIMESTAMP UTC values. * 23 was a short-lived experiment "TIMESTAMP UTC" which has been removed.
*/ */
public static final int TIMESTAMP_UTC = 23;
/** /**
* The value type for TIMESTAMP WITH TIMEZONE values. * The value type for TIMESTAMP WITH TIMEZONE values.
*/ */
...@@ -170,7 +169,7 @@ public abstract class Value { ...@@ -170,7 +169,7 @@ public abstract class Value {
/** /**
* The number of value types. * The number of value types.
*/ */
public static final int TYPE_COUNT = TIMESTAMP_TZ + 1; public static final int TYPE_COUNT = TIMESTAMP_TZ;
private static SoftReference<Value[]> softCache = private static SoftReference<Value[]> softCache =
new SoftReference<Value[]>(null); new SoftReference<Value[]>(null);
...@@ -306,8 +305,6 @@ public abstract class Value { ...@@ -306,8 +305,6 @@ public abstract class Value {
return 31; return 31;
case TIMESTAMP: case TIMESTAMP:
return 32; return 32;
case TIMESTAMP_UTC:
return 33;
case TIMESTAMP_TZ: case TIMESTAMP_TZ:
return 34; return 34;
case BYTES: case BYTES:
...@@ -553,7 +550,6 @@ public abstract class Value { ...@@ -553,7 +550,6 @@ public abstract class Value {
case TIME: case TIME:
case DATE: case DATE:
case TIMESTAMP: case TIMESTAMP:
case TIMESTAMP_UTC:
case TIMESTAMP_TZ: case TIMESTAMP_TZ:
case BYTES: case BYTES:
case JAVA_OBJECT: case JAVA_OBJECT:
...@@ -572,7 +568,6 @@ public abstract class Value { ...@@ -572,7 +568,6 @@ public abstract class Value {
case INT: case INT:
return ValueByte.get(convertToByte(getInt())); return ValueByte.get(convertToByte(getInt()));
case LONG: case LONG:
case TIMESTAMP_UTC:
return ValueByte.get(convertToByte(getLong())); return ValueByte.get(convertToByte(getLong()));
case DECIMAL: case DECIMAL:
return ValueByte.get(convertToByte(convertToLong(getBigDecimal()))); return ValueByte.get(convertToByte(convertToLong(getBigDecimal())));
...@@ -597,7 +592,6 @@ public abstract class Value { ...@@ -597,7 +592,6 @@ public abstract class Value {
case INT: case INT:
return ValueShort.get(convertToShort(getInt())); return ValueShort.get(convertToShort(getInt()));
case LONG: case LONG:
case TIMESTAMP_UTC:
return ValueShort.get(convertToShort(getLong())); return ValueShort.get(convertToShort(getLong()));
case DECIMAL: case DECIMAL:
return ValueShort.get(convertToShort(convertToLong(getBigDecimal()))); return ValueShort.get(convertToShort(convertToLong(getBigDecimal())));
...@@ -622,7 +616,6 @@ public abstract class Value { ...@@ -622,7 +616,6 @@ public abstract class Value {
case SHORT: case SHORT:
return ValueInt.get(getShort()); return ValueInt.get(getShort());
case LONG: case LONG:
case TIMESTAMP_UTC:
return ValueInt.get(convertToInt(getLong())); return ValueInt.get(convertToInt(getLong()));
case DECIMAL: case DECIMAL:
return ValueInt.get(convertToInt(convertToLong(getBigDecimal()))); return ValueInt.get(convertToInt(convertToLong(getBigDecimal())));
...@@ -662,8 +655,6 @@ public abstract class Value { ...@@ -662,8 +655,6 @@ public abstract class Value {
} }
return ValueLong.get(Long.parseLong(getString(), 16)); return ValueLong.get(Long.parseLong(getString(), 16));
} }
case TIMESTAMP_UTC:
return ValueLong.get(getLong());
case TIMESTAMP_TZ: case TIMESTAMP_TZ:
throw DbException.get( throw DbException.get(
ErrorCode.DATA_CONVERSION_ERROR_1, getString()); ErrorCode.DATA_CONVERSION_ERROR_1, getString());
...@@ -682,7 +673,6 @@ public abstract class Value { ...@@ -682,7 +673,6 @@ public abstract class Value {
case INT: case INT:
return ValueDecimal.get(BigDecimal.valueOf(getInt())); return ValueDecimal.get(BigDecimal.valueOf(getInt()));
case LONG: case LONG:
case TIMESTAMP_UTC:
return ValueDecimal.get(BigDecimal.valueOf(getLong())); return ValueDecimal.get(BigDecimal.valueOf(getLong()));
case DOUBLE: { case DOUBLE: {
double d = getDouble(); double d = getDouble();
...@@ -718,7 +708,6 @@ public abstract class Value { ...@@ -718,7 +708,6 @@ public abstract class Value {
case INT: case INT:
return ValueDouble.get(getInt()); return ValueDouble.get(getInt());
case LONG: case LONG:
case TIMESTAMP_UTC:
return ValueDouble.get(getLong()); return ValueDouble.get(getLong());
case DECIMAL: case DECIMAL:
return ValueDouble.get(getBigDecimal().doubleValue()); return ValueDouble.get(getBigDecimal().doubleValue());
...@@ -741,7 +730,6 @@ public abstract class Value { ...@@ -741,7 +730,6 @@ public abstract class Value {
case INT: case INT:
return ValueFloat.get(getInt()); return ValueFloat.get(getInt());
case LONG: case LONG:
case TIMESTAMP_UTC:
return ValueFloat.get(getLong()); return ValueFloat.get(getLong());
case DECIMAL: case DECIMAL:
return ValueFloat.get(getBigDecimal().floatValue()); return ValueFloat.get(getBigDecimal().floatValue());
...@@ -763,9 +751,6 @@ public abstract class Value { ...@@ -763,9 +751,6 @@ public abstract class Value {
case TIMESTAMP: case TIMESTAMP:
return ValueDate.fromDateValue( return ValueDate.fromDateValue(
((ValueTimestamp) this).getDateValue()); ((ValueTimestamp) this).getDateValue());
case TIMESTAMP_UTC:
return ValueDate.fromMillis(
((ValueTimestampUtc) this).getUtcDateTimeMillis());
case TIMESTAMP_TZ: case TIMESTAMP_TZ:
return ValueDate.fromDateValue( return ValueDate.fromDateValue(
((ValueTimestampTimeZone) this).getDateValue()); ((ValueTimestampTimeZone) this).getDateValue());
...@@ -781,9 +766,6 @@ public abstract class Value { ...@@ -781,9 +766,6 @@ public abstract class Value {
case TIMESTAMP: case TIMESTAMP:
return ValueTime.fromNanos( return ValueTime.fromNanos(
((ValueTimestamp) this).getTimeNanos()); ((ValueTimestamp) this).getTimeNanos());
case TIMESTAMP_UTC:
return ValueTime.fromMillis(
((ValueTimestampUtc) this).getUtcDateTimeMillis());
case TIMESTAMP_TZ: case TIMESTAMP_TZ:
return ValueTime.fromNanos( return ValueTime.fromNanos(
((ValueTimestampTimeZone) this).getTimeNanos()); ((ValueTimestampTimeZone) this).getTimeNanos());
...@@ -798,10 +780,6 @@ public abstract class Value { ...@@ -798,10 +780,6 @@ public abstract class Value {
case DATE: case DATE:
return ValueTimestamp.fromDateValueAndNanos( return ValueTimestamp.fromDateValueAndNanos(
((ValueDate) this).getDateValue(), 0); ((ValueDate) this).getDateValue(), 0);
case TIMESTAMP_UTC:
return ValueTimestamp.fromMillisNanos(
((ValueTimestampUtc) this).getUtcDateTimeMillis(),
((ValueTimestampUtc) this).getNanosSinceLastMillis());
case TIMESTAMP_TZ: case TIMESTAMP_TZ:
return ValueTimestamp.fromDateValueAndNanos( return ValueTimestamp.fromDateValueAndNanos(
((ValueTimestampTimeZone) this).getDateValue(), ((ValueTimestampTimeZone) this).getDateValue(),
...@@ -809,34 +787,6 @@ public abstract class Value { ...@@ -809,34 +787,6 @@ public abstract class Value {
} }
break; break;
} }
case TIMESTAMP_UTC: {
switch (getType()) {
case BOOLEAN:
return ValueTimestampUtc.fromNanos(getBoolean().booleanValue() ? 1 : 0);
case BYTE:
return ValueTimestampUtc.fromNanos(getByte());
case SHORT:
return ValueTimestampUtc.fromNanos(getShort());
case INT:
return ValueTimestampUtc.fromNanos(getInt());
case LONG:
return ValueTimestampUtc.fromNanos(getLong());
case DECIMAL:
return ValueTimestampUtc.fromNanos(getBigDecimal().longValue());
case FLOAT:
return ValueTimestampUtc.fromNanos((long) getFloat());
case DOUBLE:
return ValueTimestampUtc.fromNanos((long) getDouble());
case TIMESTAMP:
return ValueTimestampUtc.fromMillisNanos(
((ValueTimestamp) this).getTimestamp().getTime(),
((ValueTimestamp) this).getTimestamp().getNanos());
case TIMESTAMP_TZ:
// TODO
throw DbException.getUnsupportedException("unimplemented");
}
break;
}
case BYTES: { case BYTES: {
switch (getType()) { switch (getType()) {
case JAVA_OBJECT: case JAVA_OBJECT:
...@@ -976,8 +926,6 @@ public abstract class Value { ...@@ -976,8 +926,6 @@ public abstract class Value {
return ValueDate.parse(s.trim()); return ValueDate.parse(s.trim());
case TIMESTAMP: case TIMESTAMP:
return ValueTimestamp.parse(s.trim()); return ValueTimestamp.parse(s.trim());
case TIMESTAMP_UTC:
return ValueTimestampUtc.parse(s.trim());
case TIMESTAMP_TZ: case TIMESTAMP_TZ:
return ValueTimestampTimeZone.parse(s.trim()); return ValueTimestampTimeZone.parse(s.trim());
case BYTES: case BYTES:
......
/*
* Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0, and the
* EPL 1.0 (http://h2database.com/html/license.html). Initial Developer: H2
* Group
*/
package org.h2.value;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;
import org.h2.message.DbException;
import org.h2.util.MathUtils;
import org.h2.util.StringUtils;
/**
* Implementation of the TIMESTAMP UTC data type.
*/
public final class ValueTimestampUtc extends Value {
/**
* The precision in digits.
*/
public static final int PRECISION = 23;
/**
* The display size of the textual representation of a timestamp. Example:
* 2001-01-01 23:59:59.000 UTC
*/
static final int DISPLAY_SIZE = 27;
/**
* The default scale for timestamps.
*/
static final int DEFAULT_SCALE = 10;
/**
* Time in nanoseconds since 1 Jan 1970 i.e. similar format to
* System.currentTimeMillis()
*/
private final long utcDateTimeNanos;
private ValueTimestampUtc(long utcDateTimeNanos) {
this.utcDateTimeNanos = utcDateTimeNanos;
}
/**
* Get or create a timestamp value for the given date/time in millis.
*
* @param utcDateTimeMillis the date and time in UTC milliseconds
* @param nanos the nanoseconds since the last millisecond
* @return the value
*/
public static ValueTimestampUtc fromMillisNanos(long utcDateTimeMillis, int nanos) {
if (nanos < 0 || nanos >= 1000 * 1000) {
throw new IllegalArgumentException("nanos out of range " + nanos);
}
return (ValueTimestampUtc) Value.cache(new ValueTimestampUtc(
utcDateTimeMillis * 1000 * 1000 + nanos));
}
/**
* Get or create a timestamp value for the given date/time in millis.
*
* @param ms the milliseconds
* @return the value
*/
public static ValueTimestampUtc fromMillis(long ms) {
return fromMillisNanos(ms, (short) 0);
}
/**
* Get or create a timestamp value for the given date/time in nanos.
*
* @param nanos the nanos
* @return the value
*/
public static ValueTimestampUtc fromNanos(long nanos) {
return (ValueTimestampUtc) Value.cache(new ValueTimestampUtc(nanos));
}
/**
* Parse a string to a ValueTimestamp. This method supports the format
* +/-year-month-day hour:minute:seconds.fractional and an optional timezone
* part.
*
* @param s the string to parse
* @return the date
*/
public static ValueTimestampUtc parse(String s) {
ValueTimestamp t1 = ValueTimestamp.parse(s);
java.sql.Timestamp t2 = t1.getTimestamp();
return fromMillisNanos(t2.getTime(), t2.getNanos());
}
/**
* Time in nanoseconds since 1 Jan 1970 i.e. similar format to
* System.currentTimeMillis().
*
* @return the number of milliseconds
*/
public long getUtcDateTimeNanos() {
return utcDateTimeNanos;
}
/**
* Time in milliseconds since 1 Jan 1970 i.e. same format as
* System.currentTimeMillis()
*
* @return the number of milliseconds
*/
public long getUtcDateTimeMillis() {
return utcDateTimeNanos / 1000 / 1000;
}
/**
* Get the number of nanoseconds since the last full millisecond.
*
* @return the number of nanoseconds
*/
int getNanosSinceLastMillis() {
return (int) (utcDateTimeNanos % (1000 * 1000));
}
@Override
public java.sql.Timestamp getTimestamp() {
java.sql.Timestamp ts = new java.sql.Timestamp(getUtcDateTimeMillis());
ts.setNanos(getNanosSinceLastMillis());
return ts;
}
@Override
public int getType() {
return Value.TIMESTAMP_UTC;
}
@Override
public String getString() {
Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
cal.setTimeInMillis(getUtcDateTimeMillis());
StringBuilder buff = new StringBuilder(DISPLAY_SIZE);
// date part
int y = cal.get(Calendar.YEAR);
int m = cal.get(Calendar.MONTH);
int d = cal.get(Calendar.DAY_OF_MONTH);
if (y > 0 && y < 10000) {
StringUtils.appendZeroPadded(buff, 4, y);
} else {
buff.append(y);
}
buff.append('-');
StringUtils.appendZeroPadded(buff, 2, m);
buff.append('-');
StringUtils.appendZeroPadded(buff, 2, d);
buff.append(' ');
// time part
long timeNanos = cal.get(Calendar.HOUR_OF_DAY);
timeNanos *= 24;
timeNanos += cal.get(Calendar.MINUTE);
timeNanos *= 60;
timeNanos += cal.get(Calendar.SECOND);
timeNanos *= 60;
timeNanos += cal.get(Calendar.MILLISECOND);
timeNanos *= 1000 * 1000;
timeNanos += getNanosSinceLastMillis();
ValueTime.appendTime(buff, timeNanos, true);
buff.append(" UTC");
return buff.toString();
}
@Override
public String getSQL() {
return "TIMESTAMP UTC '" + getString() + "'";
}
@Override
public long getPrecision() {
return PRECISION;
}
@Override
public int getScale() {
return DEFAULT_SCALE;
}
@Override
public int getDisplaySize() {
return DISPLAY_SIZE;
}
@Override
public Value convertScale(boolean onlyToSmallerScale, int targetScale) {
if (targetScale >= DEFAULT_SCALE) {
return this;
}
if (targetScale < 0) {
throw DbException.getInvalidValueException("scale", targetScale);
}
// TODO
// long n = timeNanos;
// BigDecimal bd = BigDecimal.valueOf(n);
// bd = bd.movePointLeft(9);
// bd = ValueDecimal.setScale(bd, targetScale);
// bd = bd.movePointRight(9);
// long n2 = bd.longValue();
// if (n2 == n) {
// return this;
// }
return this;
}
@Override
protected int compareSecure(Value o, CompareMode mode) {
ValueTimestampUtc t = (ValueTimestampUtc) o;
return MathUtils.compareLong(utcDateTimeNanos, t.utcDateTimeNanos);
}
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
} else if (!(other instanceof ValueTimestampUtc)) {
return false;
}
ValueTimestampUtc x = (ValueTimestampUtc) other;
return utcDateTimeNanos == x.utcDateTimeNanos;
}
@Override
public int hashCode() {
return (int) (utcDateTimeNanos ^ (utcDateTimeNanos >>> 32));
}
@Override
public Object getObject() {
return getTimestamp();
}
@Override
public long getLong() {
return utcDateTimeNanos;
}
@Override
public void set(PreparedStatement prep, int parameterIndex) throws SQLException {
prep.setTimestamp(parameterIndex, getTimestamp());
}
@Override
public Value add(Value v) {
ValueTimestampUtc t = (ValueTimestampUtc) v.convertTo(Value.TIMESTAMP_UTC);
long d1 = utcDateTimeNanos + t.utcDateTimeNanos;
return new ValueTimestampUtc(d1);
}
@Override
public Value subtract(Value v) {
ValueTimestampUtc t = (ValueTimestampUtc) v.convertTo(Value.TIMESTAMP_UTC);
long d1 = utcDateTimeNanos - t.utcDateTimeNanos;
return new ValueTimestampUtc(d1);
}
}
...@@ -207,7 +207,6 @@ import org.h2.test.unit.TestSort; ...@@ -207,7 +207,6 @@ import org.h2.test.unit.TestSort;
import org.h2.test.unit.TestStreams; import org.h2.test.unit.TestStreams;
import org.h2.test.unit.TestStringCache; import org.h2.test.unit.TestStringCache;
import org.h2.test.unit.TestStringUtils; import org.h2.test.unit.TestStringUtils;
import org.h2.test.unit.TestTimeStampUtc;
import org.h2.test.unit.TestTimeStampWithTimeZone; import org.h2.test.unit.TestTimeStampWithTimeZone;
import org.h2.test.unit.TestTools; import org.h2.test.unit.TestTools;
import org.h2.test.unit.TestTraceSystem; import org.h2.test.unit.TestTraceSystem;
...@@ -865,7 +864,6 @@ kill -9 `jps -l | grep "org.h2.test." | cut -d " " -f 1` ...@@ -865,7 +864,6 @@ kill -9 `jps -l | grep "org.h2.test." | cut -d " " -f 1`
addTest(new TestSort()); addTest(new TestSort());
addTest(new TestStreams()); addTest(new TestStreams());
addTest(new TestStringUtils()); addTest(new TestStringUtils());
addTest(new TestTimeStampUtc());
addTest(new TestTimeStampWithTimeZone()); addTest(new TestTimeStampWithTimeZone());
addTest(new TestTraceSystem()); addTest(new TestTraceSystem());
addTest(new TestUpgrade()); addTest(new TestUpgrade());
......
/*
* Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0, and the
* EPL 1.0 (http://h2database.com/html/license.html). Initial Developer: H2
* Group
*/
package org.h2.test.unit;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.h2.test.TestBase;
/**
*/
public class TestTimeStampUtc extends TestBase {
/**
* Run just this test.
*
* @param a ignored
*/
public static void main(String... a) throws Exception {
TestBase.createCaller().init().test();
}
@Override
public void test() throws SQLException {
deleteDb("timestamp_utc");
test1();
deleteDb("timestamp_utc");
}
private void test1() throws SQLException {
Connection conn = getConnection("timestamp_utc");
Statement stat = conn.createStatement();
stat.execute("create table test(id identity, t1 timestamp_utc)");
stat.execute("insert into test(t1) values(0)");
ResultSet rs = stat.executeQuery("select t1 from test");
rs.next();
assertEquals(0, rs.getLong(1));
assertEquals(new java.sql.Timestamp(0), rs.getTimestamp(1));
conn.close();
}
}
...@@ -68,8 +68,10 @@ public class TestValue extends TestBase { ...@@ -68,8 +68,10 @@ public class TestValue extends TestBase {
rs.addRow(new Object[]{null}); rs.addRow(new Object[]{null});
rs.next(); rs.next();
for (int type = Value.NULL; type < Value.TYPE_COUNT; type++) { for (int type = Value.NULL; type < Value.TYPE_COUNT; type++) {
Value v = DataType.readValue(null, rs, 1, type); if (type != 23) { // a defunct experimental type
assertTrue(v == ValueNull.INSTANCE); Value v = DataType.readValue(null, rs, 1, type);
assertTrue(v == ValueNull.INSTANCE);
}
} }
testResultSetOperation(new byte[0]); testResultSetOperation(new byte[0]);
testResultSetOperation(1); testResultSetOperation(1);
......
...@@ -47,7 +47,6 @@ import org.h2.value.ValueStringIgnoreCase; ...@@ -47,7 +47,6 @@ import org.h2.value.ValueStringIgnoreCase;
import org.h2.value.ValueTime; import org.h2.value.ValueTime;
import org.h2.value.ValueTimestamp; import org.h2.value.ValueTimestamp;
import org.h2.value.ValueTimestampTimeZone; import org.h2.value.ValueTimestampTimeZone;
import org.h2.value.ValueTimestampUtc;
import org.h2.value.ValueUuid; import org.h2.value.ValueUuid;
/** /**
...@@ -164,8 +163,6 @@ public class TestValueMemory extends TestBase implements DataHandler { ...@@ -164,8 +163,6 @@ public class TestValueMemory extends TestBase implements DataHandler {
return ValueDate.get(new java.sql.Date(random.nextLong())); return ValueDate.get(new java.sql.Date(random.nextLong()));
case Value.TIMESTAMP: case Value.TIMESTAMP:
return ValueTimestamp.fromMillis(random.nextLong()); return ValueTimestamp.fromMillis(random.nextLong());
case Value.TIMESTAMP_UTC:
return ValueTimestampUtc.fromMillis(random.nextLong());
case Value.TIMESTAMP_TZ: case Value.TIMESTAMP_TZ:
// clamp to max legal value // clamp to max legal value
long nanos = Math.max(Math.min(random.nextLong(), long nanos = Math.max(Math.min(random.nextLong(),
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论