diff --git a/internal/proxy/task_index.go b/internal/proxy/task_index.go index 17880cfe45..68e7880430 100644 --- a/internal/proxy/task_index.go +++ b/internal/proxy/task_index.go @@ -173,7 +173,12 @@ func (cit *createIndexTask) parseIndexParams(ctx context.Context) error { isVecIndex := typeutil.IsVectorType(cit.fieldSchema.DataType) indexParamsMap := make(map[string]string) + keys := typeutil.NewSet[string]() for _, kv := range cit.req.GetExtraParams() { + if keys.Contain(kv.GetKey()) { + return merr.WrapErrParameterInvalidMsg("duplicated index param (key=%s) (value=%s) found", kv.GetKey(), kv.GetValue()) + } + keys.Insert(kv.GetKey()) if kv.Key == common.IndexParamsKey { params, err := funcutil.JSONToMap(kv.Value) if err != nil { diff --git a/internal/proxy/task_index_test.go b/internal/proxy/task_index_test.go index 555f14ee93..cd78cfd4c7 100644 --- a/internal/proxy/task_index_test.go +++ b/internal/proxy/task_index_test.go @@ -1091,6 +1091,40 @@ func Test_parseIndexParams(t *testing.T) { // Out of range in json: param 'M' (3000) should be in range [2, 2048] assert.Error(t, err) }) + + t.Run("check_duplicated_extraparam", func(t *testing.T) { + cit := &createIndexTask{ + Condition: nil, + req: &milvuspb.CreateIndexRequest{ + ExtraParams: []*commonpb.KeyValuePair{ + { + Key: common.IndexTypeKey, + Value: "HNSW", + }, + { + Key: common.MetricTypeKey, + Value: metric.L2, + }, + { + Key: common.MetricTypeKey, + Value: metric.COSINE, + }, + }, + IndexName: "", + }, + fieldSchema: &schemapb.FieldSchema{ + FieldID: 101, + Name: "FieldVector", + IsPrimaryKey: false, + DataType: schemapb.DataType_FloatVector, + TypeParams: []*commonpb.KeyValuePair{ + {Key: common.DimKey, Value: "768"}, + }, + }, + } + err := cit.parseIndexParams(context.TODO()) + assert.Error(t, err) + }) } func Test_wrapUserIndexParams(t *testing.T) {