diff --git a/internal/distributed/proxy/httpserver/request_v2.go b/internal/distributed/proxy/httpserver/request_v2.go index a7d22a86c1..c1a5f3c47c 100644 --- a/internal/distributed/proxy/httpserver/request_v2.go +++ b/internal/distributed/proxy/httpserver/request_v2.go @@ -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 { diff --git a/internal/distributed/proxy/httpserver/utils.go b/internal/distributed/proxy/httpserver/utils.go index 342ca824ed..d7cc948f70 100644 --- a/internal/distributed/proxy/httpserver/utils.go +++ b/internal/distributed/proxy/httpserver/utils.go @@ -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 diff --git a/internal/proxy/validate_util.go b/internal/proxy/validate_util.go index ada82f1d83..53506f2382 100644 --- a/internal/proxy/validate_util.go +++ b/internal/proxy/validate_util.go @@ -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)