Skip to content

Commit ebb5cff

Browse files
authored
fix: add TimestampLTZ-as-NTZ correctness tests and compatibility docs (#4220)
1 parent 966d836 commit ebb5cff

8 files changed

Lines changed: 133 additions & 40 deletions

File tree

.github/workflows/pr_build_linux.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,7 @@ jobs:
329329
org.apache.comet.parquet.ParquetReadV1Suite
330330
org.apache.comet.parquet.ParquetReadV2Suite
331331
org.apache.comet.parquet.ParquetReadFromFakeHadoopFsSuite
332+
org.apache.comet.parquet.ParquetTimestampLtzAsNtzSuite
332333
org.apache.spark.sql.comet.ParquetDatetimeRebaseV1Suite
333334
org.apache.spark.sql.comet.ParquetDatetimeRebaseV2Suite
334335
org.apache.spark.sql.comet.ParquetEncryptionITCase

.github/workflows/pr_build_macos.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ jobs:
177177
org.apache.comet.parquet.ParquetReadV1Suite
178178
org.apache.comet.parquet.ParquetReadV2Suite
179179
org.apache.comet.parquet.ParquetReadFromFakeHadoopFsSuite
180+
org.apache.comet.parquet.ParquetTimestampLtzAsNtzSuite
180181
org.apache.spark.sql.comet.ParquetDatetimeRebaseV1Suite
181182
org.apache.spark.sql.comet.ParquetDatetimeRebaseV2Suite
182183
org.apache.spark.sql.comet.ParquetEncryptionITCase

dev/diffs/3.4.3.diff

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2170,7 +2170,7 @@ index 29cb224c878..ee5a87fa200 100644
21702170

21712171
- test("SPARK-36182: can't read TimestampLTZ as TimestampNTZ") {
21722172
+ test("SPARK-36182: can't read TimestampLTZ as TimestampNTZ",
2173-
+ IgnoreCometNativeDataFusion("https://github.com/apache/datafusion-comet/issues/3720")) {
2173+
+ IgnoreCometNativeDataFusion("https://github.com/apache/datafusion-comet/issues/4219")) {
21742174
val data = (1 to 1000).map { i =>
21752175
val ts = new java.sql.Timestamp(i)
21762176
Row(ts)

dev/diffs/3.5.8.diff

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2137,7 +2137,7 @@ index f6472ba3d9d..5ea2d938664 100644
21372137

21382138
- test("SPARK-36182: can't read TimestampLTZ as TimestampNTZ") {
21392139
+ test("SPARK-36182: can't read TimestampLTZ as TimestampNTZ",
2140-
+ IgnoreCometNativeDataFusion("https://github.com/apache/datafusion-comet/issues/3720")) {
2140+
+ IgnoreCometNativeDataFusion("https://github.com/apache/datafusion-comet/issues/4219")) {
21412141
val data = (1 to 1000).map { i =>
21422142
val ts = new java.sql.Timestamp(i)
21432143
Row(ts)

dev/diffs/4.0.2.diff

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2729,7 +2729,7 @@ index 4474ec1fd42..05fa0257c82 100644
27292729
checkAnswer(
27302730
// "fruit" column in this file is encoded using DELTA_LENGTH_BYTE_ARRAY.
27312731
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetQuerySuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetQuerySuite.scala
2732-
index bba71f1c48d..35247c13ad9 100644
2732+
index bba71f1c48d..5a111a937a9 100644
27332733
--- a/sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetQuerySuite.scala
27342734
+++ b/sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetQuerySuite.scala
27352735
@@ -27,6 +27,7 @@ import org.apache.parquet.hadoop.ParquetOutputFormat
@@ -2740,17 +2740,7 @@ index bba71f1c48d..35247c13ad9 100644
27402740
import org.apache.spark.sql.catalyst.{InternalRow, TableIdentifier}
27412741
import org.apache.spark.sql.catalyst.expressions.SpecificInternalRow
27422742
import org.apache.spark.sql.catalyst.util.ArrayData
2743-
@@ -185,7 +186,8 @@ abstract class ParquetQuerySuite extends QueryTest with ParquetTest with SharedS
2744-
}
2745-
}
2746-
2747-
- test("SPARK-47447: read TimestampLTZ as TimestampNTZ") {
2748-
+ test("SPARK-47447: read TimestampLTZ as TimestampNTZ",
2749-
+ IgnoreCometNativeDataFusion("https://github.com/apache/datafusion-comet/issues/3720")) {
2750-
val providedSchema = StructType(Seq(StructField("time", TimestampNTZType, false)))
2751-
2752-
Seq("INT96", "TIMESTAMP_MICROS", "TIMESTAMP_MILLIS").foreach { tsType =>
2753-
@@ -996,7 +998,11 @@ abstract class ParquetQuerySuite extends QueryTest with ParquetTest with SharedS
2743+
@@ -996,7 +997,11 @@ abstract class ParquetQuerySuite extends QueryTest with ParquetTest with SharedS
27542744
Seq(Some("A"), Some("A"), None).toDF().repartition(1)
27552745
.write.parquet(path.getAbsolutePath)
27562746
val df = spark.read.parquet(path.getAbsolutePath)
@@ -2763,7 +2753,7 @@ index bba71f1c48d..35247c13ad9 100644
27632753
}
27642754
}
27652755
}
2766-
@@ -1042,7 +1048,8 @@ abstract class ParquetQuerySuite extends QueryTest with ParquetTest with SharedS
2756+
@@ -1042,7 +1047,8 @@ abstract class ParquetQuerySuite extends QueryTest with ParquetTest with SharedS
27672757
testMigration(fromTsType = "TIMESTAMP_MICROS", toTsType = "INT96")
27682758
}
27692759

@@ -2773,7 +2763,7 @@ index bba71f1c48d..35247c13ad9 100644
27732763
def readParquet(schema: String, path: File): DataFrame = {
27742764
spark.read.schema(schema).parquet(path.toString)
27752765
}
2776-
@@ -1060,7 +1067,8 @@ abstract class ParquetQuerySuite extends QueryTest with ParquetTest with SharedS
2766+
@@ -1060,7 +1066,8 @@ abstract class ParquetQuerySuite extends QueryTest with ParquetTest with SharedS
27772767
checkAnswer(readParquet(schema2, path), df)
27782768
}
27792769

@@ -2783,7 +2773,7 @@ index bba71f1c48d..35247c13ad9 100644
27832773
val schema1 = "a DECIMAL(3, 2), b DECIMAL(18, 3), c DECIMAL(37, 3)"
27842774
checkAnswer(readParquet(schema1, path), df)
27852775
val schema2 = "a DECIMAL(3, 0), b DECIMAL(18, 1), c DECIMAL(37, 1)"
2786-
@@ -1084,7 +1092,8 @@ abstract class ParquetQuerySuite extends QueryTest with ParquetTest with SharedS
2776+
@@ -1084,7 +1091,8 @@ abstract class ParquetQuerySuite extends QueryTest with ParquetTest with SharedS
27872777
val df = sql(s"SELECT 1 a, 123456 b, ${Int.MaxValue.toLong * 10} c, CAST('1.2' AS BINARY) d")
27882778
df.write.parquet(path.toString)
27892779

@@ -2793,7 +2783,7 @@ index bba71f1c48d..35247c13ad9 100644
27932783
checkAnswer(readParquet("a DECIMAL(3, 2)", path), sql("SELECT 1.00"))
27942784
checkAnswer(readParquet("a DECIMAL(11, 2)", path), sql("SELECT 1.00"))
27952785
checkAnswer(readParquet("b DECIMAL(3, 2)", path), Row(null))
2796-
@@ -1131,7 +1140,8 @@ abstract class ParquetQuerySuite extends QueryTest with ParquetTest with SharedS
2786+
@@ -1131,7 +1139,8 @@ abstract class ParquetQuerySuite extends QueryTest with ParquetTest with SharedS
27972787
}
27982788
}
27992789

dev/diffs/4.1.1.diff

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ index 6df8bc85b51..dabb75e2b75 100644
3939
withSpark(sc) { sc =>
4040
TestUtils.waitUntilExecutorsUp(sc, 2, 60000)
4141
diff --git a/pom.xml b/pom.xml
42-
index dc757d78812..18841e95f3d 100644
42+
index dc757d78812..10f7b202e71 100644
4343
--- a/pom.xml
4444
+++ b/pom.xml
4545
@@ -152,6 +152,8 @@
@@ -2685,7 +2685,7 @@ index cd6f41b4ef4..4b6a17344bc 100644
26852685
ParquetOutputFormat.WRITER_VERSION -> ParquetProperties.WriterVersion.PARQUET_2_0.toString
26862686
)
26872687
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetFilterSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetFilterSuite.scala
2688-
index 6b73cc8618d..624694916fb 100644
2688+
index 6b73cc8618d..81a58f43784 100644
26892689
--- a/sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetFilterSuite.scala
26902690
+++ b/sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetFilterSuite.scala
26912691
@@ -38,6 +38,7 @@ import org.apache.parquet.schema.MessageType
@@ -2880,7 +2880,7 @@ index 3072657a095..6b5b9103363 100644
28802880
checkAnswer(
28812881
// "fruit" column in this file is encoded using DELTA_LENGTH_BYTE_ARRAY.
28822882
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetQuerySuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetQuerySuite.scala
2883-
index c530dc0d3df..418d5ea4b4d 100644
2883+
index c530dc0d3df..7e1dd663873 100644
28842884
--- a/sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetQuerySuite.scala
28852885
+++ b/sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetQuerySuite.scala
28862886
@@ -27,6 +27,7 @@ import org.apache.parquet.hadoop.ParquetOutputFormat
@@ -2891,17 +2891,7 @@ index c530dc0d3df..418d5ea4b4d 100644
28912891
import org.apache.spark.sql.catalyst.{InternalRow, TableIdentifier}
28922892
import org.apache.spark.sql.catalyst.expressions.SpecificInternalRow
28932893
import org.apache.spark.sql.catalyst.util.ArrayData
2894-
@@ -185,7 +186,8 @@ abstract class ParquetQuerySuite extends QueryTest with ParquetTest with SharedS
2895-
}
2896-
}
2897-
2898-
- test("SPARK-47447: read TimestampLTZ as TimestampNTZ") {
2899-
+ test("SPARK-47447: read TimestampLTZ as TimestampNTZ",
2900-
+ IgnoreCometNativeDataFusion("https://github.com/apache/datafusion-comet/issues/3720")) {
2901-
val providedSchema = StructType(Seq(StructField("time", TimestampNTZType, false)))
2902-
2903-
Seq("INT96", "TIMESTAMP_MICROS", "TIMESTAMP_MILLIS").foreach { tsType =>
2904-
@@ -996,7 +998,11 @@ abstract class ParquetQuerySuite extends QueryTest with ParquetTest with SharedS
2894+
@@ -996,7 +997,11 @@ abstract class ParquetQuerySuite extends QueryTest with ParquetTest with SharedS
29052895
Seq(Some("A"), Some("A"), None).toDF().repartition(1)
29062896
.write.parquet(path.getAbsolutePath)
29072897
val df = spark.read.parquet(path.getAbsolutePath)
@@ -2914,7 +2904,7 @@ index c530dc0d3df..418d5ea4b4d 100644
29142904
}
29152905
}
29162906
}
2917-
@@ -1042,7 +1048,8 @@ abstract class ParquetQuerySuite extends QueryTest with ParquetTest with SharedS
2907+
@@ -1042,7 +1047,8 @@ abstract class ParquetQuerySuite extends QueryTest with ParquetTest with SharedS
29182908
testMigration(fromTsType = "TIMESTAMP_MICROS", toTsType = "INT96")
29192909
}
29202910

@@ -2924,7 +2914,7 @@ index c530dc0d3df..418d5ea4b4d 100644
29242914
def readParquet(schema: String, path: File): DataFrame = {
29252915
spark.read.schema(schema).parquet(path.toString)
29262916
}
2927-
@@ -1060,7 +1067,8 @@ abstract class ParquetQuerySuite extends QueryTest with ParquetTest with SharedS
2917+
@@ -1060,7 +1066,8 @@ abstract class ParquetQuerySuite extends QueryTest with ParquetTest with SharedS
29282918
checkAnswer(readParquet(schema2, path), df)
29292919
}
29302920

@@ -2934,7 +2924,7 @@ index c530dc0d3df..418d5ea4b4d 100644
29342924
val schema1 = "a DECIMAL(3, 2), b DECIMAL(18, 3), c DECIMAL(37, 3)"
29352925
checkAnswer(readParquet(schema1, path), df)
29362926
val schema2 = "a DECIMAL(3, 0), b DECIMAL(18, 1), c DECIMAL(37, 1)"
2937-
@@ -1084,7 +1092,8 @@ abstract class ParquetQuerySuite extends QueryTest with ParquetTest with SharedS
2927+
@@ -1084,7 +1091,8 @@ abstract class ParquetQuerySuite extends QueryTest with ParquetTest with SharedS
29382928
val df = sql(s"SELECT 1 a, 123456 b, ${Int.MaxValue.toLong * 10} c, CAST('1.2' AS BINARY) d")
29392929
df.write.parquet(path.toString)
29402930

@@ -2944,7 +2934,7 @@ index c530dc0d3df..418d5ea4b4d 100644
29442934
checkAnswer(readParquet("a DECIMAL(3, 2)", path), sql("SELECT 1.00"))
29452935
checkAnswer(readParquet("a DECIMAL(11, 2)", path), sql("SELECT 1.00"))
29462936
checkAnswer(readParquet("b DECIMAL(3, 2)", path), Row(null))
2947-
@@ -1131,7 +1140,8 @@ abstract class ParquetQuerySuite extends QueryTest with ParquetTest with SharedS
2937+
@@ -1131,7 +1139,8 @@ abstract class ParquetQuerySuite extends QueryTest with ParquetTest with SharedS
29482938
}
29492939
}
29502940

@@ -3841,7 +3831,7 @@ index 89f65562295..166a11a9079 100644
38413831
val tblTargetName = "tbl_target"
38423832
val tblSourceQualified = s"default.$tblSourceName"
38433833
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/test/SQLTestUtils.scala b/sql/core/src/test/scala/org/apache/spark/sql/test/SQLTestUtils.scala
3844-
index f0f3f94b811..f77b54dcef9 100644
3834+
index f0f3f94b811..be5e113c3ed 100644
38453835
--- a/sql/core/src/test/scala/org/apache/spark/sql/test/SQLTestUtils.scala
38463836
+++ b/sql/core/src/test/scala/org/apache/spark/sql/test/SQLTestUtils.scala
38473837
@@ -27,13 +27,14 @@ import scala.jdk.CollectionConverters._
@@ -3919,7 +3909,7 @@ index f0f3f94b811..f77b54dcef9 100644
39193909
super.withSQLConf(pairs: _*)(f)
39203910
}
39213911

3922-
@@ -451,6 +497,8 @@ private[sql] trait SQLTestUtilsBase
3912+
@@ -451,6 +488,8 @@ private[sql] trait SQLTestUtilsBase
39233913
val schema = df.schema
39243914
val withoutFilters = df.queryExecution.executedPlan.transform {
39253915
case FilterExec(_, child) => child
@@ -3929,7 +3919,7 @@ index f0f3f94b811..f77b54dcef9 100644
39293919

39303920
spark.internalCreateDataFrame(withoutFilters.execute(), schema)
39313921
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/test/SharedSparkSession.scala b/sql/core/src/test/scala/org/apache/spark/sql/test/SharedSparkSession.scala
3932-
index 245219c1756..a611836f086 100644
3922+
index 245219c1756..b566f970ccd 100644
39333923
--- a/sql/core/src/test/scala/org/apache/spark/sql/test/SharedSparkSession.scala
39343924
+++ b/sql/core/src/test/scala/org/apache/spark/sql/test/SharedSparkSession.scala
39353925
@@ -75,6 +75,21 @@ trait SharedSparkSessionBase
@@ -4072,7 +4062,7 @@ index b67370f6eb9..746b3974b29 100644
40724062
override def beforeEach(): Unit = {
40734063
super.beforeEach()
40744064
diff --git a/sql/hive/src/test/scala/org/apache/spark/sql/hive/test/TestHive.scala b/sql/hive/src/test/scala/org/apache/spark/sql/hive/test/TestHive.scala
4075-
index a394d0b7393..a4bc3d3fd8e 100644
4065+
index a394d0b7393..3e1f0404a37 100644
40764066
--- a/sql/hive/src/test/scala/org/apache/spark/sql/hive/test/TestHive.scala
40774067
+++ b/sql/hive/src/test/scala/org/apache/spark/sql/hive/test/TestHive.scala
40784068
@@ -53,24 +53,34 @@ object TestHive

docs/source/user-guide/latest/compatibility/spark-versions.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ Spark 3.4.3 is supported with Java 11/17 and Scala 2.12/2.13.
3434
(SPARK-36182), but Comet's `native_datafusion` scan silently returns the raw UTC value instead.
3535
See [Parquet Compatibility](scans.md#native_datafusion-limitations) for details.
3636

37+
- **Unsupported Parquet type conversions**: Spark 3.4 raises schema incompatibility errors for
38+
certain type mismatches (e.g., reading INT32 as BIGINT, decimal precision changes), but Comet's
39+
`native_datafusion` scan may not detect these and could return unexpected values.
40+
See [Parquet Compatibility](scans.md#native_datafusion-limitations) for details.
41+
3742
## Spark 3.5
3843

3944
Spark 3.5.8 is supported with Java 11/17 and Scala 2.12/2.13.
@@ -44,6 +49,11 @@ Spark 3.5.8 is supported with Java 11/17 and Scala 2.12/2.13.
4449
(SPARK-36182), but Comet's `native_datafusion` scan silently returns the raw UTC value instead.
4550
See [Parquet Compatibility](scans.md#native_datafusion-limitations) for details.
4651

52+
- **Unsupported Parquet type conversions**: Spark 3.5 raises schema incompatibility errors for
53+
certain type mismatches (e.g., reading INT32 as BIGINT, decimal precision changes), but Comet's
54+
`native_datafusion` scan may not detect these and could return unexpected values.
55+
See [Parquet Compatibility](scans.md#native_datafusion-limitations) for details.
56+
4757
## Spark 4.0
4858

4959
Spark 4.0.2 is supported with Java 17 and Scala 2.13.
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
package org.apache.comet.parquet
21+
22+
import java.sql.Timestamp
23+
24+
import org.apache.spark.SparkException
25+
import org.apache.spark.sql.CometTestBase
26+
import org.apache.spark.sql.internal.SQLConf
27+
28+
import org.apache.comet.CometConf
29+
import org.apache.comet.CometSparkSessionExtensions.isSpark40Plus
30+
31+
/**
32+
* Tests for reading Parquet TimestampLTZ columns as TimestampNTZ.
33+
*
34+
* Prior to Spark 4.0, Spark raises an error (SPARK-36182) when asked to read TimestampLTZ as
35+
* TimestampNTZ. Comet should match this behavior. In Spark 4.0+, this read is permitted
36+
* (SPARK-47447) and Comet should produce matching results.
37+
*
38+
* See https://github.com/apache/datafusion-comet/issues/4219
39+
*/
40+
class ParquetTimestampLtzAsNtzSuite extends CometTestBase {
41+
import testImplicits._
42+
43+
private val tsTypes = Seq("INT96", "TIMESTAMP_MICROS", "TIMESTAMP_MILLIS")
44+
45+
tsTypes.foreach { tsType =>
46+
test(s"read TimestampLTZ ($tsType) as TimestampNTZ throws pre-Spark 4") {
47+
assume(!isSpark40Plus, "Spark 4.0+ allows reading TimestampLTZ as TimestampNTZ")
48+
49+
val scanImpl = CometConf.COMET_NATIVE_SCAN_IMPL.get()
50+
assume(
51+
scanImpl != CometConf.SCAN_AUTO && scanImpl != CometConf.SCAN_NATIVE_DATAFUSION,
52+
s"https://github.com/apache/datafusion-comet/issues/4219 ($scanImpl scan does not " +
53+
"reject TimestampLTZ read as TimestampNTZ)")
54+
55+
val sessionTz = "America/Los_Angeles"
56+
57+
withSQLConf(
58+
SQLConf.SESSION_LOCAL_TIMEZONE.key -> sessionTz,
59+
SQLConf.PARQUET_OUTPUT_TIMESTAMP_TYPE.key -> tsType,
60+
SQLConf.USE_V1_SOURCE_LIST.key -> "parquet") {
61+
withTempPath { dir =>
62+
val path = dir.getCanonicalPath
63+
Seq(Timestamp.valueOf("2020-01-01 12:00:00")).toDF("ts").write.parquet(path)
64+
65+
// Spark refuses to read TimestampLTZ as TimestampNTZ (SPARK-36182)
66+
withSQLConf(CometConf.COMET_ENABLED.key -> "false") {
67+
intercept[SparkException] {
68+
spark.read.schema("ts timestamp_ntz").parquet(path).collect()
69+
}
70+
}
71+
72+
// Comet should also refuse
73+
intercept[SparkException] {
74+
spark.read.schema("ts timestamp_ntz").parquet(path).collect()
75+
}
76+
}
77+
}
78+
}
79+
}
80+
81+
tsTypes.foreach { tsType =>
82+
test(s"read TimestampLTZ ($tsType) as TimestampNTZ matches Spark") {
83+
assume(isSpark40Plus, "Spark 4.0+ allows reading TimestampLTZ as TimestampNTZ")
84+
val sessionTz = "America/Los_Angeles"
85+
86+
withSQLConf(
87+
SQLConf.SESSION_LOCAL_TIMEZONE.key -> sessionTz,
88+
SQLConf.PARQUET_OUTPUT_TIMESTAMP_TYPE.key -> tsType,
89+
SQLConf.USE_V1_SOURCE_LIST.key -> "parquet") {
90+
withTempPath { dir =>
91+
val path = dir.getCanonicalPath
92+
Seq(Timestamp.valueOf("2020-01-01 12:00:00")).toDF("ts").write.parquet(path)
93+
94+
withSQLConf(CometConf.COMET_NATIVE_SCAN_IMPL.key -> CometConf.SCAN_NATIVE_DATAFUSION) {
95+
checkSparkAnswerAndOperator(spark.read.schema("ts timestamp_ntz").parquet(path))
96+
}
97+
}
98+
}
99+
}
100+
}
101+
}

0 commit comments

Comments
 (0)