in sql/connect/common/src/main/scala/org/apache/spark/sql/connect/common/LiteralValueProtoConverter.scala [201:242]
def toLiteralProto(literal: Any): proto.Expression.Literal =
toLiteralProtoBuilder(literal).build()
def toLiteralProto(literal: Any, dataType: DataType): proto.Expression.Literal =
toLiteralProtoBuilder(literal, dataType).build()
private[sql] def toDataType(clz: Class[_]): DataType = clz match {
// primitive types
case JShort.TYPE => ShortType
case JInteger.TYPE => IntegerType
case JLong.TYPE => LongType
case JDouble.TYPE => DoubleType
case JByte.TYPE => ByteType
case JFloat.TYPE => FloatType
case JBoolean.TYPE => BooleanType
case JChar.TYPE => StringType
// java classes
case _ if clz == classOf[LocalDate] || clz == classOf[Date] => DateType
case _ if clz == classOf[Instant] || clz == classOf[Timestamp] => TimestampType
case _ if clz == classOf[LocalDateTime] => TimestampNTZType
case _ if clz == classOf[Duration] => DayTimeIntervalType.DEFAULT
case _ if clz == classOf[Period] => YearMonthIntervalType.DEFAULT
case _ if clz == classOf[JBigDecimal] => DecimalType.SYSTEM_DEFAULT
case _ if clz == classOf[Array[Byte]] => BinaryType
case _ if clz == classOf[Array[Char]] => StringType
case _ if clz == classOf[JShort] => ShortType
case _ if clz == classOf[JInteger] => IntegerType
case _ if clz == classOf[JLong] => LongType
case _ if clz == classOf[JDouble] => DoubleType
case _ if clz == classOf[JByte] => ByteType
case _ if clz == classOf[JFloat] => FloatType
case _ if clz == classOf[JBoolean] => BooleanType
// other scala classes
case _ if clz == classOf[String] => StringType
case _ if clz == classOf[BigInt] || clz == classOf[BigDecimal] => DecimalType.SYSTEM_DEFAULT
case _ if clz == classOf[CalendarInterval] => CalendarIntervalType
case _ if clz.isArray => ArrayType(toDataType(clz.getComponentType))
case _ =>
throw new UnsupportedOperationException(s"Unsupported component type $clz in arrays.")
}