@@ -33,7 +33,6 @@ import (
3333 "net/http"
3434 "net/url"
3535 "os"
36- "strconv"
3736 "strings"
3837 "sync"
3938 "time"
@@ -165,12 +164,12 @@ func dialHttp(ctx context.Context, addr string, num int, opt *Options) (*httpCon
165164 if opt .Debugf != nil {
166165 debugf = func (format string , v ... any ) {
167166 opt .Debugf (
168- "[clickhouse-http][conn=%d][%s ] " + format ,
169- append ([]interface {}{num , addr }, v ... )... ,
167+ "[clickhouse-http][%s][id=%d ] " + format ,
168+ append ([]interface {}{addr , num }, v ... )... ,
170169 )
171170 }
172171 } else {
173- debugf = log .New (os .Stdout , fmt .Sprintf ("[clickhouse-http][conn=%d][%s ]" , num , addr ), 0 ).Printf
172+ debugf = log .New (os .Stdout , fmt .Sprintf ("[clickhouse-http][%s][id=%d ]" , addr , num ), 0 ).Printf
174173 }
175174 }
176175
@@ -216,6 +215,8 @@ func dialHttp(ctx context.Context, addr string, num int, opt *Options) (*httpCon
216215 }
217216
218217 query .Set ("default_format" , "Native" )
218+ // TODO: we support newer revisions but for some reason this completely breaks Native format
219+ //query.Set("client_protocol_version", strconv.Itoa(ClientTCPProtocolVersion))
219220 u .RawQuery = query .Encode ()
220221
221222 httpProxy := http .ProxyFromEnvironment
@@ -241,13 +242,18 @@ func dialHttp(ctx context.Context, addr string, num int, opt *Options) (*httpCon
241242 }
242243 }
243244
244- // Temporary conn for determining timezone + version
245- conn := & httpConnect {
246- opt : opt ,
245+ conn := httpConnect {
246+ id : num ,
247+ connectedAt : time .Now (),
248+ released : false ,
249+ debugfFunc : debugf ,
250+ opt : opt ,
247251 client : & http.Client {
248252 Transport : t ,
249253 },
250- url : u ,
254+ url : u ,
255+ // TODO: learn more about why revision is broken
256+ //revision: ClientTCPProtocolVersion,
251257 buffer : new (chproto.Buffer ),
252258 compression : opt .Compression .Method ,
253259 blockCompressor : compress .NewWriter (compress .Level (opt .Compression .Level ), compress .Method (opt .Compression .Method )),
@@ -259,30 +265,9 @@ func dialHttp(ctx context.Context, addr string, num int, opt *Options) (*httpCon
259265 if err != nil {
260266 return nil , fmt .Errorf ("failed to query server hello: %w" , err )
261267 }
262- // Close temp connection, important for freeing session_id if set
263- _ = conn .close ()
264-
265- // Set client revision so we can decode updated versions of Native format
266- query .Set ("client_protocol_version" , strconv .Itoa (int (handshake .Revision )))
267- u .RawQuery = query .Encode ()
268+ conn .handshake = handshake
268269
269- return & httpConnect {
270- id : num ,
271- connectedAt : time .Now (),
272- released : false ,
273- debugfFunc : debugf ,
274- opt : opt ,
275- client : & http.Client {
276- Transport : t ,
277- },
278- url : u ,
279- buffer : new (chproto.Buffer ),
280- compression : opt .Compression .Method ,
281- blockCompressor : compress .NewWriter (compress .Level (opt .Compression .Level ), compress .Method (opt .Compression .Method )),
282- compressionPool : compressionPool ,
283- blockBufferSize : opt .BlockBufferSize ,
284- handshake : handshake ,
285- }, nil
270+ return & conn , nil
286271}
287272
288273type httpConnect struct {
@@ -291,6 +276,7 @@ type httpConnect struct {
291276 released bool
292277 debugfFunc func (format string , v ... any )
293278 opt * Options
279+ revision uint64
294280 url * url.URL
295281 client * http.Client
296282 buffer * chproto.Buffer
@@ -333,6 +319,7 @@ func (h *httpConnect) isBad() bool {
333319}
334320
335321func (h * httpConnect ) queryHello (ctx context.Context , release nativeTransportRelease ) (proto.ServerHandshake , error ) {
322+ h .debugf ("[query hello]" )
336323 ctx = Context (ctx , ignoreExternalTables ())
337324 query := "SELECT displayName(), version(), revision(), timezone()"
338325 rows , err := h .query (ctx , release , query )
@@ -420,8 +407,8 @@ func createCompressionPool(compression *Compression) (Pool[HTTPReaderWriter], er
420407func (h * httpConnect ) writeData (block * proto.Block ) error {
421408 // Saving offset of compressible data
422409 start := len (h .buffer .Buf )
423- if err := block .Encode (h .buffer , 0 ); err != nil {
424- return err
410+ if err := block .Encode (h .buffer , h . revision ); err != nil {
411+ return fmt . Errorf ( "block encode: %w" , err )
425412 }
426413 if h .compression == CompressionLZ4 || h .compression == CompressionZSTD {
427414 // Performing compression. Supported and requires
@@ -445,8 +432,8 @@ func (h *httpConnect) readData(reader *chproto.Reader, timezone *time.Location)
445432 reader .EnableCompression ()
446433 defer reader .DisableCompression ()
447434 }
448- if err := block .Decode (reader , h .handshake . Revision ); err != nil {
449- return nil , err
435+ if err := block .Decode (reader , h .revision ); err != nil {
436+ return nil , fmt . Errorf ( "block decode: %w" , err )
450437 }
451438 return & block , nil
452439}
@@ -564,7 +551,7 @@ func (h *httpConnect) createRequestWithExternalTables(ctx context.Context, query
564551 return nil , err
565552 }
566553 buf .Reset ()
567- err = table .Block ().Encode (buf , 0 )
554+ err = table .Block ().Encode (buf , h . revision )
568555 if err != nil {
569556 return nil , err
570557 }
@@ -597,11 +584,12 @@ func (h *httpConnect) executeRequest(req *http.Request) (*http.Response, error)
597584
598585 if resp .StatusCode != http .StatusOK {
599586 defer discardAndClose (resp .Body )
600- msg , err := h .readRawResponse (resp )
587+ msgBytes , err := h .readRawResponse (resp )
601588 if err != nil {
602- return nil , fmt .Errorf ("clickhouse [execute]:: %d code: failed to read the response: %w" , resp .StatusCode , err )
589+ return nil , fmt .Errorf ("[HTTP %d] failed to read response: %w" , resp .StatusCode , err )
603590 }
604- return nil , fmt .Errorf ("clickhouse [execute]:: %d code: %s" , resp .StatusCode , string (msg ))
591+
592+ return nil , fmt .Errorf ("[HTTP %d] response body: \" %s\" " , resp .StatusCode , string (msgBytes ))
605593 }
606594 return resp , nil
607595}
0 commit comments