类型系统的作用
类型系统定义对象的相互作用的行为和约束。不同的数据库系统有不同的类型系统,他们的类型系统的不是完全相同的。
类型描述
接口
org.apache.calcite.rel.type.RelDataTypeSystem
默认实现
org.apache.calcite.rel.type.RelDataTypeSystem#DEFAULT
继承实现(用于修改类型行为的实现)
org.apache.calcite.rel.type.RelDataTypeSystemImpl
/** PostgreSQL type system. */
private static final RelDataTypeSystem POSTGRESQL_TYPE_SYSTEM =
new RelDataTypeSystemImpl() {
@Override public int getMaxPrecision(SqlTypeName typeName) {
switch (typeName) {
case VARCHAR:
// From htup_details.h in postgresql:
// MaxAttrSize is a somewhat arbitrary upper limit on the declared size of
// data fields of char(n) and similar types. It need not have anything
// directly to do with the *actual* upper limit of varlena values, which
// is currently 1Gb (see TOAST structures in postgres.h). I've set it
// at 10Mb which seems like a reasonable number --- tgl 8/6/00. */
return 10 * 1024 * 1024;
default:
return super.getMaxPrecision(typeName);
}
}
};
更清楚表达修改是使用
org.apache.calcite.rel.type.DelegatingTypeSystem
typeSystem =
new DelegatingTypeSystem(typeSystem) {
@Override public boolean
shouldConvertRaggedUnionTypesToVarying() {
return true;
}
};
类型工厂
功能:
把SQL数据类型名字转换成关系数据类型
把Java数据类型转换成关系数据类型
对关系类型运算
不同类型工厂之间的类型数据转换
接口
org.apache.calcite.rel.type.RelDataTypeFactory
类型关系基础实现
org.apache.calcite.rel.type.RelDataTypeFactoryImpl
在此基础上添加根据SQL类型相关转换操作
org.apache.calcite.sql.type.SqlTypeFactoryImpl
继承实现(用于修改类型行为的实现)
/**
* MySqlTypeFactoryImpl provides a specific implementation of
* {@link SqlTypeFactoryImpl} which sets precision to 256 for VARCHAR.
*/
private static class MySqlTypeFactoryImpl extends SqlTypeFactoryImpl {
MySqlTypeFactoryImpl(RelDataTypeSystem typeSystem) {
super(typeSystem);
}
@Override public RelDataType createTypeWithNullability(
final RelDataType type,
final boolean nullable) {
if (type.getSqlTypeName() == SqlTypeName.VARCHAR) {
return new BasicSqlType(this.typeSystem, type.getSqlTypeName(),
PRECISION);
}
return super.createTypeWithNullability(type, nullable);
}
}
默认实现
final JavaTypeFactoryImpl typeFactory =
new JavaTypeFactoryImpl(RelDataTypeSystem.DEFAULT);//org.apache.calcite.jdbc.JavaTypeFactoryImpl
org.apache.calcite.adapter.geode.util.JavaTypeFactoryExtImpl
在org.apache.calcite.jdbc.JavaTypeFactoryImpl基础上添加了实验性方法
关系数据类型
表示标量表达式的类型或者返回行的类型(多个标量表达式)
实际上就是字段的类型
关系数据类型家族
SQL类型的分类
接口
org.apache.calcite.rel.type.RelDataTypeFamily
分类
org.apache.calcite.sql.type.SqlTypeFamily
该类提供以下工具方法
根据JDBC类型返回类型家族
获取所有类型家族名称
关系数据类型实现
基础
org.apache.calcite.rel.type.RelDataTypeImpl
Java类型
org.apache.calcite.rel.type.RelDataTypeFactoryImpl.JavaType
UnKnown(NULL)
org.apache.calcite.sql.type.SqlTypeFactoryImpl.UnknownSqlType
SQL类型
org.apache.calcite.sql.type.AbstractSqlType
基础SQL类型
org.apache.calcite.sql.type.BasicSqlType