Skip to content

Commit 23e8e90

Browse files
committed
Array(T) performance improvement
1 parent a9f2cb5 commit 23e8e90

File tree

4 files changed

+34
-19
lines changed

4 files changed

+34
-19
lines changed

clickhouse.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,12 @@ func (ch *clickhouse) CheckNamedValue(nv *driver.NamedValue) error {
178178
return nil
179179
}
180180
switch v := nv.Value.(type) {
181+
case
182+
[]int, []int8, []int16, []int32, []int64,
183+
[]uint, []uint8, []uint16, []uint32, []uint64,
184+
[]float32, []float64,
185+
[]string:
186+
return nil
181187
case net.IP:
182188
nv.Value = column.IP(v)
183189
case driver.Valuer:

lib/column/array.go

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,7 @@ func (array *Array) Read(decoder *binary.Decoder) (interface{}, error) {
2424
}
2525

2626
func (array *Array) Write(encoder *binary.Encoder, v interface{}) error {
27-
value := reflect.ValueOf(v)
28-
if value.Kind() != reflect.Slice {
29-
return fmt.Errorf("unsupported Array(T) type [%T]", value.Interface())
30-
}
31-
for i := 0; i < value.Len(); i++ {
32-
if err := array.column.Write(encoder, value.Index(i).Interface()); err != nil {
33-
return err
34-
}
35-
}
36-
return nil
27+
return array.column.Write(encoder, v)
3728
}
3829

3930
func (array *Array) ReadArray(decoder *binary.Decoder, rows int) (_ []interface{}, err error) {

lib/data/block.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,7 @@ func (block *Block) Read(serverInfo *ServerInfo, decoder *binary.Decoder) (err e
9595
return nil
9696
}
9797

98-
func (block *Block) prepareArray(arr interface{}, num, level int) (values []interface{}) {
99-
value := reflect.ValueOf(arr)
98+
func (block *Block) prepareArray(value reflect.Value, num, level int) (values []interface{}) {
10099
switch {
101100
case value.Kind() == reflect.Slice:
102101
if len(block.offsets[num]) < level {
@@ -108,7 +107,7 @@ func (block *Block) prepareArray(arr interface{}, num, level int) (values []inte
108107
)
109108
}
110109
for i := 0; i < value.Len(); i++ {
111-
values = append(values, block.prepareArray(value.Index(i).Interface(), num, level+1)...)
110+
values = append(values, block.prepareArray(value.Index(i), num, level+1)...)
112111
}
113112
default:
114113
values = append(values, value.Interface())
@@ -127,9 +126,14 @@ func (block *Block) AppendRow(args []driver.Value) error {
127126
for num, c := range block.Columns {
128127
switch column := c.(type) {
129128
case *column.Array:
130-
values := block.prepareArray(args[num], num, 1)
131-
if err := column.Write(block.buffers[num].Column, values); err != nil {
132-
return err
129+
value := reflect.ValueOf(args[num])
130+
if value.Kind() != reflect.Slice {
131+
return fmt.Errorf("unsupported Array(T) type [%T]", value.Interface())
132+
}
133+
for _, value := range block.prepareArray(value, num, 1) {
134+
if err := column.Write(block.buffers[num].Column, value); err != nil {
135+
return err
136+
}
133137
}
134138
case *column.Nullable:
135139
if err := column.WriteNull(block.buffers[num].Offset, block.buffers[num].Column, args[num]); err != nil {

lib/data/block_write_column.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package data
22

33
import (
4+
"fmt"
5+
"reflect"
46
"time"
57

68
"github.com/kshvakov/clickhouse/lib/binary"
@@ -16,6 +18,13 @@ func (block *Block) WriteDateTime(c int, v time.Time) error {
1618
return block.buffers[c].Column.UInt32(uint32(v.Unix()))
1719
}
1820

21+
func (block *Block) WriteBool(c int, v bool) error {
22+
if v {
23+
return block.buffers[c].Column.UInt8(1)
24+
}
25+
return block.buffers[c].Column.UInt8(0)
26+
}
27+
1928
func (block *Block) WriteInt8(c int, v int8) error {
2029
return block.buffers[c].Column.Int8(v)
2130
}
@@ -81,9 +90,14 @@ func (block *Block) WriteFixedString(c int, v []byte) error {
8190
}
8291

8392
func (block *Block) WriteArray(c int, v interface{}) error {
84-
values := block.prepareArray(v, c, 1)
85-
if err := block.Columns[c].Write(block.buffers[c].Column, values); err != nil {
86-
return err
93+
value := reflect.ValueOf(v)
94+
if value.Kind() != reflect.Slice {
95+
return fmt.Errorf("unsupported Array(T) type [%T]", value.Interface())
96+
}
97+
for _, value := range block.prepareArray(value, c, 1) {
98+
if err := block.Columns[c].Write(block.buffers[c].Column, value); err != nil {
99+
return err
100+
}
87101
}
88102
return nil
89103
}

0 commit comments

Comments
 (0)