From 82e380ed900c200c55065cf99edaae916b77611f Mon Sep 17 00:00:00 2001 From: Adam Yeats <16296989+adamyeats@users.noreply.github.com> Date: Thu, 10 Jul 2025 21:41:57 +0100 Subject: [PATCH] InfluxDB: Handle `STRING_VIEW` datatype (#107812) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR fixes an error when reading STRING_VIEW columns by correctly mapping STRING_VIEW in the newField factory and by adding a dedicated test to validate copyData’s handling of both nullable and non‐nullable STRING_VIEW arrays. This enables the Distinct Value Cache feature of InfluxDB v3 Enterprise for use. --- pkg/tsdb/influxdb/fsql/arrow.go | 4 ++- pkg/tsdb/influxdb/fsql/arrow_test.go | 37 ++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/pkg/tsdb/influxdb/fsql/arrow.go b/pkg/tsdb/influxdb/fsql/arrow.go index a816918d27c..71c480875c0 100644 --- a/pkg/tsdb/influxdb/fsql/arrow.go +++ b/pkg/tsdb/influxdb/fsql/arrow.go @@ -124,7 +124,7 @@ func newFrame(schema *arrow.Schema) *data.Frame { func newField(f arrow.Field) *data.Field { switch f.Type.ID() { - case arrow.STRING: + case arrow.STRING, arrow.STRING_VIEW: return newDataField[string](f) case arrow.FLOAT32: return newDataField[float32](f) @@ -239,6 +239,8 @@ func copyData(field *data.Field, col arrow.Array) error { return err } } + case arrow.STRING_VIEW: + copyBasic[string](field, array.NewStringViewData(colData)) case arrow.STRING: copyBasic[string](field, array.NewStringData(colData)) case arrow.UINT8: diff --git a/pkg/tsdb/influxdb/fsql/arrow_test.go b/pkg/tsdb/influxdb/fsql/arrow_test.go index 442cf32811a..9002d9a5b3b 100644 --- a/pkg/tsdb/influxdb/fsql/arrow_test.go +++ b/pkg/tsdb/influxdb/fsql/arrow_test.go @@ -469,6 +469,43 @@ func TestCopyData_Float64(t *testing.T) { assert.Equal(t, float64(3.3), *field.CopyAt(2).(*float64)) } +func TestCopyData_StringView(t *testing.T) { + // Non-nullable StringView + field := data.NewField("field", nil, []string{}) + builder := array.NewStringViewBuilder(memory.DefaultAllocator) + builder.Append("apple") + builder.Append("banana") + builder.Append("cherry") + arr := builder.NewArray() + defer arr.Release() + + svArr := array.NewStringViewData(arr.Data()) + defer svArr.Release() + + err := copyData(field, svArr) + assert.NoError(t, err) + assert.Equal(t, "apple", field.CopyAt(0)) + assert.Equal(t, "banana", field.CopyAt(1)) + assert.Equal(t, "cherry", field.CopyAt(2)) + + // Nullable StringView + field = data.NewField("field", nil, []*string{}) + builder = array.NewStringViewBuilder(memory.DefaultAllocator) + builder.Append("dog") + builder.AppendNull() + builder.Append("cat") + arr2 := builder.NewArray() + defer arr2.Release() + svArr2 := array.NewStringViewData(arr2.Data()) + defer svArr2.Release() + + err = copyData(field, svArr2) + assert.NoError(t, err) + assert.Equal(t, "dog", *(field.CopyAt(0).(*string))) + assert.Nil(t, field.CopyAt(1)) + assert.Equal(t, "cat", *(field.CopyAt(2).(*string))) +} + func TestCustomMetadata(t *testing.T) { schema := arrow.NewSchema([]arrow.Field{ {