Skip to content

Commit 8615012

Browse files
committed
More fixes to ItemView
1 parent 58e12cc commit 8615012

File tree

4 files changed

+201
-151
lines changed

4 files changed

+201
-151
lines changed

clickhouse/columns/itemview.cpp

Lines changed: 45 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,96 @@
11
#include "../columns/itemview.h"
22

3+
#include <algorithm>
4+
#include <sstream>
5+
6+
namespace {
7+
8+
template <typename Container>
9+
std::string ContainerToString(Container container, const char * separator = ", ") {
10+
std::stringstream sstr;
11+
const auto end = std::end(container);
12+
for (auto i = std::begin(container); i != end; /*intentionally no ++i*/) {
13+
const auto & elem = *i;
14+
sstr << elem;
15+
16+
if (++i != end) {
17+
sstr << separator;
18+
}
19+
}
20+
21+
return sstr.str();
22+
}
23+
24+
}
25+
326
namespace clickhouse {
427

528
void ItemView::ValidateData(Type::Code type, DataType data) {
6-
int expected_size = 0;
29+
30+
auto AssertSize = [type, &data](std::initializer_list<int> allowed_sizes) -> void {
31+
const auto end = std::end(allowed_sizes);
32+
if (std::find(std::begin(allowed_sizes), end, static_cast<int>(data.size())) == end) {
33+
throw AssertionError(std::string("ItemView value size mismatch for ")
34+
+ Type::TypeName(type)
35+
+ " expected: " + ContainerToString(allowed_sizes, " or ")
36+
+ ", got: " + std::to_string(data.size()));
37+
}
38+
};
39+
740
switch (type) {
841
case Type::Code::Void:
9-
expected_size = 0;
10-
break;
42+
return AssertSize({0});
1143

1244
case Type::Code::Int8:
1345
case Type::Code::UInt8:
1446
case Type::Code::Enum8:
15-
expected_size = 1;
16-
break;
47+
return AssertSize({1});
1748

1849
case Type::Code::Int16:
1950
case Type::Code::UInt16:
2051
case Type::Code::Date:
2152
case Type::Code::Enum16:
22-
expected_size = 2;
23-
break;
53+
return AssertSize({2});
2454

2555
case Type::Code::Int32:
2656
case Type::Code::UInt32:
2757
case Type::Code::Float32:
2858
case Type::Code::DateTime:
2959
case Type::Code::IPv4:
3060
case Type::Code::Decimal32:
31-
expected_size = 4;
32-
break;
61+
return AssertSize({4});
3362

3463
case Type::Code::Int64:
3564
case Type::Code::UInt64:
3665
case Type::Code::Float64:
3766
case Type::Code::DateTime64:
3867
case Type::Code::Decimal64:
39-
expected_size = 8;
40-
break;
68+
return AssertSize({8});
4169

4270
case Type::Code::String:
4371
case Type::Code::FixedString:
44-
case Type::Code::Decimal:
4572
// value can be of any size
4673
return;
4774

4875
case Type::Code::Array:
4976
case Type::Code::Nullable:
5077
case Type::Code::Tuple:
5178
case Type::Code::LowCardinality:
52-
throw UnimplementedError("Unsupported type in ItemView: " + std::to_string(static_cast<int>(type)));
79+
throw AssertionError("Unsupported type in ItemView: " + std::string(Type::TypeName(type)));
5380

5481
case Type::Code::IPv6:
5582
case Type::Code::UUID:
5683
case Type::Code::Int128:
5784
case Type::Code::Decimal128:
58-
expected_size = 16;
59-
break;
85+
return AssertSize({16});
86+
87+
case Type::Code::Decimal:
88+
// Could be either Decimal32, Decimal64 or Decimal128
89+
return AssertSize({4, 8, 16});
6090

6191
default:
6292
throw UnimplementedError("Unknon type code:" + std::to_string(static_cast<int>(type)));
6393
}
64-
65-
if (expected_size != static_cast<int>(data.size())) {
66-
throw AssertionError("Value size mismatch for type "
67-
+ std::to_string(static_cast<int>(type)) + " expected: "
68-
+ std::to_string(expected_size) + ", got: " + std::to_string(data.size()));
69-
}
7094
}
7195

7296
}

clickhouse/types/types.cpp

Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,50 +13,69 @@ Type::Type(const Code code)
1313
, type_unique_id_(0)
1414
{}
1515

16+
const char* Type::TypeName(Type::Code code) {
17+
switch (code) {
18+
case Type::Code::Void: return "Void";
19+
case Type::Code::Int8: return "Int8";
20+
case Type::Code::Int16: return "Int16";
21+
case Type::Code::Int32: return "Int32";
22+
case Type::Code::Int64: return "Int64";
23+
case Type::Code::UInt8: return "UInt8";
24+
case Type::Code::UInt16: return "UInt16";
25+
case Type::Code::UInt32: return "UInt32";
26+
case Type::Code::UInt64: return "UInt64";
27+
case Type::Code::Float32: return "Float32";
28+
case Type::Code::Float64: return "Float64";
29+
case Type::Code::String: return "String";
30+
case Type::Code::FixedString: return "FixedString";
31+
case Type::Code::DateTime: return "DateTime";
32+
case Type::Code::Date: return "Date";
33+
case Type::Code::Array: return "Array";
34+
case Type::Code::Nullable: return "Nullable";
35+
case Type::Code::Tuple: return "Tuple";
36+
case Type::Code::Enum8: return "Enum8";
37+
case Type::Code::Enum16: return "Enum16";
38+
case Type::Code::UUID: return "UUID";
39+
case Type::Code::IPv4: return "IPv4";
40+
case Type::Code::IPv6: return "IPv6";
41+
case Type::Code::Int128: return "Int128";
42+
case Type::Code::Decimal: return "Decimal";
43+
case Type::Code::Decimal32: return "Decimal32";
44+
case Type::Code::Decimal64: return "Decimal64";
45+
case Type::Code::Decimal128: return "Decimal128";
46+
case Type::Code::LowCardinality: return "LowCardinality";
47+
case Type::Code::DateTime64: return "DateTime64";
48+
}
49+
50+
return "Unknown type";
51+
}
52+
1653
std::string Type::GetName() const {
1754
switch (code_) {
1855
case Void:
19-
return "Void";
2056
case Int8:
21-
return "Int8";
2257
case Int16:
23-
return "Int16";
2458
case Int32:
25-
return "Int32";
2659
case Int64:
27-
return "Int64";
2860
case Int128:
29-
return "Int128";
3061
case UInt8:
31-
return "UInt8";
3262
case UInt16:
33-
return "UInt16";
3463
case UInt32:
35-
return "UInt32";
3664
case UInt64:
37-
return "UInt64";
3865
case UUID:
39-
return "UUID";
4066
case Float32:
41-
return "Float32";
4267
case Float64:
43-
return "Float64";
4468
case String:
45-
return "String";
46-
case FixedString:
47-
return As<FixedStringType>()->GetName();
4869
case IPv4:
49-
return "IPv4";
5070
case IPv6:
51-
return "IPv6";
71+
case Date:
72+
return TypeName(code_);
73+
case FixedString:
74+
return As<FixedStringType>()->GetName();
5275
case DateTime:
53-
{
5476
return As<DateTimeType>()->GetName();
55-
}
5677
case DateTime64:
5778
return As<DateTime64Type>()->GetName();
58-
case Date:
59-
return "Date";
6079
case Array:
6180
return As<ArrayType>()->GetName();
6281
case Nullable:

clickhouse/types/types.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ class Type {
8383

8484
bool IsEqual(const TypeRef& other) const { return IsEqual(*other); }
8585

86+
/// Simple name, doesn't depend on parameters and\or nested types, caller MUST NOT free returned value.
87+
static const char* TypeName(Code);
88+
8689
public:
8790
static TypeRef CreateArray(TypeRef item_type);
8891

0 commit comments

Comments
 (0)