@@ -41,13 +41,14 @@ use datafusion::execution::SendableRecordBatchStream;
41
41
use datafusion:: parquet:: basic:: { BrotliLevel , Compression , GzipLevel , ZstdLevel } ;
42
42
use datafusion:: physical_plan:: { ExecutionPlan , ExecutionPlanProperties } ;
43
43
use datafusion:: prelude:: * ;
44
+ use datafusion:: sql:: unparser:: plan_to_sql;
44
45
use datafusion_proto:: physical_plan:: AsExecutionPlan ;
45
46
use datafusion_proto:: protobuf:: PhysicalPlanNode ;
46
47
use prost:: Message ;
47
48
use pyo3:: exceptions:: PyValueError ;
48
49
use pyo3:: prelude:: * ;
49
50
use pyo3:: pybacked:: PyBackedStr ;
50
- use pyo3:: types:: { PyBytes , PyCapsule , PyDict , PyTuple , PyTupleMethods } ;
51
+ use pyo3:: types:: { PyBytes , PyCapsule , PyDict , PyString , PyTuple , PyTupleMethods } ;
51
52
use tokio:: task:: JoinHandle ;
52
53
53
54
use crate :: catalog:: PyTable ;
@@ -713,6 +714,13 @@ impl PyDataFrame {
713
714
let future_plan = DistributedPlan :: try_new ( self . df . as_ref ( ) ) ;
714
715
wait_for_future ( py, future_plan) . map_err ( py_datafusion_err)
715
716
}
717
+
718
+ fn plan_sql ( & self , py : Python < ' _ > ) -> PyResult < PyObject > {
719
+ let logical_plan = self . df . logical_plan ( ) ;
720
+
721
+ let sql = plan_to_sql ( logical_plan) . map_err ( py_datafusion_err) ?;
722
+ Ok ( PyString :: new ( py, sql. to_string ( ) . as_ref ( ) ) . into ( ) )
723
+ }
716
724
}
717
725
718
726
#[ pyclass( get_all) ]
0 commit comments