Skip to content

Commit 6b761a5

Browse files
Merge pull request #1516 from ClickHouse/issue_1515
fix: preserve nil elements in map
2 parents 513367e + 8284bad commit 6b761a5

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

lib/column/map.go

+11-1
Original file line numberDiff line numberDiff line change
@@ -328,9 +328,19 @@ func (col *Map) row(n int) reflect.Value {
328328
from = int(prev)
329329
)
330330
for next := 0; next < size; next++ {
331+
mapValue := col.values.Row(from+next, false)
332+
var mapReflectValue reflect.Value
333+
if mapValue == nil {
334+
// Convert interface{} nil to typed nil (such as nil *string) to preserve map element
335+
// https://github.com/ClickHouse/clickhouse-go/issues/1515
336+
mapReflectValue = reflect.New(value.Type().Elem()).Elem()
337+
} else {
338+
mapReflectValue = reflect.ValueOf(mapValue)
339+
}
340+
331341
value.SetMapIndex(
332342
reflect.ValueOf(col.keys.Row(from+next, false)),
333-
reflect.ValueOf(col.values.Row(from+next, false)),
343+
mapReflectValue,
334344
)
335345
}
336346
return value

tests/issues/1515_test.go

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package issues
2+
3+
import (
4+
"context"
5+
"github.com/ClickHouse/clickhouse-go/v2/tests"
6+
"github.com/stretchr/testify/require"
7+
"testing"
8+
)
9+
10+
func TestIssue1515(t *testing.T) {
11+
ctx := context.Background()
12+
13+
conn, err := tests.GetConnection("issues", nil, nil, nil)
14+
require.NoError(t, err)
15+
defer conn.Close()
16+
17+
row := conn.QueryRow(ctx, "SELECT CAST((['key', 'key2'], ['value', null]), 'Map(String, Nullable(String))')")
18+
require.NoError(t, row.Err())
19+
20+
var resultStr map[string]*string
21+
err = row.Scan(&resultStr)
22+
require.NoError(t, err)
23+
require.Len(t, resultStr, 2)
24+
require.NotNil(t, resultStr["key"])
25+
require.Equal(t, "value", *resultStr["key"])
26+
require.Nil(t, resultStr["key2"])
27+
28+
row = conn.QueryRow(ctx, "SELECT CAST((['key', 'key2'], [42, null]), 'Map(String, Nullable(Int64))')")
29+
require.NoError(t, row.Err())
30+
31+
var resultInt map[string]*int64
32+
err = row.Scan(&resultInt)
33+
require.NoError(t, err)
34+
require.Len(t, resultInt, 2)
35+
require.NotNil(t, resultInt["key"])
36+
require.Equal(t, int64(42), *resultInt["key"])
37+
require.Nil(t, resultInt["key2"])
38+
}

0 commit comments

Comments
 (0)