Skip to content

Commit

Permalink
add missing alignvalue calls, make an overload for data_ptr_t of Alig…
Browse files Browse the repository at this point in the history
…nValue
  • Loading branch information
Tishj committed Jan 14, 2025
1 parent 16d1d64 commit 8bece82
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 2 deletions.
6 changes: 6 additions & 0 deletions src/include/duckdb/common/helper.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,12 @@ static inline T AlignValue(T n) {
return ((n + (val - 1)) / val) * val;
}

template<uintptr_t alignment>
inline data_ptr_t AlignValue(data_ptr_t addr) {
static_assert((alignment & (alignment - 1)) == 0, "'alignment' has to be a power of 2");
return reinterpret_cast<data_ptr_t>((reinterpret_cast<uintptr_t>(addr) + alignment - 1) & ~(alignment - 1));
}

template<class T, T val=8>
constexpr inline T AlignValueFloor(T n) {
return (n / val) * val;
Expand Down
6 changes: 4 additions & 2 deletions src/storage/compression/roaring/compress.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ void ContainerCompressionState::OverrideArray(data_ptr_t destination, bool nulls
destination += sizeof(uint8_t) * COMPRESSED_SEGMENT_COUNT;
compressed_arrays[nulls] = reinterpret_cast<uint8_t *>(destination);
} else {
destination = AlignValue<sizeof(uint16_t)>(destination);
arrays[nulls] = reinterpret_cast<uint16_t *>(destination);
}
}
Expand All @@ -126,6 +127,7 @@ void ContainerCompressionState::OverrideRun(data_ptr_t destination, idx_t count)
destination += sizeof(uint8_t) * COMPRESSED_SEGMENT_COUNT;
compressed_runs = reinterpret_cast<uint8_t *>(destination);
} else {
destination = AlignValue<sizeof(RunContainerRLEPair)>(destination);
runs = reinterpret_cast<RunContainerRLEPair *>(destination);
}
}
Expand Down Expand Up @@ -217,7 +219,7 @@ bool RoaringCompressState::CanStore(idx_t container_size, const ContainerMetadat
idx_t required_space = 0;
if (metadata.IsUncompressed()) {
// Account for the alignment we might need for this container
required_space += (AlignValue<idx_t>(reinterpret_cast<idx_t>(data_ptr))) - reinterpret_cast<idx_t>(data_ptr);
required_space += (AlignValue<sizeof(data_ptr_t)>(data_ptr) - data_ptr);
}
required_space += metadata.GetDataSizeInBytes(container_size);

Expand Down Expand Up @@ -261,7 +263,7 @@ void RoaringCompressState::InitializeContainer() {

// Override the pointer to write directly into the block
if (metadata.IsUncompressed()) {
data_ptr = reinterpret_cast<data_ptr_t>(AlignValue<idx_t>(reinterpret_cast<idx_t>(data_ptr)));
data_ptr = AlignValue<sizeof(idx_t)>(data_ptr);
FastMemset(data_ptr, ~0, sizeof(validity_t) * (container_size / ValidityMask::BITS_PER_VALUE));
container_state.OverrideUncompressed(data_ptr);
} else if (metadata.IsRun()) {
Expand Down
2 changes: 2 additions & 0 deletions src/storage/compression/roaring/scan.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,7 @@ ContainerScanState &RoaringScanState::LoadContainer(idx_t container_index, idx_t
current_container = make_uniq<CompressedRunContainerScanState>(container_index, container_size,
number_of_runs, segments, data_ptr);
} else {
data_ptr = AlignValue<sizeof(RunContainerRLEPair)>(data_ptr);
current_container =
make_uniq<RunContainerScanState>(container_index, container_size, number_of_runs, data_ptr);
}
Expand All @@ -297,6 +298,7 @@ ContainerScanState &RoaringScanState::LoadContainer(idx_t container_index, idx_t
container_index, container_size, cardinality, segments, data_ptr);
}
} else {
data_ptr = AlignValue<sizeof(uint16_t)>(data_ptr);
if (metadata.IsInverted()) {
current_container =
make_uniq<ArrayContainerScanState<NULLS>>(container_index, container_size, cardinality, data_ptr);
Expand Down

0 comments on commit 8bece82

Please sign in to comment.