/* Copyright (c) 2001-2009, The HSQL Development Group
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of the HSQL Development Group nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.hsqldb.types;
import org.hsqldb.Error;
import org.hsqldb.ErrorCode;
import org.hsqldb.HsqlNameManager.HsqlName;
import org.hsqldb.SchemaObject;
import org.hsqldb.Session;
import org.hsqldb.SessionInterface;
import org.hsqldb.Types;
import org.hsqldb.lib.IntValueHashMap;
import org.hsqldb.lib.OrderedHashSet;
import org.hsqldb.rights.Grantee;
import org.hsqldb.store.ValuePool;
import org.hsqldb.lib.HashSet;
/**
* Base class for type objects.<p>
*
* @author Fred Toussi (fredt@users dot sourceforge.net)
* @version 1.9.0
* @since 1.9.0
*/
public abstract class Type implements SchemaObject, Cloneable {
public final static Type[] emptyArray = new Type[]{};
//
public final int typeComparisonGroup;
public final int typeCode;
public final long precision;
public final int scale;
public UserTypeModifier userTypeModifier;
//
Type(int typeGroup, int type, long precision, int scale) {
this.typeComparisonGroup = typeGroup;
this.typeCode = type;
this.precision = precision;
this.scale = scale;
}
// interface specific methods
public final int getType() {
if (userTypeModifier == null) {
throw Error.runtimeError(ErrorCode.U_S0500, "Type");
}
return userTypeModifier.getType();
}
public final HsqlName getName() {
if (userTypeModifier == null) {
throw Error.runtimeError(ErrorCode.U_S0500, "Type");
}
return userTypeModifier.getName();
}
public final HsqlName getCatalogName() {
if (userTypeModifier == null) {
throw Error.runtimeError(ErrorCode.U_S0500, "Type");
}
return userTypeModifier.getSchemaName().schema;
}
public final HsqlName getSchemaName() {
if (userTypeModifier == null) {
throw Error.runtimeError(ErrorCode.U_S0500, "Type");
}
return userTypeModifier.getSchemaName();
}
public final Grantee getOwner() {
if (userTypeModifier == null) {
throw Error.runtimeError(ErrorCode.U_S0500, "Type");
}
return userTypeModifier.getOwner();
}
public final OrderedHashSet getReferences() {
if (userTypeModifier == null) {
throw Error.runtimeError(ErrorCode.U_S0500, "Type");
}
return userTypeModifier.getReferences();
}
public final OrderedHashSet getComponents() {
if (userTypeModifier == null) {
throw Error.runtimeError(ErrorCode.U_S0500, "Type");
}
return userTypeModifier.getComponents();
}
public final void compile(Session session) {
if (userTypeModifier == null) {
throw Error.runtimeError(ErrorCode.U_S0500, "Type");
}
userTypeModifier.compile(session);
}
/**
* Retrieves the SQL character sequence required to (re)create the
* trigger, as a StringBuffer
*
* @return the SQL character sequence required to (re)create the
* trigger
*/
public String getSQL() {
if (userTypeModifier == null) {
throw Error.runtimeError(ErrorCode.U_S0500, "Type");
}
return userTypeModifier.getSQL();
}
public Type duplicate() {
try {
return (Type) clone();
} catch (CloneNotSupportedException e) {
throw Error.runtimeError(ErrorCode.U_S0500, "Type");
}
}
public abstract int displaySize();
/**
* Returns the JDBC type number of type, if it exists,
* otherwise the HSQLDB / SQL type.
*/
public abstract int getJDBCTypeCode();
/**
* Returns the JDBC class name of type, if it exists,
* otherwise the HSQLDB class name.
*/
public abstract String getJDBCClassName();
public Integer getJDBCScale() {
return acceptsScale() ? ValuePool.getInt(scale)
: null;
}
public Integer getJDBCPrecision() {
return precision > Integer.MAX_VALUE
? ValuePool.getInt(Integer.MAX_VALUE)
: ValuePool.INTEGER_0;
}
/**
* Returns the generic SQL CLI type number of type, if it exists,
* otherwise the HSQLDB type. The generic type is returned for DATETIME
* and INTERVAL types.
*/
public int getSQLGenericTypeCode() {
return typeCode;
}
/**
* Returns the name of the type
*/
public abstract String getNameString();
/**
* Returns the name of the type
*/
public String getFullNameString() {
return getNameString();
}
/**
* Returns the full definition of the type, including parameters
*/
abstract String getDefinition();
public final String getTypeDefinition() {
if (userTypeModifier == null) {
return getDefinition();
}
return getName().getSchemaQualifiedStatementName();
}
public abstract int compare(Object a, Object b);
public abstract Object convertToTypeLimits(SessionInterface session,
Object a);
/**
* Explicit casts are handled by this method.
* SQL standard 6.12 rules for enforcement of size, precision and scale
* are implemented. For CHARACTER values, it performs truncation in all
* cases of long strings.
*/
public Object castToType(SessionInterface session, Object a, Type type) {
return convertToType(session, a, type);
}
/**
* Same as castToType except for CHARACTER values. Perform string
* truncation of trailing spaces only. For other long strings, it raises
* an exception.
*/
public abstract Object convertToType(SessionInterface session, Object a,
Type type);
/**
* Convert type for JDBC. Same as convertToType, but supports non-standard
* SQL conversions supported by JDBC
*/
public Object convertToTypeJDBC(SessionInterface session, Object a,
Type type) {
return convertToType(session, a, type);
}
public Object convertJavaToSQL(SessionInterface session, Object a) {
return a;
}
public Object convertSQLToJava(SessionInterface session, Object a) {
return a;
}
/**
* Converts the object to the given type. Used for JDBC conversions.
*/
public abstract Object convertToDefaultType(
SessionInterface sessionInterface, Object o);
public abstract String convertToString(Object a);
public abstract String convertToSQLString(Object a);
public abstract boolean canConvertFrom(Type otherType);
public boolean isDistinctType() {
return userTypeModifier == null ? false
: userTypeModifier.schemaObjectType
== SchemaObject.TYPE;
}
public boolean isStructuredType() {
return false;
}
public boolean isDomainType() {
return userTypeModifier == null ? false
: userTypeModifier.schemaObjectType
== SchemaObject.DOMAIN;
}
public boolean isCharacterType() {
return false;
}
public boolean isNumberType() {
return false;
}
public boolean isIntegralType() {
return false;
}
public boolean isExactNumberType() {
return false;
}
public boolean isDateTimeType() {
return false;
}
public boolean isDateTimeTypeWithZone() {
return false;
}
public boolean isIntervalType() {
return false;
}
public boolean isBinaryType() {
return false;
}
public boolean isBooleanType() {
return false;
}
public boolean isLobType() {
return false;
}
public boolean isBitType() {
return false;
}
public boolean isObjectType() {
return false;
}
public boolean acceptsPrecision() {
return false;
}
public boolean requiresPrecision() {
return false;
}
public boolean acceptsFractionalPrecision() {
return false;
}
public boolean acceptsScale() {
return false;
}
public int precedenceDegree(Type other) {
if (other.typeCode == typeCode) {
return 0;
}
return Integer.MIN_VALUE;
}
/**
* Common type used in comparison opertions. other must be comparable
* with this.
*/
public abstract Type getAggregateType(Type other);
/**
* Result type of combining values of two types in different opertions.
* other type is not allways comparable with this, but a operation should
* be valid without any explicit CAST
*/
public abstract Type getCombinedType(Type other, int operation);
public int compareToTypeRange(Object o) {
return 0;
}
/**
* All arithmetic ops are called on the pre-determined Type object of the result
*/
public Object absolute(Object a) {
throw Error.runtimeError(ErrorCode.U_S0500, "Type");
}
public Object negate(Object a) {
throw Error.runtimeError(ErrorCode.U_S0500, "Type");
}
public Object add(Object a, Object b, Type otherType) {
throw Error.runtimeError(ErrorCode.U_S0500, "Type");
}
public Object subtract(Object a, Object b, Type otherType) {
throw Error.runtimeError(ErrorCode.U_S0500, "Type");
}
public Object multiply(Object a, Object b) {
throw Error.runtimeError(ErrorCode.U_S0500, "Type");
}
public Object divide(Object a, Object b) {
throw Error.runtimeError(ErrorCode.U_S0500, "Type");
}
public Object concat(Session session, Object a, Object b) {
throw Error.runtimeError(ErrorCode.U_S0500, "Type");
}
@Override
public boolean equals(Object other) {
if (other == this) {
return true;
}
if (other instanceof Type) {
return ((Type) other).typeCode == typeCode
&& ((Type) other).precision == precision
&& ((Type) other).scale == scale
&& ((Type) other).userTypeModifier == userTypeModifier;
}
return false;
}
@Override
public int hashCode() {
return typeCode + (int) precision << 8 + scale << 16;
}
/** @todo 1.9.0 - review all needs max implementation defined lengths, used for parameters */
// null type
public static final Type SQL_ALL_TYPES = NullType.getNullType();
// character types
public static final Type SQL_CHAR = new CharacterType(Types.SQL_CHAR, 0);
public static final Type SQL_VARCHAR = new CharacterType(Types.SQL_VARCHAR,
0);
public static final Type SQL_CHAR_DEFAULT =
new CharacterType(Types.SQL_CHAR, 32 * 1024);
public static final Type SQL_VARCHAR_DEFAULT =
new CharacterType(Types.SQL_VARCHAR, 32 * 1024);
public static final ClobType SQL_CLOB = new ClobType();
public static final Type VARCHAR_IGNORECASE =
new CharacterType(Types.VARCHAR_IGNORECASE, 0);
// binary types
public static final BitType SQL_BIT = new BitType(Types.SQL_BIT, 0);
public static final BitType SQL_BIT_VARYING =
new BitType(Types.SQL_BIT_VARYING, 0);
public static final BitType SQL_BIT_VARYING_MAX_LENGTH =
new BitType(Types.SQL_BIT_VARYING, 32 * 1024);
// binary types
public static final BinaryType SQL_BINARY =
new BinaryType(Types.SQL_BINARY, 0);
public static final BinaryType SQL_BINARY_DEFAULT =
new BinaryType(Types.SQL_BINARY, 32 * 1024);
public static final BinaryType SQL_VARBINARY =
new BinaryType(Types.SQL_VARBINARY, 0);
public static final BinaryType SQL_VARBINARY_DEFAULT =
new BinaryType(Types.SQL_VARBINARY, 32 * 1024);
public static final BlobType SQL_BLOB = new BlobType();
// other type
public static final OtherType OTHER = OtherType.getOtherType();
// boolean type
public static final BooleanType SQL_BOOLEAN = BooleanType.getBooleanType();
// number types
public static final NumberType SQL_NUMERIC =
new NumberType(Types.SQL_NUMERIC, NumberType.defaultNumericPrecision,
0);
public static final NumberType SQL_DECIMAL =
new NumberType(Types.SQL_DECIMAL, NumberType.defaultNumericPrecision,
7);
public static final NumberType SQL_DECIMAL_BIGINT_SQR =
new NumberType(Types.SQL_DECIMAL,
NumberType.bigintSquareNumericPrecision, 0);
public static final NumberType SQL_DOUBLE =
new NumberType(Types.SQL_DOUBLE, NumberType.doublePrecision, 8);
//
public static final NumberType TINYINT = new NumberType(Types.TINYINT,
NumberType.tinyintPrecision, 1);
public static final NumberType SQL_SMALLINT =
new NumberType(Types.SQL_SMALLINT, NumberType.smallintPrecision, 2);
public static final NumberType SQL_INTEGER =
new NumberType(Types.SQL_INTEGER, NumberType.integerPrecision, 4);
public static final NumberType SQL_BIGINT =
new NumberType(Types.SQL_BIGINT, NumberType.bigintPrecision, 8);
// date time
public static final DateTimeType SQL_DATE =
new DateTimeType(Types.SQL_TIMESTAMP, Types.SQL_DATE, 0);
public static final DateTimeType SQL_TIME =
new DateTimeType(Types.SQL_TIME, Types.SQL_TIME,
DTIType.defaultTimeFractionPrecision);
public static final DateTimeType SQL_TIME_WITH_TIME_ZONE =
new DateTimeType(Types.SQL_TIME, Types.SQL_TIME_WITH_TIME_ZONE,
DTIType.defaultTimeFractionPrecision);
public static final DateTimeType SQL_TIMESTAMP =
new DateTimeType(Types.SQL_TIMESTAMP, Types.SQL_TIMESTAMP,
8);
public static final DateTimeType SQL_TIMESTAMP_WITH_TIME_ZONE =
new DateTimeType(Types.SQL_TIMESTAMP,
Types.SQL_TIMESTAMP_WITH_TIME_ZONE,
DTIType.defaultTimestampFractionPrecision);
public static final DateTimeType SQL_TIMESTAMP_NO_FRACTION =
new DateTimeType(Types.SQL_TIMESTAMP, Types.SQL_TIMESTAMP, 0);
// interval
public static final IntervalType SQL_INTERVAL_YEAR =
IntervalType.newIntervalType(Types.SQL_INTERVAL_YEAR,
DTIType.defaultIntervalPrecision, 0);
public static final IntervalType SQL_INTERVAL_MONTH =
IntervalType.newIntervalType(Types.SQL_INTERVAL_MONTH,
DTIType.defaultIntervalPrecision, 0);
public static final IntervalType SQL_INTERVAL_DAY =
IntervalType.newIntervalType(Types.SQL_INTERVAL_DAY,
DTIType.defaultIntervalPrecision, 0);
public static final IntervalType SQL_INTERVAL_HOUR =
IntervalType.newIntervalType(Types.SQL_INTERVAL_HOUR,
DTIType.defaultIntervalPrecision, 0);
public static final IntervalType SQL_INTERVAL_MINUTE =
IntervalType.newIntervalType(Types.SQL_INTERVAL_MINUTE,
DTIType.defaultIntervalPrecision, 0);
public static final IntervalType SQL_INTERVAL_SECOND =
IntervalType.newIntervalType(Types.SQL_INTERVAL_SECOND,
DTIType.defaultIntervalPrecision,
DTIType.defaultIntervalFractionPrecision);
public static final IntervalType SQL_INTERVAL_SECOND_MAX_FRACTION =
IntervalType.newIntervalType(Types.SQL_INTERVAL_SECOND,
DTIType.defaultIntervalPrecision,
DTIType.maxFractionPrecision);
public static final IntervalType SQL_INTERVAL_YEAR_TO_MONTH =
IntervalType.newIntervalType(Types.SQL_INTERVAL_YEAR_TO_MONTH,
DTIType.defaultIntervalPrecision, 0);
public static final IntervalType SQL_INTERVAL_DAY_TO_HOUR =
IntervalType.newIntervalType(Types.SQL_INTERVAL_DAY_TO_HOUR,
DTIType.defaultIntervalPrecision, 0);
public static final IntervalType SQL_INTERVAL_DAY_TO_MINUTE =
IntervalType.newIntervalType(Types.SQL_INTERVAL_DAY_TO_MINUTE,
DTIType.defaultIntervalPrecision, 0);
public static final IntervalType SQL_INTERVAL_DAY_TO_SECOND =
IntervalType.newIntervalType(Types.SQL_INTERVAL_DAY_TO_SECOND,
DTIType.defaultIntervalPrecision,
DTIType.defaultIntervalFractionPrecision);
public static final IntervalType SQL_INTERVAL_HOUR_TO_MINUTE =
IntervalType.newIntervalType(Types.SQL_INTERVAL_HOUR_TO_MINUTE,
DTIType.defaultIntervalPrecision, 0);
public static final IntervalType SQL_INTERVAL_HOUR_TO_SECOND =
IntervalType.newIntervalType(Types.SQL_INTERVAL_HOUR_TO_SECOND,
DTIType.defaultIntervalPrecision,
DTIType.defaultIntervalFractionPrecision);
public static final IntervalType SQL_INTERVAL_MINUTE_TO_SECOND =
IntervalType.newIntervalType(Types.SQL_INTERVAL_MINUTE_TO_SECOND,
DTIType.defaultIntervalPrecision,
DTIType.defaultIntervalFractionPrecision);
//
public static final IntervalType SQL_INTERVAL_YEAR_MAX_PRECISION =
IntervalType.newIntervalType(Types.SQL_INTERVAL_YEAR,
DTIType.maxIntervalPrecision, 0);
public static final IntervalType SQL_INTERVAL_MONTH_MAX_PRECISION =
IntervalType.newIntervalType(Types.SQL_INTERVAL_MONTH,
DTIType.maxIntervalPrecision, 0);
public static final IntervalType SQL_INTERVAL_DAY_MAX_PRECISION =
IntervalType.newIntervalType(Types.SQL_INTERVAL_DAY,
DTIType.maxIntervalPrecision, 0);
public static final IntervalType SQL_INTERVAL_HOUR_MAX_PRECISION =
IntervalType.newIntervalType(Types.SQL_INTERVAL_HOUR,
DTIType.maxIntervalPrecision, 0);
public static final IntervalType SQL_INTERVAL_MINUTE_MAX_PRECISION =
IntervalType.newIntervalType(Types.SQL_INTERVAL_MINUTE,
DTIType.maxIntervalPrecision, 0);
public static final IntervalType SQL_INTERVAL_SECOND_MAX_PRECISION =
IntervalType.newIntervalType(Types.SQL_INTERVAL_SECOND,
DTIType.maxIntervalPrecision,
DTIType.defaultIntervalFractionPrecision);
public static final IntervalType SQL_INTERVAL_SECOND_MAX_FRACTION_MAX_PRECISION =
IntervalType.newIntervalType(Types.SQL_INTERVAL_SECOND,
DTIType.maxIntervalPrecision,
DTIType.maxFractionPrecision);
public static Type getDefaultType(int type) {
try {
return getType(type, 0, 0, 0);
} catch (Exception e) {
return null;
}
}
public static Type getDefaultTypeWithSize(int type) {
switch (type) {
case Types.SQL_ALL_TYPES :
return SQL_ALL_TYPES;
// return SQL_ALL_TYPES; // needs changes to Expression type resolution
case Types.SQL_CHAR :
return SQL_CHAR_DEFAULT;
case Types.SQL_VARCHAR :
return SQL_VARCHAR_DEFAULT;
case Types.VARCHAR_IGNORECASE :
return VARCHAR_IGNORECASE;
case Types.SQL_CLOB :
return SQL_CLOB;
case Types.SQL_INTEGER :
return SQL_INTEGER;
case Types.SQL_SMALLINT :
return SQL_SMALLINT;
case Types.SQL_BIGINT :
return SQL_BIGINT;
case Types.TINYINT :
return TINYINT;
case Types.SQL_FLOAT :
case Types.SQL_REAL :
case Types.SQL_DOUBLE :
return SQL_DOUBLE;
case Types.SQL_NUMERIC :
return SQL_NUMERIC;
case Types.SQL_DECIMAL :
return SQL_DECIMAL;
case Types.SQL_BOOLEAN :
return SQL_BOOLEAN;
case Types.SQL_BINARY :
return SQL_BINARY_DEFAULT;
case Types.SQL_VARBINARY :
return SQL_VARBINARY_DEFAULT;
case Types.SQL_BLOB :
return SQL_BLOB;
case Types.SQL_BIT :
return SQL_BIT;
case Types.SQL_BIT_VARYING :
return SQL_BIT_VARYING;
case Types.SQL_DATE :
return SQL_DATE;
case Types.SQL_TIME :
return SQL_TIME;
case Types.SQL_TIME_WITH_TIME_ZONE :
return SQL_TIME_WITH_TIME_ZONE;
case Types.SQL_TIMESTAMP :
return SQL_TIMESTAMP;
case Types.SQL_TIMESTAMP_WITH_TIME_ZONE :
return SQL_TIMESTAMP_WITH_TIME_ZONE;
case Types.SQL_INTERVAL_YEAR :
return SQL_INTERVAL_YEAR;
case Types.SQL_INTERVAL_YEAR_TO_MONTH :
return SQL_INTERVAL_YEAR_TO_MONTH;
case Types.SQL_INTERVAL_MONTH :
return SQL_INTERVAL_MONTH;
case Types.SQL_INTERVAL_DAY :
return SQL_INTERVAL_DAY;
case Types.SQL_INTERVAL_DAY_TO_HOUR :
return SQL_INTERVAL_DAY_TO_HOUR;
case Types.SQL_INTERVAL_DAY_TO_MINUTE :
return SQL_INTERVAL_DAY_TO_MINUTE;
case Types.SQL_INTERVAL_DAY_TO_SECOND :
return SQL_INTERVAL_DAY_TO_SECOND;
case Types.SQL_INTERVAL_HOUR :
return SQL_INTERVAL_HOUR;
case Types.SQL_INTERVAL_HOUR_TO_MINUTE :
return SQL_INTERVAL_HOUR_TO_MINUTE;
case Types.SQL_INTERVAL_HOUR_TO_SECOND :
return SQL_INTERVAL_HOUR_TO_SECOND;
case Types.SQL_INTERVAL_MINUTE :
return SQL_INTERVAL_MINUTE;
case Types.SQL_INTERVAL_MINUTE_TO_SECOND :
return SQL_INTERVAL_MINUTE_TO_SECOND;
case Types.SQL_INTERVAL_SECOND :
return SQL_INTERVAL_SECOND;
case Types.OTHER :
return OTHER;
default :
throw Error.runtimeError(ErrorCode.U_S0500, "Type");
}
}
public static int getHSQLDBTypeCode(int jdbcTypeNumber) {
switch (jdbcTypeNumber) {
case Types.BIGINT :
return Types.SQL_BIGINT;
case Types.LONGVARCHAR :
return Types.SQL_VARCHAR;
case Types.CLOB :
return Types.SQL_CLOB;
case Types.BINARY :
return Types.SQL_BINARY;
case Types.BIT :
return Types.SQL_BIT_VARYING;
case Types.VARBINARY :
case Types.LONGVARBINARY :
return Types.SQL_VARBINARY;
case Types.BLOB :
return Types.SQL_BLOB;
default :
return jdbcTypeNumber;
}
}
/**
* translate an internal type number to JDBC type number if a type is not
* supported internally, it is returned without translation
*
* @param type int
* @return int
*/
public static int getJDBCTypeCode(int type) {
switch (type) {
case Types.SQL_BLOB :
return Types.BLOB;
case Types.SQL_CLOB :
return Types.CLOB;
case Types.SQL_BIGINT :
return Types.BIGINT;
case Types.SQL_BINARY :
return Types.BINARY;
case Types.SQL_VARBINARY :
return Types.VARBINARY;
case Types.SQL_BIT :
case Types.SQL_BIT_VARYING :
return Types.BIT;
default :
return type;
}
}
/**
* Enforces precision and scale limits on type
*/
public static Type getType(int type, int collation, long precision,
int scale) {
switch (type) {
case Types.SQL_ALL_TYPES :
return SQL_ALL_TYPES;
// return SQL_ALL_TYPES; // needs changes to Expression type resolution
case Types.SQL_CHAR :
case Types.SQL_VARCHAR :
case Types.VARCHAR_IGNORECASE :
case Types.SQL_CLOB :
return CharacterType.getCharacterType(type, precision);
case Types.SQL_INTEGER :
return SQL_INTEGER;
case Types.SQL_SMALLINT :
return SQL_SMALLINT;
case Types.SQL_BIGINT :
return SQL_BIGINT;
case Types.TINYINT :
return TINYINT;
case Types.SQL_FLOAT :
if (precision > 53) {
throw Error.error(ErrorCode.X_42592, "" + precision);
}
// fall through
case Types.SQL_REAL :
case Types.SQL_DOUBLE :
return SQL_DOUBLE;
case Types.SQL_NUMERIC :
case Types.SQL_DECIMAL :
if (precision == 0) {
precision = NumberType.defaultNumericPrecision;
}
return NumberType.getNumberType(type, precision, 7);
case Types.SQL_BOOLEAN :
return SQL_BOOLEAN;
case Types.SQL_BINARY :
case Types.SQL_VARBINARY :
case Types.SQL_BLOB :
return BinaryType.getBinaryType(type, precision);
case Types.SQL_BIT :
case Types.SQL_BIT_VARYING :
return BitType.getBitType(type, precision);
case Types.SQL_DATE :
case Types.SQL_TIME :
case Types.SQL_TIME_WITH_TIME_ZONE :
case Types.SQL_TIMESTAMP :
case Types.SQL_TIMESTAMP_WITH_TIME_ZONE :
return DateTimeType.getDateTimeType(type, scale);
case Types.SQL_INTERVAL_YEAR :
case Types.SQL_INTERVAL_YEAR_TO_MONTH :
case Types.SQL_INTERVAL_MONTH :
case Types.SQL_INTERVAL_DAY :
case Types.SQL_INTERVAL_DAY_TO_HOUR :
case Types.SQL_INTERVAL_DAY_TO_MINUTE :
case Types.SQL_INTERVAL_DAY_TO_SECOND :
case Types.SQL_INTERVAL_HOUR :
case Types.SQL_INTERVAL_HOUR_TO_MINUTE :
case Types.SQL_INTERVAL_HOUR_TO_SECOND :
case Types.SQL_INTERVAL_MINUTE :
case Types.SQL_INTERVAL_MINUTE_TO_SECOND :
case Types.SQL_INTERVAL_SECOND :
return IntervalType.getIntervalType(type, precision, scale);
case Types.OTHER :
return OTHER;
default :
throw Error.runtimeError(ErrorCode.U_S0500, "Type");
}
}
public static Type getAggregateType(Type add, Type existing) {
if (existing == null || existing.typeCode == Types.SQL_ALL_TYPES) {
return add;
}
if (add == null || add.typeCode == Types.SQL_ALL_TYPES) {
return existing;
}
return existing.getAggregateType(add);
}
public static final IntValueHashMap typeAliases;
public static final IntValueHashMap typeNames;
public static final HashSet basicTypes;
static {
typeNames = new IntValueHashMap(37);
/*typeNames.put("CHARACTER", Types.SQL_CHAR);
typeNames.put("VARCHAR", Types.SQL_VARCHAR);
typeNames.put("VARCHAR_IGNORECASE", Types.VARCHAR_IGNORECASE);
typeNames.put("DATE", Types.SQL_DATE);
typeNames.put("TIME", Types.SQL_TIME);
typeNames.put("TIMESTAMP", Types.SQL_TIMESTAMP);
typeNames.put("INTERVAL", Types.SQL_INTERVAL);
typeNames.put("TINYINT", Types.TINYINT);
typeNames.put("SMALLINT", Types.SQL_SMALLINT);
typeNames.put("INTEGER", Types.SQL_INTEGER);
typeNames.put("BIGINT", Types.SQL_BIGINT);
typeNames.put("REAL", Types.SQL_REAL);
typeNames.put("FLOAT", Types.SQL_FLOAT);
typeNames.put("DOUBLE", Types.SQL_DOUBLE);
typeNames.put("NUMERIC", Types.SQL_NUMERIC);
typeNames.put("DECIMAL", Types.SQL_DECIMAL);
typeNames.put("BOOLEAN", Types.SQL_BOOLEAN);
typeNames.put("BINARY", Types.SQL_BINARY);
typeNames.put("VARBINARY", Types.SQL_VARBINARY);
typeNames.put("CLOB", Types.SQL_CLOB);
typeNames.put("BLOB", Types.SQL_BLOB);
typeNames.put("BIT", Types.SQL_BIT);
typeNames.put("OTHER", Types.OTHER);*/
// VOLTDB CODE
typeNames.put("TINYINT", Types.TINYINT);
typeNames.put("SMALLINT", Types.SQL_SMALLINT);
typeNames.put("INTEGER", Types.SQL_INTEGER);
typeNames.put("BIGINT", Types.SQL_BIGINT);
//typeNames.put("FLOAT", Types.SQL_FLOAT);
typeNames.put("FLOAT", Types.SQL_DOUBLE);
typeNames.put("DECIMAL", Types.SQL_DECIMAL);
typeNames.put("CHAR", Types.SQL_CHAR);
typeNames.put("VARCHAR", Types.SQL_VARCHAR);
typeNames.put("TIMESTAMP", Types.SQL_TIMESTAMP);
//
typeAliases = new IntValueHashMap(64);
//typeAliases.put("CHAR", Types.SQL_CHAR);
/*
typeAliases.put("CHAR VARYING", Types.SQL_VARCHAR);
typeAliases.put("CHARACTER VARYING", Types.SQL_VARCHAR);
typeAliases.put("CHARACTER LARGE OBJECT", Types.SQL_CLOB);
*/
/*typeAliases.put("INT", Types.SQL_INTEGER);
typeAliases.put("DEC", Types.SQL_DECIMAL);
typeAliases.put("LONGVARCHAR", Types.SQL_VARCHAR);
typeAliases.put("DATETIME", Types.SQL_TIMESTAMP);
typeAliases.put("LONGVARBINARY", Types.SQL_VARBINARY);
typeAliases.put("OBJECT", Types.OTHER);*/
// VOLTDB CODE
typeAliases.put("INT", Types.SQL_INTEGER);
typeAliases.put("REAL", Types.SQL_DOUBLE);
typeAliases.put("CHARACTER", Types.SQL_CHAR);
//
basicTypes = new HashSet(37);
basicTypes.add(SQL_CHAR_DEFAULT);
basicTypes.add(SQL_VARCHAR_DEFAULT);
basicTypes.add(SQL_DATE);
basicTypes.add(SQL_TIME);
basicTypes.add(SQL_TIMESTAMP);
basicTypes.add(SQL_INTERVAL_YEAR);
basicTypes.add(SQL_INTERVAL_YEAR_TO_MONTH);
basicTypes.add(SQL_INTERVAL_MONTH);
basicTypes.add(SQL_INTERVAL_DAY);
basicTypes.add(SQL_INTERVAL_DAY_TO_HOUR);
basicTypes.add(SQL_INTERVAL_DAY_TO_MINUTE);
basicTypes.add(SQL_INTERVAL_DAY_TO_SECOND);
basicTypes.add(SQL_INTERVAL_HOUR);
basicTypes.add(SQL_INTERVAL_HOUR_TO_MINUTE);
basicTypes.add(SQL_INTERVAL_HOUR_TO_SECOND);
basicTypes.add(SQL_INTERVAL_MINUTE);
basicTypes.add(SQL_INTERVAL_MINUTE_TO_SECOND);
basicTypes.add(SQL_INTERVAL_SECOND);
basicTypes.add(TINYINT);
basicTypes.add(SQL_SMALLINT);
basicTypes.add(SQL_INTEGER);
basicTypes.add(SQL_BIGINT);
basicTypes.add(SQL_DOUBLE);
}
public static int getTypeNr(String name) {
int i = typeNames.get(name, Integer.MIN_VALUE);
if (i == Integer.MIN_VALUE) {
i = typeAliases.get(name, Integer.MIN_VALUE);
}
return i;
}
public static boolean isSupportedSQLType(int typeNumber) {
if (getDefaultType(typeNumber) == null) {
return false;
}
return true;
}
public static boolean matches(Type[] one, Type[] other) {
for (int i = 0; i < one.length; i++) {
if (one[i].typeCode != other[i].typeCode) {
return false;
}
}
return true;
}
}