@@ -679,7 +679,7 @@ mod test {
679679
680680 #[ rstest]
681681 #[ tokio:: test]
682- async fn pruning_geoparquet_metadata ( #[ values( "st_intersects" , "st_within " ) ] udf_name : & str ) {
682+ async fn pruning_geoparquet_metadata ( #[ values( "st_intersects" , "st_contains " ) ] udf_name : & str ) {
683683 let data_dir = geoarrow_data_dir ( ) . unwrap ( ) ;
684684 let ctx = setup_context ( ) ;
685685
@@ -691,10 +691,8 @@ mod test {
691691 )
692692 . into ( ) ;
693693
694- let definitely_non_intersecting_scalar = create_scalar (
695- Some ( "POLYGON ((100 200), (100 300), (200 300), (100 200))" ) ,
696- & WKB_GEOMETRY ,
697- ) ;
694+ let definitely_non_intersecting_scalar =
695+ create_scalar ( Some ( "POINT (100 200)" ) , & WKB_GEOMETRY ) ;
698696 let storage_field = WKB_GEOMETRY . to_storage_field ( "" , true ) . unwrap ( ) ;
699697
700698 let df = ctx
@@ -713,10 +711,7 @@ mod test {
713711 let batches_out = df. collect ( ) . await . unwrap ( ) ;
714712 assert ! ( batches_out. is_empty( ) ) ;
715713
716- let definitely_intersecting_scalar = create_scalar (
717- Some ( "POLYGON ((30 10), (30 20), (40 20), (40 10), (30 10))" ) ,
718- & WKB_GEOMETRY ,
719- ) ;
714+ let definitely_intersecting_scalar = create_scalar ( Some ( "POINT (30 10)" ) , & WKB_GEOMETRY ) ;
720715 let df = ctx
721716 . table ( format ! ( "{data_dir}/example/files/*_geo.parquet" ) )
722717 . await
@@ -734,6 +729,46 @@ mod test {
734729 assert ! ( !batches_out. is_empty( ) ) ;
735730 }
736731
732+ #[ tokio:: test]
733+ async fn should_not_prune_geoparquet_metadata_after_disabling_pruning ( ) {
734+ let data_dir = geoarrow_data_dir ( ) . unwrap ( ) ;
735+ let ctx = setup_context ( ) ;
736+ ctx. sql ( "SET datafusion.execution.parquet.pruning TO false" )
737+ . await
738+ . expect ( "Disabling parquet pruning failed" ) ;
739+
740+ let udf: ScalarUDF = SimpleScalarUDF :: new_with_signature (
741+ "st_intersects" ,
742+ Signature :: any ( 2 , Volatility :: Immutable ) ,
743+ DataType :: Boolean ,
744+ Arc :: new ( |_args| Ok ( ScalarValue :: Boolean ( Some ( true ) ) . into ( ) ) ) ,
745+ )
746+ . into ( ) ;
747+
748+ let definitely_non_intersecting_scalar =
749+ create_scalar ( Some ( "POINT (100 200)" ) , & WKB_GEOMETRY ) ;
750+ let storage_field = WKB_GEOMETRY . to_storage_field ( "" , true ) . unwrap ( ) ;
751+
752+ let df = ctx
753+ . table ( format ! ( "{data_dir}/example/files/*_geo.parquet" ) )
754+ . await
755+ . unwrap ( )
756+ . filter ( udf. call ( vec ! [
757+ col( "geometry" ) ,
758+ Expr :: Literal (
759+ definitely_non_intersecting_scalar,
760+ Some ( storage_field. metadata( ) . into( ) ) ,
761+ ) ,
762+ ] ) )
763+ . unwrap ( ) ;
764+
765+ // Even if the query window does not intersect with the data, we should not prune
766+ // any files because pruning has been disabled. We can retrieve the data here
767+ // because the dummy UDF always returns true.
768+ let batches_out = df. collect ( ) . await . unwrap ( ) ;
769+ assert ! ( !batches_out. is_empty( ) ) ;
770+ }
771+
737772 #[ tokio:: test]
738773 async fn geoparquet_format_factory ( ) {
739774 let ctx = SessionContext :: new ( ) ;
0 commit comments