Skip to content

Commit 1d87030

Browse files
committed
Array(T) performance improvement #2
1 parent 23e8e90 commit 1d87030

File tree

3 files changed

+11
-18
lines changed

3 files changed

+11
-18
lines changed

lib/column/array.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,6 @@ import (
99
"github.com/kshvakov/clickhouse/lib/binary"
1010
)
1111

12-
type ArrayWriter interface {
13-
WriteArray(encoder *binary.Encoder, column Column) (uint64, error)
14-
}
15-
1612
type Array struct {
1713
base
1814
depth int

lib/data/block.go

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

98-
func (block *Block) prepareArray(value reflect.Value, num, level int) (values []interface{}) {
98+
func (block *Block) writeArray(column column.Column, value reflect.Value, num, level int) error {
9999
switch {
100100
case value.Kind() == reflect.Slice:
101101
if len(block.offsets[num]) < level {
@@ -107,12 +107,16 @@ func (block *Block) prepareArray(value reflect.Value, num, level int) (values []
107107
)
108108
}
109109
for i := 0; i < value.Len(); i++ {
110-
values = append(values, block.prepareArray(value.Index(i), num, level+1)...)
110+
if err := block.writeArray(column, value.Index(i), num, level+1); err != nil {
111+
return err
112+
}
111113
}
112114
default:
113-
values = append(values, value.Interface())
115+
if err := column.Write(block.buffers[num].Column, value.Interface()); err != nil {
116+
return err
117+
}
114118
}
115-
return values
119+
return nil
116120
}
117121

118122
func (block *Block) AppendRow(args []driver.Value) error {
@@ -130,10 +134,8 @@ func (block *Block) AppendRow(args []driver.Value) error {
130134
if value.Kind() != reflect.Slice {
131135
return fmt.Errorf("unsupported Array(T) type [%T]", value.Interface())
132136
}
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-
}
137+
if err := block.writeArray(c, value, num, 1); err != nil {
138+
return err
137139
}
138140
case *column.Nullable:
139141
if err := column.WriteNull(block.buffers[num].Offset, block.buffers[num].Column, args[num]); err != nil {

lib/data/block_write_column.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,5 @@ func (block *Block) WriteArray(c int, v interface{}) error {
9494
if value.Kind() != reflect.Slice {
9595
return fmt.Errorf("unsupported Array(T) type [%T]", value.Interface())
9696
}
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-
}
101-
}
102-
return nil
97+
return block.writeArray(block.Columns[c], value, c, 1)
10398
}

0 commit comments

Comments
 (0)