andygrove opened a new issue, #5060:
URL: https://github.com/apache/datafusion-comet/issues/5060

   ### What is the problem the feature request solves?
   
   Comet's native Parquet scan does not support the ANSI interval types, so any 
table with an `INTERVAL YEAR TO MONTH` or `INTERVAL DAY TO SECOND` column falls 
the **entire scan** back to Spark, including all the other columns in that 
table.
   
   ```sql
   CREATE TABLE t(ym INTERVAL YEAR TO MONTH, dt INTERVAL DAY TO SECOND) USING 
parquet;
   INSERT INTO t VALUES (make_ym_interval(1, 2), make_dt_interval(1, 2, 3, 
4.5));
   SELECT ym, dt FROM t;
   ```
   
   ```
   Scan parquet spark_catalog.default.t [COMET: Unsupported schema
     
StructType(StructField(ym,YearMonthIntervalType(0,1),true),StructField(dt,DayTimeIntervalType(0,3),true)):
     Unsupported ym of type YearMonthIntervalType(0,1)]
   ```
   
   The gate is `DataTypeSupport.isTypeSupported`, which `CometScanTypeChecker` 
delegates to:
   
   
https://github.com/apache/datafusion-comet/blob/1d3044f35bda457a20f1ccf4324a4699b35f5158/spark/src/main/scala/org/apache/comet/DataTypeSupport.scala#L51-L56
   
   Note that the list includes `CalendarIntervalType` but not the two ANSI 
interval types, which is backwards for a scan gate. Spark's 
`ParquetTable.supportsDataType` accepts only `AtomicType` and friends; 
`CalendarIntervalType extends DataType` directly, so it can never appear in a 
Parquet file, while `YearMonthIntervalType` / `DayTimeIntervalType` extend 
`AnsiIntervalType extends AtomicType` and are written as annotated INT32 / 
INT64. So the one type listed is unreachable for scans, and the two that are 
reachable are rejected.
   
   This is now the main thing blocking interval work from reaching real 
queries. After #4898 and #4976 the types round-trip through codegen dispatch, 
`CometSink`, `CometLocalTableScanExec` and native shuffle, and I verified that 
interval columns already work natively for joins, multi-key sorts, 
`first`/`last`, `coalesce`/`if` and comparisons. But none of that is reachable 
from a Parquet-backed table today, so the only way to get an interval column 
into a Comet operator is to construct it inline with `make_dt_interval` / 
`make_ym_interval`, which is exactly what all the existing tests do.
   
   ### Describe the potential solution
   
   - Add `YearMonthIntervalType` and `DayTimeIntervalType` to 
`DataTypeSupport.isTypeSupported`, and confirm the native Parquet reader 
decodes Spark's physical layout: `YearMonthIntervalType` is INT32 total months 
and `DayTimeIntervalType` is INT64 microseconds, matching the Arrow mappings 
already chosen in `native/core/src/execution/serde.rs` (`Interval(YearMonth)` 
and `Duration(Microsecond)`).
   - Verify both scan implementations (`CometScanExec` / V1 and 
`CometBatchScanExec` / V2) and both `spark.comet.scan.impl` modes.
   - Decide what to do with the `CalendarIntervalType` entry. It appears to be 
unreachable for scans; if it is only needed for `CometLocalTableScanExec` 
(which extends `DataTypeSupport`), it would be clearer to override there rather 
than widen the shared scan-facing gate.
   - Add scan tests that write ANSI interval columns to Parquet and read them 
back, including nulls, negative values, the full `startField`/`endField` range 
(`INTERVAL YEAR`, `INTERVAL MONTH`, `INTERVAL DAY TO HOUR`, ...), and 
dictionary-encoded and multi-row-group files.
   
   ### Additional context
   
   - Part of #4540. Follows #4898 (CalendarIntervalType support) and #4976 
(nested values and native shuffle).
   - Reproduced on `1d3044f35` with the Spark 4.1 profile.
   - Related gates that still exclude the ANSI interval types and will surface 
as fallbacks once scans work, worth tracking separately:
     - `QueryPlanSerde.supportedScalarSortElementType` already carries a `TODO: 
Include SparkSQL's YearMonthIntervalType and DayTimeIntervalType`. 
Single-column sort on an interval falls back, while multi-column sort is not 
checked at all and produces correct results, so the restriction looks removable.
     - `AggSerde.minMaxDataTypeSupported` / `avgDataTypeSupported` / 
`sumDataTypeSupported` reject intervals, so `min` / `max` / `sum` / `avg` fall 
back even though Spark supports all four over ANSI intervals.
     - `CometShuffleExchangeExec.supportedHashPartitioningDataType` and the 
columnar-shuffle `supportedSerializableDataType` reject all three interval 
types, so `GROUP BY <interval>` falls back unless shuffle mode is `native`.
     - `arithmetic.scala`'s `supportedDataType` rejects intervals, so 
`UnaryMinus` and `Abs` fall back, even though 
`native/spark-expr/src/math_funcs/negative.rs` already has overflow-checked 
interval negation that is currently unreachable. That one is #4756.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


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

Reply via email to