vbarua opened a new issue, #11055:
URL: https://github.com/apache/datafusion/issues/11055

   ### Describe the bug
   
   In various engines, the order in which intervals are added to dates can 
affect the final value. This is especially noticeable with leap years.
   
   Datafusion appears to constant fold these intervals, which throws away the 
operation order. 
   
   ```sql
   > EXPLAIN SELECT
            DATE '2019-02-28' + INTERVAL '1 YEAR' + INTERVAL '1 DAY' AS FEB,
            DATE '2019-02-28' + INTERVAL '1 DAY' + INTERVAL '1 YEAR' AS MAR;
   
+---------------+----------------------------------------------------------------------+
   | plan_type     | plan                                                       
          |
   
+---------------+----------------------------------------------------------------------+
   | logical_plan  | Projection: Date32("2020-02-29") AS feb, 
Date32("2020-02-29") AS mar |
   |               |   EmptyRelation                                            
          |
   | physical_plan | ProjectionExec: expr=[2020-02-29 as feb, 2020-02-29 as 
mar]          |
   |               |   PlaceholderRowExec                                       
          |
   |               |                                                            
          |
   
+---------------+----------------------------------------------------------------------+
   ```
   
   ### To Reproduce
   
   Testing via datafusion-cli
   ```SQL
   > SELECT
     DATE '2019-02-28' + INTERVAL '1 YEAR' + INTERVAL '1 DAY' AS FEB,
     DATE '2019-02-28' + INTERVAL '1 DAY' + INTERVAL '1 YEAR' AS MAR;
   +------------+------------+
   | feb        | mar        |
   +------------+------------+
   | 2020-02-29 | 2020-02-29 |
   +------------+------------+
   ```
   
   ### Expected behavior
   
   Due to leap year shenanigans, adding the year before the day results in a 
different date than adding the day before the year.
   
   Trino emits
   ```sql 
   trino> SELECT
       ->   DATE '2019-02-28' + INTERVAL '1' YEAR + INTERVAL '1' DAY AS FEB,
       ->   DATE '2019-02-28' + INTERVAL '1' DAY + INTERVAL '1' YEAR AS MAR;
       FEB     |    MAR     
   ------------+------------
    2020-02-29 | 2020-03-01 
   (1 row)
   ```
   as does [Postgres](https://www.db-fiddle.com/f/tpG3LWnAbzBwkELiU5J2NS/0) and 
Snowflake (based on their documentation for [interval 
types](https://docs.snowflake.com/en/sql-reference/data-types-datetime#interval-constants)
 where this example came from)
   
   ### Additional context
   
   _No response_


-- 
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: github-unsubscr...@datafusion.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org
For additional commands, e-mail: github-h...@datafusion.apache.org

Reply via email to