@@ -41,13 +41,14 @@ use datafusion::execution::SendableRecordBatchStream;
4141use datafusion:: parquet:: basic:: { BrotliLevel , Compression , GzipLevel , ZstdLevel } ;
4242use datafusion:: physical_plan:: { ExecutionPlan , ExecutionPlanProperties } ;
4343use datafusion:: prelude:: * ;
44+ use datafusion:: sql:: unparser:: plan_to_sql;
4445use datafusion_proto:: physical_plan:: AsExecutionPlan ;
4546use datafusion_proto:: protobuf:: PhysicalPlanNode ;
4647use prost:: Message ;
4748use pyo3:: exceptions:: PyValueError ;
4849use pyo3:: prelude:: * ;
4950use pyo3:: pybacked:: PyBackedStr ;
50- use pyo3:: types:: { PyBytes , PyCapsule , PyDict , PyTuple , PyTupleMethods } ;
51+ use pyo3:: types:: { PyBytes , PyCapsule , PyDict , PyString , PyTuple , PyTupleMethods } ;
5152use tokio:: task:: JoinHandle ;
5253
5354use crate :: catalog:: PyTable ;
@@ -713,6 +714,13 @@ impl PyDataFrame {
713714 let future_plan = DistributedPlan :: try_new ( self . df . as_ref ( ) ) ;
714715 wait_for_future ( py, future_plan) . map_err ( py_datafusion_err)
715716 }
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+ }
716724}
717725
718726#[ pyclass( get_all) ]
0 commit comments