Skip to content

Commit 8ee9613

Browse files
authored
Merge pull request #190 from Enmk/DateTime32_tests_and_fixes
Fixed Date32 range, now it supports pre-epoch values
2 parents 50a8bdb + 4809d9b commit 8ee9613

File tree

7 files changed

+39
-7
lines changed

7 files changed

+39
-7
lines changed

clickhouse/columns/date.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,13 @@ ItemView ColumnDate::GetItem(size_t index) const {
6565

6666
ColumnDate32::ColumnDate32()
6767
: Column(Type::CreateDate32())
68-
, data_(std::make_shared<ColumnUInt32>())
68+
, data_(std::make_shared<ColumnInt32>())
6969
{
7070
}
7171

7272
void ColumnDate32::Append(const std::time_t& value) {
7373
/// TODO: This code is fundamentally wrong.
74-
data_->Append(static_cast<uint16_t>(value / std::time_t(86400)));
74+
data_->Append(static_cast<int32_t>(value / std::time_t(86400)));
7575
}
7676

7777
void ColumnDate32::Clear() {
@@ -101,7 +101,7 @@ size_t ColumnDate32::Size() const {
101101
}
102102

103103
ColumnRef ColumnDate32::Slice(size_t begin, size_t len) const {
104-
auto col = data_->Slice(begin, len)->As<ColumnUInt32>();
104+
auto col = data_->Slice(begin, len)->As<ColumnInt32>();
105105
auto result = std::make_shared<ColumnDate32>();
106106

107107
result->data_->Append(col);
@@ -119,7 +119,7 @@ void ColumnDate32::Swap(Column& other) {
119119
}
120120

121121
ItemView ColumnDate32::GetItem(size_t index) const {
122-
return data_->GetItem(index);
122+
return ItemView{Type()->GetCode(), data_->GetItem(index)};
123123
}
124124

125125

clickhouse/columns/date.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class ColumnDate32 : public Column {
8686
ItemView GetItem(size_t index) const override;
8787

8888
private:
89-
std::shared_ptr<ColumnUInt32> data_;
89+
std::shared_ptr<ColumnInt32> data_;
9090
};
9191

9292

clickhouse/columns/itemview.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ void ItemView::ValidateData(Type::Code type, DataType data) {
5656
case Type::Code::UInt32:
5757
case Type::Code::Float32:
5858
case Type::Code::DateTime:
59+
case Type::Code::Date32:
5960
case Type::Code::IPv4:
6061
case Type::Code::Decimal32:
6162
return AssertSize({4});

clickhouse/columns/itemview.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ struct ItemView {
6969
if (sizeof(ValueType) == data.size()) {
7070
return *reinterpret_cast<const T*>(data.data());
7171
} else {
72-
throw AssertionError("Incompatitable value type and size.");
72+
throw AssertionError("Incompatitable value type and size. Requested size: "
73+
+ std::to_string(sizeof(ValueType)) + " stored size: " + std::to_string(data.size()));
7374
}
7475
}
7576
}

ut/Column_ut.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@ namespace {
2222
using namespace clickhouse;
2323
}
2424

25+
namespace clickhouse{
26+
27+
std::ostream& operator<<(std::ostream& ostr, const Type::Code& type_code) {
28+
return ostr << Type::TypeName(type_code) << " (" << static_cast<int>(type_code) << ")";
29+
}
30+
31+
}
32+
2533

2634
// Generic tests for a Column subclass against basic API:
2735
// 1. Constructor: Create, ensure that it is empty
@@ -60,6 +68,8 @@ class GenericColumnTest : public testing::Test {
6068
return GenerateVector(values_size, FromVectorGenerator{MakeDateTimes()});
6169
} else if constexpr (std::is_same_v<ColumnType, ColumnDateTime64>) {
6270
return MakeDateTime64s(3u, values_size);
71+
} else if constexpr (std::is_same_v<ColumnType, ColumnDate32>) {
72+
return GenerateVector(values_size, FromVectorGenerator{MakeDates32()});
6373
} else if constexpr (std::is_same_v<ColumnType, ColumnIPv4>) {
6474
return GenerateVector(values_size, FromVectorGenerator{MakeIPv4s()});
6575
} else if constexpr (std::is_same_v<ColumnType, ColumnIPv6>) {
@@ -100,7 +110,7 @@ using ValueColumns = ::testing::Types<
100110
, ColumnInt8, ColumnInt16, ColumnInt32, ColumnInt64
101111
, ColumnFloat32, ColumnFloat64
102112
, ColumnString, ColumnFixedString
103-
, ColumnDate, ColumnDateTime, ColumnDateTime64
113+
, ColumnDate, ColumnDateTime, ColumnDateTime64, ColumnDate32
104114
, ColumnIPv4, ColumnIPv6
105115
, ColumnInt128
106116
, ColumnDecimal
@@ -168,6 +178,8 @@ inline auto convertValueForGetItem(const ColumnType& col, ValueType&& t) {
168178
return std::string_view(reinterpret_cast<const char*>(t.s6_addr), 16);
169179
} else if constexpr (std::is_same_v<ColumnType, ColumnDate>) {
170180
return static_cast<uint16_t>(t / std::time_t(86400));
181+
} else if constexpr (std::is_same_v<ColumnType, ColumnDate32>) {
182+
return static_cast<uint32_t>(t / std::time_t(86400));
171183
} else if constexpr (std::is_same_v<ColumnType, ColumnDateTime>) {
172184
return static_cast<uint32_t>(t);
173185
} else {

ut/value_generators.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,23 @@ std::vector<clickhouse::Int64> MakeDates() {
6565
return result;
6666
}
6767

68+
std::vector<clickhouse::Int64> MakeDates32() {
69+
// in CH Date32 internally a UInt32 and stores a day number
70+
// ColumnDate expects values to be seconds, which is then
71+
// converted to day number internally, hence the `* 86400`.
72+
// 114634 * 86400 is 2282-11-10, last integer that fits into DateTime32 range
73+
// (max is 2283-11-11)
74+
std::vector<clickhouse::Int64> result = MakeDates();
75+
76+
// add corresponding negative values, since pre-epoch date are supported too.
77+
const auto size = result.size();
78+
for (size_t i = 0; i < size; ++i) {
79+
result.push_back(result[i] * -1);
80+
}
81+
82+
return result;
83+
}
84+
6885
std::vector<clickhouse::Int64> MakeDateTimes() {
6986
// in CH DateTime internally a UInt32
7087
return {

ut/value_generators.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ std::vector<std::string> MakeFixedStrings(size_t string_size);
3333
std::vector<std::string> MakeStrings();
3434
std::vector<clickhouse::Int64> MakeDateTime64s(size_t scale, size_t values_size = 200);
3535
std::vector<clickhouse::Int64> MakeDates();
36+
std::vector<clickhouse::Int64> MakeDates32();
3637
std::vector<clickhouse::Int64> MakeDateTimes();
3738
std::vector<in_addr> MakeIPv4s();
3839
std::vector<in6_addr> MakeIPv6s();

0 commit comments

Comments
 (0)