Skip to content

Commit d7533f7

Browse files
Merge pull request #1605 from ClickHouse/server_info_for_columns
include server revision in block/column parsing
2 parents 22773d9 + ff4e041 commit d7533f7

23 files changed

+133
-116
lines changed

clickhouse_rows_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package clickhouse
22

33
import (
4+
"github.com/ClickHouse/clickhouse-go/v2/lib/column"
45
"github.com/ClickHouse/clickhouse-go/v2/lib/proto"
56
"github.com/stretchr/testify/assert"
67
"strconv"
@@ -10,9 +11,9 @@ import (
1011
func TestReadWithEmptyBlock(t *testing.T) {
1112
blockInitFunc := func() *proto.Block {
1213
retVal := &proto.Block{
13-
Packet: 0,
14-
Columns: nil,
15-
Timezone: nil,
14+
Packet: 0,
15+
Columns: nil,
16+
ServerContext: &column.ServerContext{},
1617
}
1718
retVal.AddColumn("col1", ("Int64"))
1819
retVal.AddColumn("col2", ("String"))

conn.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"crypto/tls"
2323
"errors"
2424
"fmt"
25+
"github.com/ClickHouse/clickhouse-go/v2/lib/column"
2526
"io"
2627
"log"
2728
"net"
@@ -356,6 +357,16 @@ func (c *connect) sendData(block *proto.Block, name string) error {
356357
return nil
357358
}
358359

360+
func serverVersionToContext(v ServerVersion) column.ServerContext {
361+
return column.ServerContext{
362+
Revision: v.Revision,
363+
VersionMajor: v.Version.Major,
364+
VersionMinor: v.Version.Minor,
365+
VersionPatch: v.Version.Patch,
366+
Timezone: v.Timezone,
367+
}
368+
}
369+
359370
func (c *connect) readData(ctx context.Context, packet byte, compressible bool) (*proto.Block, error) {
360371
if c.isClosed() {
361372
err := errors.New("attempted reading on closed connection")
@@ -385,7 +396,9 @@ func (c *connect) readData(ctx context.Context, packet byte, compressible bool)
385396
location = userLocation
386397
}
387398

388-
block := proto.Block{Timezone: location}
399+
serverContext := serverVersionToContext(c.server)
400+
serverContext.Timezone = location
401+
block := proto.Block{ServerContext: &serverContext}
389402
if err := block.Decode(c.reader, c.revision); err != nil {
390403
c.debugf("[read data] decode error: %v", err)
391404
return nil, err

conn_batch.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ func (b *batch) Columns() []column.Interface {
321321
}
322322

323323
func (b *batch) closeQuery() error {
324-
if err := b.conn.sendData(&proto.Block{}, ""); err != nil {
324+
if err := b.conn.sendData(proto.NewBlock(), ""); err != nil {
325325
return err
326326
}
327327

conn_http.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,9 @@ func (h *httpConnect) readData(reader *chproto.Reader, timezone *time.Location)
429429
location = timezone
430430
}
431431

432-
block := proto.Block{Timezone: location}
432+
serverContext := serverVersionToContext(h.handshake)
433+
serverContext.Timezone = location
434+
block := proto.Block{ServerContext: &serverContext}
433435
if h.compression == CompressionLZ4 || h.compression == CompressionZSTD {
434436
reader.EnableCompression()
435437
defer reader.DisableCompression()

conn_http_batch.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ func newBlock(h *httpConnect, release nativeTransportRelease, ctx context.Contex
107107
}
108108

109109
var block proto.Block
110+
serverContext := serverVersionToContext(h.handshake)
111+
block.ServerContext = &serverContext
110112
for _, col := range columns {
111113
if err := block.AddColumn(col.Name, column.Type(col.Type)); err != nil {
112114
return "", nil, err

conn_http_query.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func (h *httpConnect) query(ctx context.Context, release nativeTransportRelease,
5555

5656
if res.ContentLength == 0 {
5757
discardAndClose(res.Body)
58-
block := &proto.Block{}
58+
block := proto.NewBlock()
5959
release(h, nil)
6060
return &rows{
6161
block: block,
@@ -122,7 +122,7 @@ func (h *httpConnect) query(ctx context.Context, release nativeTransportRelease,
122122
}()
123123

124124
if block == nil {
125-
block = &proto.Block{}
125+
block = proto.NewBlock()
126126
}
127127

128128
return &rows{

conn_send_query.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ func (c *connect) sendQuery(body string, o *QueryOptions) error {
4747
return err
4848
}
4949
}
50-
if err := c.sendData(&proto.Block{}, ""); err != nil {
50+
if err := c.sendData(proto.NewBlock(), ""); err != nil {
5151
return err
5252
}
5353
return c.flush()

ext/ext.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import (
2727
func NewTable(name string, columns ...func(t *Table) error) (*Table, error) {
2828
table := &Table{
2929
name: name,
30-
block: &proto.Block{},
30+
block: proto.NewBlock(),
3131
}
3232
for _, column := range columns {
3333
if err := column(table); err != nil {

lib/column/array.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import (
2323
"github.com/ClickHouse/ch-go/proto"
2424
"reflect"
2525
"strings"
26-
"time"
2726
)
2827

2928
var scanTypeAny = reflect.TypeOf((*interface{})(nil)).Elem()
@@ -53,7 +52,7 @@ func (col *Array) Name() string {
5352
return col.name
5453
}
5554

56-
func (col *Array) parse(t Type, tz *time.Location) (_ *Array, err error) {
55+
func (col *Array) parse(t Type, sc *ServerContext) (_ *Array, err error) {
5756
col.chType = t
5857
var typeStr = string(t)
5958

@@ -69,7 +68,7 @@ parse:
6968
}
7069
}
7170
if col.depth != 0 {
72-
if col.values, err = Type(typeStr).Column(col.name, tz); err != nil {
71+
if col.values, err = Type(typeStr).Column(col.name, sc); err != nil {
7372
return nil, err
7473
}
7574
offsetScanTypes := make([]reflect.Type, 0, col.depth)

lib/column/codegen/column.tpl

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import (
3636
"github.com/ClickHouse/clickhouse-go/v2/lib/chcol"
3737
)
3838

39-
func (t Type) Column(name string, tz *time.Location) (Interface, error) {
39+
func (t Type) Column(name string, sc *ServerContext) (Interface, error) {
4040
switch t {
4141
{{- range . }}
4242
case "{{ .ChType }}":
@@ -81,15 +81,15 @@ func (t Type) Column(name string, tz *time.Location) (Interface, error) {
8181
case "Bool", "Boolean":
8282
return &Bool{name: name}, nil
8383
case "Date":
84-
return &Date{name: name, location: tz}, nil
84+
return &Date{name: name, location: sc.Timezone}, nil
8585
case "Date32":
86-
return &Date32{name: name, location: tz}, nil
86+
return &Date32{name: name, location: sc.Timezone}, nil
8787
case "UUID":
8888
return &UUID{name: name}, nil
8989
case "Nothing":
9090
return &Nothing{name: name}, nil
9191
case "Ring":
92-
set, err := (&Array{name: name}).parse("Array(Point)", tz)
92+
set, err := (&Array{name: name}).parse("Array(Point)", sc)
9393
if err != nil {
9494
return nil, err
9595
}
@@ -99,7 +99,7 @@ func (t Type) Column(name string, tz *time.Location) (Interface, error) {
9999
name: name,
100100
}, nil
101101
case "Polygon":
102-
set, err := (&Array{name: name}).parse("Array(Ring)", tz)
102+
set, err := (&Array{name: name}).parse("Array(Ring)", sc)
103103
if err != nil {
104104
return nil, err
105105
}
@@ -109,7 +109,7 @@ func (t Type) Column(name string, tz *time.Location) (Interface, error) {
109109
name: name,
110110
}, nil
111111
case "MultiPolygon":
112-
set, err := (&Array{name: name}).parse("Array(Polygon)", tz)
112+
set, err := (&Array{name: name}).parse("Array(Polygon)", sc)
113113
if err != nil {
114114
return nil, err
115115
}
@@ -123,42 +123,42 @@ func (t Type) Column(name string, tz *time.Location) (Interface, error) {
123123
case "String":
124124
return &String{name: name, col: colStrProvider(name)}, nil
125125
case "Object('json')":
126-
return &JSONObject{name: name, root: true, tz: tz}, nil
126+
return &JSONObject{name: name, root: true, sc: sc}, nil
127127
}
128128

129129
switch strType := string(t); {
130130
case strings.HasPrefix(string(t), "Map("):
131-
return (&Map{name: name}).parse(t, tz)
131+
return (&Map{name: name}).parse(t, sc)
132132
case strings.HasPrefix(string(t), "Tuple("):
133-
return (&Tuple{name: name}).parse(t, tz)
133+
return (&Tuple{name: name}).parse(t, sc)
134134
case strings.HasPrefix(string(t), "Variant("):
135-
return (&Variant{name: name}).parse(t, tz)
135+
return (&Variant{name: name}).parse(t, sc)
136136
case strings.HasPrefix(string(t), "Dynamic"):
137-
return (&Dynamic{name: name}).parse(t, tz)
137+
return (&Dynamic{name: name}).parse(t, sc)
138138
case strings.HasPrefix(string(t), "JSON"):
139-
return (&JSON{name: name}).parse(t, tz)
139+
return (&JSON{name: name}).parse(t, sc)
140140
case strings.HasPrefix(string(t), "Decimal("):
141141
return (&Decimal{name: name}).parse(t)
142142
case strings.HasPrefix(strType, "Nested("):
143-
return (&Nested{name: name}).parse(t, tz)
143+
return (&Nested{name: name}).parse(t, sc)
144144
case strings.HasPrefix(string(t), "Array("):
145-
return (&Array{name: name}).parse(t, tz)
145+
return (&Array{name: name}).parse(t, sc)
146146
case strings.HasPrefix(string(t), "Interval"):
147147
return (&Interval{name: name}).parse(t)
148148
case strings.HasPrefix(string(t), "Nullable"):
149-
return (&Nullable{name: name}).parse(t, tz)
149+
return (&Nullable{name: name}).parse(t, sc)
150150
case strings.HasPrefix(string(t), "FixedString"):
151151
return (&FixedString{name: name}).parse(t)
152152
case strings.HasPrefix(string(t), "LowCardinality"):
153-
return (&LowCardinality{name: name}).parse(t, tz)
153+
return (&LowCardinality{name: name}).parse(t, sc)
154154
case strings.HasPrefix(string(t), "SimpleAggregateFunction"):
155-
return (&SimpleAggregateFunction{name: name}).parse(t, tz)
155+
return (&SimpleAggregateFunction{name: name}).parse(t, sc)
156156
case strings.HasPrefix(string(t), "Enum8") || strings.HasPrefix(string(t), "Enum16"):
157157
return Enum(t, name)
158158
case strings.HasPrefix(string(t), "DateTime64"):
159-
return (&DateTime64{name: name}).parse(t, tz)
159+
return (&DateTime64{name: name}).parse(t, sc.Timezone)
160160
case strings.HasPrefix(strType, "DateTime") && !strings.HasPrefix(strType, "DateTime64"):
161-
return (&DateTime{name: name}).parse(t, tz)
161+
return (&DateTime{name: name}).parse(t, sc.Timezone)
162162
}
163163
return nil, &UnsupportedColumnTypeError{
164164
t: t,

0 commit comments

Comments
 (0)