okhsunrog commented on code in PR #10927:
URL: https://github.com/apache/arrow-rs/pull/10927#discussion_r3905581761


##########
arrow-select/src/concat.rs:
##########
@@ -1708,6 +1708,124 @@ mod tests {
         assert_eq!(array.logical_null_count(), 10);
     }
 
+    #[test]
+    fn concat_string_view_dictionary_merges_duplicate_values() {
+        // Two independently-built `Dictionary<UInt8, Utf8View>` arrays 
holding the
+        // same 200 distinct values. Naively concatenating their dictionaries 
yields
+        // 400 entries, which overflows the u8 key range, but the distinct 
values do
+        // fit -- so the values must be merged and deduplicated instead. This 
mirrors
+        // a `Dictionary<UInt16, Utf8View>` column read in several partitions, 
each
+        // building its own dictionary, and then combined.
+        let dict = |offset: usize| {
+            let values: StringViewArray = (0..200).map(|i| 
Some(format!("v{i}"))).collect();
+            let keys = UInt8Array::from_iter_values((0..200).map(|i| (i + 
offset) as u8 % 200));
+            DictionaryArray::<UInt8Type>::new(keys, Arc::new(values))
+        };
+        let (a, b) = (dict(0), dict(7));
+
+        let combined = concat(&[&a, &b]).unwrap();
+        let combined = combined.as_dictionary::<UInt8Type>();
+
+        assert_eq!(combined.len(), 400);
+        assert_eq!(combined.values().data_type(), &DataType::Utf8View);
+        assert!(combined.values().len() < 400);

Review Comment:
   It is 251 here, not 200. With only two dictionaries the best-effort interner 
has enough buckets to do the merge on its own, so the exact retry never runs 
and 51 duplicates survive. The property worth asserting is that the result fits 
the key type, so I went with 
`assert!(u8::try_from(combined.values().len()).is_ok())` and said why in a 
comment. The test still checks every key resolves to its original value, which 
is the real guarantee.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to