Github user mgaido91 commented on the issue:

    https://github.com/apache/spark/pull/20023
  
    @gatorsmile, please refer to the [e-mail to the dev mail 
list](https://mail-archives.apache.org/mod_mbox/spark-dev/201712.mbox/%3CCAEorWNAJ4TxJR9NBcgSFMD_VxTg8qVxusjP%2BAJP-x%2BJV9zH-yA%40mail.gmail.com%3E)
 for further details. I run the script I added to the tests in this PR, the 
results are:
    
     - Hive behaves exactly as Spark after this PR;
     - SQLServer the same, even though on additions and subtractions it seems 
to maintain one more precision digit in some cases (I am running SQLServer 
2017, since Hive implementation, and therefore this too, are inspired to 
SQLServer2005, there might have been a small behavior change in this case). 
Anyway, differently from Hive and Spark it throws an exception in case 3 
described in the email (it is compliant to SQL standard, point 3 of the email 
is out of scope of this PR, I will create another PR for it once we agree on 
how to handle that case);
     - Oracle and Postgres have nearly infinite precision. Thus it is nearly 
impossible to provoke a rounding on them. If we force a precision loss on them 
(point 3 of the email, out of scope of this PR) they throw an exception 
(compliant to SQL standard and SQLServer);
    
    Here you are the outputs of the queries.
    
    **Hive 2.3.0 (same as Spark after PR)**
    
    ```
    0: jdbc:hive2://localhost:10000> create table decimals_test(id int, a 
decimal(38,18), b decimal(38,18));
    No rows affected (2.085 seconds)
    0: jdbc:hive2://localhost:10000> insert into decimals_test values (1, 
100.0, 999.0), (2, 12345.123, 12345.123), (3, 0.1234567891011, 1234.1), (4, 
123456789123456789.0, 1.123456789123456789);
    No rows affected (14.054 seconds)
    0: jdbc:hive2://localhost:10000> select id, a+b, a-b, a*b, a/b from 
decimals_test order by id;
    
+-----+---------------------------------------+---------------------------------------+----------------------------+----------------------------+
    | id  |                  _c1                  |                  _c2        
          |            _c3             |            _c4             |
    
+-----+---------------------------------------+---------------------------------------+----------------------------+----------------------------+
    | 1   | 1099.00000000000000000                | -899.00000000000000000      
          | 99900.000000               | 0.100100                   |
    | 2   | 24690.24600000000000000               | 0E-17                       
          | 152402061.885129           | 1.000000                   |
    | 3   | 1234.22345678910110000                | -1233.97654321089890000     
          | 152.358023                 | 0.000100                   |
    | 4   | 123456789123456790.12345678912345679  | 
123456789123456787.87654321087654321  | 138698367904130467.515623  | 
109890109097814272.043109  |
    
+-----+---------------------------------------+---------------------------------------+----------------------------+----------------------------+
    ```
    
    **SQLServer 2017**
    
    ```
    1> create table decimals_test(id int, a decimal(38,18), b decimal(38,18));
    2> insert into decimals_test values (1, 100.0, 999.0), (2, 12345.123, 
12345.123), (3, 0.1234567891011, 1234.1), (4, 123456789123456789.0, 
1.123456789123456789);
    3> select id, a+b, a-b, a*b, a/b from decimals_test order by id;
    4> GO
    
    (4 rows affected)
    id                                                                          
                                                                                
                   
    ----------- ---------------------------------------- 
---------------------------------------- 
---------------------------------------- 
----------------------------------------
              1                  1099.000000000000000000                  
-899.000000000000000000                             99900.000000                
                  .100100
              2                 24690.246000000000000000                      
.000000000000000000                         152402061.885129                    
             1.000000
              3                  1234.223456789101100000                 
-1233.976543210898900000                               152.358023               
                   .000100
              4    123456789123456790.123456789123456789    
123456789123456787.876543210876543211                138698367904130467.515623  
              109890109097814272.043109
    ```
    
    **Postgres and Oracle**
    
    ```
    postgres=# create table decimals_test(id int, a decimal(38,18), b 
decimal(38,18));
    CREATE TABLE
    postgres=# insert into decimals_test values (1, 100.0, 999.0), (2, 
12345.123, 12345.123), (3, 0.1234567891011, 1234.1), (4, 123456789123456789.0, 
1.123456789123456789);
    INSERT 0 4
    postgres=# select id, a+b, a-b, a*b, a/b from decimals_test order by id;
     id |               ?column?                |               ?column?        
        |                        ?column?                         |             
  ?column?                
    
----+---------------------------------------+---------------------------------------+---------------------------------------------------------+---------------------------------------
      1 |               1099.000000000000000000 |               
-899.000000000000000000 |              
99900.000000000000000000000000000000000000 |                
0.10010010010010010010
      2 |              24690.246000000000000000 |                  
0.000000000000000000 |          152402061.885129000000000000000000000000000000 
|                1.00000000000000000000
      3 |               1234.223456789101100000 |              
-1233.976543210898900000 |                
152.358023429667510000000000000000000000 |            0.000100037913541123085649
      4 | 123456789123456790.123456789123456789 | 
123456789123456787.876543210876543211 | 
138698367904130467.515622620750190521000000000000000000 | 
109890109097814272.043109406191131436
    (4 rows)
    ```
    
    **Spark before the PR**
    
    ```
    scala> sql("create table decimals_test(id int, a decimal(38,18), b 
decimal(38,18)) using parquet")
    res0: org.apache.spark.sql.DataFrame = []
    
    scala> sql("insert into decimals_test values (1, 100.0, 999.0), (2, 
12345.123, 12345.123), (3, 0.1234567891011, 1234.1), (4, 123456789123456789.0, 
1.123456789123456789)")
    res1: org.apache.spark.sql.DataFrame = []                                   
    
    
    scala> sql("select id, a+b, a-b, a*b, a/b from decimals_test order by 
id").show(truncate = false)
    
+---+-------------------------------------+-------------------------------------+-------+-------------------------------------+
    |id |(a + b)                              |(a - b)                          
    |(a * b)|(a / b)                              |
    
+---+-------------------------------------+-------------------------------------+-------+-------------------------------------+
    |1  |1099.000000000000000000              |-899.000000000000000000          
    |null   |0.100100100100100100                 |
    |2  |24690.246000000000000000             |0E-18                            
    |null   |1.000000000000000000                 |
    |3  |1234.223456789101100000              |-1233.976543210898900000         
    |null   |0.000100037913541123                 |
    |4  
|123456789123456790.123456789123456789|123456789123456787.876543210876543211|null
   |109890109097814272.043109406191131436|
    
+---+-------------------------------------+-------------------------------------+-------+-------------------------------------+
    ```


---

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

Reply via email to