@@ -196,11 +196,10 @@ case class CometExecRule(session: SparkSession) extends Rule[SparkPlan] {
196196 val nativeOp = operator2Proto(scan).get
197197 CometNativeScan .createExec(nativeOp, scan)
198198
199- // Fully native Iceberg scan for V2
199+ // Fully native Iceberg scan for V2 (iceberg-rust path)
200+ // Only handle scans with native metadata; SupportsComet scans fall through to isCometScan
200201 // Config checks (COMET_ICEBERG_NATIVE_ENABLED, COMET_EXEC_ENABLED) are done in CometScanRule
201- case scan : CometBatchScanExec
202- if scan.wrapped.scan.getClass.getName ==
203- " org.apache.iceberg.spark.source.SparkBatchQueryScan" =>
202+ case scan : CometBatchScanExec if scan.nativeIcebergScanMetadata.isDefined =>
204203 operator2Proto(scan) match {
205204 case Some (nativeOp) =>
206205 CometIcebergNativeScan .createExec(nativeOp, scan)
@@ -820,10 +819,8 @@ case class CometExecRule(session: SparkSession) extends Rule[SparkPlan] {
820819 case scan : CometScanExec if scan.scanImpl == CometConf .SCAN_NATIVE_DATAFUSION =>
821820 CometNativeScan .convert(scan, builder, childOp : _* )
822821
823- // Fully native Iceberg scan for V2
824- case scan : CometBatchScanExec
825- if scan.wrapped.scan.getClass.getName ==
826- " org.apache.iceberg.spark.source.SparkBatchQueryScan" =>
822+ // Fully native Iceberg scan for V2 (iceberg-rust path)
823+ case scan : CometBatchScanExec if scan.nativeIcebergScanMetadata.isDefined =>
827824 CometIcebergNativeScan .convert(scan, builder, childOp : _* )
828825
829826 case op if isCometSink(op) =>
0 commit comments