From 0bc7fdfbfde2cd588d6eea8b0dab88878df8cb39 Mon Sep 17 00:00:00 2001 From: Devan Date: Wed, 26 Nov 2025 11:15:19 -0600 Subject: [PATCH] feat: Adds datatypes and authorizer for fields --- coordinator/statement_executor.go | 13 ++++++++----- tsdb/store.go | 11 +++++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/coordinator/statement_executor.go b/coordinator/statement_executor.go index d8d7926484..a495e83ccc 100644 --- a/coordinator/statement_executor.go +++ b/coordinator/statement_executor.go @@ -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 { diff --git a/tsdb/store.go b/tsdb/store.go index 6089709ef1..be94191372 100644 --- a/tsdb/store.go +++ b/tsdb/store.go @@ -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