Skip to content

Commit 7166e3f

Browse files
committed
test: add integration test for nil driver.Valuer bin guard
1 parent a1dd45a commit 7166e3f

1 file changed

Lines changed: 102 additions & 0 deletions

File tree

tests/issues/1823_test.go

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package issues
2+
3+
import (
4+
"context"
5+
"database/sql"
6+
"testing"
7+
8+
"github.com/google/uuid"
9+
"github.com/stretchr/testify/require"
10+
11+
"github.com/ClickHouse/clickhouse-go/v2"
12+
clickhouse_tests "github.com/ClickHouse/clickhouse-go/v2/tests"
13+
)
14+
15+
// Test1823 verifies that passing a typed nil pointer to a type implementing
16+
// driver.Valuer with a value receiver (e.g. *uuid.UUID) is bound as NULL
17+
// rather than panicking inside fn.Value().
18+
func Test1823(t *testing.T) {
19+
const ddl = "CREATE TABLE IF NOT EXISTS test_1823 (id UUID, ref_id Nullable(UUID)) Engine Memory"
20+
21+
t.Run("native_select", func(t *testing.T) {
22+
conn, err := clickhouse_tests.GetConnectionTCP("issues", clickhouse.Settings{
23+
"max_execution_time": 60,
24+
}, nil, &clickhouse.Compression{Method: clickhouse.CompressionLZ4})
25+
require.NoError(t, err)
26+
27+
ctx := context.Background()
28+
var nilUUID *uuid.UUID
29+
30+
require.NotPanics(t, func() {
31+
var got *uuid.UUID
32+
require.NoError(t, conn.QueryRow(ctx, "SELECT ?", nilUUID).Scan(&got))
33+
require.Nil(t, got)
34+
})
35+
})
36+
37+
t.Run("native_insert", func(t *testing.T) {
38+
conn, err := clickhouse_tests.GetConnectionTCP("issues", clickhouse.Settings{
39+
"max_execution_time": 60,
40+
}, nil, &clickhouse.Compression{Method: clickhouse.CompressionLZ4})
41+
require.NoError(t, err)
42+
43+
ctx := context.Background()
44+
require.NoError(t, conn.Exec(ctx, ddl))
45+
defer conn.Exec(ctx, "DROP TABLE IF EXISTS test_1823")
46+
47+
id := uuid.New()
48+
var nilUUID *uuid.UUID
49+
50+
require.NotPanics(t, func() {
51+
require.NoError(t, conn.Exec(ctx, "INSERT INTO test_1823 (id, ref_id) VALUES (?, ?)", id, nilUUID))
52+
})
53+
54+
var gotRef *uuid.UUID
55+
require.NoError(t, conn.QueryRow(ctx, "SELECT ref_id FROM test_1823 WHERE id = ?", id).Scan(&gotRef))
56+
require.Nil(t, gotRef)
57+
})
58+
59+
t.Run("std_select", func(t *testing.T) {
60+
env, err := clickhouse_tests.GetTestEnvironment("issues")
61+
require.NoError(t, err)
62+
opts := clickhouse_tests.ClientOptionsFromEnv(env, clickhouse.Settings{}, false)
63+
db, err := sql.Open("clickhouse", clickhouse_tests.OptionsToDSN(&opts))
64+
require.NoError(t, err)
65+
defer db.Close()
66+
67+
ctx := context.Background()
68+
var nilUUID *uuid.UUID
69+
70+
require.NotPanics(t, func() {
71+
var got uuid.NullUUID
72+
require.NoError(t, db.QueryRowContext(ctx, "SELECT ?", nilUUID).Scan(&got))
73+
require.False(t, got.Valid)
74+
})
75+
})
76+
77+
t.Run("std_insert", func(t *testing.T) {
78+
env, err := clickhouse_tests.GetTestEnvironment("issues")
79+
require.NoError(t, err)
80+
opts := clickhouse_tests.ClientOptionsFromEnv(env, clickhouse.Settings{}, false)
81+
db, err := sql.Open("clickhouse", clickhouse_tests.OptionsToDSN(&opts))
82+
require.NoError(t, err)
83+
defer db.Close()
84+
85+
ctx := context.Background()
86+
_, err = db.ExecContext(ctx, ddl)
87+
require.NoError(t, err)
88+
defer db.ExecContext(ctx, "DROP TABLE IF EXISTS test_1823")
89+
90+
id := uuid.New()
91+
var nilUUID *uuid.UUID
92+
93+
require.NotPanics(t, func() {
94+
_, err := db.ExecContext(ctx, "INSERT INTO test_1823 (id, ref_id) VALUES (?, ?)", id, nilUUID)
95+
require.NoError(t, err)
96+
})
97+
98+
var gotRef uuid.NullUUID
99+
require.NoError(t, db.QueryRowContext(ctx, "SELECT ref_id FROM test_1823 WHERE id = ?", id).Scan(&gotRef))
100+
require.False(t, gotRef.Valid)
101+
})
102+
}

0 commit comments

Comments
 (0)