@@ -438,6 +438,7 @@ impl FileSource for GeoParquetFileSource {
438438 self . metadata_size_hint ,
439439 self . predicate . clone ( ) . unwrap ( ) ,
440440 base_config. file_schema . clone ( ) ,
441+ self . inner . table_parquet_options ( ) . global . pruning ,
441442 ) )
442443 }
443444
@@ -678,7 +679,7 @@ mod test {
678679
679680 #[ rstest]
680681 #[ tokio:: test]
681- 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 ) {
682683 let data_dir = geoarrow_data_dir ( ) . unwrap ( ) ;
683684 let ctx = setup_context ( ) ;
684685
@@ -690,10 +691,8 @@ mod test {
690691 )
691692 . into ( ) ;
692693
693- let definitely_non_intersecting_scalar = create_scalar (
694- Some ( "POLYGON ((100 200), (100 300), (200 300), (100 200))" ) ,
695- & WKB_GEOMETRY ,
696- ) ;
694+ let definitely_non_intersecting_scalar =
695+ create_scalar ( Some ( "POINT (100 200)" ) , & WKB_GEOMETRY ) ;
697696 let storage_field = WKB_GEOMETRY . to_storage_field ( "" , true ) . unwrap ( ) ;
698697
699698 let df = ctx
@@ -712,10 +711,7 @@ mod test {
712711 let batches_out = df. collect ( ) . await . unwrap ( ) ;
713712 assert ! ( batches_out. is_empty( ) ) ;
714713
715- let definitely_intersecting_scalar = create_scalar (
716- Some ( "POLYGON ((30 10), (30 20), (40 20), (40 10), (30 10))" ) ,
717- & WKB_GEOMETRY ,
718- ) ;
714+ let definitely_intersecting_scalar = create_scalar ( Some ( "POINT (30 10)" ) , & WKB_GEOMETRY ) ;
719715 let df = ctx
720716 . table ( format ! ( "{data_dir}/example/files/*_geo.parquet" ) )
721717 . await
@@ -733,6 +729,46 @@ mod test {
733729 assert ! ( !batches_out. is_empty( ) ) ;
734730 }
735731
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+
736772 #[ tokio:: test]
737773 async fn geoparquet_format_factory ( ) {
738774 let ctx = SessionContext :: new ( ) ;
0 commit comments