aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/ClickHouse/clickhouse-go/clickhouse_write_block.go
blob: 5a76f497997dc523f042dbbb533be32def237713 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package clickhouse

import (
	"github.com/ClickHouse/clickhouse-go/lib/data"
	"github.com/ClickHouse/clickhouse-go/lib/protocol"
)

func (ch *clickhouse) writeBlock(block *data.Block, tableName string) error {
	ch.Lock()
	defer ch.Unlock()
	if err := ch.encoder.Uvarint(protocol.ClientData); err != nil {
		return err
	}

	if err := ch.encoder.String(tableName); err != nil { // temporary table
		return err
	}

	// implement CityHash v 1.0.2 and add LZ4 compression
	/*
		From Alexey Milovidov
		Насколько я помню, сжимаются блоки с данными Native формата, а всё остальное (всякие номера пакетов и т. п.)  передаётся без сжатия.

		Сжатые данные устроены так. Они представляют собой набор сжатых фреймов.
		Каждый фрейм имеет следующий вид:
		чексумма (16 байт),
		идентификатор алгоритма сжатия (1 байт),
		размер сжатых данных (4 байта, little endian, размер не включает в себя чексумму, но включает в себя остальные 9 байт заголовка),
		размер несжатых данных (4 байта, little endian), затем сжатые данные.
		Идентификатор алгоритма: 0x82 - lz4, 0x90 - zstd.
		Чексумма - CityHash128 из CityHash версии 1.0.2, вычисленный от сжатых данных с учётом 9 байт заголовка.

		См. CompressedReadBufferBase, CompressedWriteBuffer,
		utils/compressor, TCPHandler.
	*/
	ch.encoder.SelectCompress(ch.compress)
	err := block.Write(&ch.ServerInfo, ch.encoder)
	ch.encoder.SelectCompress(false)
	return err
}