diff --git a/parameter_test.go b/parameter_test.go index f3f7401b..33a72d10 100644 --- a/parameter_test.go +++ b/parameter_test.go @@ -19,7 +19,7 @@ func TestParameter_Inference(t *testing.T) { assert.Equal(t, string("TIMESTAMP"), *parameters[1].Type) assert.Equal(t, &cli_service.TSparkParameterValue{StringValue: strPtr("5")}, parameters[2].Value) assert.Equal(t, string("true"), *parameters[3].Value.StringValue) - assert.Equal(t, string("DECIMAL"), *parameters[4].Type) + assert.Equal(t, string("DECIMAL(2,1)"), *parameters[4].Type) assert.Equal(t, string("6.2"), *parameters[4].Value.StringValue) }) } @@ -31,6 +31,6 @@ func TestParameters_Names(t *testing.T) { assert.Equal(t, cli_service.TSparkParameterValue{StringValue: strPtr("26")}, *parameters[0].Value) assert.Equal(t, string("2"), *parameters[1].Name) assert.Equal(t, cli_service.TSparkParameterValue{StringValue: strPtr("6.2")}, *parameters[1].Value) - assert.Equal(t, string("DECIMAL"), *parameters[1].Type) + assert.Equal(t, string("DECIMAL(2,1)"), *parameters[1].Type) }) } diff --git a/parameters.go b/parameters.go index 146e7d1e..5cd6ab5d 100644 --- a/parameters.go +++ b/parameters.go @@ -4,6 +4,7 @@ import ( "database/sql/driver" "fmt" "strconv" + "strings" "time" "github.com/databricks/databricks-sql-go/internal/cli_service" @@ -142,9 +143,33 @@ func convertNamedValuesToSparkParams(values []driver.NamedValue) []*cli_service. for i := range sqlParams { sqlParam := sqlParams[i] sparkParamValue := sqlParam.Value.(string) - sparkParamType := sqlParam.Type.String() + var sparkParamType string + if sqlParam.Type == Decimal { + sparkParamType = inferDecimalType(sparkParamValue) + } else { + sparkParamType = sqlParam.Type.String() + } sparkParam := cli_service.TSparkParameter{Name: &sqlParam.Name, Type: &sparkParamType, Value: &cli_service.TSparkParameterValue{StringValue: &sparkParamValue}} sparkParams = append(sparkParams, &sparkParam) } return sparkParams } + +func inferDecimalType(d string) (t string) { + var overall int + var after int + if strings.HasPrefix(d, "0.") { + // Less than one + overall = len(d) - 2 + after = len(d) - 2 + } else if !strings.Contains(d, ".") { + // Less than one + overall = len(d) + after = 0 + } else { + components := strings.Split(d, ".") + overall, after = len(components[0])+len(components[1]), len(components[1]) + } + + return fmt.Sprintf("DECIMAL(%d,%d)", overall, after) +}