CurtHagenlocher commented on code in PR #1267:
URL: https://github.com/apache/arrow-adbc/pull/1267#discussion_r1388147171


##########
go/adbc/driver/snowflake/driver_test.go:
##########
@@ -679,6 +681,96 @@ func (suite *SnowflakeTests) TestUseHighPrecision() {
        suite.Equal(9876543210.99, rec.Column(1).(*array.Float64).Value(1))
 }
 
+func (suite *SnowflakeTests) TestDecimalHighPrecision() {
+       for sign := 0; sign <= 1; sign++ {
+               for scale := 0; scale <= 2; scale++ {
+                       for precision := 3; precision <= 38; precision++ {
+                               numberString := strings.Repeat("9", 
precision-scale) + "." + strings.Repeat("9", scale)
+                               if sign == 1 {
+                                       numberString = "-" + numberString
+                               }
+                               query := "SELECT CAST('" + numberString + 
fmt.Sprintf("' AS NUMBER(%d, %d)) AS RESULT", precision, scale)
+                               number, err := 
decimal128.FromString(numberString, int32(precision), int32(scale))
+                               suite.NoError(err)
+
+                               
suite.Require().NoError(suite.stmt.SetOption(driver.OptionUseHighPrecision, 
adbc.OptionValueEnabled))
+                               
suite.Require().NoError(suite.stmt.SetSqlQuery(query))
+                               rdr, n, err := 
suite.stmt.ExecuteQuery(suite.ctx)
+                               suite.Require().NoError(err)
+                               defer rdr.Release()
+
+                               suite.EqualValues(1, n)
+                               
suite.Truef(arrow.TypeEqual(&arrow.Decimal128Type{Precision: int32(precision), 
Scale: int32(scale)}, rdr.Schema().Field(0).Type), "expected decimal(%d, %d), 
got %s", precision, scale, rdr.Schema().Field(0).Type)
+                               suite.True(rdr.Next())
+                               rec := rdr.Record()
+
+                               suite.Equal(number, 
rec.Column(0).(*array.Decimal128).Value(0))
+                       }
+               }
+       }
+}
+
+func (suite *SnowflakeTests) TestNonIntDecimalLowPrecision() {
+       for sign := 0; sign <= 1; sign++ {
+               for precision := 3; precision <= 38; precision++ {
+                       scale := 2
+                       numberString := strings.Repeat("9", precision-scale) + 
".99"
+                       if sign == 1 {
+                               numberString = "-" + numberString
+                       }
+                       query := "SELECT CAST('" + numberString + 
fmt.Sprintf("' AS NUMBER(%d, %d)) AS RESULT", precision, scale)
+                       decimalNumber, err := 
decimal128.FromString(numberString, int32(precision), int32(scale))
+                       suite.NoError(err)
+                       number := decimalNumber.ToFloat64(int32(scale))
+
+                       
suite.Require().NoError(suite.stmt.SetOption(driver.OptionUseHighPrecision, 
adbc.OptionValueDisabled))
+                       suite.Require().NoError(suite.stmt.SetSqlQuery(query))
+                       rdr, n, err := suite.stmt.ExecuteQuery(suite.ctx)
+                       suite.Require().NoError(err)
+                       defer rdr.Release()
+
+                       suite.EqualValues(1, n)
+                       
suite.Truef(arrow.TypeEqual(arrow.PrimitiveTypes.Float64, 
rdr.Schema().Field(0).Type), "expected float64, got %s", 
rdr.Schema().Field(0).Type)
+                       suite.True(rdr.Next())
+                       rec := rdr.Record()
+
+                       value := rec.Column(0).(*array.Float64).Value(0)
+                       difference := math.Abs(number - value)
+                       suite.Truef(difference < 1e-13, "expected %f, got %f", 
number, value)
+               }
+       }
+}
+
+func (suite *SnowflakeTests) TestIntDecimalLowPrecision() {
+       for sign := 0; sign <= 1; sign++ {
+               for precision := 3; precision <= 38; precision++ {
+                       scale := 0
+                       numberString := strings.Repeat("9", precision-scale)
+                       if sign == 1 {
+                               numberString = "-" + numberString
+                       }
+                       query := "SELECT CAST('" + numberString + 
fmt.Sprintf("' AS NUMBER(%d, %d)) AS RESULT", precision, scale)
+                       decimalNumber, err := 
decimal128.FromString(numberString, int32(precision), int32(scale))
+                       suite.NoError(err)
+                       number := int64(decimalNumber.LowBits())

Review Comment:
   Filed #1277



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

Reply via email to