fn try_to_substrait_null()

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:?}"
        ))),
    }
}