-
Notifications
You must be signed in to change notification settings - Fork 1.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix: to_char Function Now Correctly Handles DATE Values in DataFusion #14970
base: main
Are you sure you want to change the base?
Conversation
|
||
#[test] | ||
fn test_to_char_input_none_array() { | ||
let date_array = Arc::new(Date32Array::from(vec![Some(18506), None])) as ArrayRef; | ||
let format_array = | ||
StringArray::from(vec!["%Y-%m-%d".to_string(), "%Y-%m-%d".to_string()]); | ||
let args = datafusion_expr::ScalarFunctionArgs { | ||
args: vec![ | ||
ColumnarValue::Array(date_array), | ||
ColumnarValue::Array(Arc::new(format_array) as ArrayRef), | ||
], | ||
number_rows: 2, | ||
return_type: &DataType::Utf8, | ||
}; | ||
let result = ToCharFunc::new() | ||
.invoke_with_args(args) | ||
.expect("Expected no error"); | ||
if let ColumnarValue::Array(result) = result { | ||
let result = result.as_any().downcast_ref::<StringArray>().unwrap(); | ||
assert_eq!(result.len(), 2); | ||
// The first element is valid, second is null. | ||
assert!(!result.is_null(0)); | ||
assert!(result.is_null(1)); | ||
} else { | ||
panic!("Expected an array value"); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Remove test which was added in #14908
// fix https://github.com/apache/datafusion/issues/14884 | ||
// If the input date/time is null, return a null Utf8 result. | ||
if array.is_null(0) { | ||
return Ok(match is_scalar_expression { | ||
true => ColumnarValue::Scalar(ScalarValue::Utf8(None)), | ||
false => ColumnarValue::Array(new_null_array(&Utf8, array.len())), | ||
}); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Undo #14908
// fix https://github.com/apache/datafusion/issues/14884 | ||
// If the date/time value is null, push None. | ||
if arrays[0].is_null(idx) { | ||
results.push(None); | ||
continue; | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
undo #14908
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you @kosiew -- this makes sense to me
@@ -234,15 +226,21 @@ fn _to_char_scalar( | |||
}; | |||
|
|||
let formatter = ArrayFormatter::try_new(array.as_ref(), &format_options)?; | |||
let formatted: Result<Vec<_>, ArrowError> = (0..array.len()) | |||
.map(|i| formatter.value(i).try_to_string()) | |||
let formatted: Result<Vec<Option<String>>, ArrowError> = (0..array.len()) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍
Which issue does this PR close?
Rationale for this change
After #14908, the
to_char
function was incorrectly returningNULL
for validDATE
values due to improper handling of theDATE
type. This fix ensures thatto_char
correctly formats non-nullDATE
values while preservingNULL
values as expected.This is a re-implementation of #14908
What changes are included in this PR?
to_char
function to properly processDATE
values.DATE
values.Are these changes tested?
Yes, new test cases have been added to confirm that:
to_char
correctly formats validDATE
values.NULL
values remain unaffected.Are there any user-facing changes?
No breaking changes. Users will now see correctly formatted
DATE
values when usingto_char
, instead of unexpectedNULL
results.