@@ -2833,6 +2833,41 @@ mod tests {
28332833 ) )
28342834 } ) ?;
28352835
2836+ // Additional test: Dictionary deduplication with repeated keys
2837+ // This tests that multiple rows with the same key (pointing to the same value)
2838+ // are evaluated correctly
2839+ let dedup_case = DictionaryInListTestCase {
2840+ _name : "dictionary_deduplication" ,
2841+ dict_type : DataType :: Dictionary (
2842+ Box :: new ( DataType :: Int8 ) ,
2843+ Box :: new ( DataType :: Utf8 ) ,
2844+ ) ,
2845+ // Keys: [0, 1, 0, 1, null] - keys 0 and 1 are repeated
2846+ // This creates data: ["a", "d", "a", "d", null]
2847+ dict_keys : vec ! [ Some ( 0 ) , Some ( 1 ) , Some ( 0 ) , Some ( 1 ) , None ] ,
2848+ dict_values : Arc :: new ( StringArray :: from ( vec ! [ Some ( "a" ) , Some ( "d" ) ] ) ) ,
2849+ list_values_no_null : vec ! [ lit( "a" ) , lit( "b" ) ] ,
2850+ list_values_with_null : vec ! [ lit( "a" ) , lit( "b" ) , lit( ScalarValue :: Utf8 ( None ) ) ] ,
2851+ // Test 1: a IN ("a", "b") → [true, false, true, false, null]
2852+ // Rows 0 and 2 both have key 0 → "a", so both are true
2853+ expected_1 : vec ! [ Some ( true ) , Some ( false ) , Some ( true ) , Some ( false ) , None ] ,
2854+ // Test 2: a NOT IN ("a", "b") → [false, true, false, true, null]
2855+ expected_2 : vec ! [ Some ( false ) , Some ( true ) , Some ( false ) , Some ( true ) , None ] ,
2856+ // Test 3: a IN ("a", "b", NULL) → [true, null, true, null, null]
2857+ // "d" becomes null due to NULL in list
2858+ expected_3 : vec ! [ Some ( true ) , None , Some ( true ) , None , None ] ,
2859+ // Test 4: a NOT IN ("a", "b", NULL) → [false, null, false, null, null]
2860+ expected_4 : vec ! [ Some ( false ) , None , Some ( false ) , None , None ] ,
2861+ dict_needle_test : None ,
2862+ } ;
2863+
2864+ run_dictionary_in_list_test ( dedup_case) . map_err ( |e| {
2865+ datafusion_common:: DataFusionError :: Execution ( format ! (
2866+ "Dictionary deduplication test failed: {}" ,
2867+ e
2868+ ) )
2869+ } ) ?;
2870+
28362871 // Additional test for Float64 NaN in IN list
28372872 let dict_type =
28382873 DataType :: Dictionary ( Box :: new ( DataType :: Int8 ) , Box :: new ( DataType :: Float64 ) ) ;
0 commit comments