未验证 提交 0e29c374 编写于 作者: J Jiquan Long 提交者: GitHub

Forbid system fields in user schema (#17613)

Signed-off-by: Nlongjiquan <jiquan.long@zilliz.com>
上级 f5fa93aa
...@@ -87,6 +87,15 @@ func (t *CreateCollectionReqTask) Type() commonpb.MsgType { ...@@ -87,6 +87,15 @@ func (t *CreateCollectionReqTask) Type() commonpb.MsgType {
return t.Req.Base.MsgType return t.Req.Base.MsgType
} }
func hasSystemFields(schema *schemapb.CollectionSchema, systemFields []string) bool {
for _, f := range schema.GetFields() {
if funcutil.SliceContain(systemFields, f.GetName()) {
return true
}
}
return false
}
// Execute task execution // Execute task execution
func (t *CreateCollectionReqTask) Execute(ctx context.Context) error { func (t *CreateCollectionReqTask) Execute(ctx context.Context) error {
if t.Type() != commonpb.MsgType_CreateCollection { if t.Type() != commonpb.MsgType_CreateCollection {
...@@ -108,6 +117,11 @@ func (t *CreateCollectionReqTask) Execute(ctx context.Context) error { ...@@ -108,6 +117,11 @@ func (t *CreateCollectionReqTask) Execute(ctx context.Context) error {
zap.Int32("ShardsNum", t.Req.ShardsNum), zap.Int32("ShardsNum", t.Req.ShardsNum),
zap.String("ConsistencyLevel", t.Req.ConsistencyLevel.String())) zap.String("ConsistencyLevel", t.Req.ConsistencyLevel.String()))
if hasSystemFields(&schema, []string{RowIDFieldName, TimeStampFieldName}) {
log.Error("failed to create collection, user schema contain system field")
return fmt.Errorf("schema contains system field: %s, %s", RowIDFieldName, TimeStampFieldName)
}
for idx, field := range schema.Fields { for idx, field := range schema.Fields {
field.FieldID = int64(idx + StartOfUserFieldID) field.FieldID = int64(idx + StartOfUserFieldID)
} }
......
...@@ -5,6 +5,12 @@ import ( ...@@ -5,6 +5,12 @@ import (
"errors" "errors"
"testing" "testing"
"github.com/golang/protobuf/proto"
"github.com/milvus-io/milvus/internal/proto/milvuspb"
"github.com/milvus-io/milvus/internal/proto/schemapb"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/milvus-io/milvus/internal/proto/etcdpb" "github.com/milvus-io/milvus/internal/proto/etcdpb"
...@@ -113,3 +119,35 @@ func TestDescribeSegmentsReqTask_Execute(t *testing.T) { ...@@ -113,3 +119,35 @@ func TestDescribeSegmentsReqTask_Execute(t *testing.T) {
} }
assert.NoError(t, tsk.Execute(context.Background())) assert.NoError(t, tsk.Execute(context.Background()))
} }
func Test_hasSystemFields(t *testing.T) {
t.Run("no system fields", func(t *testing.T) {
schema := &schemapb.CollectionSchema{Fields: []*schemapb.FieldSchema{{Name: "not_system_field"}}}
assert.False(t, hasSystemFields(schema, []string{RowIDFieldName, TimeStampFieldName}))
})
t.Run("has row id field", func(t *testing.T) {
schema := &schemapb.CollectionSchema{Fields: []*schemapb.FieldSchema{{Name: RowIDFieldName}}}
assert.True(t, hasSystemFields(schema, []string{RowIDFieldName, TimeStampFieldName}))
})
t.Run("has timestamp field", func(t *testing.T) {
schema := &schemapb.CollectionSchema{Fields: []*schemapb.FieldSchema{{Name: TimeStampFieldName}}}
assert.True(t, hasSystemFields(schema, []string{RowIDFieldName, TimeStampFieldName}))
})
}
func TestCreateCollectionReqTask_Execute_hasSystemFields(t *testing.T) {
schema := &schemapb.CollectionSchema{Name: "test", Fields: []*schemapb.FieldSchema{{Name: TimeStampFieldName}}}
marshaledSchema, err := proto.Marshal(schema)
assert.NoError(t, err)
task := &CreateCollectionReqTask{
Req: &milvuspb.CreateCollectionRequest{
Base: &commonpb.MsgBase{MsgType: commonpb.MsgType_CreateCollection},
CollectionName: "test",
Schema: marshaledSchema,
},
}
err = task.Execute(context.Background())
assert.Error(t, err)
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册