Skip to content

Commit 627babf

Browse files
committed
fix variant prefix encoding
1 parent 2555f87 commit 627babf

File tree

3 files changed

+56
-4
lines changed

3 files changed

+56
-4
lines changed

lib/column/variant.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -263,8 +263,18 @@ func (c *Variant) AppendRow(v any) error {
263263
return fmt.Errorf("value \"%v\" cannot be stored in variant column: no compatible types", v)
264264
}
265265

266-
func (c *Variant) encodeHeader(buffer *proto.Buffer) {
266+
func (c *Variant) encodeHeader(buffer *proto.Buffer) error {
267267
buffer.PutUInt64(SupportedVariantSerializationVersion)
268+
269+
for _, col := range c.columns {
270+
if serialize, ok := col.(CustomSerialization); ok {
271+
if err := serialize.WriteStatePrefix(buffer); err != nil {
272+
return fmt.Errorf("failed to write prefix for type %s in variant: %w", col.Type(), err)
273+
}
274+
}
275+
}
276+
277+
return nil
268278
}
269279

270280
func (c *Variant) encodeData(buffer *proto.Buffer) {
@@ -276,9 +286,7 @@ func (c *Variant) encodeData(buffer *proto.Buffer) {
276286
}
277287

278288
func (c *Variant) WriteStatePrefix(buffer *proto.Buffer) error {
279-
c.encodeHeader(buffer)
280-
281-
return nil
289+
return c.encodeHeader(buffer)
282290
}
283291

284292
func (c *Variant) Encode(buffer *proto.Buffer) {

tests/dynamic_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ func TestDynamic(t *testing.T) {
7676
require.NoError(t, batch.Append(colNil))
7777
colSliceUInt8 := []uint8{0xA, 0xB, 0xC}
7878
require.NoError(t, batch.Append(clickhouse.NewDynamicWithType(colSliceUInt8, "Array(UInt8)")))
79+
colSliceSliceUInt8 := [][]uint8{{0xA, 0xB}, {0xC, 0xD}}
80+
require.NoError(t, batch.Append(clickhouse.NewDynamicWithType(colSliceSliceUInt8, "Array(Array(UInt8))")))
7981
colSliceMapStringString := []map[string]string{{"key1": "value1", "key2": "value2"}, {"key3": "value3"}}
8082
require.NoError(t, batch.Append(clickhouse.NewDynamicWithType(colSliceMapStringString, "Array(Map(String, String))")))
8183
colMapStringString := map[string]string{"key1": "value1", "key2": "value2"}
@@ -119,6 +121,11 @@ func TestDynamic(t *testing.T) {
119121
require.NoError(t, err)
120122
require.Equal(t, colSliceUInt8, row.Any())
121123

124+
require.True(t, rows.Next())
125+
err = rows.Scan(&row)
126+
require.NoError(t, err)
127+
require.Equal(t, colSliceSliceUInt8, row.Any())
128+
122129
require.True(t, rows.Next())
123130
err = rows.Scan(&row)
124131
require.NoError(t, err)

tests/variant_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,43 @@ func TestVariant(t *testing.T) {
156156
})
157157
}
158158

159+
func TestVariantPrefix(t *testing.T) {
160+
TestProtocols(t, func(t *testing.T, protocol clickhouse.Protocol) {
161+
conn := setupVariantTest(t, protocol)
162+
ctx := context.Background()
163+
164+
const ddl = `
165+
CREATE TABLE IF NOT EXISTS test_variant_prefix (
166+
c Variant(LowCardinality(String))
167+
) Engine = MergeTree() ORDER BY tuple()
168+
`
169+
require.NoError(t, conn.Exec(ctx, ddl))
170+
defer func() {
171+
require.NoError(t, conn.Exec(ctx, "DROP TABLE IF EXISTS test_variant_prefix"))
172+
}()
173+
174+
batch, err := conn.PrepareBatch(ctx, "INSERT INTO test_variant_prefix (c)")
175+
require.NoError(t, err)
176+
177+
val := "a"
178+
require.NoError(t, batch.Append(clickhouse.NewVariantWithType(val, "LowCardinality(String)")))
179+
require.NoError(t, batch.Send())
180+
181+
rows, err := conn.Query(ctx, "SELECT c FROM test_variant_prefix")
182+
require.NoError(t, err)
183+
184+
var row clickhouse.Variant
185+
186+
require.True(t, rows.Next())
187+
err = rows.Scan(&row)
188+
require.NoError(t, err)
189+
require.Equal(t, val, row.Any())
190+
191+
require.NoError(t, rows.Close())
192+
require.NoError(t, rows.Err())
193+
})
194+
}
195+
159196
func TestVariantArray(t *testing.T) {
160197
TestProtocols(t, func(t *testing.T, protocol clickhouse.Protocol) {
161198
conn := setupVariantTest(t, protocol)

0 commit comments

Comments
 (0)