fix: [GoSDK] Pass only valid data for nullable column (#40328)

Related to #40327

Signed-off-by: Congqi Xia <congqi.xia@zilliz.com>
This commit is contained in:
congqixia 2025-03-04 20:58:04 +08:00 committed by GitHub
parent 7d35d023a3
commit c02763d49a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 24 additions and 12 deletions

View File

@ -32,6 +32,7 @@ func (c *columnArrayBase[T]) FieldData() *schemapb.FieldData {
fd := &schemapb.FieldData{ fd := &schemapb.FieldData{
Type: schemapb.DataType_Array, Type: schemapb.DataType_Array,
FieldName: c.name, FieldName: c.name,
ValidData: c.validData,
} }
data := make([]*schemapb.ScalarField, 0, c.Len()) data := make([]*schemapb.ScalarField, 0, c.Len())

View File

@ -49,6 +49,9 @@ func (c *genericColumnBase[T]) Type() entity.FieldType {
} }
func (c *genericColumnBase[T]) Len() int { func (c *genericColumnBase[T]) Len() int {
if c.validData != nil {
return len(c.validData)
}
return len(c.values) return len(c.values)
} }
@ -166,9 +169,9 @@ func (c *genericColumnBase[T]) AppendNull() error {
if !c.nullable { if !c.nullable {
return errors.New("append null to not nullable column") return errors.New("append null to not nullable column")
} }
var v T // var v T
c.validData = append(c.validData, true) c.validData = append(c.validData, true)
c.values = append(c.values, v) // c.values = append(c.values, v)
return nil return nil
} }

View File

@ -16,7 +16,10 @@
package column package column
import "github.com/cockroachdb/errors" import (
"github.com/cockroachdb/errors"
"github.com/samber/lo"
)
var ( var (
// scalars // scalars
@ -55,9 +58,13 @@ type NullableColumnCreator[col interface {
func (c NullableColumnCreator[col, T]) New(name string, values []T, validData []bool) (col, error) { func (c NullableColumnCreator[col, T]) New(name string, values []T, validData []bool) (col, error) {
var result col var result col
if len(values) != len(validData) { validCnt := lo.CountBy(validData, func(v bool) bool {
return result, errors.New("values & validData slice has different length") return v
})
if validCnt != len(values) {
return result, errors.Newf("values number(%d) does not match valid count(%d)", len(values), validCnt)
} }
result = c.base(name, values) result = c.base(name, values)
result.withValidData(validData) result.withValidData(validData)

View File

@ -33,7 +33,7 @@ type NullableScalarSuite struct {
func (s *NullableScalarSuite) TestBasic() { func (s *NullableScalarSuite) TestBasic() {
s.Run("nullable_bool", func() { s.Run("nullable_bool", func() {
name := fmt.Sprintf("field_%d", rand.Intn(1000)) name := fmt.Sprintf("field_%d", rand.Intn(1000))
data := []bool{true, false} data := []bool{false}
validData := []bool{true, false} validData := []bool{true, false}
column, err := NewNullableColumnBool(name, data, validData) column, err := NewNullableColumnBool(name, data, validData)
s.NoError(err) s.NoError(err)
@ -63,7 +63,7 @@ func (s *NullableScalarSuite) TestBasic() {
s.Run("nullable_int8", func() { s.Run("nullable_int8", func() {
name := fmt.Sprintf("field_%d", rand.Intn(1000)) name := fmt.Sprintf("field_%d", rand.Intn(1000))
data := []int8{1, 2, 3} data := []int8{1, 3}
validData := []bool{true, false, true} validData := []bool{true, false, true}
column, err := NewNullableColumnInt8(name, data, validData) column, err := NewNullableColumnInt8(name, data, validData)
s.NoError(err) s.NoError(err)
@ -93,7 +93,7 @@ func (s *NullableScalarSuite) TestBasic() {
s.Run("nullable_int16", func() { s.Run("nullable_int16", func() {
name := fmt.Sprintf("field_%d", rand.Intn(1000)) name := fmt.Sprintf("field_%d", rand.Intn(1000))
data := []int16{1, 2, 3} data := []int16{1, 3}
validData := []bool{true, false, true} validData := []bool{true, false, true}
column, err := NewNullableColumnInt16(name, data, validData) column, err := NewNullableColumnInt16(name, data, validData)
s.NoError(err) s.NoError(err)
@ -123,7 +123,7 @@ func (s *NullableScalarSuite) TestBasic() {
s.Run("nullable_int32", func() { s.Run("nullable_int32", func() {
name := fmt.Sprintf("field_%d", rand.Intn(1000)) name := fmt.Sprintf("field_%d", rand.Intn(1000))
data := []int32{1, 2, 3} data := []int32{1, 3}
validData := []bool{true, false, true} validData := []bool{true, false, true}
column, err := NewNullableColumnInt32(name, data, validData) column, err := NewNullableColumnInt32(name, data, validData)
s.NoError(err) s.NoError(err)
@ -153,7 +153,7 @@ func (s *NullableScalarSuite) TestBasic() {
s.Run("nullable_int64", func() { s.Run("nullable_int64", func() {
name := fmt.Sprintf("field_%d", rand.Intn(1000)) name := fmt.Sprintf("field_%d", rand.Intn(1000))
data := []int64{1, 2, 3} data := []int64{1, 3}
validData := []bool{true, false, true} validData := []bool{true, false, true}
column, err := NewNullableColumnInt64(name, data, validData) column, err := NewNullableColumnInt64(name, data, validData)
s.NoError(err) s.NoError(err)
@ -183,7 +183,7 @@ func (s *NullableScalarSuite) TestBasic() {
s.Run("nullable_float", func() { s.Run("nullable_float", func() {
name := fmt.Sprintf("field_%d", rand.Intn(1000)) name := fmt.Sprintf("field_%d", rand.Intn(1000))
data := []float32{0.1, 0.2, 0.3} data := []float32{0.1, 0.3}
validData := []bool{true, false, true} validData := []bool{true, false, true}
column, err := NewNullableColumnFloat(name, data, validData) column, err := NewNullableColumnFloat(name, data, validData)
s.NoError(err) s.NoError(err)
@ -213,7 +213,7 @@ func (s *NullableScalarSuite) TestBasic() {
s.Run("nullable_double", func() { s.Run("nullable_double", func() {
name := fmt.Sprintf("field_%d", rand.Intn(1000)) name := fmt.Sprintf("field_%d", rand.Intn(1000))
data := []float64{0.1, 0.2, 0.3} data := []float64{0.1, 0.3}
validData := []bool{true, false, true} validData := []bool{true, false, true}
column, err := NewNullableColumnDouble(name, data, validData) column, err := NewNullableColumnDouble(name, data, validData)
s.NoError(err) s.NoError(err)

View File

@ -220,6 +220,7 @@ func (f *Field) ProtoMessage() *schemapb.FieldSchema {
IsPartitionKey: f.IsPartitionKey, IsPartitionKey: f.IsPartitionKey,
IsClusteringKey: f.IsClusteringKey, IsClusteringKey: f.IsClusteringKey,
ElementType: schemapb.DataType(f.ElementType), ElementType: schemapb.DataType(f.ElementType),
Nullable: f.Nullable,
} }
} }