yaooqinn opened a new pull request #28673:
URL: https://github.com/apache/spark/pull/28673


   ### What changes were proposed in this pull request?
   
   
   the new datetime formatter introduces silent data change like,
   
   ```sql
   spark-sql> select from_unixtime(1, 'yyyyyyyyyyy-MM-dd');
   NULL
   spark-sql> set spark.sql.legacy.timeParserPolicy=legacy;
   spark.sql.legacy.timeParserPolicy    legacy
   spark-sql> select from_unixtime(1, 'yyyyyyyyyyy-MM-dd');
   00000001970-01-01
   spark-sql>
   ```
   
   For patterns that support `SignStyle.EXCEEDS_PAD`, e.g. `y..y`(len >=4), 
when using the `NumberPrinterParser` to format it
   
   ```java
   switch (signStyle) {
     case EXCEEDS_PAD:
       if (minWidth < 19 && value >= EXCEED_POINTS[minWidth]) {
         buf.append(decimalStyle.getPositiveSign());
       }
       break;
      
              ....
   ``` 
   the `minWidth` == `len(y..y)`
   the `EXCEED_POINTS` is 
   
   ```java
   /**
            * Array of 10 to the power of n.
            */
           static final long[] EXCEED_POINTS = new long[] {
               0L,
               10L,
               100L,
               1000L,
               10000L,
               100000L,
               1000000L,
               10000000L,
               100000000L,
               1000000000L,
               10000000000L,
           };
   ```
   
   So when the `len(y..y)` is greater than 10, ` 
ArrayIndexOutOfBoundsException` will be raised.
   
    And at the caller side, for `from_unixtime`, the exception will be 
suppressed and silent data change occurs. for `date_format`, the 
`ArrayIndexOutOfBoundsException` will continue.
   
   In this PR, for `EXCEPTION` mode, we wrapped exceptions from the new 
formatter during formatting to `SparkUpgradeException` for end-users to make 
proper decisions.
   
   ### Why are the changes needed?
   
   fix silent data change.
   
   ### Does this PR introduce _any_ user-facing change?
   
   Yes, SparkUpgradeException will take place of `null` result when something 
is wrong during new formatter's formatting phase.
   
   ### How was this patch tested?
   <!--
   If tests were added, say they were added here. Please make sure to add some 
test cases that check the changes thoroughly including negative and positive 
cases if possible.
   If it was tested in a way different from regular unit tests, please clarify 
how you tested step by step, ideally copy and paste-able, so that other 
reviewers can test and check, and descendants can verify in the future.
   If tests were not added, please describe why they were not added and/or why 
it was difficult to add.
   -->
   add unit tests,
   
   the 
`sql/core/src/test/resources/sql-tests/results/datetime-corrected.sql.out` is 
added for different behaviors from the caller sides.


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

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



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

Reply via email to