Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 32 additions & 24 deletions datafusion/spark/src/function/string/format_string.rs
Original file line number Diff line number Diff line change
Expand Up @@ -891,6 +891,23 @@ fn unsigned_to_char(value: u64) -> Result<char> {
codepoint_to_char(codepoint)
}

/// Convert a non-null integer scalar to a [`char`] for the `%c` conversion.
fn integer_scalar_to_char(scalar: &ScalarValue) -> Result<char> {
match scalar {
ScalarValue::Int8(Some(value)) => signed_to_char(*value as i64),
ScalarValue::Int16(Some(value)) => signed_to_char(*value as i64),
ScalarValue::Int32(Some(value)) => signed_to_char(*value as i64),
ScalarValue::Int64(Some(value)) => signed_to_char(*value),
ScalarValue::UInt8(Some(value)) => unsigned_to_char(*value as u64),
ScalarValue::UInt16(Some(value)) => unsigned_to_char(*value as u64),
ScalarValue::UInt32(Some(value)) => unsigned_to_char(*value as u64),
ScalarValue::UInt64(Some(value)) => unsigned_to_char(*value),
_ => datafusion_common::internal_err!(
"integer_scalar_to_char expects a non-null integer scalar, got {scalar:?}"
),
}
}

impl ConversionSpecifier {
/// Validates that the grouping separator flag is not used with scientific
/// notation conversions, matching Java/Spark behavior which throws
Expand Down Expand Up @@ -923,6 +940,21 @@ impl ConversionSpecifier {

_ => self.format_boolean(string, value),
},
ScalarValue::Int8(Some(_))
| ScalarValue::Int16(Some(_))
| ScalarValue::Int32(Some(_))
| ScalarValue::Int64(Some(_))
| ScalarValue::UInt8(Some(_))
| ScalarValue::UInt16(Some(_))
| ScalarValue::UInt32(Some(_))
| ScalarValue::UInt64(Some(_))
if matches!(
self.conversion_type,
ConversionType::CharLower | ConversionType::CharUpper
) =>
{
self.format_char(string, integer_scalar_to_char(value)?)
}
ScalarValue::Int8(value) => match (self.conversion_type, value) {
(ConversionType::DecInt, Some(value)) => {
self.format_signed(string, *value as i64)
Expand All @@ -933,9 +965,6 @@ impl ConversionSpecifier {
| ConversionType::OctInt,
Some(value),
) => self.format_unsigned(string, (*value as u8) as u64),
(ConversionType::CharLower | ConversionType::CharUpper, Some(value)) => {
self.format_char(string, signed_to_char(*value as i64)?)
}
(
ConversionType::StringLower | ConversionType::StringUpper,
Some(value),
Expand All @@ -952,9 +981,6 @@ impl ConversionSpecifier {
(ConversionType::DecInt, Some(value)) => {
self.format_signed(string, *value as i64)
}
(ConversionType::CharLower | ConversionType::CharUpper, Some(value)) => {
self.format_char(string, signed_to_char(*value as i64)?)
}
(
ConversionType::HexIntLower
| ConversionType::HexIntUpper
Expand Down Expand Up @@ -983,9 +1009,6 @@ impl ConversionSpecifier {
| ConversionType::OctInt,
Some(value),
) => self.format_unsigned(string, (*value as u32) as u64),
(ConversionType::CharLower | ConversionType::CharUpper, Some(value)) => {
self.format_char(string, signed_to_char(*value as i64)?)
}
(
ConversionType::StringLower | ConversionType::StringUpper,
Some(value),
Expand All @@ -1008,9 +1031,6 @@ impl ConversionSpecifier {
| ConversionType::OctInt,
Some(value),
) => self.format_unsigned(string, *value as u64),
(ConversionType::CharLower | ConversionType::CharUpper, Some(value)) => {
self.format_char(string, signed_to_char(*value)?)
}
(
ConversionType::StringLower | ConversionType::StringUpper,
Some(value),
Expand All @@ -1031,9 +1051,6 @@ impl ConversionSpecifier {
| ConversionType::OctInt,
Some(value),
) => self.format_unsigned(string, *value as u64),
(ConversionType::CharLower | ConversionType::CharUpper, Some(value)) => {
self.format_char(string, unsigned_to_char(*value as u64)?)
}
(
ConversionType::StringLower | ConversionType::StringUpper,
Some(value),
Expand All @@ -1054,9 +1071,6 @@ impl ConversionSpecifier {
| ConversionType::OctInt,
Some(value),
) => self.format_unsigned(string, *value as u64),
(ConversionType::CharLower | ConversionType::CharUpper, Some(value)) => {
self.format_char(string, unsigned_to_char(*value as u64)?)
}
(
ConversionType::StringLower | ConversionType::StringUpper,
Some(value),
Expand All @@ -1077,9 +1091,6 @@ impl ConversionSpecifier {
| ConversionType::OctInt,
Some(value),
) => self.format_unsigned(string, *value as u64),
(ConversionType::CharLower | ConversionType::CharUpper, Some(value)) => {
self.format_char(string, unsigned_to_char(*value as u64)?)
}
(
ConversionType::StringLower | ConversionType::StringUpper,
Some(value),
Expand All @@ -1100,9 +1111,6 @@ impl ConversionSpecifier {
| ConversionType::OctInt,
Some(value),
) => self.format_unsigned(string, *value),
(ConversionType::CharLower | ConversionType::CharUpper, Some(value)) => {
self.format_char(string, unsigned_to_char(*value)?)
}
(
ConversionType::StringLower | ConversionType::StringUpper,
Some(value),
Expand Down
Loading