-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Fix: to_char Function Now Correctly Handles DATE Values in DataFusion #14970
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
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
| 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.
👍
|
Thanks again @kosiew |
|
Thank you @alamb for the review. |
…apache#14970) * revert _to_char_scalar to before apache#14908 * Amend formatted loop - handle null * revert _to_char_array to before apache#14908 * add slt test
Which issue does this PR close?
Rationale for this change
After #14908, the
to_charfunction was incorrectly returningNULLfor validDATEvalues due to improper handling of theDATEtype. This fix ensures thatto_charcorrectly formats non-nullDATEvalues while preservingNULLvalues as expected.This is a re-implementation of #14908
What changes are included in this PR?
to_charfunction to properly processDATEvalues.DATEvalues.Are these changes tested?
Yes, new test cases have been added to confirm that:
to_charcorrectly formats validDATEvalues.NULLvalues remain unaffected.Are there any user-facing changes?
No breaking changes. Users will now see correctly formatted
DATEvalues when usingto_char, instead of unexpectedNULLresults.