theirix commented on code in PR #21737:
URL: https://github.com/apache/datafusion/pull/21737#discussion_r3112566390
##########
datafusion/catalog/src/information_schema.rs:
##########
@@ -411,6 +412,127 @@ impl InformationSchemaConfig {
}
}
+/// Resolve a native type `NativeType` to `DataType` for use in the
information schema
+/// Since it is one-to-many, use the most representative type on tie
+fn get_data_type_for_schema(native_type: &NativeType) -> Option<DataType> {
+ match native_type {
+ NativeType::Null => Some(DataType::Null),
+ NativeType::Boolean => Some(DataType::Boolean),
+ NativeType::Int8 => Some(DataType::Int8),
+ NativeType::Int16 => Some(DataType::Int16),
+ NativeType::Int32 => Some(DataType::Int32),
+ NativeType::Int64 => Some(DataType::Int64),
+ NativeType::UInt8 => Some(DataType::UInt8),
+ NativeType::UInt16 => Some(DataType::UInt16),
+ NativeType::UInt32 => Some(DataType::UInt32),
+ NativeType::UInt64 => Some(DataType::UInt64),
+ NativeType::Float16 => Some(DataType::Float16),
+ NativeType::Float32 => Some(DataType::Float32),
+ NativeType::Float64 => Some(DataType::Float64),
+ NativeType::Date => Some(DataType::Date32), // A tie
+ NativeType::Binary => Some(DataType::Binary), // A tie
+ NativeType::String => Some(DataType::Utf8), // A tie
+ NativeType::Decimal(precision, scale) => {
+ Some(DataType::Decimal256(*precision, *scale)) // A tie, use the
widest type
+ }
+ NativeType::Timestamp(time_unit, timezone) => {
+ Some(DataType::Timestamp(*time_unit, timezone.to_owned()))
+ }
+ NativeType::Time(TimeUnit::Second) =>
Some(DataType::Time32(TimeUnit::Second)),
+ NativeType::Time(TimeUnit::Millisecond) => {
+ Some(DataType::Time32(TimeUnit::Millisecond))
+ }
+ NativeType::Time(TimeUnit::Microsecond) => {
+ Some(DataType::Time64(TimeUnit::Microsecond))
+ }
+ NativeType::Time(TimeUnit::Nanosecond) => {
+ Some(DataType::Time64(TimeUnit::Nanosecond))
+ }
+ NativeType::Duration(time_unit) =>
Some(DataType::Duration(*time_unit)),
+ NativeType::Interval(interval_unit) =>
Some(DataType::Interval(*interval_unit)),
+ NativeType::FixedSizeBinary(size) =>
Some(DataType::FixedSizeBinary(*size)),
+ NativeType::FixedSizeList(logical_field, size) =>
get_data_type_for_schema(
+ logical_field.logical_type.native(),
+ )
+ .map(|child_dt| {
+ DataType::FixedSizeList(
+ Arc::new(Field::new(
+ logical_field.name.clone(),
+ child_dt,
+ logical_field.nullable,
+ )),
+ *size,
+ )
+ }),
+ NativeType::List(logical_field) => get_data_type_for_schema(
+ logical_field.logical_type.native(),
+ )
+ .map(|child_dt| {
+ // A tie, use List
+ DataType::List(Arc::new(Field::new(
+ logical_field.name.clone(),
+ child_dt,
+ logical_field.nullable,
+ )))
+ }),
+ NativeType::Struct(logical_fields) => {
+ let fields = logical_fields
+ .iter()
+ .map(|logical_field| {
+ let dt =
+
get_data_type_for_schema(logical_field.logical_type.native())?;
+ Some(Arc::new(Field::new(
+ logical_field.name.clone(),
+ dt,
+ logical_field.nullable,
+ )))
+ })
+ .collect::<Option<Fields>>()?;
+ Some(DataType::Struct(fields))
+ }
+ NativeType::Union(logical_fields) => {
+ let ids = logical_fields.iter().map(|(i, _)|
*i).collect::<Vec<i8>>();
+ let fields: Vec<FieldRef> = logical_fields
+ .iter()
+ .map(|(_, logical_field)| {
+ let dt =
+
get_data_type_for_schema(logical_field.logical_type.native())?;
+ Some(Arc::new(Field::new(
+ logical_field.name.clone(),
+ dt,
+ logical_field.nullable,
Review Comment:
It exists only in an arrow schema Field, not in a logical field or DataType
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]