📄 value.java
字号:
case BYTE:
return ValueShort.get(getByte());
case INT:
return ValueShort.get(convertToShort(getInt()));
case LONG:
return ValueShort.get(convertToShort(getLong()));
case DECIMAL:
return ValueShort.get(convertToShort(convertToLong(getBigDecimal())));
case DOUBLE:
return ValueShort.get(convertToShort(convertToLong(getDouble())));
case FLOAT:
return ValueShort.get(convertToShort(convertToLong(getFloat())));
}
break;
}
case INT: {
switch (getType()) {
case BOOLEAN:
return ValueInt.get(getBoolean().booleanValue() ? 1 : 0);
case BYTE:
return ValueInt.get(getByte());
case SHORT:
return ValueInt.get(getShort());
case LONG:
return ValueInt.get(convertToInt(getLong()));
case DECIMAL:
return ValueInt.get(convertToInt(convertToLong(getBigDecimal())));
case DOUBLE:
return ValueInt.get(convertToInt(convertToLong(getDouble())));
case FLOAT:
return ValueInt.get(convertToInt(convertToLong(getFloat())));
}
break;
}
case LONG: {
switch (getType()) {
case BOOLEAN:
return ValueLong.get(getBoolean().booleanValue() ? 1 : 0);
case BYTE:
return ValueLong.get(getByte());
case SHORT:
return ValueLong.get(getShort());
case INT:
return ValueLong.get(getInt());
case DECIMAL:
return ValueLong.get(convertToLong(getBigDecimal()));
case DOUBLE:
return ValueLong.get(convertToLong(getDouble()));
case FLOAT:
return ValueLong.get(convertToLong(getFloat()));
}
break;
}
case DECIMAL: {
// convert to string is required for JDK 1.4
switch (getType()) {
case BOOLEAN:
return ValueDecimal.get(new BigDecimal(getBoolean().booleanValue() ? "1" : "0"));
case BYTE:
return ValueDecimal.get(new BigDecimal("" + getByte()));
case SHORT:
return ValueDecimal.get(new BigDecimal("" + getShort()));
case INT:
return ValueDecimal.get(new BigDecimal("" + getInt()));
case LONG:
return ValueDecimal.get(new BigDecimal("" + getLong()));
case DOUBLE: {
double d = getDouble();
if (Double.isInfinite(d) || Double.isNaN(d)) {
throw Message.getSQLException(ErrorCode.DATA_CONVERSION_ERROR_1, "" + d);
}
return ValueDecimal.get(new BigDecimal(d));
}
case FLOAT: {
float f = getFloat();
if (Float.isInfinite(f) || Float.isNaN(f)) {
throw Message.getSQLException(ErrorCode.DATA_CONVERSION_ERROR_1, ""+f);
}
return ValueDecimal.get(new BigDecimal(f));
}
}
break;
}
case DOUBLE: {
switch (getType()) {
case BOOLEAN:
return ValueDouble.get(getBoolean().booleanValue() ? 1 : 0);
case BYTE:
return ValueDouble.get(getByte());
case SHORT:
return ValueDouble.get(getShort());
case INT:
return ValueDouble.get(getInt());
case LONG:
return ValueDouble.get(getLong());
case DECIMAL:
return ValueDouble.get(getBigDecimal().doubleValue());
case FLOAT:
return ValueDouble.get(getFloat());
}
break;
}
case FLOAT: {
switch (getType()) {
case BOOLEAN:
return ValueFloat.get(getBoolean().booleanValue() ? 1 : 0);
case BYTE:
return ValueFloat.get(getByte());
case SHORT:
return ValueFloat.get(getShort());
case INT:
return ValueFloat.get(getInt());
case LONG:
return ValueFloat.get(getLong());
case DECIMAL:
return ValueFloat.get(getBigDecimal().floatValue());
case DOUBLE:
return ValueFloat.get((float) getDouble());
}
break;
}
case DATE: {
switch (getType()) {
case TIME:
return ValueDate.get(new Date(getTimeNoCopy().getTime()));
case TIMESTAMP:
return ValueDate.get(new Date(getTimestampNoCopy().getTime()));
}
break;
}
case TIME: {
switch (getType()) {
case DATE:
// need to normalize the year, month and day
return ValueTime.get(new Time(getDateNoCopy().getTime()));
case TIMESTAMP:
// need to normalize the year, month and day
return ValueTime.get(new Time(getTimestampNoCopy().getTime()));
}
break;
}
case TIMESTAMP: {
switch (getType()) {
case TIME:
return ValueTimestamp.getNoCopy(new Timestamp(getTimeNoCopy().getTime()));
case DATE:
return ValueTimestamp.getNoCopy(new Timestamp(getDateNoCopy().getTime()));
}
break;
}
case BYTES: {
switch(getType()) {
case JAVA_OBJECT:
case BLOB:
case UUID:
return ValueBytes.getNoCopy(getBytesNoCopy());
}
break;
}
case JAVA_OBJECT: {
switch(getType()) {
case BYTES:
case BLOB:
return ValueBytes.getNoCopy(getBytesNoCopy());
}
break;
}
case BLOB: {
switch(getType()) {
case BYTES:
return ValueLob.createSmallLob(Value.BLOB, getBytesNoCopy());
}
break;
}
case UUID: {
switch(getType()) {
case BYTES:
return ValueUuid.get(getBytesNoCopy());
}
}
}
// conversion by parsing the string value
String s = getString();
try {
switch (type) {
case NULL:
return ValueNull.INSTANCE;
case BOOLEAN: {
if (s.equalsIgnoreCase("true") || s.equalsIgnoreCase("t") || s.equalsIgnoreCase("yes") || s.equalsIgnoreCase("y")) {
return ValueBoolean.get(true);
} else if (s.equalsIgnoreCase("false") || s.equalsIgnoreCase("f") || s.equalsIgnoreCase("no") || s.equalsIgnoreCase("n")) {
return ValueBoolean.get(false);
} else {
// convert to a number, and if it is not 0 then it is true
return ValueBoolean.get(new BigDecimal(s).signum() != 0);
}
}
case BYTE:
return ValueByte.get(MathUtils.decodeByte(s.trim()));
case SHORT:
return ValueShort.get(MathUtils.decodeShort(s.trim()));
case INT:
return ValueInt.get(MathUtils.decodeInt(s.trim()));
case LONG:
return ValueLong.get(MathUtils.decodeLong(s.trim()));
case DECIMAL:
return ValueDecimal.get(new BigDecimal(s.trim()));
case TIME:
return ValueTime.get(ValueTime.parseTime(s.trim()));
case DATE:
return ValueDate.get(ValueDate.parseDate(s.trim()));
case TIMESTAMP:
return ValueTimestamp.get(ValueTimestamp.parseTimestamp(s.trim()));
case BYTES:
return ValueBytes.getNoCopy(ByteUtils.convertStringToBytes(s.trim()));
case JAVA_OBJECT:
return ValueJavaObject.getNoCopy(ByteUtils.convertStringToBytes(s.trim()));
case STRING:
return ValueString.get(s);
case STRING_IGNORECASE:
return ValueStringIgnoreCase.get(s);
case STRING_FIXED:
return ValueStringFixed.get(s);
case DOUBLE:
return ValueDouble.get(Double.parseDouble(s.trim()));
case FLOAT:
return ValueFloat.get(Float.parseFloat(s.trim()));
case CLOB:
return ValueLob.createSmallLob(CLOB, StringUtils.utf8Encode(s));
case BLOB:
return ValueLob.createSmallLob(BLOB, ByteUtils.convertStringToBytes(s.trim()));
case ARRAY:
return ValueArray.get(new Value[]{ValueString.get(s)});
case RESULT_SET: {
SimpleResultSet rs = new SimpleResultSet();
rs.addColumn("X", Types.VARCHAR, s.length(), 0);
rs.addRow(new String[]{s});
return ValueResultSet.get(rs);
}
case UUID:
return ValueUuid.get(s);
default:
throw Message.getInternalError("type=" + type);
}
} catch (NumberFormatException e) {
throw Message.getSQLException(ErrorCode.DATA_CONVERSION_ERROR_1, new String[] { s }, e);
}
}
public final int compareTypeSave(Value v, CompareMode mode) throws SQLException {
if (this == ValueNull.INSTANCE) {
return v == ValueNull.INSTANCE ? 0 : -1;
} else if (v == ValueNull.INSTANCE) {
return 1;
}
return compareSecure(v, mode);
}
public final boolean compareEqual(Value v) throws SQLException {
if (this == ValueNull.INSTANCE) {
return v == ValueNull.INSTANCE;
} else if (v == ValueNull.INSTANCE) {
return false;
}
if (getType() == v.getType()) {
return equals(v);
}
int t2 = Value.getHigherOrder(getType(), v.getType());
return convertTo(t2).equals(v.convertTo(t2));
}
public final int compareTo(Value v, CompareMode mode) throws SQLException {
if (this == ValueNull.INSTANCE) {
return v == ValueNull.INSTANCE ? 0 : -1;
} else if (v == ValueNull.INSTANCE) {
return 1;
}
if (getType() == v.getType()) {
return compareSecure(v, mode);
}
int t2 = Value.getHigherOrder(getType(), v.getType());
return convertTo(t2).compareSecure(v.convertTo(t2), mode);
}
public int getScale() {
return 0;
}
public Value convertScale(boolean onlyToSmallerScale, int targetScale) throws SQLException {
return this;
}
public Value convertPrecision(long precision) throws SQLException {
return this;
}
private byte convertToByte(long x) throws SQLException {
if (x > Byte.MAX_VALUE || x < Byte.MIN_VALUE) {
throw Message.getSQLException(ErrorCode.NUMERIC_VALUE_OUT_OF_RANGE);
}
return (byte) x;
}
private short convertToShort(long x) throws SQLException {
if (x > Short.MAX_VALUE || x < Short.MIN_VALUE) {
throw Message.getSQLException(ErrorCode.NUMERIC_VALUE_OUT_OF_RANGE);
}
return (short) x;
}
private int convertToInt(long x) throws SQLException {
if (x > Integer.MAX_VALUE || x < Integer.MIN_VALUE) {
throw Message.getSQLException(ErrorCode.NUMERIC_VALUE_OUT_OF_RANGE);
}
return (int) x;
}
private long convertToLong(double x) throws SQLException {
if (x > Long.MAX_VALUE || x < Long.MIN_VALUE) {
// TODO document that +Infinity, -Infinity throw an exception and NaN returns 0
throw Message.getSQLException(ErrorCode.NUMERIC_VALUE_OUT_OF_RANGE);
}
if (Constants.CONVERT_TO_LONG_ROUND) {
return Math.round(x);
} else {
return (long) x;
}
}
private long convertToLong(BigDecimal x) throws SQLException {
if (x.compareTo(MAX_LONG_DECIMAL) > 0 || x.compareTo(Value.MIN_LONG_DECIMAL) < 0) {
throw Message.getSQLException(ErrorCode.NUMERIC_VALUE_OUT_OF_RANGE);
}
if (Constants.CONVERT_TO_LONG_ROUND) {
return x.setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
} else {
return x.longValue();
}
}
public Value link(DataHandler handler, int tableId) throws SQLException {
return this;
}
public boolean isLinked() {
return false;
}
public void unlink() throws SQLException {
}
public boolean isFileBased() {
return false;
}
public void close() throws SQLException {
}
public boolean checkPrecision(long precision) {
return getPrecision() <= precision;
}
public String toString() {
return getSQL();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -