in datafusion/sql/src/unparser/expr.rs [1123:1353]
fn scalar_to_sql(&self, v: &ScalarValue) -> Result<ast::Expr> {
match v {
ScalarValue::Null => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::Boolean(Some(b)) => {
Ok(ast::Expr::value(ast::Value::Boolean(b.to_owned())))
}
ScalarValue::Boolean(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::Float16(Some(f)) => {
Ok(ast::Expr::value(ast::Value::Number(f.to_string(), false)))
}
ScalarValue::Float16(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::Float32(Some(f)) => {
let f_val = match f.fract() {
0.0 => format!("{:.1}", f),
_ => format!("{}", f),
};
Ok(ast::Expr::value(ast::Value::Number(f_val, false)))
}
ScalarValue::Float32(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::Float64(Some(f)) => {
let f_val = match f.fract() {
0.0 => format!("{:.1}", f),
_ => format!("{}", f),
};
Ok(ast::Expr::value(ast::Value::Number(f_val, false)))
}
ScalarValue::Float64(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::Decimal128(Some(value), precision, scale) => {
Ok(ast::Expr::value(ast::Value::Number(
Decimal128Type::format_decimal(*value, *precision, *scale),
false,
)))
}
ScalarValue::Decimal128(None, ..) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::Decimal256(Some(value), precision, scale) => {
Ok(ast::Expr::value(ast::Value::Number(
Decimal256Type::format_decimal(*value, *precision, *scale),
false,
)))
}
ScalarValue::Decimal256(None, ..) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::Int8(Some(i)) => {
Ok(ast::Expr::value(ast::Value::Number(i.to_string(), false)))
}
ScalarValue::Int8(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::Int16(Some(i)) => {
Ok(ast::Expr::value(ast::Value::Number(i.to_string(), false)))
}
ScalarValue::Int16(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::Int32(Some(i)) => {
Ok(ast::Expr::value(ast::Value::Number(i.to_string(), false)))
}
ScalarValue::Int32(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::Int64(Some(i)) => {
Ok(ast::Expr::value(ast::Value::Number(i.to_string(), false)))
}
ScalarValue::Int64(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::UInt8(Some(ui)) => {
Ok(ast::Expr::value(ast::Value::Number(ui.to_string(), false)))
}
ScalarValue::UInt8(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::UInt16(Some(ui)) => {
Ok(ast::Expr::value(ast::Value::Number(ui.to_string(), false)))
}
ScalarValue::UInt16(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::UInt32(Some(ui)) => {
Ok(ast::Expr::value(ast::Value::Number(ui.to_string(), false)))
}
ScalarValue::UInt32(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::UInt64(Some(ui)) => {
Ok(ast::Expr::value(ast::Value::Number(ui.to_string(), false)))
}
ScalarValue::UInt64(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::Utf8(Some(str)) => {
Ok(ast::Expr::value(SingleQuotedString(str.to_string())))
}
ScalarValue::Utf8(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::Utf8View(Some(str)) => {
Ok(ast::Expr::value(SingleQuotedString(str.to_string())))
}
ScalarValue::Utf8View(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::LargeUtf8(Some(str)) => {
Ok(ast::Expr::value(SingleQuotedString(str.to_string())))
}
ScalarValue::LargeUtf8(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::Binary(Some(_)) => not_impl_err!("Unsupported scalar: {v:?}"),
ScalarValue::Binary(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::BinaryView(Some(_)) => {
not_impl_err!("Unsupported scalar: {v:?}")
}
ScalarValue::BinaryView(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::FixedSizeBinary(..) => {
not_impl_err!("Unsupported scalar: {v:?}")
}
ScalarValue::LargeBinary(Some(_)) => {
not_impl_err!("Unsupported scalar: {v:?}")
}
ScalarValue::LargeBinary(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::FixedSizeList(a) => self.scalar_value_list_to_sql(a.values()),
ScalarValue::List(a) => self.scalar_value_list_to_sql(a.values()),
ScalarValue::LargeList(a) => self.scalar_value_list_to_sql(a.values()),
ScalarValue::Date32(Some(_)) => {
let date = v
.to_array()?
.as_any()
.downcast_ref::<Date32Array>()
.ok_or(internal_datafusion_err!(
"Unable to downcast to Date32 from Date32 scalar"
))?
.value_as_date(0)
.ok_or(internal_datafusion_err!(
"Unable to convert Date32 to NaiveDate"
))?;
Ok(ast::Expr::Cast {
kind: ast::CastKind::Cast,
expr: Box::new(ast::Expr::value(SingleQuotedString(
date.to_string(),
))),
data_type: ast::DataType::Date,
format: None,
})
}
ScalarValue::Date32(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::Date64(Some(_)) => {
let datetime = v
.to_array()?
.as_any()
.downcast_ref::<Date64Array>()
.ok_or(internal_datafusion_err!(
"Unable to downcast to Date64 from Date64 scalar"
))?
.value_as_datetime(0)
.ok_or(internal_datafusion_err!(
"Unable to convert Date64 to NaiveDateTime"
))?;
Ok(ast::Expr::Cast {
kind: ast::CastKind::Cast,
expr: Box::new(ast::Expr::value(SingleQuotedString(
datetime.to_string(),
))),
data_type: self.ast_type_for_date64_in_cast(),
format: None,
})
}
ScalarValue::Date64(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::Time32Second(Some(_t)) => {
self.handle_time::<Time32SecondType>(v)
}
ScalarValue::Time32Second(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::Time32Millisecond(Some(_t)) => {
self.handle_time::<Time32MillisecondType>(v)
}
ScalarValue::Time32Millisecond(None) => {
Ok(ast::Expr::value(ast::Value::Null))
}
ScalarValue::Time64Microsecond(Some(_t)) => {
self.handle_time::<Time64MicrosecondType>(v)
}
ScalarValue::Time64Microsecond(None) => {
Ok(ast::Expr::value(ast::Value::Null))
}
ScalarValue::Time64Nanosecond(Some(_t)) => {
self.handle_time::<Time64NanosecondType>(v)
}
ScalarValue::Time64Nanosecond(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::TimestampSecond(Some(_ts), tz) => {
self.handle_timestamp::<TimestampSecondType>(v, tz)
}
ScalarValue::TimestampSecond(None, _) => {
Ok(ast::Expr::value(ast::Value::Null))
}
ScalarValue::TimestampMillisecond(Some(_ts), tz) => {
self.handle_timestamp::<TimestampMillisecondType>(v, tz)
}
ScalarValue::TimestampMillisecond(None, _) => {
Ok(ast::Expr::value(ast::Value::Null))
}
ScalarValue::TimestampMicrosecond(Some(_ts), tz) => {
self.handle_timestamp::<TimestampMicrosecondType>(v, tz)
}
ScalarValue::TimestampMicrosecond(None, _) => {
Ok(ast::Expr::value(ast::Value::Null))
}
ScalarValue::TimestampNanosecond(Some(_ts), tz) => {
self.handle_timestamp::<TimestampNanosecondType>(v, tz)
}
ScalarValue::TimestampNanosecond(None, _) => {
Ok(ast::Expr::value(ast::Value::Null))
}
ScalarValue::IntervalYearMonth(Some(_))
| ScalarValue::IntervalDayTime(Some(_))
| ScalarValue::IntervalMonthDayNano(Some(_)) => {
self.interval_scalar_to_sql(v)
}
ScalarValue::IntervalYearMonth(None) => {
Ok(ast::Expr::value(ast::Value::Null))
}
ScalarValue::IntervalDayTime(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::IntervalMonthDayNano(None) => {
Ok(ast::Expr::value(ast::Value::Null))
}
ScalarValue::DurationSecond(Some(_d)) => {
not_impl_err!("Unsupported scalar: {v:?}")
}
ScalarValue::DurationSecond(None) => Ok(ast::Expr::value(ast::Value::Null)),
ScalarValue::DurationMillisecond(Some(_d)) => {
not_impl_err!("Unsupported scalar: {v:?}")
}
ScalarValue::DurationMillisecond(None) => {
Ok(ast::Expr::value(ast::Value::Null))
}
ScalarValue::DurationMicrosecond(Some(_d)) => {
not_impl_err!("Unsupported scalar: {v:?}")
}
ScalarValue::DurationMicrosecond(None) => {
Ok(ast::Expr::value(ast::Value::Null))
}
ScalarValue::DurationNanosecond(Some(_d)) => {
not_impl_err!("Unsupported scalar: {v:?}")
}
ScalarValue::DurationNanosecond(None) => {
Ok(ast::Expr::value(ast::Value::Null))
}
ScalarValue::Struct(_) => not_impl_err!("Unsupported scalar: {v:?}"),
ScalarValue::Map(_) => not_impl_err!("Unsupported scalar: {v:?}"),
ScalarValue::Union(..) => not_impl_err!("Unsupported scalar: {v:?}"),
ScalarValue::Dictionary(_k, v) => self.scalar_to_sql(v),
}
}