Skip to content

Commit 711cec6

Browse files
committed
Merge branch 'master' of https://github.com/ClickHouse/clickhouse-cpp into support-date32
2 parents 63d15ac + 211f115 commit 711cec6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1437
-204
lines changed

clickhouse/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ SET ( clickhouse-cpp-lib-src
77
base/wire_format.cpp
88

99
columns/array.cpp
10+
columns/column.cpp
1011
columns/date.cpp
1112
columns/decimal.cpp
1213
columns/enum.cpp

clickhouse/base/wire_format.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ void WireFormat::WriteAll(OutputStream& output, const void* buf, size_t len) {
4040
}
4141

4242
if (len) {
43-
throw Error("Failed to write " + std::to_string(original_len)
43+
throw ProtocolError("Failed to write " + std::to_string(original_len)
4444
+ " bytes, only written " + std::to_string(original_len - len));
4545
}
4646
}

clickhouse/client.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,10 @@ bool Client::Impl::ReceivePacket(uint64_t* server_packet) {
419419
return true;
420420
}
421421

422+
case ServerCodes::Hello: {
423+
return true;
424+
}
425+
422426
case ServerCodes::EndOfStream: {
423427
if (events_) {
424428
events_->OnFinish();

clickhouse/columns/array.cpp

Lines changed: 62 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,21 @@
55
namespace clickhouse {
66

77
ColumnArray::ColumnArray(ColumnRef data)
8+
: ColumnArray(data, std::make_shared<ColumnUInt64>())
9+
{
10+
}
11+
12+
ColumnArray::ColumnArray(ColumnRef data, std::shared_ptr<ColumnUInt64> offsets)
813
: Column(Type::CreateArray(data->Type()))
914
, data_(data)
10-
, offsets_(std::make_shared<ColumnUInt64>())
15+
, offsets_(offsets)
16+
{
17+
}
18+
19+
ColumnArray::ColumnArray(ColumnArray&& other)
20+
: Column(other.Type())
21+
, data_(std::move(other.data_))
22+
, offsets_(std::move(other.offsets_))
1123
{
1224
}
1325

@@ -18,30 +30,33 @@ void ColumnArray::AppendAsColumn(ColumnRef array) {
1830
"to column type " + data_->Type()->GetName());
1931
}
2032

21-
if (offsets_->Size() == 0) {
22-
offsets_->Append(array->Size());
23-
} else {
24-
offsets_->Append((*offsets_)[offsets_->Size() - 1] + array->Size());
25-
}
26-
33+
AddOffset(array->Size());
2734
data_->Append(array);
2835
}
2936

3037
ColumnRef ColumnArray::GetAsColumn(size_t n) const {
38+
if (n >= Size())
39+
throw ValidationError("Index is out ouf bounds: " + std::to_string(n));
40+
3141
return data_->Slice(GetOffset(n), GetSize(n));
3242
}
3343

3444
ColumnRef ColumnArray::Slice(size_t begin, size_t size) const {
35-
auto result = std::make_shared<ColumnArray>(GetAsColumn(begin));
36-
result->OffsetsIncrease(1);
45+
if (size && begin + size > Size())
46+
throw ValidationError("Slice indexes are out of bounds");
3747

38-
for (size_t i = 1; i < size; i++) {
39-
result->Append(std::make_shared<ColumnArray>(GetAsColumn(begin + i)));
48+
auto result = std::make_shared<ColumnArray>(data_->CloneEmpty());
49+
for (size_t i = 0; i < size; i++) {
50+
result->AppendAsColumn(GetAsColumn(begin + i));
4051
}
4152

4253
return result;
4354
}
4455

56+
ColumnRef ColumnArray::CloneEmpty() const {
57+
return std::make_shared<ColumnArray>(data_->CloneEmpty());
58+
}
59+
4560
void ColumnArray::Append(ColumnRef column) {
4661
if (auto col = column->As<ColumnArray>()) {
4762
if (!col->data_->Type()->IsEqual(data_->Type())) {
@@ -54,22 +69,34 @@ void ColumnArray::Append(ColumnRef column) {
5469
}
5570
}
5671

57-
bool ColumnArray::Load(InputStream* input, size_t rows) {
72+
bool ColumnArray::LoadPrefix(InputStream* input, size_t rows) {
5873
if (!rows) {
5974
return true;
6075
}
61-
if (!offsets_->Load(input, rows)) {
76+
77+
return data_->LoadPrefix(input, rows);
78+
}
79+
80+
bool ColumnArray::LoadBody(InputStream* input, size_t rows) {
81+
if (!rows) {
82+
return true;
83+
}
84+
if (!offsets_->LoadBody(input, rows)) {
6285
return false;
6386
}
64-
if (!data_->Load(input, (*offsets_)[rows - 1])) {
87+
if (!data_->LoadBody(input, (*offsets_)[rows - 1])) {
6588
return false;
6689
}
6790
return true;
6891
}
6992

70-
void ColumnArray::Save(OutputStream* output) {
71-
offsets_->Save(output);
72-
data_->Save(output);
93+
void ColumnArray::SavePrefix(OutputStream* output) {
94+
data_->SavePrefix(output);
95+
}
96+
97+
void ColumnArray::SaveBody(OutputStream* output) {
98+
offsets_->SaveBody(output);
99+
data_->SaveBody(output);
73100
}
74101

75102
void ColumnArray::Clear() {
@@ -92,11 +119,29 @@ void ColumnArray::OffsetsIncrease(size_t n) {
92119
}
93120

94121
size_t ColumnArray::GetOffset(size_t n) const {
122+
95123
return (n == 0) ? 0 : (*offsets_)[n - 1];
96124
}
97125

126+
void ColumnArray::AddOffset(size_t n) {
127+
if (offsets_->Size() == 0) {
128+
offsets_->Append(n);
129+
} else {
130+
offsets_->Append((*offsets_)[offsets_->Size() - 1] + n);
131+
}
132+
}
133+
98134
size_t ColumnArray::GetSize(size_t n) const {
99135
return (n == 0) ? (*offsets_)[n] : ((*offsets_)[n] - (*offsets_)[n - 1]);
100136
}
101137

138+
ColumnRef ColumnArray::GetData() {
139+
return data_;
140+
}
141+
142+
void ColumnArray::Reset() {
143+
data_.reset();
144+
offsets_.reset();
145+
}
146+
102147
}

0 commit comments

Comments
 (0)