@@ -22,13 +22,13 @@ use crate::variation_const::{
2222    DATE_32_TYPE_VARIATION_REF ,  DATE_64_TYPE_VARIATION_REF , 
2323    DECIMAL_128_TYPE_VARIATION_REF ,  DECIMAL_256_TYPE_VARIATION_REF , 
2424    DEFAULT_CONTAINER_TYPE_VARIATION_REF ,  DEFAULT_INTERVAL_DAY_TYPE_VARIATION_REF , 
25-     DEFAULT_TYPE_VARIATION_REF ,  DURATION_INTERVAL_DAY_TYPE_VARIATION_REF , 
26-     INTERVAL_DAY_TIME_TYPE_REF ,   INTERVAL_MONTH_DAY_NANO_TYPE_NAME , 
27-     INTERVAL_MONTH_DAY_NANO_TYPE_REF ,   INTERVAL_YEAR_MONTH_TYPE_REF , 
28-     LARGE_CONTAINER_TYPE_VARIATION_REF ,   TIMESTAMP_MICRO_TYPE_VARIATION_REF , 
29-     TIMESTAMP_MILLI_TYPE_VARIATION_REF ,   TIMESTAMP_NANO_TYPE_VARIATION_REF , 
30-     TIMESTAMP_SECOND_TYPE_VARIATION_REF ,   UNSIGNED_INTEGER_TYPE_VARIATION_REF , 
31-     VIEW_CONTAINER_TYPE_VARIATION_REF , 
25+     DEFAULT_TYPE_VARIATION_REF ,  DICTIONARY_CONTAINER_TYPE_VARIATION_REF , 
26+     DURATION_INTERVAL_DAY_TYPE_VARIATION_REF ,   INTERVAL_DAY_TIME_TYPE_REF , 
27+     INTERVAL_MONTH_DAY_NANO_TYPE_NAME ,   INTERVAL_MONTH_DAY_NANO_TYPE_REF , 
28+     INTERVAL_YEAR_MONTH_TYPE_REF ,   LARGE_CONTAINER_TYPE_VARIATION_REF , 
29+     TIMESTAMP_MICRO_TYPE_VARIATION_REF ,   TIMESTAMP_MILLI_TYPE_VARIATION_REF , 
30+     TIMESTAMP_NANO_TYPE_VARIATION_REF ,   TIMESTAMP_SECOND_TYPE_VARIATION_REF , 
31+     UNSIGNED_INTEGER_TYPE_VARIATION_REF ,   VIEW_CONTAINER_TYPE_VARIATION_REF , 
3232} ; 
3333use  datafusion:: arrow:: datatypes:: { 
3434    DataType ,  Field ,  Fields ,  IntervalUnit ,  Schema ,  TimeUnit , 
@@ -181,24 +181,32 @@ pub fn from_substrait_type(
181181                let  value_type = map. value . as_ref ( ) . ok_or_else ( || { 
182182                    substrait_datafusion_err ! ( "Map type must have value type" ) 
183183                } ) ?; 
184-                 let  key_field = Arc :: new ( Field :: new ( 
185-                     "key" , 
186-                     from_substrait_type ( consumer,  key_type,  dfs_names,  name_idx) ?, 
187-                     false , 
188-                 ) ) ; 
189-                 let  value_field = Arc :: new ( Field :: new ( 
190-                     "value" , 
191-                     from_substrait_type ( consumer,  value_type,  dfs_names,  name_idx) ?, 
192-                     true , 
193-                 ) ) ; 
194-                 Ok ( DataType :: Map ( 
195-                     Arc :: new ( Field :: new_struct ( 
196-                         "entries" , 
197-                         [ key_field,  value_field] , 
198-                         false ,  // The inner map field is always non-nullable (Arrow #1697), 
184+                 let  key_type =
185+                     from_substrait_type ( consumer,  key_type,  dfs_names,  name_idx) ?; 
186+                 let  value_type =
187+                     from_substrait_type ( consumer,  value_type,  dfs_names,  name_idx) ?; 
188+ 
189+                 match  map. type_variation_reference  { 
190+                     DEFAULT_CONTAINER_TYPE_VARIATION_REF  => { 
191+                         let  key_field = Arc :: new ( Field :: new ( "key" ,  key_type,  false ) ) ; 
192+                         let  value_field = Arc :: new ( Field :: new ( "value" ,  value_type,  true ) ) ; 
193+                         Ok ( DataType :: Map ( 
194+                             Arc :: new ( Field :: new_struct ( 
195+                                 "entries" , 
196+                                 [ key_field,  value_field] , 
197+                                 false ,  // The inner map field is always non-nullable (Arrow #1697), 
198+                             ) ) , 
199+                             false ,  // whether keys are sorted 
200+                         ) ) 
201+                     } 
202+                     DICTIONARY_CONTAINER_TYPE_VARIATION_REF  => Ok ( DataType :: Dictionary ( 
203+                         Box :: new ( key_type) , 
204+                         Box :: new ( value_type) , 
199205                    ) ) , 
200-                     false ,  // whether keys are sorted 
201-                 ) ) 
206+                     v => not_impl_err ! ( 
207+                         "Unsupported Substrait type variation {v} of type {s_kind:?}" 
208+                     ) , 
209+                 } 
202210            } 
203211            r#type:: Kind :: Decimal ( d)  => match  d. type_variation_reference  { 
204212                DECIMAL_128_TYPE_VARIATION_REF  => { 
0 commit comments