Skip to content

Commit 5fb337d

Browse files
authored
Fix negative interval prettyprint (#3491)
* Fix negative interval prettyprint * Simplify check * Empty * Fix edge case
1 parent 3788fd2 commit 5fb337d

File tree

2 files changed

+55
-29
lines changed

2 files changed

+55
-29
lines changed

arrow-cast/src/display.rs

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,20 +67,29 @@ macro_rules! make_string_interval_day_time {
6767
let days_parts: i32 = ((value & 0xFFFFFFFF00000000) >> 32) as i32;
6868
let milliseconds_part: i32 = (value & 0xFFFFFFFF) as i32;
6969

70-
let secs = milliseconds_part / 1000;
70+
let secs = milliseconds_part / 1_000;
7171
let mins = secs / 60;
7272
let hours = mins / 60;
7373

7474
let secs = secs - (mins * 60);
7575
let mins = mins - (hours * 60);
7676

77+
let milliseconds = milliseconds_part % 1_000;
78+
79+
let secs_sign = if secs < 0 || milliseconds < 0 {
80+
"-"
81+
} else {
82+
""
83+
};
84+
7785
Ok(format!(
78-
"0 years 0 mons {} days {} hours {} mins {}.{:03} secs",
86+
"0 years 0 mons {} days {} hours {} mins {}{}.{:03} secs",
7987
days_parts,
8088
hours,
8189
mins,
82-
secs,
83-
(milliseconds_part % 1000),
90+
secs_sign,
91+
secs.abs(),
92+
milliseconds.abs(),
8493
))
8594
}};
8695
}
@@ -99,21 +108,26 @@ macro_rules! make_string_interval_month_day_nano {
99108
let days_part: i32 = ((value & 0xFFFFFFFF0000000000000000) >> 64) as i32;
100109
let nanoseconds_part: i64 = (value & 0xFFFFFFFFFFFFFFFF) as i64;
101110

102-
let secs = nanoseconds_part / 1000000000;
111+
let secs = nanoseconds_part / 1_000_000_000;
103112
let mins = secs / 60;
104113
let hours = mins / 60;
105114

106115
let secs = secs - (mins * 60);
107116
let mins = mins - (hours * 60);
108117

118+
let nanoseconds = nanoseconds_part % 1_000_000_000;
119+
120+
let secs_sign = if secs < 0 || nanoseconds < 0 { "-" } else { "" };
121+
109122
Ok(format!(
110-
"0 years {} mons {} days {} hours {} mins {}.{:09} secs",
123+
"0 years {} mons {} days {} hours {} mins {}{}.{:09} secs",
111124
months_part,
112125
days_part,
113126
hours,
114127
mins,
115-
secs,
116-
(nanoseconds_part % 1000000000),
128+
secs_sign,
129+
secs.abs(),
130+
nanoseconds.abs(),
117131
))
118132
}};
119133
}

arrow/src/util/pretty.rs

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -991,6 +991,9 @@ mod tests {
991991
#[test]
992992
fn test_pretty_format_interval_day_time() -> Result<()> {
993993
let arr = Arc::new(arrow_array::IntervalDayTimeArray::from(vec![
994+
Some(-600000),
995+
Some(4294966295),
996+
Some(4294967295),
994997
Some(1),
995998
Some(10),
996999
Some(100),
@@ -1007,13 +1010,16 @@ mod tests {
10071010
let table = pretty_format_batches(&[batch])?.to_string();
10081011

10091012
let expected = vec![
1010-
"+-------------------------------------------------+",
1011-
"| IntervalDayTime |",
1012-
"+-------------------------------------------------+",
1013-
"| 0 years 0 mons 0 days 0 hours 0 mins 0.001 secs |",
1014-
"| 0 years 0 mons 0 days 0 hours 0 mins 0.010 secs |",
1015-
"| 0 years 0 mons 0 days 0 hours 0 mins 0.100 secs |",
1016-
"+-------------------------------------------------+",
1013+
"+----------------------------------------------------+",
1014+
"| IntervalDayTime |",
1015+
"+----------------------------------------------------+",
1016+
"| 0 years 0 mons -1 days 0 hours -10 mins 0.000 secs |",
1017+
"| 0 years 0 mons 0 days 0 hours 0 mins -1.001 secs |",
1018+
"| 0 years 0 mons 0 days 0 hours 0 mins -0.001 secs |",
1019+
"| 0 years 0 mons 0 days 0 hours 0 mins 0.001 secs |",
1020+
"| 0 years 0 mons 0 days 0 hours 0 mins 0.010 secs |",
1021+
"| 0 years 0 mons 0 days 0 hours 0 mins 0.100 secs |",
1022+
"+----------------------------------------------------+",
10171023
];
10181024

10191025
let actual: Vec<&str> = table.lines().collect();
@@ -1026,6 +1032,9 @@ mod tests {
10261032
#[test]
10271033
fn test_pretty_format_interval_month_day_nano_array() -> Result<()> {
10281034
let arr = Arc::new(arrow_array::IntervalMonthDayNanoArray::from(vec![
1035+
Some(-600000000000),
1036+
Some(18446744072709551615),
1037+
Some(18446744073709551615),
10291038
Some(1),
10301039
Some(10),
10311040
Some(100),
@@ -1049,20 +1058,23 @@ mod tests {
10491058
let table = pretty_format_batches(&[batch])?.to_string();
10501059

10511060
let expected = vec![
1052-
"+-------------------------------------------------------+",
1053-
"| IntervalMonthDayNano |",
1054-
"+-------------------------------------------------------+",
1055-
"| 0 years 0 mons 0 days 0 hours 0 mins 0.000000001 secs |",
1056-
"| 0 years 0 mons 0 days 0 hours 0 mins 0.000000010 secs |",
1057-
"| 0 years 0 mons 0 days 0 hours 0 mins 0.000000100 secs |",
1058-
"| 0 years 0 mons 0 days 0 hours 0 mins 0.000001000 secs |",
1059-
"| 0 years 0 mons 0 days 0 hours 0 mins 0.000010000 secs |",
1060-
"| 0 years 0 mons 0 days 0 hours 0 mins 0.000100000 secs |",
1061-
"| 0 years 0 mons 0 days 0 hours 0 mins 0.001000000 secs |",
1062-
"| 0 years 0 mons 0 days 0 hours 0 mins 0.010000000 secs |",
1063-
"| 0 years 0 mons 0 days 0 hours 0 mins 0.100000000 secs |",
1064-
"| 0 years 0 mons 0 days 0 hours 0 mins 1.000000000 secs |",
1065-
"+-------------------------------------------------------+",
1061+
"+-----------------------------------------------------------+",
1062+
"| IntervalMonthDayNano |",
1063+
"+-----------------------------------------------------------+",
1064+
"| 0 years -1 mons -1 days 0 hours -10 mins 0.000000000 secs |",
1065+
"| 0 years 0 mons 0 days 0 hours 0 mins -1.000000001 secs |",
1066+
"| 0 years 0 mons 0 days 0 hours 0 mins -0.000000001 secs |",
1067+
"| 0 years 0 mons 0 days 0 hours 0 mins 0.000000001 secs |",
1068+
"| 0 years 0 mons 0 days 0 hours 0 mins 0.000000010 secs |",
1069+
"| 0 years 0 mons 0 days 0 hours 0 mins 0.000000100 secs |",
1070+
"| 0 years 0 mons 0 days 0 hours 0 mins 0.000001000 secs |",
1071+
"| 0 years 0 mons 0 days 0 hours 0 mins 0.000010000 secs |",
1072+
"| 0 years 0 mons 0 days 0 hours 0 mins 0.000100000 secs |",
1073+
"| 0 years 0 mons 0 days 0 hours 0 mins 0.001000000 secs |",
1074+
"| 0 years 0 mons 0 days 0 hours 0 mins 0.010000000 secs |",
1075+
"| 0 years 0 mons 0 days 0 hours 0 mins 0.100000000 secs |",
1076+
"| 0 years 0 mons 0 days 0 hours 0 mins 1.000000000 secs |",
1077+
"+-----------------------------------------------------------+",
10661078
];
10671079

10681080
let actual: Vec<&str> = table.lines().collect();

0 commit comments

Comments
 (0)