Skip to content

Commit 5d65c38

Browse files
committed
add support Array types for direct interface
1 parent 7c78a8f commit 5d65c38

11 files changed

+54
-46
lines changed

bootstrap.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ func (ch *clickhouse) hello(database, username, password string) error {
127127
}
128128
switch packet {
129129
case protocol.ServerException:
130-
return ch.exception(ch.decoder)
130+
return ch.exception()
131131
case protocol.ServerHello:
132132
if err := ch.ServerInfo.Read(ch.decoder); err != nil {
133133
return err

clickhouse.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,9 @@ func (ch *clickhouse) process() error {
172172
return nil
173173
case protocol.ServerException:
174174
ch.logf("[process] <- exception")
175-
return ch.exception(ch.decoder)
175+
return ch.exception()
176176
case protocol.ServerProgress:
177-
progress, err := ch.progress(ch.decoder)
177+
progress, err := ch.progress()
178178
if err != nil {
179179
return err
180180
}
@@ -184,13 +184,13 @@ func (ch *clickhouse) process() error {
184184
progress.totalRows,
185185
)
186186
case protocol.ServerProfileInfo:
187-
profileInfo, err := ch.profileInfo(ch.decoder)
187+
profileInfo, err := ch.profileInfo()
188188
if err != nil {
189189
return err
190190
}
191191
ch.logf("[process] <- profiling: rows=%d, bytes=%d, blocks=%d", profileInfo.rows, profileInfo.bytes, profileInfo.blocks)
192192
case protocol.ServerData:
193-
block, err := ch.readBlock(ch.decoder)
193+
block, err := ch.readBlock()
194194
if err != nil {
195195
return err
196196
}

clickhouse_direct_test.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package clickhouse_test
22

33
import (
44
"database/sql/driver"
5+
"fmt"
56
// "fmt"
67
"net"
78
"testing"
@@ -135,7 +136,6 @@ func Test_DirectInsert(t *testing.T) {
135136
}
136137
}
137138

138-
/*
139139
func Test_DirectArrayT(t *testing.T) {
140140
const (
141141
ddl = `
@@ -247,4 +247,3 @@ func Test_DirectArrayT(t *testing.T) {
247247
}
248248
}
249249
}
250-
*/

clickhouse_exception.go

+7-9
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ package clickhouse
33
import (
44
"fmt"
55
"strings"
6-
7-
"github.com/kshvakov/clickhouse/lib/binary"
86
)
97

108
type Exception struct {
@@ -19,30 +17,30 @@ func (e *Exception) Error() string {
1917
return fmt.Sprintf("code: %d, message: %s", e.Code, e.Message)
2018
}
2119

22-
func (ch *clickhouse) exception(decoder *binary.Decoder) error {
20+
func (ch *clickhouse) exception() error {
2321
var (
2422
e Exception
2523
err error
2624
hasNested bool
2725
)
28-
if e.Code, err = decoder.Int32(); err != nil {
26+
if e.Code, err = ch.decoder.Int32(); err != nil {
2927
return err
3028
}
31-
if e.Name, err = decoder.String(); err != nil {
29+
if e.Name, err = ch.decoder.String(); err != nil {
3230
return err
3331
}
34-
if e.Message, err = decoder.String(); err != nil {
32+
if e.Message, err = ch.decoder.String(); err != nil {
3533
return err
3634
}
3735
e.Message = strings.TrimSpace(strings.TrimPrefix(e.Message, e.Name+":"))
38-
if e.StackTrace, err = decoder.String(); err != nil {
36+
if e.StackTrace, err = ch.decoder.String(); err != nil {
3937
return err
4038
}
41-
if hasNested, err = decoder.Bool(); err != nil {
39+
if hasNested, err = ch.decoder.Bool(); err != nil {
4240
return err
4341
}
4442
if hasNested {
45-
e.nested = ch.exception(decoder)
43+
e.nested = ch.exception()
4644
}
4745
return &e
4846
}

clickhouse_profile_info.go

+7-9
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package clickhouse
22

3-
import "github.com/kshvakov/clickhouse/lib/binary"
4-
53
type profileInfo struct {
64
rows uint64
75
bytes uint64
@@ -11,28 +9,28 @@ type profileInfo struct {
119
calculatedRowsBeforeLimit bool
1210
}
1311

14-
func (ch *clickhouse) profileInfo(decoder *binary.Decoder) (*profileInfo, error) {
12+
func (ch *clickhouse) profileInfo() (*profileInfo, error) {
1513
var (
1614
p profileInfo
1715
err error
1816
)
19-
if p.rows, err = decoder.Uvarint(); err != nil {
17+
if p.rows, err = ch.decoder.Uvarint(); err != nil {
2018
return nil, err
2119
}
22-
if p.blocks, err = decoder.Uvarint(); err != nil {
20+
if p.blocks, err = ch.decoder.Uvarint(); err != nil {
2321
return nil, err
2422
}
25-
if p.bytes, err = decoder.Uvarint(); err != nil {
23+
if p.bytes, err = ch.decoder.Uvarint(); err != nil {
2624
return nil, err
2725
}
2826

29-
if p.appliedLimit, err = decoder.Bool(); err != nil {
27+
if p.appliedLimit, err = ch.decoder.Bool(); err != nil {
3028
return nil, err
3129
}
32-
if p.rowsBeforeLimit, err = decoder.Uvarint(); err != nil {
30+
if p.rowsBeforeLimit, err = ch.decoder.Uvarint(); err != nil {
3331
return nil, err
3432
}
35-
if p.calculatedRowsBeforeLimit, err = decoder.Bool(); err != nil {
33+
if p.calculatedRowsBeforeLimit, err = ch.decoder.Bool(); err != nil {
3634
return nil, err
3735
}
3836
return &p, nil

clickhouse_progress.go

+5-8
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,26 @@
11
package clickhouse
22

3-
import (
4-
"github.com/kshvakov/clickhouse/lib/binary"
5-
"github.com/kshvakov/clickhouse/lib/protocol"
6-
)
3+
import "github.com/kshvakov/clickhouse/lib/protocol"
74

85
type progress struct {
96
rows uint64
107
bytes uint64
118
totalRows uint64
129
}
1310

14-
func (ch *clickhouse) progress(decoder *binary.Decoder) (*progress, error) {
11+
func (ch *clickhouse) progress() (*progress, error) {
1512
var (
1613
p progress
1714
err error
1815
)
19-
if p.rows, err = decoder.Uvarint(); err != nil {
16+
if p.rows, err = ch.decoder.Uvarint(); err != nil {
2017
return nil, err
2118
}
22-
if p.bytes, err = decoder.Uvarint(); err != nil {
19+
if p.bytes, err = ch.decoder.Uvarint(); err != nil {
2320
return nil, err
2421
}
2522
if ch.ServerInfo.Revision >= protocol.DBMS_MIN_REVISION_WITH_TOTAL_ROWS_IN_PROGRESS {
26-
if p.totalRows, err = decoder.Uvarint(); err != nil {
23+
if p.totalRows, err = ch.decoder.Uvarint(); err != nil {
2724
return nil, err
2825
}
2926
}

clickhouse_read_block.go

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
11
package clickhouse
22

33
import (
4-
"github.com/kshvakov/clickhouse/lib/binary"
54
"github.com/kshvakov/clickhouse/lib/data"
65
"github.com/kshvakov/clickhouse/lib/protocol"
76
)
87

9-
func (ch *clickhouse) readBlock(decoder *binary.Decoder) (*data.Block, error) {
8+
func (ch *clickhouse) readBlock() (*data.Block, error) {
109
if ch.ServerInfo.Revision >= protocol.DBMS_MIN_REVISION_WITH_TEMPORARY_TABLES {
11-
if _, err := decoder.String(); err != nil {
10+
if _, err := ch.decoder.String(); err != nil {
1211
return nil, err
1312
}
1413
}
1514
if ch.compress {
1615

1716
}
1817
var block data.Block
19-
if err := block.Read(&ch.ServerInfo, decoder); err != nil {
18+
if err := block.Read(&ch.ServerInfo, ch.decoder); err != nil {
2019
return nil, err
2120
}
2221
return &block, nil

clickhouse_read_meta.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ func (ch *clickhouse) readMeta() (*data.Block, error) {
1616
switch packet {
1717
case protocol.ServerException:
1818
ch.logf("[read meta] <- exception")
19-
return nil, ch.exception(ch.decoder)
19+
return nil, ch.exception()
2020
case protocol.ServerProgress:
21-
progress, err := ch.progress(ch.decoder)
21+
progress, err := ch.progress()
2222
if err != nil {
2323
return nil, err
2424
}
@@ -28,13 +28,13 @@ func (ch *clickhouse) readMeta() (*data.Block, error) {
2828
progress.totalRows,
2929
)
3030
case protocol.ServerProfileInfo:
31-
profileInfo, err := ch.profileInfo(ch.decoder)
31+
profileInfo, err := ch.profileInfo()
3232
if err != nil {
3333
return nil, err
3434
}
3535
ch.logf("[read meta] <- profiling: rows=%d, bytes=%d, blocks=%d", profileInfo.rows, profileInfo.bytes, profileInfo.blocks)
3636
case protocol.ServerData:
37-
block, err := ch.readBlock(ch.decoder)
37+
block, err := ch.readBlock()
3838
if err != nil {
3939
return nil, err
4040
}

lib/data/block.go

+5
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ func (block *Block) Read(serverInfo *ServerInfo, decoder *binary.Decoder) (err e
4343
return err
4444
}
4545
block.Values = make([][]interface{}, block.NumColumns)
46+
if block.NumRows > 10 {
47+
for i := 0; i < int(block.NumColumns); i++ {
48+
block.Values[i] = make([]interface{}, 0, block.NumRows)
49+
}
50+
}
4651
for i := 0; i < int(block.NumColumns); i++ {
4752
var (
4853
value interface{}

lib/types/array.go

+13-1
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,20 @@ func (array *Array) Value() (driver.Value, error) {
6363
}
6464

6565
func (array *Array) WriteArray(encoder *binary.Encoder, column column.Column) (uint64, error) {
66+
if array.err != nil {
67+
return 0, array.err
68+
}
69+
var (
70+
v = reflect.ValueOf(array.values)
71+
ln = v.Len()
72+
)
73+
for i := 0; i < v.Len(); i++ {
6674

67-
return 0, nil
75+
if err := column.Write(encoder, v.Index(i).Interface()); err != nil {
76+
return 0, err
77+
}
78+
}
79+
return uint64(ln), nil
6880
}
6981

7082
var columnsMap = map[reflect.Type]column.Column{

rows.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,9 @@ func (rows *rows) receiveData() error {
9797
switch packet {
9898
case protocol.ServerException:
9999
rows.ch.logf("[receive data] <- exception")
100-
return rows.ch.exception(rows.ch.decoder)
100+
return rows.ch.exception()
101101
case protocol.ServerProgress:
102-
progress, err := rows.ch.progress(rows.ch.decoder)
102+
progress, err := rows.ch.progress()
103103
if err != nil {
104104
return err
105105
}
@@ -109,13 +109,13 @@ func (rows *rows) receiveData() error {
109109
progress.totalRows,
110110
)
111111
case protocol.ServerProfileInfo:
112-
profileInfo, err := rows.ch.profileInfo(rows.ch.decoder)
112+
profileInfo, err := rows.ch.profileInfo()
113113
if err != nil {
114114
return err
115115
}
116116
rows.ch.logf("[receive data] <- profiling: rows=%d, bytes=%d, blocks=%d", profileInfo.rows, profileInfo.bytes, profileInfo.blocks)
117117
case protocol.ServerData, protocol.ServerTotals, protocol.ServerExtremes:
118-
block, err := rows.ch.readBlock(rows.ch.decoder)
118+
block, err := rows.ch.readBlock()
119119
if err != nil {
120120
return err
121121
}

0 commit comments

Comments
 (0)