1#include "duckdb/storage/string_uncompressed.hpp"
2#include "duckdb/common/types/value.hpp"
3#include "duckdb/common/fsst.hpp"
4#include "fsst.h"
5
6namespace duckdb {
7
8string_t FSSTPrimitives::DecompressValue(void *duckdb_fsst_decoder, Vector &result, const char *compressed_string,
9 idx_t compressed_string_len) {
10 D_ASSERT(result.GetVectorType() == VectorType::FLAT_VECTOR);
11 unsigned char decompress_buffer[StringUncompressed::STRING_BLOCK_LIMIT + 1];
12 auto fsst_decoder = reinterpret_cast<duckdb_fsst_decoder_t *>(duckdb_fsst_decoder);
13 auto compressed_string_ptr = (unsigned char *)compressed_string; // NOLINT
14 auto decompressed_string_size =
15 duckdb_fsst_decompress(decoder: fsst_decoder, lenIn: compressed_string_len, strIn: compressed_string_ptr,
16 size: StringUncompressed::STRING_BLOCK_LIMIT + 1, output: &decompress_buffer[0]);
17 D_ASSERT(decompressed_string_size <= StringUncompressed::STRING_BLOCK_LIMIT);
18
19 return StringVector::AddStringOrBlob(vector&: result, data: const_char_ptr_cast(src: decompress_buffer), len: decompressed_string_size);
20}
21
22Value FSSTPrimitives::DecompressValue(void *duckdb_fsst_decoder, const char *compressed_string,
23 idx_t compressed_string_len) {
24 unsigned char decompress_buffer[StringUncompressed::STRING_BLOCK_LIMIT + 1];
25 auto compressed_string_ptr = (unsigned char *)compressed_string; // NOLINT
26 auto fsst_decoder = reinterpret_cast<duckdb_fsst_decoder_t *>(duckdb_fsst_decoder);
27 auto decompressed_string_size =
28 duckdb_fsst_decompress(decoder: fsst_decoder, lenIn: compressed_string_len, strIn: compressed_string_ptr,
29 size: StringUncompressed::STRING_BLOCK_LIMIT + 1, output: &decompress_buffer[0]);
30 D_ASSERT(decompressed_string_size <= StringUncompressed::STRING_BLOCK_LIMIT);
31
32 return Value(string(char_ptr_cast(src: decompress_buffer), decompressed_string_size));
33}
34
35} // namespace duckdb
36