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

   ## What is the problem the feature request solves?
   
   > **Note:** This issue was generated with AI assistance. The specification 
details have been extracted from Spark documentation and may need verification.
   
   Comet does not currently support the Spark `try_make_interval` function, 
causing queries using this function to fall back to Spark's JVM execution 
instead of running natively on DataFusion.
   
   The `TryMakeInterval` expression creates an interval from separate 
components (years, months, weeks, days, hours, minutes, seconds). Unlike 
`MakeInterval`, this expression returns `NULL` instead of throwing an exception 
when an error occurs during interval creation. It is implemented as a 
`RuntimeReplaceable` expression that delegates to `MakeInterval` with 
`failOnError = false`.
   
   Supporting this expression would allow more Spark workloads to benefit from 
Comet's native acceleration.
   
   ## Describe the potential solution
   
   ### Spark Specification
   
   **Syntax:**
   ```sql
   try_make_interval([years [, months [, weeks [, days [, hours [, mins [, 
secs]]]]]]])
   ```
   
   **Arguments:**
   | Argument | Type | Description |
   |----------|------|-------------|
   | years | Expression | Number of years (optional, defaults to 0) |
   | months | Expression | Number of months (optional, defaults to 0) |
   | weeks | Expression | Number of weeks (optional, defaults to 0) |
   | days | Expression | Number of days (optional, defaults to 0) |
   | hours | Expression | Number of hours (optional, defaults to 0) |
   | mins | Expression | Number of minutes (optional, defaults to 0) |
   | secs | Expression | Number of seconds as Decimal (optional, defaults to 0) 
|
   
   **Return Type:** Returns `INTERVAL` data type or `NULL` if an error occurs 
during interval construction.
   
   **Supported Data Types:**
   - **Numeric types**: All numeric expressions are supported for input 
parameters
   - **Decimal**: The seconds parameter specifically uses Decimal type with 
`MAX_LONG_DIGITS` precision and scale of 6
   - **Integer literals**: Default values use integer literals (0) for most 
parameters
   
   **Edge Cases:**
   - **Null handling**: Returns `NULL` if any input parameter is `NULL`
   - **Invalid intervals**: Returns `NULL` instead of throwing exceptions for 
invalid interval combinations
   - **Overflow conditions**: Returns `NULL` when interval components exceed 
valid ranges
   - **Missing parameters**: Automatically fills missing parameters with 
appropriate zero values (Literal(0) for most, Decimal(0) for seconds)
   - **Empty constructor**: Intentionally not supported in try version as it 
would never overflow
   
   **Examples:**
   ```sql
   -- Create interval with all components
   SELECT try_make_interval(1, 2, 3, 4, 5, 6, 7.5);
   
   -- Create interval with partial components
   SELECT try_make_interval(2, 3);
   
   -- Handle invalid input gracefully (returns NULL)
   SELECT try_make_interval(9999999, 9999999, 9999999);
   
   -- Compare with make_interval behavior
   SELECT 
     try_make_interval(1, NULL, 3) as safe_result,  -- Returns NULL
     make_interval(1, NULL, 3) as unsafe_result;    -- Throws exception
   ```
   
   ```scala
   // DataFrame API usage
   import org.apache.spark.sql.functions._
   
   // Create interval column
   df.select(try_make_interval(col("years"), col("months"), col("days")))
   
   // With literal values
   df.select(try_make_interval(lit(1), lit(6), lit(0), lit(15)))
   
   // Handle potentially invalid data
   df.select(try_make_interval(col("user_years"), col("user_months")))
     .filter(col("interval_col").isNotNull)
   ```
   
   ### Implementation Approach
   
   See the [Comet guide on adding new 
expressions](https://datafusion.apache.org/comet/contributor-guide/adding_a_new_expression.html)
 for detailed instructions.
   
   1. **Scala Serde**: Add expression handler in 
`spark/src/main/scala/org/apache/comet/serde/`
   2. **Register**: Add to appropriate map in `QueryPlanSerde.scala`
   3. **Protobuf**: Add message type in `native/proto/src/proto/expr.proto` if 
needed
   4. **Rust**: Implement in `native/spark-expr/src/` (check if DataFusion has 
built-in support first)
   
   
   ## Additional context
   
   **Difficulty:** Medium
   **Spark Expression Class:** 
`org.apache.spark.sql.catalyst.expressions.TryMakeInterval`
   
   **Related:**
   - `MakeInterval` - The non-safe version that throws exceptions on errors
   - `INTERVAL` literal syntax - Direct interval creation
   - Date/time arithmetic functions for interval operations
   
   ---
   *This issue was auto-generated from Spark reference documentation.*
   


-- 
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