in datafusion/substrait/src/logical_plan/producer.rs [1411:1571]
fn try_to_substrait_null(v: &ScalarValue) -> Result<LiteralType> {
let default_nullability = r#type::Nullability::Nullable as i32;
match v {
ScalarValue::Boolean(None) => Ok(LiteralType::Null(substrait::proto::Type {
kind: Some(r#type::Kind::Bool(r#type::Boolean {
type_variation_reference: DEFAULT_TYPE_REF,
nullability: default_nullability,
})),
})),
ScalarValue::Int8(None) => Ok(LiteralType::Null(substrait::proto::Type {
kind: Some(r#type::Kind::I8(r#type::I8 {
type_variation_reference: DEFAULT_TYPE_REF,
nullability: default_nullability,
})),
})),
ScalarValue::UInt8(None) => Ok(LiteralType::Null(substrait::proto::Type {
kind: Some(r#type::Kind::I8(r#type::I8 {
type_variation_reference: UNSIGNED_INTEGER_TYPE_REF,
nullability: default_nullability,
})),
})),
ScalarValue::Int16(None) => Ok(LiteralType::Null(substrait::proto::Type {
kind: Some(r#type::Kind::I16(r#type::I16 {
type_variation_reference: DEFAULT_TYPE_REF,
nullability: default_nullability,
})),
})),
ScalarValue::UInt16(None) => Ok(LiteralType::Null(substrait::proto::Type {
kind: Some(r#type::Kind::I16(r#type::I16 {
type_variation_reference: UNSIGNED_INTEGER_TYPE_REF,
nullability: default_nullability,
})),
})),
ScalarValue::Int32(None) => Ok(LiteralType::Null(substrait::proto::Type {
kind: Some(r#type::Kind::I32(r#type::I32 {
type_variation_reference: DEFAULT_TYPE_REF,
nullability: default_nullability,
})),
})),
ScalarValue::UInt32(None) => Ok(LiteralType::Null(substrait::proto::Type {
kind: Some(r#type::Kind::I32(r#type::I32 {
type_variation_reference: UNSIGNED_INTEGER_TYPE_REF,
nullability: default_nullability,
})),
})),
ScalarValue::Int64(None) => Ok(LiteralType::Null(substrait::proto::Type {
kind: Some(r#type::Kind::I64(r#type::I64 {
type_variation_reference: DEFAULT_TYPE_REF,
nullability: default_nullability,
})),
})),
ScalarValue::UInt64(None) => Ok(LiteralType::Null(substrait::proto::Type {
kind: Some(r#type::Kind::I64(r#type::I64 {
type_variation_reference: UNSIGNED_INTEGER_TYPE_REF,
nullability: default_nullability,
})),
})),
ScalarValue::Float32(None) => Ok(LiteralType::Null(substrait::proto::Type {
kind: Some(r#type::Kind::Fp32(r#type::Fp32 {
type_variation_reference: DEFAULT_TYPE_REF,
nullability: default_nullability,
})),
})),
ScalarValue::Float64(None) => Ok(LiteralType::Null(substrait::proto::Type {
kind: Some(r#type::Kind::Fp64(r#type::Fp64 {
type_variation_reference: DEFAULT_TYPE_REF,
nullability: default_nullability,
})),
})),
ScalarValue::TimestampSecond(None, _) => {
Ok(LiteralType::Null(substrait::proto::Type {
kind: Some(r#type::Kind::Timestamp(r#type::Timestamp {
type_variation_reference: TIMESTAMP_SECOND_TYPE_REF,
nullability: default_nullability,
})),
}))
}
ScalarValue::TimestampMillisecond(None, _) => {
Ok(LiteralType::Null(substrait::proto::Type {
kind: Some(r#type::Kind::Timestamp(r#type::Timestamp {
type_variation_reference: TIMESTAMP_MILLI_TYPE_REF,
nullability: default_nullability,
})),
}))
}
ScalarValue::TimestampMicrosecond(None, _) => {
Ok(LiteralType::Null(substrait::proto::Type {
kind: Some(r#type::Kind::Timestamp(r#type::Timestamp {
type_variation_reference: TIMESTAMP_MICRO_TYPE_REF,
nullability: default_nullability,
})),
}))
}
ScalarValue::TimestampNanosecond(None, _) => {
Ok(LiteralType::Null(substrait::proto::Type {
kind: Some(r#type::Kind::Timestamp(r#type::Timestamp {
type_variation_reference: TIMESTAMP_NANO_TYPE_REF,
nullability: default_nullability,
})),
}))
}
ScalarValue::Date32(None) => Ok(LiteralType::Null(substrait::proto::Type {
kind: Some(r#type::Kind::Date(r#type::Date {
type_variation_reference: DATE_32_TYPE_REF,
nullability: default_nullability,
})),
})),
ScalarValue::Date64(None) => Ok(LiteralType::Null(substrait::proto::Type {
kind: Some(r#type::Kind::Date(r#type::Date {
type_variation_reference: DATE_64_TYPE_REF,
nullability: default_nullability,
})),
})),
ScalarValue::Binary(None) => Ok(LiteralType::Null(substrait::proto::Type {
kind: Some(r#type::Kind::Binary(r#type::Binary {
type_variation_reference: DEFAULT_CONTAINER_TYPE_REF,
nullability: default_nullability,
})),
})),
ScalarValue::LargeBinary(None) => Ok(LiteralType::Null(substrait::proto::Type {
kind: Some(r#type::Kind::Binary(r#type::Binary {
type_variation_reference: LARGE_CONTAINER_TYPE_REF,
nullability: default_nullability,
})),
})),
ScalarValue::FixedSizeBinary(_, None) => {
Ok(LiteralType::Null(substrait::proto::Type {
kind: Some(r#type::Kind::Binary(r#type::Binary {
type_variation_reference: DEFAULT_TYPE_REF,
nullability: default_nullability,
})),
}))
}
ScalarValue::Utf8(None) => Ok(LiteralType::Null(substrait::proto::Type {
kind: Some(r#type::Kind::String(r#type::String {
type_variation_reference: DEFAULT_CONTAINER_TYPE_REF,
nullability: default_nullability,
})),
})),
ScalarValue::LargeUtf8(None) => Ok(LiteralType::Null(substrait::proto::Type {
kind: Some(r#type::Kind::String(r#type::String {
type_variation_reference: LARGE_CONTAINER_TYPE_REF,
nullability: default_nullability,
})),
})),
ScalarValue::Decimal128(None, p, s) => {
Ok(LiteralType::Null(substrait::proto::Type {
kind: Some(r#type::Kind::Decimal(r#type::Decimal {
scale: *s as i32,
precision: *p as i32,
type_variation_reference: DEFAULT_TYPE_REF,
nullability: default_nullability,
})),
}))
}
// TODO: Extend support for remaining data types
_ => Err(DataFusionError::NotImplemented(format!(
"Unsupported literal: {v:?}"
))),
}
}