Skip to content

Commit aeb5e5d

Browse files
esdrasbelezakravets-levkomdibaieecandiduslynx
authored
Fix Spark parameter creation when passing a nil-value named parameter to a query (#199)
- When a `sql.NamedValue` has the field `Value` set to `nil`, the resulting `cli_service.TSparkParameter` will also have the value `nil` instead of `*cli_service.TSparkParameterValue{StringValue: *"%!s(<nil>"}`. - Add the type `SqlVoid`, following the conventions used in the [NodeJS connector](https://github.com/databricks/databricks-sql-nodejs/blob/main/lib/DBSQLParameter.ts#L43-L51) and the [Python driver](https://github.com/databricks/databricks-sql-python/blob/f6fd7a7956a4dbc78ad36b5e079fe8d74176a0f1/src/databricks/sql/parameters/native.py#L319-L323). Fix #193. --------- Signed-off-by: Esdras Beleza <[email protected]> Signed-off-by: Levko Kravets <[email protected]> Signed-off-by: candiduslynx <[email protected]> Co-authored-by: Levko Kravets <[email protected]> Co-authored-by: Mahdi Dibaiee <[email protected]> Co-authored-by: Alex Shcherbakov <[email protected]>
1 parent 4f9a1a1 commit aeb5e5d

File tree

3 files changed

+23
-6
lines changed

3 files changed

+23
-6
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Release History
22

3-
- Fix formatting of *float64 parameters
3+
- Bug fix for issue 193: convertNamedValuesToSparkParams was incorrectly creating a Spark parameter value as "%!s(<nil>)" when a named param was nil (databricks/databricks-sql-go#199 by @esdrasbeleza)
4+
- Fix formatting of *float64 parameters (databricks/databricks-sql-go#215 by @esdrasbeleza)
45

56
## v1.5.4 (2024-04-10)
67

parameter_test.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@ import (
1212

1313
func TestParameter_Inference(t *testing.T) {
1414
t.Run("Should infer types correctly", func(t *testing.T) {
15-
values := [6]driver.NamedValue{
15+
values := [7]driver.NamedValue{
1616
{Name: "", Value: float32(5.1)},
1717
{Name: "", Value: time.Now()},
1818
{Name: "", Value: int64(5)},
1919
{Name: "", Value: true},
2020
{Name: "", Value: Parameter{Value: "6.2", Type: SqlDecimal}},
21+
{Name: "", Value: nil},
2122
{Name: "", Value: Parameter{Value: float64Ptr(6.2), Type: SqlUnkown}},
2223
}
2324
parameters := convertNamedValuesToSparkParams(values[:])
@@ -28,7 +29,9 @@ func TestParameter_Inference(t *testing.T) {
2829
assert.Equal(t, string("true"), *parameters[3].Value.StringValue)
2930
assert.Equal(t, string("DECIMAL(2,1)"), *parameters[4].Type)
3031
assert.Equal(t, string("6.2"), *parameters[4].Value.StringValue)
31-
assert.Equal(t, &cli_service.TSparkParameterValue{StringValue: strPtr("6.2")}, parameters[5].Value)
32+
assert.Equal(t, string("VOID"), *parameters[5].Type)
33+
assert.Nil(t, parameters[5].Value)
34+
assert.Equal(t, &cli_service.TSparkParameterValue{StringValue: strPtr("6.2")}, parameters[6].Value)
3235
})
3336
}
3437
func TestParameters_Names(t *testing.T) {

parameters.go

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ const (
3434
SqlBoolean
3535
SqlIntervalMonth
3636
SqlIntervalDay
37+
SqlVoid
3738
)
3839

3940
func (s SqlType) String() string {
@@ -64,6 +65,8 @@ func (s SqlType) String() string {
6465
return "INTERVAL MONTH"
6566
case SqlIntervalDay:
6667
return "INTERVAL DAY"
68+
case SqlVoid:
69+
return "VOID"
6770
}
6871
return "unknown"
6972
}
@@ -149,6 +152,9 @@ func inferType(param *Parameter) {
149152
case time.Time:
150153
param.Value = value.Format(time.RFC3339Nano)
151154
param.Type = SqlTimestamp
155+
case nil:
156+
param.Value = nil
157+
param.Type = SqlVoid
152158
default:
153159
s := fmt.Sprintf("%s", param.Value)
154160
param.Value = s
@@ -163,14 +169,21 @@ func convertNamedValuesToSparkParams(values []driver.NamedValue) []*cli_service.
163169
inferTypes(sqlParams)
164170
for i := range sqlParams {
165171
sqlParam := sqlParams[i]
166-
sparkParamValue := sqlParam.Value.(string)
172+
sparkValue := new(cli_service.TSparkParameterValue)
173+
if sqlParam.Type == SqlVoid {
174+
sparkValue = nil
175+
} else {
176+
stringValue := sqlParam.Value.(string)
177+
sparkValue = &cli_service.TSparkParameterValue{StringValue: &stringValue}
178+
}
179+
167180
var sparkParamType string
168181
if sqlParam.Type == SqlDecimal {
169-
sparkParamType = inferDecimalType(sparkParamValue)
182+
sparkParamType = inferDecimalType(sparkValue.GetStringValue())
170183
} else {
171184
sparkParamType = sqlParam.Type.String()
172185
}
173-
sparkParam := cli_service.TSparkParameter{Name: &sqlParam.Name, Type: &sparkParamType, Value: &cli_service.TSparkParameterValue{StringValue: &sparkParamValue}}
186+
sparkParam := cli_service.TSparkParameter{Name: &sqlParam.Name, Type: &sparkParamType, Value: sparkValue}
174187
sparkParams = append(sparkParams, &sparkParam)
175188
}
176189
return sparkParams

0 commit comments

Comments
 (0)