fix: restfulv2 parsing fixes and schema defaults support with timestamptz (#46057)

issue: https://github.com/milvus-io/milvus/issues/44585

Signed-off-by: zhenshan.cao <zhenshan.cao@zilliz.com>
This commit is contained in:
zhenshan.cao 2025-12-09 17:53:17 +08:00 committed by GitHub
parent 624147740b
commit 765768b0e4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 15 additions and 13 deletions

View File

@ -586,7 +586,7 @@ func (field *FieldSchema) GetProto(ctx context.Context) (*schemapb.FieldSchema,
var err error
fieldSchema.DefaultValue, err = convertDefaultValue(field.DefaultValue, dataType)
if err != nil {
log.Ctx(ctx).Warn("convert defaultValue fail", zap.Any("defaultValue", field.DefaultValue))
log.Ctx(ctx).Warn("convert defaultValue fail", zap.Any("defaultValue", field.DefaultValue), zap.Error(err))
return nil, merr.WrapErrParameterInvalidMsg("convert defaultValue fail, err: %s", err.Error())
}
if dataType == schemapb.DataType_Array {

View File

@ -439,7 +439,7 @@ func checkAndSetData(body []byte, collSchema *schemapb.CollectionSchema, partial
return merr.WrapErrParameterInvalid(schemapb.DataType_name[int32(fieldType)], dataString, err.Error()), reallyDataArray, validDataMap
}
reallyData[fieldName] = result
case schemapb.DataType_Int64, schemapb.DataType_Timestamptz:
case schemapb.DataType_Int64:
result, err := json.Number(dataString).Int64()
if err != nil {
return merr.WrapErrParameterInvalid(schemapb.DataType_name[int32(fieldType)], dataString, err.Error()), reallyDataArray, validDataMap
@ -576,6 +576,8 @@ func checkAndSetData(body []byte, collSchema *schemapb.CollectionSchema, partial
return merr.WrapErrParameterInvalid(schemapb.DataType_name[int32(fieldType)], dataString, err.Error()), reallyDataArray, validDataMap
}
reallyData[fieldName] = result
case schemapb.DataType_Timestamptz:
reallyData[fieldName] = dataString
case schemapb.DataType_VarChar:
reallyData[fieldName] = dataString
case schemapb.DataType_String:
@ -778,7 +780,7 @@ func anyToColumns(rows []map[string]interface{}, validDataMap map[string][]bool,
case schemapb.DataType_Double:
data = make([]float64, 0, rowsLen)
case schemapb.DataType_Timestamptz:
data = make([]int64, 0, rowsLen)
data = make([]string, 0, rowsLen)
case schemapb.DataType_String:
data = make([]string, 0, rowsLen)
case schemapb.DataType_VarChar:
@ -878,7 +880,7 @@ func anyToColumns(rows []map[string]interface{}, validDataMap map[string][]bool,
case schemapb.DataType_Float:
nameColumns[field.Name] = append(nameColumns[field.Name].([]float32), candi.v.Interface().(float32))
case schemapb.DataType_Timestamptz:
nameColumns[field.Name] = append(nameColumns[field.Name].([]int64), candi.v.Interface().(int64))
nameColumns[field.Name] = append(nameColumns[field.Name].([]string), candi.v.Interface().(string))
case schemapb.DataType_Double:
nameColumns[field.Name] = append(nameColumns[field.Name].([]float64), candi.v.Interface().(float64))
case schemapb.DataType_String:
@ -1036,9 +1038,9 @@ func anyToColumns(rows []map[string]interface{}, validDataMap map[string][]bool,
case schemapb.DataType_Timestamptz:
colData.Field = &schemapb.FieldData_Scalars{
Scalars: &schemapb.ScalarField{
Data: &schemapb.ScalarField_TimestamptzData{
TimestamptzData: &schemapb.TimestamptzArray{
Data: column.([]int64),
Data: &schemapb.ScalarField_StringData{
StringData: &schemapb.StringArray{
Data: column.([]string),
},
},
},
@ -1389,7 +1391,7 @@ func buildQueryResp(rowsNum int64, needFields []string, fieldDataList []*schemap
case schemapb.DataType_Double:
rowsNum = int64(len(fieldDataList[0].GetScalars().GetDoubleData().GetData()))
case schemapb.DataType_Timestamptz:
rowsNum = int64(len(fieldDataList[0].GetScalars().GetTimestamptzData().GetData()))
rowsNum = int64(len(fieldDataList[0].GetScalars().GetStringData().GetData()))
case schemapb.DataType_String:
rowsNum = int64(len(fieldDataList[0].GetScalars().GetStringData().GetData()))
case schemapb.DataType_VarChar:
@ -1500,7 +1502,7 @@ func buildQueryResp(rowsNum int64, needFields []string, fieldDataList []*schemap
row[fieldDataList[j].GetFieldName()] = nil
continue
}
row[fieldDataList[j].FieldName] = fieldDataList[j].GetScalars().GetTimestamptzData().GetData()[i]
row[fieldDataList[j].FieldName] = fieldDataList[j].GetScalars().GetStringData().GetData()[i]
case schemapb.DataType_String:
if len(fieldDataList[j].GetValidData()) != 0 && !fieldDataList[j].GetValidData()[i] {
row[fieldDataList[j].GetFieldName()] = nil
@ -1714,13 +1716,13 @@ func convertDefaultValue(value interface{}, dataType schemapb.DataType) (*schema
return data, nil
case schemapb.DataType_Timestamptz:
v, ok := value.(float64)
v, ok := value.(string)
if !ok {
return nil, merr.WrapErrParameterInvalid("string", value, "Wrong defaultValue type")
}
data := &schemapb.ValueField{
Data: &schemapb.ValueField_TimestamptzData{
TimestamptzData: int64(v),
Data: &schemapb.ValueField_StringData{
StringData: v,
},
}
return data, nil

View File

@ -1163,7 +1163,7 @@ func (v *validateUtil) checkTimestamptzFieldData(field *schemapb.FieldData, time
// Use the centralized parser (timestamptz.ParseTimeTz) for validation and parsing.
t, err := timestamptz.ParseTimeTz(isoStr, timezone)
if err != nil {
log.Warn("cannot parse timestamptz string", zap.String("timestamp_string", isoStr), zap.Error(err))
log.Info("cannot parse timestamptz string", zap.String("timestamp_string", isoStr), zap.String("timezone", timezone), zap.Error(err))
// Use the recommended refined error message structure
const invalidMsg = "invalid timezone name; must be a valid IANA Time Zone ID (e.g., 'Asia/Shanghai' or 'UTC')"
return merr.WrapErrParameterInvalidMsg("got invalid timestamptz string '%s': %s", isoStr, invalidMsg)