diff --git a/CHANGELOG.md b/CHANGELOG.md index 40ec55848..e9d6aee55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +* Fixed send optional arguments to the server with `ydb.ParamsBuilder` + ## v3.88.0 * Removed UUID methods from ydb.ParamsBuilder() diff --git a/internal/params/optional.go b/internal/params/optional.go index cce0f8050..e5701aca9 100644 --- a/internal/params/optional.go +++ b/internal/params/optional.go @@ -23,7 +23,7 @@ func (b *optionalBuilder) EndOptional() Builder { b.opt.parent.params = append(b.opt.parent.params, &Parameter{ parent: b.opt.parent, name: b.opt.name, - value: value.OptionalValue(b.opt.value), + value: b.opt.value, }) return b.opt.parent diff --git a/internal/params/optional_test.go b/internal/params/optional_test.go index 69aabb2e0..e65d4eb48 100644 --- a/internal/params/optional_test.go +++ b/internal/params/optional_test.go @@ -30,21 +30,11 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_UINT64}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_UINT64}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_Uint64Value{ - Uint64Value: 123, - }, - }, + Value: &Ydb.Value_Uint64Value{ + Uint64Value: 123, }, }, }, @@ -55,21 +45,11 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_INT64}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_INT64}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_Int64Value{ - Int64Value: 123, - }, - }, + Value: &Ydb.Value_Int64Value{ + Int64Value: 123, }, }, }, @@ -80,21 +60,11 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_UINT32}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_UINT32}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_Uint32Value{ - Uint32Value: 123, - }, - }, + Value: &Ydb.Value_Uint32Value{ + Uint32Value: 123, }, }, }, @@ -105,21 +75,11 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_INT32}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_INT32}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_Int32Value{ - Int32Value: 123, - }, - }, + Value: &Ydb.Value_Int32Value{ + Int32Value: 123, }, }, }, @@ -130,21 +90,11 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_UINT16}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_UINT16}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_Uint32Value{ - Uint32Value: 123, - }, - }, + Value: &Ydb.Value_Uint32Value{ + Uint32Value: 123, }, }, }, @@ -155,21 +105,11 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_INT16}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_INT16}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_Int32Value{ - Int32Value: 123, - }, - }, + Value: &Ydb.Value_Int32Value{ + Int32Value: 123, }, }, }, @@ -180,21 +120,11 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_UINT8}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_UINT8}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_Uint32Value{ - Uint32Value: 123, - }, - }, + Value: &Ydb.Value_Uint32Value{ + Uint32Value: 123, }, }, }, @@ -205,21 +135,11 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_INT8}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_INT8}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_Int32Value{ - Int32Value: 123, - }, - }, + Value: &Ydb.Value_Int32Value{ + Int32Value: 123, }, }, }, @@ -230,21 +150,11 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_BOOL}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_BOOL}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_BoolValue{ - BoolValue: true, - }, - }, + Value: &Ydb.Value_BoolValue{ + BoolValue: true, }, }, }, @@ -255,21 +165,11 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_UTF8}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_UTF8}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_TextValue{ - TextValue: "test", - }, - }, + Value: &Ydb.Value_TextValue{ + TextValue: "test", }, }, }, @@ -280,21 +180,11 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_STRING}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_STRING}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_BytesValue{ - BytesValue: []byte("test"), - }, - }, + Value: &Ydb.Value_BytesValue{ + BytesValue: []byte("test"), }, }, }, @@ -305,21 +195,11 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_FLOAT}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_FLOAT}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_FloatValue{ - FloatValue: float32(123), - }, - }, + Value: &Ydb.Value_FloatValue{ + FloatValue: float32(123), }, }, }, @@ -330,21 +210,11 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_DOUBLE}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_DOUBLE}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_DoubleValue{ - DoubleValue: float64(123), - }, - }, + Value: &Ydb.Value_DoubleValue{ + DoubleValue: float64(123), }, }, }, @@ -355,21 +225,12 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_INTERVAL}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_INTERVAL}, }, + Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_Int64Value{ - Int64Value: 1000000, - }, - }, + Value: &Ydb.Value_Int64Value{ + Int64Value: 1000000, }, }, }, @@ -380,21 +241,11 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_DATETIME}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_DATETIME}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_Uint32Value{ - Uint32Value: 123456789, - }, - }, + Value: &Ydb.Value_Uint32Value{ + Uint32Value: 123456789, }, }, }, @@ -405,21 +256,11 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_DATE}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_DATE}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_Uint32Value{ - Uint32Value: 1428, - }, - }, + Value: &Ydb.Value_Uint32Value{ + Uint32Value: 1428, }, }, }, @@ -430,21 +271,11 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_TIMESTAMP}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_TIMESTAMP}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_Uint64Value{ - Uint64Value: 123456789000000, - }, - }, + Value: &Ydb.Value_Uint64Value{ + Uint64Value: 123456789000000, }, }, }, @@ -455,27 +286,17 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_DecimalType{ - DecimalType: &Ydb.DecimalType{ - Precision: 22, - Scale: 9, - }, - }, - }, + Type: &Ydb.Type_DecimalType{ + DecimalType: &Ydb.DecimalType{ + Precision: 22, + Scale: 9, }, }, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - High_128: 72623859790382856, - Value: &Ydb.Value_Low_128{ - Low_128: 648519454493508870, - }, - }, + High_128: 72623859790382856, + Value: &Ydb.Value_Low_128{ + Low_128: 648519454493508870, }, }, }, @@ -486,21 +307,11 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_JSON}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_JSON}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_TextValue{ - TextValue: `{"a": 1,"b": "B"}`, - }, - }, + Value: &Ydb.Value_TextValue{ + TextValue: `{"a": 1,"b": "B"}`, }, }, }, @@ -511,21 +322,11 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_JSON_DOCUMENT}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_JSON_DOCUMENT}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_TextValue{ - TextValue: `{"a": 1,"b": "B"}`, - }, - }, + Value: &Ydb.Value_TextValue{ + TextValue: `{"a": 1,"b": "B"}`, }, }, }, @@ -536,21 +337,11 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_YSON}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_YSON}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_BytesValue{ - BytesValue: []byte(`{"a": 1,"b": "B"}`), - }, - }, + Value: &Ydb.Value_BytesValue{ + BytesValue: []byte(`{"a": 1,"b": "B"}`), }, }, }, @@ -561,23 +352,13 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_UUID}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_UUID}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_Low_128{ - Low_128: 506660481424032516, - }, - High_128: 1157159078456920585, - }, + Value: &Ydb.Value_Low_128{ + Low_128: 506660481424032516, }, + High_128: 1157159078456920585, }, }, }, @@ -587,23 +368,13 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_UUID}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_UUID}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_Low_128{ - Low_128: 651345242494996240, - }, - High_128: 72623859790382856, - }, + Value: &Ydb.Value_Low_128{ + Low_128: 651345242494996240, }, + High_128: 72623859790382856, }, }, }, @@ -613,21 +384,11 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_TZ_DATETIME}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_TZ_DATETIME}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_TextValue{ - TextValue: "1973-11-29T21:33:09Z", - }, - }, + Value: &Ydb.Value_TextValue{ + TextValue: "1973-11-29T21:33:09Z", }, }, }, @@ -638,21 +399,11 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_TZ_DATE}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_TZ_DATE}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_TextValue{ - TextValue: "1973-11-29", - }, - }, + Value: &Ydb.Value_TextValue{ + TextValue: "1973-11-29", }, }, }, @@ -663,21 +414,11 @@ func TestOptional(t *testing.T) { expected: expected{ Type: &Ydb.Type{ - Type: &Ydb.Type_OptionalType{ - OptionalType: &Ydb.OptionalType{ - Item: &Ydb.Type{ - Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_TZ_TIMESTAMP}, - }, - }, - }, + Type: &Ydb.Type_TypeId{TypeId: Ydb.Type_TZ_TIMESTAMP}, }, Value: &Ydb.Value{ - Value: &Ydb.Value_NestedValue{ - NestedValue: &Ydb.Value{ - Value: &Ydb.Value_TextValue{ - TextValue: "1973-11-29T21:33:09.000000Z", - }, - }, + Value: &Ydb.Value_TextValue{ + TextValue: "1973-11-29T21:33:09.000000Z", }, }, }, diff --git a/tests/integration/query_regression_test.go b/tests/integration/query_regression_test.go index 3b3738f99..e5e373e85 100644 --- a/tests/integration/query_regression_test.go +++ b/tests/integration/query_regression_test.go @@ -4,6 +4,7 @@ package integration import ( + "os" "strings" "testing" @@ -12,6 +13,7 @@ import ( "github.com/ydb-platform/ydb-go-sdk/v3" "github.com/ydb-platform/ydb-go-sdk/v3/internal/query/tx" + "github.com/ydb-platform/ydb-go-sdk/v3/internal/version" "github.com/ydb-platform/ydb-go-sdk/v3/query" "github.com/ydb-platform/ydb-go-sdk/v3/table/types" ) @@ -264,3 +266,39 @@ SELECT $val`, require.Equal(t, id.String(), res.String()) }) } + +// https://github.com/ydb-platform/ydb-go-sdk/issues/1506 +func TestIssue1506TypedNullPushdown(t *testing.T) { + if version.Lt(os.Getenv("YDB_VERSION"), "24.1") { + t.Skip("query service not allowed in YDB version '" + os.Getenv("YDB_VERSION") + "'") + } + + scope := newScope(t) + ctx := scope.Ctx + db := scope.Driver() + + val := int64(123) + row, err := db.Query().QueryRow(ctx, ` +DECLARE $arg1 AS Int64?; +DECLARE $arg2 AS Int64?; + +SELECT CAST($arg1 AS Utf8) AS v1, CAST($arg2 AS Utf8) AS v2 +`, query.WithParameters( + ydb.ParamsBuilder(). + Param("$arg1").BeginOptional().Int64(nil).EndOptional(). + Param("$arg2").BeginOptional().Int64(&val).EndOptional(). + Build(), + ), + ) + require.NoError(t, err) + + var res struct { + V1 *string `sql:"v1"` + V2 *string `sql:"v2"` + } + err = row.ScanStruct(&res) + require.NoError(t, err) + + require.Nil(t, res.V1) + require.Equal(t, "123", *res.V2) +}