feat: Adds datatypes and authorizer for fields

pull/26995/head
Devan 2025-11-26 11:15:19 -06:00
parent eb80628cc9
commit 0bc7fdfbfd
2 changed files with 19 additions and 5 deletions

View File

@ -1166,7 +1166,7 @@ func (e *StatementExecutor) executeShowFieldKeys(ctx *query.ExecutionContext, q
cond = baseCond
}
rps := []string{}
var rps []string
for _, m := range q.Sources.Measurements() {
if len(m.RetentionPolicy) > 0 {
rps = append(rps, m.RetentionPolicy)
@ -1179,7 +1179,7 @@ func (e *StatementExecutor) executeShowFieldKeys(ctx *query.ExecutionContext, q
}
}
fieldKeys := make(map[string]map[string]struct{})
fieldKeys := make(map[string]map[string]influxql.DataType)
for _, rpName := range rps {
var allGroups []meta.ShardGroupInfo
sgis, err := e.MetaClient.ShardGroupsByTimeRange(q.Database, rpName, timeRange.MinTime(), timeRange.MaxTime())
@ -1203,10 +1203,12 @@ func (e *StatementExecutor) executeShowFieldKeys(ctx *query.ExecutionContext, q
for _, m := range keys {
measurementName := rpName + "." + m.Measurement
if fieldKeys[measurementName] == nil {
fieldKeys[measurementName] = make(map[string]struct{})
fieldKeys[measurementName] = make(map[string]influxql.DataType)
}
for _, key := range m.Keys {
fieldKeys[measurementName][key] = struct{}{}
if typ, ok := m.Types[key]; ok {
fieldKeys[measurementName][key] = typ
}
}
}
}
@ -1247,7 +1249,8 @@ func (e *StatementExecutor) executeShowFieldKeys(ctx *query.ExecutionContext, q
Values: make([][]interface{}, len(keyList)),
}
for i, key := range keyList {
row.Values[i] = []interface{}{key, "float"}
typ := keys[key]
row.Values[i] = []interface{}{key, typ.String()}
}
if err := ctx.Send(&query.Result{Series: []*models.Row{row}}); err != nil {

View File

@ -1932,6 +1932,7 @@ func (a TagKeysSlice) Less(i, j int) bool { return a[i].Measurement < a[j].Measu
type FieldKeys struct {
Measurement string
Keys []string
Types map[string]influxql.DataType
}
type FieldKeysSlice []FieldKeys
@ -2150,14 +2151,24 @@ func (s *Store) FieldKeys(ctx context.Context, auth query.FineAuthorizer, shardI
default:
}
if !is.measurementAuthorizedSeries(auth, name, nil) {
continue
}
keys := shards.FieldKeysByMeasurement(name)
if len(keys) == 0 {
continue
}
fields, _, err := shards.FieldDimensions([]string{string(name)})
if err != nil {
return nil, err
}
results = append(results, FieldKeys{
Measurement: string(name),
Keys: keys,
Types: fields,
})
}
return results, nil