This is an automated email from the ASF dual-hosted git repository.

comphead pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion-comet.git


The following commit(s) were added to refs/heads/main by this push:
     new a99f7428 feat: Enable `clippy::clone_on_ref_ptr` on `core` crate (#860)
a99f7428 is described below

commit a99f7428398793507b31188c8919e4cf128d8d38
Author: Oleks V <[email protected]>
AuthorDate: Wed Aug 21 19:45:06 2024 -0700

    feat: Enable `clippy::clone_on_ref_ptr` on `core` crate (#860)
---
 .../src/execution/datafusion/expressions/avg.rs    |   2 +-
 .../datafusion/expressions/avg_decimal.rs          |   2 +-
 .../datafusion/expressions/bitwise_not.rs          |   2 +-
 .../expressions/bloom_filter_might_contain.rs      |   4 +-
 .../datafusion/expressions/checkoverflow.rs        |   2 +-
 .../datafusion/expressions/correlation.rs          |  22 ++-
 .../execution/datafusion/expressions/covariance.rs |   2 +-
 .../execution/datafusion/expressions/negative.rs   |   2 +-
 .../datafusion/expressions/normalize_nan.rs        |   2 +-
 .../src/execution/datafusion/expressions/stddev.rs |   2 +-
 .../execution/datafusion/expressions/strings.rs    |   4 +-
 .../datafusion/expressions/sum_decimal.rs          |   2 +-
 .../execution/datafusion/expressions/variance.rs   |   2 +-
 .../src/execution/datafusion/operators/expand.rs   |  19 ++-
 native/core/src/execution/datafusion/planner.rs    | 171 ++++++++++++---------
 .../src/execution/datafusion/shuffle_writer.rs     |  20 +--
 native/core/src/execution/jni_api.rs               |   4 +-
 native/core/src/execution/operators/copy.rs        |  15 +-
 native/core/src/execution/operators/filter.rs      |   2 +-
 native/core/src/execution/operators/scan.rs        |   4 +-
 native/core/src/lib.rs                             |   6 +-
 native/core/src/parquet/read/column.rs             |  10 +-
 native/core/src/parquet/util/buffer.rs             |   2 +-
 native/core/src/parquet/util/memory.rs             |  14 +-
 .../core/src/parquet/util/test_common/page_util.rs |   7 +-
 25 files changed, 185 insertions(+), 139 deletions(-)

diff --git a/native/core/src/execution/datafusion/expressions/avg.rs 
b/native/core/src/execution/datafusion/expressions/avg.rs
index d1ebc67d..c3277bf7 100644
--- a/native/core/src/execution/datafusion/expressions/avg.rs
+++ b/native/core/src/execution/datafusion/expressions/avg.rs
@@ -96,7 +96,7 @@ impl AggregateExpr for Avg {
     }
 
     fn expressions(&self) -> Vec<Arc<dyn PhysicalExpr>> {
-        vec![self.expr.clone()]
+        vec![Arc::clone(&self.expr)]
     }
 
     fn name(&self) -> &str {
diff --git a/native/core/src/execution/datafusion/expressions/avg_decimal.rs 
b/native/core/src/execution/datafusion/expressions/avg_decimal.rs
index 7a6e988e..d29dc6da 100644
--- a/native/core/src/execution/datafusion/expressions/avg_decimal.rs
+++ b/native/core/src/execution/datafusion/expressions/avg_decimal.rs
@@ -107,7 +107,7 @@ impl AggregateExpr for AvgDecimal {
     }
 
     fn expressions(&self) -> Vec<Arc<dyn PhysicalExpr>> {
-        vec![self.expr.clone()]
+        vec![Arc::clone(&self.expr)]
     }
 
     fn name(&self) -> &str {
diff --git a/native/core/src/execution/datafusion/expressions/bitwise_not.rs 
b/native/core/src/execution/datafusion/expressions/bitwise_not.rs
index 06ead267..c7b2bc06 100644
--- a/native/core/src/execution/datafusion/expressions/bitwise_not.rs
+++ b/native/core/src/execution/datafusion/expressions/bitwise_not.rs
@@ -113,7 +113,7 @@ impl PhysicalExpr for BitwiseNotExpr {
         self: Arc<Self>,
         children: Vec<Arc<dyn PhysicalExpr>>,
     ) -> Result<Arc<dyn PhysicalExpr>> {
-        Ok(Arc::new(BitwiseNotExpr::new(children[0].clone())))
+        Ok(Arc::new(BitwiseNotExpr::new(Arc::clone(&children[0]))))
     }
 
     fn dyn_hash(&self, state: &mut dyn Hasher) {
diff --git 
a/native/core/src/execution/datafusion/expressions/bloom_filter_might_contain.rs
 
b/native/core/src/execution/datafusion/expressions/bloom_filter_might_contain.rs
index b922119f..b66ca5b2 100644
--- 
a/native/core/src/execution/datafusion/expressions/bloom_filter_might_contain.rs
+++ 
b/native/core/src/execution/datafusion/expressions/bloom_filter_might_contain.rs
@@ -138,8 +138,8 @@ impl PhysicalExpr for BloomFilterMightContain {
         children: Vec<Arc<dyn PhysicalExpr>>,
     ) -> Result<Arc<dyn PhysicalExpr>> {
         Ok(Arc::new(BloomFilterMightContain::try_new(
-            children[0].clone(),
-            children[1].clone(),
+            Arc::clone(&children[0]),
+            Arc::clone(&children[1]),
         )?))
     }
 
diff --git a/native/core/src/execution/datafusion/expressions/checkoverflow.rs 
b/native/core/src/execution/datafusion/expressions/checkoverflow.rs
index e4f54a1b..ff2cffd4 100644
--- a/native/core/src/execution/datafusion/expressions/checkoverflow.rs
+++ b/native/core/src/execution/datafusion/expressions/checkoverflow.rs
@@ -158,7 +158,7 @@ impl PhysicalExpr for CheckOverflow {
         children: Vec<Arc<dyn PhysicalExpr>>,
     ) -> datafusion_common::Result<Arc<dyn PhysicalExpr>> {
         Ok(Arc::new(CheckOverflow::new(
-            children[0].clone(),
+            Arc::clone(&children[0]),
             self.data_type.clone(),
             self.fail_on_error,
         )))
diff --git a/native/core/src/execution/datafusion/expressions/correlation.rs 
b/native/core/src/execution/datafusion/expressions/correlation.rs
index 78a3f341..642c7d86 100644
--- a/native/core/src/execution/datafusion/expressions/correlation.rs
+++ b/native/core/src/execution/datafusion/expressions/correlation.rs
@@ -115,7 +115,7 @@ impl AggregateExpr for Correlation {
     }
 
     fn expressions(&self) -> Vec<Arc<dyn PhysicalExpr>> {
-        vec![self.expr1.clone(), self.expr2.clone()]
+        vec![Arc::clone(&self.expr1), Arc::clone(&self.expr2)]
     }
 
     fn name(&self) -> &str {
@@ -209,13 +209,21 @@ impl Accumulator for CorrelationAccumulator {
 
     fn merge_batch(&mut self, states: &[ArrayRef]) -> Result<()> {
         let states_c = [
-            states[0].clone(),
-            states[1].clone(),
-            states[2].clone(),
-            states[3].clone(),
+            Arc::clone(&states[0]),
+            Arc::clone(&states[1]),
+            Arc::clone(&states[2]),
+            Arc::clone(&states[3]),
+        ];
+        let states_s1 = [
+            Arc::clone(&states[0]),
+            Arc::clone(&states[1]),
+            Arc::clone(&states[4]),
+        ];
+        let states_s2 = [
+            Arc::clone(&states[0]),
+            Arc::clone(&states[2]),
+            Arc::clone(&states[5]),
         ];
-        let states_s1 = [states[0].clone(), states[1].clone(), 
states[4].clone()];
-        let states_s2 = [states[0].clone(), states[2].clone(), 
states[5].clone()];
 
         if states[0].len() > 0 && states[1].len() > 0 && states[2].len() > 0 {
             self.covar.merge_batch(&states_c)?;
diff --git a/native/core/src/execution/datafusion/expressions/covariance.rs 
b/native/core/src/execution/datafusion/expressions/covariance.rs
index 151fb61a..20a6fab9 100644
--- a/native/core/src/execution/datafusion/expressions/covariance.rs
+++ b/native/core/src/execution/datafusion/expressions/covariance.rs
@@ -112,7 +112,7 @@ impl AggregateExpr for Covariance {
     }
 
     fn expressions(&self) -> Vec<Arc<dyn PhysicalExpr>> {
-        vec![self.expr1.clone(), self.expr2.clone()]
+        vec![Arc::clone(&self.expr1), Arc::clone(&self.expr2)]
     }
 
     fn name(&self) -> &str {
diff --git a/native/core/src/execution/datafusion/expressions/negative.rs 
b/native/core/src/execution/datafusion/expressions/negative.rs
index 9e82812b..fbcd194f 100644
--- a/native/core/src/execution/datafusion/expressions/negative.rs
+++ b/native/core/src/execution/datafusion/expressions/negative.rs
@@ -200,7 +200,7 @@ impl PhysicalExpr for NegativeExpr {
         children: Vec<Arc<dyn PhysicalExpr>>,
     ) -> Result<Arc<dyn PhysicalExpr>> {
         Ok(Arc::new(NegativeExpr::new(
-            children[0].clone(),
+            Arc::clone(&children[0]),
             self.fail_on_error,
         )))
     }
diff --git a/native/core/src/execution/datafusion/expressions/normalize_nan.rs 
b/native/core/src/execution/datafusion/expressions/normalize_nan.rs
index 3bd5feea..d2192fee 100644
--- a/native/core/src/execution/datafusion/expressions/normalize_nan.rs
+++ b/native/core/src/execution/datafusion/expressions/normalize_nan.rs
@@ -87,7 +87,7 @@ impl PhysicalExpr for NormalizeNaNAndZero {
     ) -> datafusion_common::Result<Arc<dyn PhysicalExpr>> {
         Ok(Arc::new(NormalizeNaNAndZero::new(
             self.data_type.clone(),
-            children[0].clone(),
+            Arc::clone(&children[0]),
         )))
     }
 
diff --git a/native/core/src/execution/datafusion/expressions/stddev.rs 
b/native/core/src/execution/datafusion/expressions/stddev.rs
index bbddf9aa..50d66463 100644
--- a/native/core/src/execution/datafusion/expressions/stddev.rs
+++ b/native/core/src/execution/datafusion/expressions/stddev.rs
@@ -102,7 +102,7 @@ impl AggregateExpr for Stddev {
     }
 
     fn expressions(&self) -> Vec<Arc<dyn PhysicalExpr>> {
-        vec![self.expr.clone()]
+        vec![Arc::clone(&self.expr)]
     }
 
     fn name(&self) -> &str {
diff --git a/native/core/src/execution/datafusion/expressions/strings.rs 
b/native/core/src/execution/datafusion/expressions/strings.rs
index 9112c256..96e45eae 100644
--- a/native/core/src/execution/datafusion/expressions/strings.rs
+++ b/native/core/src/execution/datafusion/expressions/strings.rs
@@ -228,7 +228,7 @@ impl PhysicalExpr for SubstringExpr {
         children: Vec<Arc<dyn PhysicalExpr>>,
     ) -> datafusion_common::Result<Arc<dyn PhysicalExpr>> {
         Ok(Arc::new(SubstringExpr::new(
-            children[0].clone(),
+            Arc::clone(&children[0]),
             self.start,
             self.len,
         )))
@@ -292,7 +292,7 @@ impl PhysicalExpr for StringSpaceExpr {
         self: Arc<Self>,
         children: Vec<Arc<dyn PhysicalExpr>>,
     ) -> datafusion_common::Result<Arc<dyn PhysicalExpr>> {
-        Ok(Arc::new(StringSpaceExpr::new(children[0].clone())))
+        Ok(Arc::new(StringSpaceExpr::new(Arc::clone(&children[0]))))
     }
 
     fn dyn_hash(&self, state: &mut dyn Hasher) {
diff --git a/native/core/src/execution/datafusion/expressions/sum_decimal.rs 
b/native/core/src/execution/datafusion/expressions/sum_decimal.rs
index 2afbbf01..4eb36cbd 100644
--- a/native/core/src/execution/datafusion/expressions/sum_decimal.rs
+++ b/native/core/src/execution/datafusion/expressions/sum_decimal.rs
@@ -94,7 +94,7 @@ impl AggregateExpr for SumDecimal {
     }
 
     fn expressions(&self) -> Vec<Arc<dyn PhysicalExpr>> {
-        vec![self.expr.clone()]
+        vec![Arc::clone(&self.expr)]
     }
 
     fn name(&self) -> &str {
diff --git a/native/core/src/execution/datafusion/expressions/variance.rs 
b/native/core/src/execution/datafusion/expressions/variance.rs
index f996c13d..19322aa6 100644
--- a/native/core/src/execution/datafusion/expressions/variance.rs
+++ b/native/core/src/execution/datafusion/expressions/variance.rs
@@ -100,7 +100,7 @@ impl AggregateExpr for Variance {
     }
 
     fn expressions(&self) -> Vec<Arc<dyn PhysicalExpr>> {
-        vec![self.expr.clone()]
+        vec![Arc::clone(&self.expr)]
     }
 
     fn name(&self) -> &str {
diff --git a/native/core/src/execution/datafusion/operators/expand.rs 
b/native/core/src/execution/datafusion/operators/expand.rs
index 67171212..a3dd0650 100644
--- a/native/core/src/execution/datafusion/operators/expand.rs
+++ b/native/core/src/execution/datafusion/operators/expand.rs
@@ -52,7 +52,7 @@ impl CometExpandExec {
         schema: SchemaRef,
     ) -> Self {
         let cache = PlanProperties::new(
-            EquivalenceProperties::new(schema.clone()),
+            EquivalenceProperties::new(Arc::clone(&schema)),
             Partitioning::UnknownPartitioning(1),
             ExecutionMode::Bounded,
         );
@@ -93,7 +93,7 @@ impl ExecutionPlan for CometExpandExec {
     }
 
     fn schema(&self) -> SchemaRef {
-        self.schema.clone()
+        Arc::clone(&self.schema)
     }
 
     fn children(&self) -> Vec<&Arc<dyn ExecutionPlan>> {
@@ -106,8 +106,8 @@ impl ExecutionPlan for CometExpandExec {
     ) -> datafusion_common::Result<Arc<dyn ExecutionPlan>> {
         let new_expand = CometExpandExec::new(
             self.projections.clone(),
-            children[0].clone(),
-            self.schema.clone(),
+            Arc::clone(&children[0]),
+            Arc::clone(&self.schema),
         );
         Ok(Arc::new(new_expand))
     }
@@ -118,8 +118,11 @@ impl ExecutionPlan for CometExpandExec {
         context: Arc<TaskContext>,
     ) -> datafusion_common::Result<SendableRecordBatchStream> {
         let child_stream = self.child.execute(partition, context)?;
-        let expand_stream =
-            ExpandStream::new(self.projections.clone(), child_stream, 
self.schema.clone());
+        let expand_stream = ExpandStream::new(
+            self.projections.clone(),
+            child_stream,
+            Arc::clone(&self.schema),
+        );
         Ok(Box::pin(expand_stream))
     }
 
@@ -174,7 +177,7 @@ impl ExpandStream {
         })?;
 
         let options = 
RecordBatchOptions::new().with_row_count(Some(batch.num_rows()));
-        RecordBatch::try_new_with_options(self.schema.clone(), columns, 
&options)
+        RecordBatch::try_new_with_options(Arc::clone(&self.schema), columns, 
&options)
             .map_err(|e| e.into())
     }
 }
@@ -210,6 +213,6 @@ impl Stream for ExpandStream {
 
 impl RecordBatchStream for ExpandStream {
     fn schema(&self) -> SchemaRef {
-        self.schema.clone()
+        Arc::clone(&self.schema)
     }
 }
diff --git a/native/core/src/execution/datafusion/planner.rs 
b/native/core/src/execution/datafusion/planner.rs
index fe6ef9f7..b0137bf8 100644
--- a/native/core/src/execution/datafusion/planner.rs
+++ b/native/core/src/execution/datafusion/planner.rs
@@ -163,7 +163,7 @@ impl PhysicalPlanner {
         Self {
             exec_context_id,
             execution_props: self.execution_props,
-            session_ctx: self.session_ctx.clone(),
+            session_ctx: Arc::clone(&self.session_ctx),
         }
     }
 
@@ -210,37 +210,43 @@ impl PhysicalPlanner {
                 input_schema,
             ),
             ExprStruct::Eq(expr) => {
-                let left = self.create_expr(expr.left.as_ref().unwrap(), 
input_schema.clone())?;
+                let left =
+                    self.create_expr(expr.left.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let right = self.create_expr(expr.right.as_ref().unwrap(), 
input_schema)?;
                 let op = DataFusionOperator::Eq;
                 Ok(Arc::new(BinaryExpr::new(left, op, right)))
             }
             ExprStruct::Neq(expr) => {
-                let left = self.create_expr(expr.left.as_ref().unwrap(), 
input_schema.clone())?;
+                let left =
+                    self.create_expr(expr.left.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let right = self.create_expr(expr.right.as_ref().unwrap(), 
input_schema)?;
                 let op = DataFusionOperator::NotEq;
                 Ok(Arc::new(BinaryExpr::new(left, op, right)))
             }
             ExprStruct::Gt(expr) => {
-                let left = self.create_expr(expr.left.as_ref().unwrap(), 
input_schema.clone())?;
+                let left =
+                    self.create_expr(expr.left.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let right = self.create_expr(expr.right.as_ref().unwrap(), 
input_schema)?;
                 let op = DataFusionOperator::Gt;
                 Ok(Arc::new(BinaryExpr::new(left, op, right)))
             }
             ExprStruct::GtEq(expr) => {
-                let left = self.create_expr(expr.left.as_ref().unwrap(), 
input_schema.clone())?;
+                let left =
+                    self.create_expr(expr.left.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let right = self.create_expr(expr.right.as_ref().unwrap(), 
input_schema)?;
                 let op = DataFusionOperator::GtEq;
                 Ok(Arc::new(BinaryExpr::new(left, op, right)))
             }
             ExprStruct::Lt(expr) => {
-                let left = self.create_expr(expr.left.as_ref().unwrap(), 
input_schema.clone())?;
+                let left =
+                    self.create_expr(expr.left.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let right = self.create_expr(expr.right.as_ref().unwrap(), 
input_schema)?;
                 let op = DataFusionOperator::Lt;
                 Ok(Arc::new(BinaryExpr::new(left, op, right)))
             }
             ExprStruct::LtEq(expr) => {
-                let left = self.create_expr(expr.left.as_ref().unwrap(), 
input_schema.clone())?;
+                let left =
+                    self.create_expr(expr.left.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let right = self.create_expr(expr.right.as_ref().unwrap(), 
input_schema)?;
                 let op = DataFusionOperator::LtEq;
                 Ok(Arc::new(BinaryExpr::new(left, op, right)))
@@ -272,13 +278,15 @@ impl PhysicalPlanner {
                 Ok(Arc::new(IsNullExpr::new(child)))
             }
             ExprStruct::And(and) => {
-                let left = self.create_expr(and.left.as_ref().unwrap(), 
input_schema.clone())?;
+                let left =
+                    self.create_expr(and.left.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let right = self.create_expr(and.right.as_ref().unwrap(), 
input_schema)?;
                 let op = DataFusionOperator::And;
                 Ok(Arc::new(BinaryExpr::new(left, op, right)))
             }
             ExprStruct::Or(or) => {
-                let left = self.create_expr(or.left.as_ref().unwrap(), 
input_schema.clone())?;
+                let left =
+                    self.create_expr(or.left.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let right = self.create_expr(or.right.as_ref().unwrap(), 
input_schema)?;
                 let op = DataFusionOperator::Or;
                 Ok(Arc::new(BinaryExpr::new(left, op, right)))
@@ -396,13 +404,15 @@ impl PhysicalPlanner {
                 Ok(Arc::new(SecondExpr::new(child, timezone)))
             }
             ExprStruct::TruncDate(expr) => {
-                let child = self.create_expr(expr.child.as_ref().unwrap(), 
input_schema.clone())?;
+                let child =
+                    self.create_expr(expr.child.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let format = self.create_expr(expr.format.as_ref().unwrap(), 
input_schema)?;
 
                 Ok(Arc::new(DateTruncExpr::new(child, format)))
             }
             ExprStruct::TruncTimestamp(expr) => {
-                let child = self.create_expr(expr.child.as_ref().unwrap(), 
input_schema.clone())?;
+                let child =
+                    self.create_expr(expr.child.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let format = self.create_expr(expr.format.as_ref().unwrap(), 
input_schema)?;
                 let timezone = expr.timezone.clone();
 
@@ -427,31 +437,36 @@ impl PhysicalPlanner {
                 Ok(Arc::new(StringSpaceExpr::new(child)))
             }
             ExprStruct::Contains(expr) => {
-                let left = self.create_expr(expr.left.as_ref().unwrap(), 
input_schema.clone())?;
+                let left =
+                    self.create_expr(expr.left.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let right = self.create_expr(expr.right.as_ref().unwrap(), 
input_schema)?;
 
                 Ok(Arc::new(Contains::new(left, right)))
             }
             ExprStruct::StartsWith(expr) => {
-                let left = self.create_expr(expr.left.as_ref().unwrap(), 
input_schema.clone())?;
+                let left =
+                    self.create_expr(expr.left.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let right = self.create_expr(expr.right.as_ref().unwrap(), 
input_schema)?;
 
                 Ok(Arc::new(StartsWith::new(left, right)))
             }
             ExprStruct::EndsWith(expr) => {
-                let left = self.create_expr(expr.left.as_ref().unwrap(), 
input_schema.clone())?;
+                let left =
+                    self.create_expr(expr.left.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let right = self.create_expr(expr.right.as_ref().unwrap(), 
input_schema)?;
 
                 Ok(Arc::new(EndsWith::new(left, right)))
             }
             ExprStruct::Like(expr) => {
-                let left = self.create_expr(expr.left.as_ref().unwrap(), 
input_schema.clone())?;
+                let left =
+                    self.create_expr(expr.left.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let right = self.create_expr(expr.right.as_ref().unwrap(), 
input_schema)?;
 
                 Ok(Arc::new(Like::new(left, right)))
             }
             ExprStruct::Rlike(expr) => {
-                let left = self.create_expr(expr.left.as_ref().unwrap(), 
input_schema.clone())?;
+                let left =
+                    self.create_expr(expr.left.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let right = self.create_expr(expr.right.as_ref().unwrap(), 
input_schema)?;
                 match 
right.as_any().downcast_ref::<Literal>().unwrap().value() {
                     ScalarValue::Utf8(Some(pattern)) => {
@@ -475,19 +490,22 @@ impl PhysicalPlanner {
             }
             ExprStruct::ScalarFunc(expr) => 
self.create_scalar_function_expr(expr, input_schema),
             ExprStruct::EqNullSafe(expr) => {
-                let left = self.create_expr(expr.left.as_ref().unwrap(), 
input_schema.clone())?;
+                let left =
+                    self.create_expr(expr.left.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let right = self.create_expr(expr.right.as_ref().unwrap(), 
input_schema)?;
                 let op = DataFusionOperator::IsNotDistinctFrom;
                 Ok(Arc::new(BinaryExpr::new(left, op, right)))
             }
             ExprStruct::NeqNullSafe(expr) => {
-                let left = self.create_expr(expr.left.as_ref().unwrap(), 
input_schema.clone())?;
+                let left =
+                    self.create_expr(expr.left.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let right = self.create_expr(expr.right.as_ref().unwrap(), 
input_schema)?;
                 let op = DataFusionOperator::IsDistinctFrom;
                 Ok(Arc::new(BinaryExpr::new(left, op, right)))
             }
             ExprStruct::BitwiseAnd(expr) => {
-                let left = self.create_expr(expr.left.as_ref().unwrap(), 
input_schema.clone())?;
+                let left =
+                    self.create_expr(expr.left.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let right = self.create_expr(expr.right.as_ref().unwrap(), 
input_schema)?;
                 let op = DataFusionOperator::BitwiseAnd;
                 Ok(Arc::new(BinaryExpr::new(left, op, right)))
@@ -497,32 +515,36 @@ impl PhysicalPlanner {
                 Ok(Arc::new(BitwiseNotExpr::new(child)))
             }
             ExprStruct::BitwiseOr(expr) => {
-                let left = self.create_expr(expr.left.as_ref().unwrap(), 
input_schema.clone())?;
+                let left =
+                    self.create_expr(expr.left.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let right = self.create_expr(expr.right.as_ref().unwrap(), 
input_schema)?;
                 let op = DataFusionOperator::BitwiseOr;
                 Ok(Arc::new(BinaryExpr::new(left, op, right)))
             }
             ExprStruct::BitwiseXor(expr) => {
-                let left = self.create_expr(expr.left.as_ref().unwrap(), 
input_schema.clone())?;
+                let left =
+                    self.create_expr(expr.left.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let right = self.create_expr(expr.right.as_ref().unwrap(), 
input_schema)?;
                 let op = DataFusionOperator::BitwiseXor;
                 Ok(Arc::new(BinaryExpr::new(left, op, right)))
             }
             ExprStruct::BitwiseShiftRight(expr) => {
-                let left = self.create_expr(expr.left.as_ref().unwrap(), 
input_schema.clone())?;
+                let left =
+                    self.create_expr(expr.left.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let right = self.create_expr(expr.right.as_ref().unwrap(), 
input_schema)?;
                 let op = DataFusionOperator::BitwiseShiftRight;
                 Ok(Arc::new(BinaryExpr::new(left, op, right)))
             }
             ExprStruct::BitwiseShiftLeft(expr) => {
-                let left = self.create_expr(expr.left.as_ref().unwrap(), 
input_schema.clone())?;
+                let left =
+                    self.create_expr(expr.left.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let right = self.create_expr(expr.right.as_ref().unwrap(), 
input_schema)?;
                 let op = DataFusionOperator::BitwiseShiftLeft;
                 Ok(Arc::new(BinaryExpr::new(left, op, right)))
             }
             // https://github.com/apache/datafusion-comet/issues/666
             // ExprStruct::Abs(expr) => {
-            //     let child = self.create_expr(expr.child.as_ref().unwrap(), 
input_schema.clone())?;
+            //     let child = self.create_expr(expr.child.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
             //     let return_type = child.data_type(&input_schema)?;
             //     let args = vec![child];
             //     let eval_mode = from_protobuf_eval_mode(expr.eval_mode)?;
@@ -537,12 +559,12 @@ impl PhysicalPlanner {
                 let when_then_pairs = case_when
                     .when
                     .iter()
-                    .map(|x| self.create_expr(x, input_schema.clone()))
+                    .map(|x| self.create_expr(x, Arc::clone(&input_schema)))
                     .zip(
                         case_when
                             .then
                             .iter()
-                            .map(|then| self.create_expr(then, 
input_schema.clone())),
+                            .map(|then| self.create_expr(then, 
Arc::clone(&input_schema))),
                     )
                     .try_fold(Vec::new(), |mut acc, (a, b)| {
                         acc.push((a?, b?));
@@ -565,20 +587,20 @@ impl PhysicalPlanner {
             }
             ExprStruct::In(expr) => {
                 let value =
-                    self.create_expr(expr.in_value.as_ref().unwrap(), 
input_schema.clone())?;
+                    self.create_expr(expr.in_value.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let list = expr
                     .lists
                     .iter()
-                    .map(|x| self.create_expr(x, input_schema.clone()))
+                    .map(|x| self.create_expr(x, Arc::clone(&input_schema)))
                     .collect::<Result<Vec<_>, _>>()?;
 
                 in_list(value, list, &expr.negated, 
input_schema.as_ref()).map_err(|e| e.into())
             }
             ExprStruct::If(expr) => {
                 let if_expr =
-                    self.create_expr(expr.if_expr.as_ref().unwrap(), 
input_schema.clone())?;
+                    self.create_expr(expr.if_expr.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let true_expr =
-                    self.create_expr(expr.true_expr.as_ref().unwrap(), 
input_schema.clone())?;
+                    self.create_expr(expr.true_expr.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let false_expr =
                     self.create_expr(expr.false_expr.as_ref().unwrap(), 
input_schema)?;
                 Ok(Arc::new(IfExpr::new(if_expr, true_expr, false_expr)))
@@ -589,7 +611,7 @@ impl PhysicalPlanner {
             }
             ExprStruct::UnaryMinus(expr) => {
                 let child: Arc<dyn PhysicalExpr> =
-                    self.create_expr(expr.child.as_ref().unwrap(), 
input_schema.clone())?;
+                    self.create_expr(expr.child.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 let result = negative::create_negate_expr(child, 
expr.fail_on_error);
                 result.map_err(|e| ExecutionError::GeneralError(e.to_string()))
             }
@@ -604,8 +626,10 @@ impl PhysicalPlanner {
                 Ok(Arc::new(Subquery::new(self.exec_context_id, id, 
data_type)))
             }
             ExprStruct::BloomFilterMightContain(expr) => {
-                let bloom_filter_expr =
-                    self.create_expr(expr.bloom_filter.as_ref().unwrap(), 
input_schema.clone())?;
+                let bloom_filter_expr = self.create_expr(
+                    expr.bloom_filter.as_ref().unwrap(),
+                    Arc::clone(&input_schema),
+                )?;
                 let value_expr = 
self.create_expr(expr.value.as_ref().unwrap(), input_schema)?;
                 Ok(Arc::new(BloomFilterMightContain::try_new(
                     bloom_filter_expr,
@@ -616,13 +640,14 @@ impl PhysicalPlanner {
                 let values = expr
                     .values
                     .iter()
-                    .map(|expr| self.create_expr(expr, input_schema.clone()))
+                    .map(|expr| self.create_expr(expr, 
Arc::clone(&input_schema)))
                     .collect::<Result<Vec<_>, _>>()?;
                 let names = expr.names.clone();
                 Ok(Arc::new(CreateNamedStruct::new(values, names)))
             }
             ExprStruct::GetStructField(expr) => {
-                let child = self.create_expr(expr.child.as_ref().unwrap(), 
input_schema.clone())?;
+                let child =
+                    self.create_expr(expr.child.as_ref().unwrap(), 
Arc::clone(&input_schema))?;
                 Ok(Arc::new(GetStructField::new(child, expr.ordinal as usize)))
             }
             expr => Err(ExecutionError::GeneralError(format!(
@@ -669,8 +694,8 @@ impl PhysicalPlanner {
         op: DataFusionOperator,
         input_schema: SchemaRef,
     ) -> Result<Arc<dyn PhysicalExpr>, ExecutionError> {
-        let left = self.create_expr(left, input_schema.clone())?;
-        let right = self.create_expr(right, input_schema.clone())?;
+        let left = self.create_expr(left, Arc::clone(&input_schema))?;
+        let right = self.create_expr(right, Arc::clone(&input_schema))?;
         match (
             &op,
             left.data_type(&input_schema),
@@ -801,7 +826,7 @@ impl PhysicalPlanner {
                 let agg_exprs: PhyAggResult = agg
                     .agg_exprs
                     .iter()
-                    .map(|expr| self.create_agg_expr(expr, schema.clone()))
+                    .map(|expr| self.create_agg_expr(expr, 
Arc::clone(&schema)))
                     .collect();
 
                 let num_agg = agg.agg_exprs.len();
@@ -811,8 +836,8 @@ impl PhysicalPlanner {
                         group_by,
                         agg_exprs?,
                         vec![None; num_agg], // no filter expressions
-                        child.clone(),
-                        schema.clone(),
+                        Arc::clone(&child),
+                        Arc::clone(&schema),
                     )?,
                 );
                 let result_exprs: PhyExprResult = agg
@@ -1039,13 +1064,13 @@ impl PhysicalPlanner {
                 let sort_exprs: Result<Vec<PhysicalSortExpr>, ExecutionError> 
= wnd
                     .order_by_list
                     .iter()
-                    .map(|expr| self.create_sort_expr(expr, 
input_schema.clone()))
+                    .map(|expr| self.create_sort_expr(expr, 
Arc::clone(&input_schema)))
                     .collect();
 
                 let partition_exprs: Result<Vec<Arc<dyn PhysicalExpr>>, 
ExecutionError> = wnd
                     .partition_by_list
                     .iter()
-                    .map(|expr| self.create_expr(expr, input_schema.clone()))
+                    .map(|expr| self.create_expr(expr, 
Arc::clone(&input_schema)))
                     .collect();
 
                 let sort_exprs = &sort_exprs?;
@@ -1057,7 +1082,7 @@ impl PhysicalPlanner {
                     .map(|expr| {
                         self.create_window_expr(
                             expr,
-                            input_schema.clone(),
+                            Arc::clone(&input_schema),
                             partition_exprs,
                             sort_exprs,
                         )
@@ -1147,7 +1172,7 @@ impl PhysicalPlanner {
                         val_type.as_ref().clone(),
                         f.is_nullable(),
                     )),
-                    _ => f.clone(),
+                    _ => Arc::clone(f),
                 })
                 .collect();
 
@@ -1248,17 +1273,17 @@ impl PhysicalPlanner {
                 let children = expr
                     .children
                     .iter()
-                    .map(|child| self.create_expr(child, schema.clone()))
+                    .map(|child| self.create_expr(child, Arc::clone(&schema)))
                     .collect::<Result<Vec<_>, _>>()?;
 
                 // create `IS NOT NULL expr` and join them with `AND` if there 
are multiple
                 let not_null_expr: Arc<dyn PhysicalExpr> = 
children.iter().skip(1).fold(
-                    Arc::new(IsNotNullExpr::new(children[0].clone())) as 
Arc<dyn PhysicalExpr>,
+                    Arc::new(IsNotNullExpr::new(Arc::clone(&children[0]))) as 
Arc<dyn PhysicalExpr>,
                     |acc, child| {
                         Arc::new(BinaryExpr::new(
                             acc,
                             DataFusionOperator::And,
-                            Arc::new(IsNotNullExpr::new(child.clone())),
+                            Arc::new(IsNotNullExpr::new(Arc::clone(child))),
                         ))
                     },
                 );
@@ -1283,7 +1308,7 @@ impl PhysicalPlanner {
                 .map_err(|e| ExecutionError::DataFusionError(e.to_string()))
             }
             AggExprStruct::Min(expr) => {
-                let child = self.create_expr(expr.child.as_ref().unwrap(), 
schema.clone())?;
+                let child = self.create_expr(expr.child.as_ref().unwrap(), 
Arc::clone(&schema))?;
                 let datatype = 
to_arrow_datatype(expr.datatype.as_ref().unwrap());
                 let child = Arc::new(CastExpr::new(child, datatype.clone(), 
None));
                 create_aggregate_expr(
@@ -1300,7 +1325,7 @@ impl PhysicalPlanner {
                 .map_err(|e| ExecutionError::DataFusionError(e.to_string()))
             }
             AggExprStruct::Max(expr) => {
-                let child = self.create_expr(expr.child.as_ref().unwrap(), 
schema.clone())?;
+                let child = self.create_expr(expr.child.as_ref().unwrap(), 
Arc::clone(&schema))?;
                 let datatype = 
to_arrow_datatype(expr.datatype.as_ref().unwrap());
                 let child = Arc::new(CastExpr::new(child, datatype.clone(), 
None));
                 create_aggregate_expr(
@@ -1317,7 +1342,7 @@ impl PhysicalPlanner {
                 .map_err(|e| ExecutionError::DataFusionError(e.to_string()))
             }
             AggExprStruct::Sum(expr) => {
-                let child = self.create_expr(expr.child.as_ref().unwrap(), 
schema.clone())?;
+                let child = self.create_expr(expr.child.as_ref().unwrap(), 
Arc::clone(&schema))?;
                 let datatype = 
to_arrow_datatype(expr.datatype.as_ref().unwrap());
 
                 match datatype {
@@ -1344,7 +1369,7 @@ impl PhysicalPlanner {
                 }
             }
             AggExprStruct::Avg(expr) => {
-                let child = self.create_expr(expr.child.as_ref().unwrap(), 
schema.clone())?;
+                let child = self.create_expr(expr.child.as_ref().unwrap(), 
Arc::clone(&schema))?;
                 let datatype = 
to_arrow_datatype(expr.datatype.as_ref().unwrap());
                 let input_datatype = 
to_arrow_datatype(expr.sum_datatype.as_ref().unwrap());
                 match datatype {
@@ -1364,7 +1389,7 @@ impl PhysicalPlanner {
                 }
             }
             AggExprStruct::First(expr) => {
-                let child = self.create_expr(expr.child.as_ref().unwrap(), 
schema.clone())?;
+                let child = self.create_expr(expr.child.as_ref().unwrap(), 
Arc::clone(&schema))?;
                 let func = 
datafusion_expr::AggregateUDF::new_from_impl(FirstValue::new());
                 create_aggregate_expr(
                     &func,
@@ -1380,7 +1405,7 @@ impl PhysicalPlanner {
                 .map_err(|e| e.into())
             }
             AggExprStruct::Last(expr) => {
-                let child = self.create_expr(expr.child.as_ref().unwrap(), 
schema.clone())?;
+                let child = self.create_expr(expr.child.as_ref().unwrap(), 
Arc::clone(&schema))?;
                 let func = 
datafusion_expr::AggregateUDF::new_from_impl(LastValue::new());
                 create_aggregate_expr(
                     &func,
@@ -1396,7 +1421,7 @@ impl PhysicalPlanner {
                 .map_err(|e| e.into())
             }
             AggExprStruct::BitAndAgg(expr) => {
-                let child = self.create_expr(expr.child.as_ref().unwrap(), 
schema.clone())?;
+                let child = self.create_expr(expr.child.as_ref().unwrap(), 
Arc::clone(&schema))?;
                 create_aggregate_expr(
                     &bit_and_udaf(),
                     &[child],
@@ -1411,7 +1436,7 @@ impl PhysicalPlanner {
                 .map_err(|e| e.into())
             }
             AggExprStruct::BitOrAgg(expr) => {
-                let child = self.create_expr(expr.child.as_ref().unwrap(), 
schema.clone())?;
+                let child = self.create_expr(expr.child.as_ref().unwrap(), 
Arc::clone(&schema))?;
                 create_aggregate_expr(
                     &bit_or_udaf(),
                     &[child],
@@ -1426,7 +1451,7 @@ impl PhysicalPlanner {
                 .map_err(|e| e.into())
             }
             AggExprStruct::BitXorAgg(expr) => {
-                let child = self.create_expr(expr.child.as_ref().unwrap(), 
schema.clone())?;
+                let child = self.create_expr(expr.child.as_ref().unwrap(), 
Arc::clone(&schema))?;
                 create_aggregate_expr(
                     &bit_xor_udaf(),
                     &[child],
@@ -1441,8 +1466,10 @@ impl PhysicalPlanner {
                 .map_err(|e| e.into())
             }
             AggExprStruct::Covariance(expr) => {
-                let child1 = self.create_expr(expr.child1.as_ref().unwrap(), 
schema.clone())?;
-                let child2 = self.create_expr(expr.child2.as_ref().unwrap(), 
schema.clone())?;
+                let child1 =
+                    self.create_expr(expr.child1.as_ref().unwrap(), 
Arc::clone(&schema))?;
+                let child2 =
+                    self.create_expr(expr.child2.as_ref().unwrap(), 
Arc::clone(&schema))?;
                 let datatype = 
to_arrow_datatype(expr.datatype.as_ref().unwrap());
                 match expr.stats_type {
                     0 => Ok(Arc::new(Covariance::new(
@@ -1468,7 +1495,7 @@ impl PhysicalPlanner {
                 }
             }
             AggExprStruct::Variance(expr) => {
-                let child = self.create_expr(expr.child.as_ref().unwrap(), 
schema.clone())?;
+                let child = self.create_expr(expr.child.as_ref().unwrap(), 
Arc::clone(&schema))?;
                 let datatype = 
to_arrow_datatype(expr.datatype.as_ref().unwrap());
                 match expr.stats_type {
                     0 => Ok(Arc::new(Variance::new(
@@ -1492,7 +1519,7 @@ impl PhysicalPlanner {
                 }
             }
             AggExprStruct::Stddev(expr) => {
-                let child = self.create_expr(expr.child.as_ref().unwrap(), 
schema.clone())?;
+                let child = self.create_expr(expr.child.as_ref().unwrap(), 
Arc::clone(&schema))?;
                 let datatype = 
to_arrow_datatype(expr.datatype.as_ref().unwrap());
                 match expr.stats_type {
                     0 => Ok(Arc::new(Stddev::new(
@@ -1516,8 +1543,10 @@ impl PhysicalPlanner {
                 }
             }
             AggExprStruct::Correlation(expr) => {
-                let child1 = self.create_expr(expr.child1.as_ref().unwrap(), 
schema.clone())?;
-                let child2 = self.create_expr(expr.child2.as_ref().unwrap(), 
schema.clone())?;
+                let child1 =
+                    self.create_expr(expr.child1.as_ref().unwrap(), 
Arc::clone(&schema))?;
+                let child2 =
+                    self.create_expr(expr.child2.as_ref().unwrap(), 
Arc::clone(&schema))?;
                 let datatype = 
to_arrow_datatype(expr.datatype.as_ref().unwrap());
                 Ok(Arc::new(Correlation::new(
                     child1,
@@ -1547,7 +1576,7 @@ impl PhysicalPlanner {
                     window_args = f
                         .args
                         .iter()
-                        .map(|expr| self.create_expr(expr, 
input_schema.clone()))
+                        .map(|expr| self.create_expr(expr, 
Arc::clone(&input_schema)))
                         .collect::<Result<Vec<_>, ExecutionError>>()?;
                 }
                 other => {
@@ -1557,7 +1586,7 @@ impl PhysicalPlanner {
                 }
             };
         } else if let Some(agg_func) = &spark_expr.agg_func {
-            let result = self.process_agg_func(agg_func, 
input_schema.clone())?;
+            let result = self.process_agg_func(agg_func, 
Arc::clone(&input_schema))?;
             window_func_name = result.0;
             window_args = result.1;
         } else {
@@ -1654,20 +1683,20 @@ impl PhysicalPlanner {
                 let children = expr
                     .children
                     .iter()
-                    .map(|child| self.create_expr(child, schema.clone()))
+                    .map(|child| self.create_expr(child, Arc::clone(&schema)))
                     .collect::<Result<Vec<_>, _>>()?;
                 Ok(("count".to_string(), children))
             }
             Some(AggExprStruct::Min(expr)) => {
-                let child = self.create_expr(expr.child.as_ref().unwrap(), 
schema.clone())?;
+                let child = self.create_expr(expr.child.as_ref().unwrap(), 
Arc::clone(&schema))?;
                 Ok(("min".to_string(), vec![child]))
             }
             Some(AggExprStruct::Max(expr)) => {
-                let child = self.create_expr(expr.child.as_ref().unwrap(), 
schema.clone())?;
+                let child = self.create_expr(expr.child.as_ref().unwrap(), 
Arc::clone(&schema))?;
                 Ok(("max".to_string(), vec![child]))
             }
             Some(AggExprStruct::Sum(expr)) => {
-                let child = self.create_expr(expr.child.as_ref().unwrap(), 
schema.clone())?;
+                let child = self.create_expr(expr.child.as_ref().unwrap(), 
Arc::clone(&schema))?;
                 let arrow_type = 
to_arrow_datatype(expr.datatype.as_ref().unwrap());
                 let datatype = child.data_type(&schema)?;
 
@@ -1708,7 +1737,7 @@ impl PhysicalPlanner {
                 let exprs: PartitionPhyExprResult = hash_partition
                     .hash_expression
                     .iter()
-                    .map(|x| self.create_expr(x, input_schema.clone()))
+                    .map(|x| self.create_expr(x, Arc::clone(&input_schema)))
                     .collect();
                 Ok(Partitioning::Hash(
                     exprs?,
@@ -1727,7 +1756,7 @@ impl PhysicalPlanner {
         let args = expr
             .args
             .iter()
-            .map(|x| self.create_expr(x, input_schema.clone()))
+            .map(|x| self.create_expr(x, Arc::clone(&input_schema)))
             .collect::<Result<Vec<_>, _>>()?;
 
         let fun_name = &expr.func;
@@ -2134,7 +2163,7 @@ mod tests {
         let session_ctx = SessionContext::new();
         let task_ctx = session_ctx.task_ctx();
 
-        let stream = datafusion_plan.execute(0, task_ctx.clone()).unwrap();
+        let stream = datafusion_plan.execute(0, 
Arc::clone(&task_ctx)).unwrap();
         let output = collect(stream).await.unwrap();
         assert!(output.is_empty());
     }
diff --git a/native/core/src/execution/datafusion/shuffle_writer.rs 
b/native/core/src/execution/datafusion/shuffle_writer.rs
index f7c97bea..751484db 100644
--- a/native/core/src/execution/datafusion/shuffle_writer.rs
+++ b/native/core/src/execution/datafusion/shuffle_writer.rs
@@ -114,7 +114,7 @@ impl ExecutionPlan for ShuffleWriterExec {
     ) -> Result<Arc<dyn ExecutionPlan>> {
         match children.len() {
             1 => Ok(Arc::new(ShuffleWriterExec::try_new(
-                children[0].clone(),
+                Arc::clone(&children[0]),
                 self.partitioning.clone(),
                 self.output_data_file.clone(),
                 self.output_index_file.clone(),
@@ -128,7 +128,7 @@ impl ExecutionPlan for ShuffleWriterExec {
         partition: usize,
         context: Arc<TaskContext>,
     ) -> Result<SendableRecordBatchStream> {
-        let input = self.input.execute(partition, context.clone())?;
+        let input = self.input.execute(partition, Arc::clone(&context))?;
         let metrics = ShuffleRepartitionerMetrics::new(&self.metrics, 0);
 
         Ok(Box::pin(RecordBatchStreamAdapter::new(
@@ -175,7 +175,7 @@ impl ShuffleWriterExec {
         output_index_file: String,
     ) -> Result<Self> {
         let cache = PlanProperties::new(
-            EquivalenceProperties::new(input.schema().clone()),
+            EquivalenceProperties::new(Arc::clone(&input.schema())),
             partitioning.clone(),
             ExecutionMode::Bounded,
         );
@@ -284,7 +284,7 @@ impl PartitionBuffer {
         self.num_active_rows = 0;
         mem_diff -= self.active_slots_mem_size as isize;
 
-        let frozen_batch = make_batch(self.schema.clone(), active, num_rows)?;
+        let frozen_batch = make_batch(Arc::clone(&self.schema), active, 
num_rows)?;
 
         let frozen_capacity_old = self.frozen.capacity();
         let mut cursor = Cursor::new(&mut self.frozen);
@@ -634,10 +634,10 @@ impl ShuffleRepartitioner {
         Self {
             output_data_file,
             output_index_file,
-            schema: schema.clone(),
+            schema: Arc::clone(&schema),
             buffered_partitions: Mutex::new(
                 (0..num_output_partitions)
-                    .map(|_| PartitionBuffer::new(schema.clone(), batch_size))
+                    .map(|_| PartitionBuffer::new(Arc::clone(&schema), 
batch_size))
                     .collect::<Vec<_>>(),
             ),
             spills: Mutex::new(vec![]),
@@ -863,7 +863,7 @@ impl ShuffleRepartitioner {
         self.reservation.shrink(used);
 
         // shuffle writer always has empty output
-        Ok(Box::pin(EmptyStream::try_new(self.schema.clone())?))
+        Ok(Box::pin(EmptyStream::try_new(Arc::clone(&self.schema))?))
     }
 
     fn used(&self) -> usize {
@@ -973,7 +973,7 @@ async fn external_shuffle(
         partition_id,
         output_data_file,
         output_index_file,
-        schema.clone(),
+        Arc::clone(&schema),
         partitioning,
         metrics,
         context.runtime_env(),
@@ -1409,7 +1409,7 @@ impl Stream for EmptyStream {
 impl RecordBatchStream for EmptyStream {
     /// Get the schema
     fn schema(&self) -> SchemaRef {
-        self.schema.clone()
+        Arc::clone(&self.schema)
     }
 }
 
@@ -1467,7 +1467,7 @@ mod test {
             b.append_value(format!("{i}"));
         }
         let array = b.finish();
-        let batch = RecordBatch::try_new(schema.clone(), 
vec![Arc::new(array)]).unwrap();
+        let batch = RecordBatch::try_new(Arc::clone(&schema), 
vec![Arc::new(array)]).unwrap();
 
         let batches = vec![batch.clone()];
 
diff --git a/native/core/src/execution/jni_api.rs 
b/native/core/src/execution/jni_api.rs
index 587defaa..3ad822cc 100644
--- a/native/core/src/execution/jni_api.rs
+++ b/native/core/src/execution/jni_api.rs
@@ -348,14 +348,14 @@ pub unsafe extern "system" fn 
Java_org_apache_comet_Native_executePlan(
         // Because we don't know if input arrays are dictionary-encoded when 
we create
         // query plan, we need to defer stream initialization to first time 
execution.
         if exec_context.root_op.is_none() {
-            let planner = 
PhysicalPlanner::new(exec_context.session_ctx.clone())
+            let planner = 
PhysicalPlanner::new(Arc::clone(&exec_context.session_ctx))
                 .with_exec_id(exec_context_id);
             let (scans, root_op) = planner.create_plan(
                 &exec_context.spark_plan,
                 &mut exec_context.input_sources.clone(),
             )?;
 
-            exec_context.root_op = Some(root_op.clone());
+            exec_context.root_op = Some(Arc::clone(&root_op));
             exec_context.scans = scans;
 
             if exec_context.explain_native {
diff --git a/native/core/src/execution/operators/copy.rs 
b/native/core/src/execution/operators/copy.rs
index 0705a3b7..d6c095a7 100644
--- a/native/core/src/execution/operators/copy.rs
+++ b/native/core/src/execution/operators/copy.rs
@@ -74,7 +74,7 @@ impl CopyExec {
         let schema = Arc::new(Schema::new(fields));
 
         let cache = PlanProperties::new(
-            EquivalenceProperties::new(schema.clone()),
+            EquivalenceProperties::new(Arc::clone(&schema)),
             Partitioning::UnknownPartitioning(1),
             ExecutionMode::Bounded,
         );
@@ -105,7 +105,7 @@ impl ExecutionPlan for CopyExec {
     }
 
     fn schema(&self) -> SchemaRef {
-        self.schema.clone()
+        Arc::clone(&self.schema)
     }
 
     fn children(&self) -> Vec<&Arc<dyn ExecutionPlan>> {
@@ -116,11 +116,11 @@ impl ExecutionPlan for CopyExec {
         self: Arc<Self>,
         children: Vec<Arc<dyn ExecutionPlan>>,
     ) -> DataFusionResult<Arc<dyn ExecutionPlan>> {
-        let input = self.input.clone();
+        let input = Arc::clone(&self.input);
         let new_input = input.with_new_children(children)?;
         Ok(Arc::new(CopyExec {
             input: new_input,
-            schema: self.schema.clone(),
+            schema: Arc::clone(&self.schema),
             cache: self.cache.clone(),
             metrics: self.metrics.clone(),
             mode: self.mode.clone(),
@@ -193,8 +193,9 @@ impl CopyStream {
             .collect::<Result<Vec<ArrayRef>, _>>()?;
 
         let options = 
RecordBatchOptions::new().with_row_count(Some(batch.num_rows()));
-        let maybe_batch = 
RecordBatch::try_new_with_options(self.schema.clone(), vectors, &options)
-            .map_err(|e| arrow_datafusion_err!(e));
+        let maybe_batch =
+            RecordBatch::try_new_with_options(Arc::clone(&self.schema), 
vectors, &options)
+                .map_err(|e| arrow_datafusion_err!(e));
         timer.stop();
         self.baseline_metrics.record_output(batch.num_rows());
         maybe_batch
@@ -214,7 +215,7 @@ impl Stream for CopyStream {
 
 impl RecordBatchStream for CopyStream {
     fn schema(&self) -> SchemaRef {
-        self.schema.clone()
+        Arc::clone(&self.schema)
     }
 }
 
diff --git a/native/core/src/execution/operators/filter.rs 
b/native/core/src/execution/operators/filter.rs
index 902529ba..fff656b4 100644
--- a/native/core/src/execution/operators/filter.rs
+++ b/native/core/src/execution/operators/filter.rs
@@ -380,7 +380,7 @@ pub fn comet_filter_record_batch(
             })
             .collect();
         let options = 
RecordBatchOptions::new().with_row_count(Some(record_batch.num_rows()));
-        RecordBatch::try_new_with_options(record_batch.schema().clone(), 
arrays, &options)
+        RecordBatch::try_new_with_options(Arc::clone(&record_batch.schema()), 
arrays, &options)
     } else {
         filter_record_batch(record_batch, predicate)
     }
diff --git a/native/core/src/execution/operators/scan.rs 
b/native/core/src/execution/operators/scan.rs
index 0d5b3393..59616efb 100644
--- a/native/core/src/execution/operators/scan.rs
+++ b/native/core/src/execution/operators/scan.rs
@@ -366,7 +366,7 @@ impl<'a> ScanStream<'a> {
             })
             .collect::<Result<Vec<_>, _>>()?;
         let options = RecordBatchOptions::new().with_row_count(Some(num_rows));
-        RecordBatch::try_new_with_options(self.schema.clone(), new_columns, 
&options)
+        RecordBatch::try_new_with_options(Arc::clone(&self.schema), 
new_columns, &options)
             .map_err(|e| arrow_datafusion_err!(e))
     }
 }
@@ -406,7 +406,7 @@ impl<'a> Stream for ScanStream<'a> {
 impl<'a> RecordBatchStream for ScanStream<'a> {
     /// Get the schema
     fn schema(&self) -> SchemaRef {
-        self.schema.clone()
+        Arc::clone(&self.schema)
     }
 }
 
diff --git a/native/core/src/lib.rs b/native/core/src/lib.rs
index b608461e..4a647d96 100644
--- a/native/core/src/lib.rs
+++ b/native/core/src/lib.rs
@@ -19,7 +19,11 @@
 #![allow(non_camel_case_types)]
 #![allow(dead_code)]
 #![allow(clippy::upper_case_acronyms)]
-#![allow(clippy::derive_partial_eq_without_eq)] // For prost generated struct
+// For prost generated struct
+#![allow(clippy::derive_partial_eq_without_eq)]
+// The clippy throws an error if the reference clone not wrapped into 
`Arc::clone`
+// The lint makes easier for code reader/reviewer separate references clones 
from more heavyweight ones
+#![deny(clippy::clone_on_ref_ptr)]
 
 use jni::{
     objects::{JClass, JString},
diff --git a/native/core/src/parquet/read/column.rs 
b/native/core/src/parquet/read/column.rs
index feb34271..73f8df95 100644
--- a/native/core/src/parquet/read/column.rs
+++ b/native/core/src/parquet/read/column.rs
@@ -801,13 +801,13 @@ impl<T: DataType> TypedColumnReader<T> {
         let mut page_buffer = page_data;
 
         let bit_width = log2(self.desc.max_rep_level() as u64 + 1) as u8;
-        let mut rl_decoder = LevelDecoder::new(self.desc.clone(), bit_width, 
true);
+        let mut rl_decoder = LevelDecoder::new(Arc::clone(&self.desc), 
bit_width, true);
         let offset = rl_decoder.set_data(page_value_count, &page_buffer);
         self.rep_level_decoder = Some(rl_decoder);
         page_buffer = page_buffer.slice(offset);
 
         let bit_width = log2(self.desc.max_def_level() as u64 + 1) as u8;
-        let mut dl_decoder = LevelDecoder::new(self.desc.clone(), bit_width, 
true);
+        let mut dl_decoder = LevelDecoder::new(Arc::clone(&self.desc), 
bit_width, true);
         let offset = dl_decoder.set_data(page_value_count, &page_buffer);
         self.def_level_decoder = Some(dl_decoder);
         page_buffer = page_buffer.slice(offset);
@@ -829,12 +829,12 @@ impl<T: DataType> TypedColumnReader<T> {
         self.check_dictionary(&encoding);
 
         let bit_width = log2(self.desc.max_rep_level() as u64 + 1) as u8;
-        let mut rl_decoder = LevelDecoder::new(self.desc.clone(), bit_width, 
false);
+        let mut rl_decoder = LevelDecoder::new(Arc::clone(&self.desc), 
bit_width, false);
         rl_decoder.set_data(page_value_count, &rep_level_data);
         self.rep_level_decoder = Some(rl_decoder);
 
         let bit_width = log2(self.desc.max_def_level() as u64 + 1) as u8;
-        let mut dl_decoder = LevelDecoder::new(self.desc.clone(), bit_width, 
false);
+        let mut dl_decoder = LevelDecoder::new(Arc::clone(&self.desc), 
bit_width, false);
         dl_decoder.set_data(page_value_count, &def_level_data);
         self.def_level_decoder = Some(dl_decoder);
 
@@ -987,7 +987,7 @@ impl<T: DataType> TypedColumnReader<T> {
             value_data,
             page_value_count,
             encoding,
-            self.desc.clone(),
+            Arc::clone(&self.desc),
             self.read_options,
         )
     }
diff --git a/native/core/src/parquet/util/buffer.rs 
b/native/core/src/parquet/util/buffer.rs
index d584ac0b..72cfa3fe 100644
--- a/native/core/src/parquet/util/buffer.rs
+++ b/native/core/src/parquet/util/buffer.rs
@@ -87,7 +87,7 @@ impl BufferRef {
         );
 
         Self {
-            inner: self.inner.clone(),
+            inner: Arc::clone(&self.inner),
             offset: self.offset + offset,
             len,
         }
diff --git a/native/core/src/parquet/util/memory.rs 
b/native/core/src/parquet/util/memory.rs
index a2bbbfdd..ed2ab980 100644
--- a/native/core/src/parquet/util/memory.rs
+++ b/native/core/src/parquet/util/memory.rs
@@ -182,7 +182,7 @@ impl<T: Clone> Buffer<T> {
         let old_data = mem::take(&mut self.data);
         let mut result = BufferPtr::new(old_data);
         if let Some(ref mc) = self.mem_tracker {
-            result = result.with_mem_tracker(mc.clone());
+            result = result.with_mem_tracker(Arc::clone(mc));
         }
         result
     }
@@ -361,7 +361,7 @@ impl<T> BufferPtr<T> {
     /// Reference counted pointer to the data is copied.
     pub fn all(&self) -> BufferPtr<T> {
         BufferPtr {
-            data: self.data.clone(),
+            data: Arc::clone(&self.data),
             start: self.start,
             len: self.len,
             mem_tracker: self.mem_tracker.as_ref().cloned(),
@@ -372,7 +372,7 @@ impl<T> BufferPtr<T> {
     pub fn start_from(&self, start: usize) -> BufferPtr<T> {
         assert!(start <= self.len);
         BufferPtr {
-            data: self.data.clone(),
+            data: Arc::clone(&self.data),
             start: self.start + start,
             len: self.len - start,
             mem_tracker: self.mem_tracker.as_ref().cloned(),
@@ -383,7 +383,7 @@ impl<T> BufferPtr<T> {
     pub fn range(&self, start: usize, len: usize) -> BufferPtr<T> {
         assert!(start + len <= self.len);
         BufferPtr {
-            data: self.data.clone(),
+            data: Arc::clone(&self.data),
             start: self.start + start,
             len,
             mem_tracker: self.mem_tracker.as_ref().cloned(),
@@ -431,7 +431,7 @@ mod tests {
     fn test_byte_buffer_mem_tracker() {
         let mem_tracker = Arc::new(MemTracker::new());
 
-        let mut buffer = 
ByteBuffer::new().with_mem_tracker(mem_tracker.clone());
+        let mut buffer = 
ByteBuffer::new().with_mem_tracker(Arc::clone(&mem_tracker));
         buffer.set_data(vec![0; 10]);
         assert_eq!(mem_tracker.memory_usage(), buffer.capacity() as i64);
         buffer.set_data(vec![0; 20]);
@@ -439,7 +439,7 @@ mod tests {
         assert_eq!(mem_tracker.memory_usage(), capacity);
 
         let max_capacity = {
-            let mut buffer2 = 
ByteBuffer::new().with_mem_tracker(mem_tracker.clone());
+            let mut buffer2 = 
ByteBuffer::new().with_mem_tracker(Arc::clone(&mem_tracker));
             buffer2.reserve(30);
             assert_eq!(
                 mem_tracker.memory_usage(),
@@ -467,7 +467,7 @@ mod tests {
     fn test_byte_ptr_mem_tracker() {
         let mem_tracker = Arc::new(MemTracker::new());
 
-        let mut buffer = 
ByteBuffer::new().with_mem_tracker(mem_tracker.clone());
+        let mut buffer = 
ByteBuffer::new().with_mem_tracker(Arc::clone(&mem_tracker));
         buffer.set_data(vec![0; 60]);
 
         {
diff --git a/native/core/src/parquet/util/test_common/page_util.rs 
b/native/core/src/parquet/util/test_common/page_util.rs
index efd3f38e..6303943c 100644
--- a/native/core/src/parquet/util/test_common/page_util.rs
+++ b/native/core/src/parquet/util/test_common/page_util.rs
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-use std::{collections::VecDeque, mem};
+use std::{collections::VecDeque, mem, sync::Arc};
 
 use rand::distributions::uniform::SampleUniform;
 
@@ -252,7 +252,7 @@ pub fn make_pages<T: DataType>(
     let max_def_level = desc.max_def_level();
     let max_rep_level = desc.max_rep_level();
 
-    let mut dict_encoder = DictEncoder::<T>::new(desc.clone());
+    let mut dict_encoder = DictEncoder::<T>::new(Arc::clone(&desc));
 
     for i in 0..num_pages {
         let mut num_values_cur_page = 0;
@@ -275,7 +275,8 @@ pub fn make_pages<T: DataType>(
 
         // Generate the current page
 
-        let mut pb = DataPageBuilderImpl::new(desc.clone(), 
num_values_cur_page as u32, use_v2);
+        let mut pb =
+            DataPageBuilderImpl::new(Arc::clone(&desc), num_values_cur_page as 
u32, use_v2);
         if max_rep_level > 0 {
             pb.add_rep_levels(max_rep_level, &rep_levels[level_range.clone()]);
         }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to