@@ -596,12 +596,92 @@ async fn query_nested_get_indexed_field() -> Result<()> {
596596 "+----------+" ,
597597 ] ;
598598 assert_batches_eq ! ( expected, & actual) ;
599+
600+ // nested with scalar values
599601 let sql = "SELECT some_list[0][0] as i0 FROM ints LIMIT 3" ;
600602 let actual = execute_to_batches ( & ctx, sql) . await ;
601603 let expected = vec ! [
602604 "+----+" , "| i0 |" , "+----+" , "| 0 |" , "| 5 |" , "| 11 |" , "+----+" ,
603605 ] ;
604606 assert_batches_eq ! ( expected, & actual) ;
607+
608+ // nested with dynamic expr in key
609+ assert_batches_eq ! ( expected, & actual) ;
610+ let sql = "SELECT some_list[1 - 1][1 - 1] as i0 FROM ints LIMIT 3" ;
611+ let actual = execute_to_batches ( & ctx, sql) . await ;
612+ let expected = vec ! [
613+ "+----+" , "| i0 |" , "+----+" , "| 0 |" , "| 5 |" , "| 11 |" , "+----+" ,
614+ ] ;
615+ assert_batches_eq ! ( expected, & actual) ;
616+
617+ Ok ( ( ) )
618+ }
619+
620+ #[ tokio:: test]
621+ async fn query_get_indexed_array_dynamic_key ( ) -> Result < ( ) > {
622+ let ctx = SessionContext :: new ( ) ;
623+
624+ let list_dt = Box :: new ( Field :: new ( "item" , DataType :: Int64 , true ) ) ;
625+ let schema = Arc :: new ( Schema :: new ( vec ! [
626+ Field :: new( "arr" , DataType :: List ( list_dt) , false ) ,
627+ Field :: new( "key" , DataType :: Int64 , false ) ,
628+ ] ) ) ;
629+
630+ let array_ints_builder = PrimitiveBuilder :: < Int64Type > :: new ( 3 ) ;
631+ let mut arr_builder = ListBuilder :: new ( array_ints_builder) ;
632+ let mut key_builder = PrimitiveBuilder :: < Int64Type > :: new ( 3 ) ;
633+
634+ for ( int_vec, key) in vec ! [
635+ ( vec![ 0 , 1 , 2 , 3 ] , 1 ) ,
636+ ( vec![ 4 , 5 , 6 , 7 ] , 2 ) ,
637+ ( vec![ 8 , 9 , 10 , 11 ] , 3 ) ,
638+ ] {
639+ for n in int_vec {
640+ arr_builder. values ( ) . append_value ( n) ?;
641+ }
642+
643+ key_builder. append_value ( key) ?;
644+ arr_builder. append ( true ) ?;
645+ }
646+
647+ let data = RecordBatch :: try_new (
648+ schema. clone ( ) ,
649+ vec ! [
650+ Arc :: new( arr_builder. finish( ) ) ,
651+ Arc :: new( key_builder. finish( ) ) ,
652+ ] ,
653+ ) ?;
654+ let table = MemTable :: try_new ( schema, vec ! [ vec![ data] ] ) ?;
655+ let table_a = Arc :: new ( table) ;
656+
657+ ctx. register_table ( "array_and_keys" , table_a) ?;
658+
659+ let sql = "SELECT arr[key], key FROM array_and_keys" ;
660+ let actual = execute_to_batches ( & ctx, sql) . await ;
661+ let expected = vec ! [
662+ "+----------------------------------------+-----+" ,
663+ "| array_and_keys.arr[array_and_keys.key] | key |" ,
664+ "+----------------------------------------+-----+" ,
665+ "| 0 | 1 |" ,
666+ "| 4 | 2 |" ,
667+ "| 8 | 3 |" ,
668+ "+----------------------------------------+-----+" ,
669+ ] ;
670+ assert_batches_eq ! ( expected, & actual) ;
671+
672+ // All dynamic
673+ let sql = "SELECT r.value[r.key] FROM (SELECT array[1,2,3] as value, 1 as key UNION ALL SELECT array[4,5,6] as value, 2 as key) as r" ;
674+ let actual = execute_to_batches ( & ctx, sql) . await ;
675+ let expected = vec ! [
676+ "+----------------+" ,
677+ "| r.value[r.key] |" ,
678+ "+----------------+" ,
679+ "| 1 |" ,
680+ "| 5 |" ,
681+ "+----------------+" ,
682+ ] ;
683+ assert_batches_eq ! ( expected, & actual) ;
684+
605685 Ok ( ( ) )
606686}
607687
@@ -634,7 +714,7 @@ async fn query_nested_get_indexed_field_on_struct() -> Result<()> {
634714 ctx. register_table ( "structs" , table_a) ?;
635715
636716 // Original column is micros, convert to millis and check timestamp
637- let sql = "SELECT some_struct[\" bar\" ] as l0 FROM structs LIMIT 3" ;
717+ let sql = "SELECT some_struct[' bar' ] as l0 FROM structs LIMIT 3" ;
638718 let actual = execute_to_batches ( & ctx, sql) . await ;
639719 let expected = vec ! [
640720 "+----------------+" ,
@@ -661,7 +741,7 @@ async fn query_nested_get_indexed_field_on_struct() -> Result<()> {
661741 ] ;
662742 assert_batches_eq ! ( expected, & actual) ;
663743
664- let sql = "SELECT some_struct[\" bar\" ][0] as i0 FROM structs LIMIT 3" ;
744+ let sql = "SELECT some_struct[' bar' ][0] as i0 FROM structs LIMIT 3" ;
665745 let actual = execute_to_batches ( & ctx, sql) . await ;
666746 let expected = vec ! [
667747 "+----+" , "| i0 |" , "+----+" , "| 0 |" , "| 4 |" , "| 8 |" , "+----+" ,
0 commit comments