in kyuubi-server/src/main/scala/org/apache/kyuubi/server/trino/api/TrinoContext.scala [234:324]
private def toClientTypeSignature(
entry: TTypeEntry): (String, util.List[ClientTypeSignatureParameter]) = {
// according to `io.trino.jdbc.ColumnInfo`
if (entry.isSetPrimitiveEntry) {
entry.getPrimitiveEntry.getType match {
case TTypeId.BOOLEAN_TYPE =>
(ClientStandardTypes.BOOLEAN, ImmutableList.of[ClientTypeSignatureParameter])
case TTypeId.TINYINT_TYPE =>
(ClientStandardTypes.TINYINT, ImmutableList.of[ClientTypeSignatureParameter])
case TTypeId.SMALLINT_TYPE =>
(ClientStandardTypes.SMALLINT, ImmutableList.of[ClientTypeSignatureParameter])
case TTypeId.INT_TYPE =>
(ClientStandardTypes.INTEGER, ImmutableList.of[ClientTypeSignatureParameter])
case TTypeId.BIGINT_TYPE =>
(ClientStandardTypes.BIGINT, ImmutableList.of[ClientTypeSignatureParameter])
case TTypeId.FLOAT_TYPE =>
(ClientStandardTypes.DOUBLE, ImmutableList.of[ClientTypeSignatureParameter])
case TTypeId.DOUBLE_TYPE =>
(ClientStandardTypes.DOUBLE, ImmutableList.of[ClientTypeSignatureParameter])
case TTypeId.DATE_TYPE =>
(ClientStandardTypes.DATE, ImmutableList.of[ClientTypeSignatureParameter])
case TTypeId.TIMESTAMP_TYPE =>
(ClientStandardTypes.TIMESTAMP, ImmutableList.of[ClientTypeSignatureParameter])
case TTypeId.BINARY_TYPE =>
(ClientStandardTypes.VARBINARY, ImmutableList.of[ClientTypeSignatureParameter])
case TTypeId.DECIMAL_TYPE =>
val map = entry.getPrimitiveEntry.getTypeQualifiers.getQualifiers
val precision = Option(map.get(TCLIServiceConstants.PRECISION)).map(_.getI32Value)
.getOrElse(38)
val scale = Option(map.get(TCLIServiceConstants.SCALE)).map(_.getI32Value)
.getOrElse(18)
(
ClientStandardTypes.DECIMAL,
ImmutableList.of(
ClientTypeSignatureParameter.ofLong(precision),
ClientTypeSignatureParameter.ofLong(scale)))
case TTypeId.STRING_TYPE =>
(
ClientStandardTypes.VARCHAR,
varcharSignatureParameter)
case TTypeId.VARCHAR_TYPE =>
(
ClientStandardTypes.VARCHAR,
varcharSignatureParameter)
case TTypeId.CHAR_TYPE =>
(ClientStandardTypes.CHAR, ImmutableList.of(ClientTypeSignatureParameter.ofLong(65536)))
case TTypeId.INTERVAL_YEAR_MONTH_TYPE =>
(
ClientStandardTypes.INTERVAL_YEAR_TO_MONTH,
ImmutableList.of[ClientTypeSignatureParameter])
case TTypeId.INTERVAL_DAY_TIME_TYPE =>
(ClientStandardTypes.TIME_WITH_TIME_ZONE, ImmutableList.of[ClientTypeSignatureParameter])
case TTypeId.TIMESTAMPLOCALTZ_TYPE =>
(
ClientStandardTypes.TIMESTAMP_WITH_TIME_ZONE,
ImmutableList.of[ClientTypeSignatureParameter])
case _ =>
(
ClientStandardTypes.VARCHAR,
varcharSignatureParameter)
}
} else if (entry.isSetArrayEntry) {
// thrift does not support nested types.
// it's quite hard to follow the hive way, so always return varchar
// TODO: make complex data type more accurate
(
ClientStandardTypes.ARRAY,
ImmutableList.of(ClientTypeSignatureParameter.ofType(
new ClientTypeSignature(ClientStandardTypes.VARCHAR, varcharSignatureParameter))))
} else if (entry.isSetMapEntry) {
(
ClientStandardTypes.MAP,
ImmutableList.of(
ClientTypeSignatureParameter.ofType(
new ClientTypeSignature(ClientStandardTypes.VARCHAR, varcharSignatureParameter)),
ClientTypeSignatureParameter.ofType(
new ClientTypeSignature(ClientStandardTypes.VARCHAR, varcharSignatureParameter))))
} else if (entry.isSetStructEntry) {
val parameters = entry.getStructEntry.getNameToTypePtr.asScala.map { case (k, v) =>
ClientTypeSignatureParameter.ofNamedType(
new NamedClientTypeSignature(
Optional.of(new RowFieldName(k)),
new ClientTypeSignature(ClientStandardTypes.VARCHAR, varcharSignatureParameter)))
}
(
ClientStandardTypes.ROW,
ImmutableList.copyOf(parameters.toArray))
} else {
throw new UnsupportedOperationException(s"Do not support type: $entry")
}
}