private def toClientTypeSignature()

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")
    }
  }