55
66DUCKDB_INCLUDES_BEGIN
77#include " duckdb/common/vector.hpp"
8+ #include " duckdb/common/fsst.hpp"
89#include " duckdb/common/types/value.hpp"
10+ #include " duckdb/common/types/vector_buffer.hpp"
911#include " duckdb/common/types/vector.hpp"
1012DUCKDB_INCLUDES_END
1113
@@ -60,6 +62,8 @@ class DataVector : public Vector {
6062
6163} // namespace vortex
6264
65+ static constexpr uint64_t VX_FSST_CORRUPT = 32774747032022883ULL ;
66+
6367extern " C" void duckdb_vx_string_vector_add_vector_data_buffer (duckdb_vector ffi_vector,
6468 duckdb_vx_vector_buffer buffer) {
6569 auto vector = reinterpret_cast <Vector *>(ffi_vector);
@@ -81,6 +85,49 @@ extern "C" void duckdb_vx_vector_set_data_ptr(duckdb_vector ffi_vector, void *pt
8185 dvector->SetDataPtr ((data_ptr_t )ptr);
8286}
8387
88+ extern " C" void duckdb_vx_fsst_vector_set (duckdb_vector ffi_vector,
89+ const uint64_t *symbols,
90+ const uint8_t *symbol_lengths,
91+ idx_t symbol_count,
92+ idx_t string_block_limit,
93+ idx_t count,
94+ duckdb_vx_vector_buffer buffer) {
95+ auto vector = reinterpret_cast <Vector *>(ffi_vector);
96+ D_ASSERT (vector);
97+ D_ASSERT (symbol_count <= 255 );
98+
99+ buffer_ptr<void > decoder_buffer = make_buffer<duckdb_fsst_decoder_t >();
100+ auto *decoder = reinterpret_cast <duckdb_fsst_decoder_t *>(decoder_buffer.get ());
101+ decoder->version = 0 ;
102+ decoder->zeroTerminated = 0 ;
103+ for (idx_t i = 0 ; i < 255 ; i++) {
104+ decoder->len [i] = 8 ;
105+ decoder->symbol [i] = VX_FSST_CORRUPT;
106+ }
107+ for (idx_t i = 0 ; i < symbol_count; i++) {
108+ decoder->len [i] = symbol_lengths[i];
109+ decoder->symbol [i] = symbols[i];
110+ }
111+
112+ FSSTVector::RegisterDecoder (*vector, decoder_buffer, string_block_limit);
113+
114+ if (buffer) {
115+ auto data = reinterpret_cast <shared_ptr<vortex::ExternalVectorBuffer> *>(buffer);
116+ auto aux = vector->GetAuxiliary ();
117+ D_ASSERT (aux);
118+ D_ASSERT (aux->GetBufferType () == VectorBufferType::FSST_BUFFER);
119+ aux->Cast <VectorFSSTStringBuffer>().AddHeapReference (*data);
120+ }
121+
122+ FSSTVector::SetCount (*vector, count);
123+ vector->SetVectorType (VectorType::FSST_VECTOR);
124+ }
125+
126+ extern " C" bool duckdb_vx_vector_is_fsst (duckdb_vector ffi_vector) {
127+ auto vector = reinterpret_cast <Vector *>(ffi_vector);
128+ return vector && vector->GetVectorType () == VectorType::FSST_VECTOR;
129+ }
130+
84131extern " C" duckdb_value duckdb_vx_vector_get_value (duckdb_vector ffi_vector, idx_t index) {
85132 auto vector = reinterpret_cast <Vector *>(ffi_vector);
86133 auto value = duckdb::make_uniq<Value>(vector->GetValue (index));
0 commit comments