@@ -2,6 +2,7 @@ package clickhouse_test
2
2
3
3
import (
4
4
"database/sql"
5
+ "database/sql/driver"
5
6
"fmt"
6
7
"testing"
7
8
@@ -159,3 +160,62 @@ func Test_Custom_Types(t *testing.T) {
159
160
}
160
161
}
161
162
}
163
+
164
+ type PointType struct {
165
+ x int32
166
+ y int32
167
+ z int32
168
+ }
169
+
170
+ func (p PointType ) Value () (driver.Value , error ) {
171
+ return fmt .Sprintf ("%v,%v,%v" , p .x , p .y , p .z ), nil
172
+ }
173
+
174
+ func (p * PointType ) Scan (v interface {}) error {
175
+ var src string
176
+ switch v := v .(type ) {
177
+ case string :
178
+ src = v
179
+ case []byte :
180
+ src = string (v )
181
+ default :
182
+ return fmt .Errorf ("unexpected type '%T'" , v )
183
+ }
184
+ if _ , err := fmt .Sscanf (src , "%d,%d,%d" , & p .x , & p .y , & p .z ); err != nil {
185
+ return err
186
+ }
187
+ return nil
188
+ }
189
+
190
+ func Test_Scan_Value (t * testing.T ) {
191
+ const (
192
+ ddl = `
193
+ CREATE TABLE clickhouse_test_scan_value (
194
+ Value String
195
+ ) Engine = Memory
196
+ `
197
+ )
198
+
199
+ point := PointType {1 , 2 , 3 }
200
+ if connect , err := sql .Open ("clickhouse" , "tcp://127.0.0.1:9000?debug=true" ); assert .NoError (t , err ) && assert .NoError (t , connect .Ping ()) {
201
+ if _ , err := connect .Exec ("DROP TABLE IF EXISTS clickhouse_test_scan_value" ); assert .NoError (t , err ) {
202
+ if _ , err := connect .Exec (ddl ); assert .NoError (t , err ) {
203
+ if tx , err := connect .Begin (); assert .NoError (t , err ) {
204
+ if stmt , err := tx .Prepare (`INSERT INTO clickhouse_test_scan_value VALUES (?)` ); assert .NoError (t , err ) {
205
+ if _ , err = stmt .Exec (point ); ! assert .NoError (t , err ) {
206
+ return
207
+ }
208
+ } else {
209
+ return
210
+ }
211
+ if assert .NoError (t , tx .Commit ()) {
212
+ var p PointType
213
+ if err := connect .QueryRow (`SELECT Value FROM clickhouse_test_scan_value` ).Scan (& p ); assert .NoError (t , err ) {
214
+ assert .Equal (t , point , p )
215
+ }
216
+ }
217
+ }
218
+ }
219
+ }
220
+ }
221
+ }
0 commit comments