-
Notifications
You must be signed in to change notification settings - Fork 655
Expand file tree
/
Copy pathquery_parameters_test.go
More file actions
128 lines (112 loc) · 3.92 KB
/
query_parameters_test.go
File metadata and controls
128 lines (112 loc) · 3.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package std
import (
"fmt"
"github.com/ClickHouse/clickhouse-go/v2"
clickhouse_tests "github.com/ClickHouse/clickhouse-go/v2/tests"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"strconv"
"testing"
"time"
)
func TestQueryParameters(t *testing.T) {
env, err := GetStdTestEnvironment()
require.NoError(t, err)
require.NoError(t, err)
useSSL, err := strconv.ParseBool(clickhouse_tests.GetEnv("CLICKHOUSE_USE_SSL", "false"))
require.NoError(t, err)
connectionString := fmt.Sprintf("http://%s:%d?username=%s&password=%s&dial_timeout=200ms&max_execution_time=60", env.Host, env.HttpPort, env.Username, env.Password)
if useSSL {
connectionString = fmt.Sprintf("https://%s:%d?username=%s&password=%s&dial_timeout=200ms&max_execution_time=60&secure=true", env.Host, env.HttpsPort, env.Username, env.Password)
}
dsns := map[string]string{"Http": connectionString}
for name, dsn := range dsns {
t.Run(fmt.Sprintf("%s Protocol", name), func(t *testing.T) {
conn, err := GetConnectionFromDSN(dsn)
require.NoError(t, err)
t.Run("with named arguments", func(t *testing.T) {
var actualNum uint64
var actualStr string
row := conn.QueryRow(
"SELECT {num:UInt64}, {str:String}",
clickhouse.Named("num", "42"),
clickhouse.Named("str", "hello"),
)
require.NoError(t, row.Err())
require.NoError(t, row.Scan(&actualNum, &actualStr))
assert.Equal(t, uint64(42), actualNum)
assert.Equal(t, "hello", actualStr)
})
t.Run("named args with string and interface supported", func(t *testing.T) {
var actualNum uint64
var actualStr string
row := conn.QueryRow(
"SELECT {num:UInt64}, {str:String}",
clickhouse.Named("num", 42),
clickhouse.Named("str", "hello"),
)
require.NoError(t, row.Scan(&actualNum, &actualStr))
assert.Equal(t, uint64(42), actualNum)
assert.Equal(t, "hello", actualStr)
})
t.Run("with identifier type", func(t *testing.T) {
var actualNum uint64
row := conn.QueryRow(
"SELECT {column:Identifier} FROM {database:Identifier}.{table:Identifier} LIMIT 1 OFFSET 100;",
clickhouse.Named("column", "number"),
clickhouse.Named("database", "system"),
clickhouse.Named("table", "numbers"),
)
require.NoError(t, row.Err())
require.NoError(t, row.Scan(&actualNum))
assert.Equal(t, uint64(100), actualNum)
})
t.Run("unsupported arg type", func(t *testing.T) {
row := conn.QueryRow(
"SELECT {num:UInt64}, {str:String}",
1234,
"String",
)
require.ErrorIs(t, row.Err(), clickhouse.ErrUnsupportedQueryParameter)
})
t.Run("invalid NamedDateValue", func(t *testing.T) {
row := conn.QueryRow(
"SELECT {ts:DateTime}",
clickhouse.DateNamed("ts", time.Time{}, clickhouse.Seconds), // zero time
)
require.ErrorIs(t, row.Err(), clickhouse.ErrInvalidValueInNamedDateValue)
})
t.Run("valid named args", func(t *testing.T) {
row := conn.QueryRow(
"SELECT {str:String}, {ts:DateTime}",
clickhouse.Named("str", "hi"),
clickhouse.DateNamed("ts", time.Now(), clickhouse.Seconds),
)
require.NoError(t, row.Err())
})
t.Run("with bind backwards compatibility", func(t *testing.T) {
var actualNum uint8
var actualStr string
row := conn.QueryRow(
"SELECT @num, @str",
clickhouse.Named("num", 42),
clickhouse.Named("str", "hello"),
)
require.NoError(t, row.Err())
require.NoError(t, row.Scan(&actualNum, &actualStr))
assert.Equal(t, uint8(42), actualNum)
assert.Equal(t, "hello", actualStr)
})
t.Run("with nullable parameter", func(t *testing.T) {
var actualVal *string
row := conn.QueryRow(
"SELECT {val:Nullable(String)}",
clickhouse.Named("val", (*string)(nil)),
)
require.NoError(t, row.Err())
require.NoError(t, row.Scan(&actualVal))
require.True(t, actualVal == nil || *actualVal == "", "expected nil or empty string, got %v", actualVal)
})
})
}
}