duckdb 0.7.2-dev2233.0 → 0.7.2-dev2320.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/binding.gyp +1 -0
- package/package.json +1 -1
- package/src/duckdb/src/catalog/catalog.cpp +18 -17
- package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +0 -4
- package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +0 -4
- package/src/duckdb/src/catalog/catalog_set.cpp +3 -3
- package/src/duckdb/src/common/adbc/adbc.cpp +441 -0
- package/src/duckdb/src/common/adbc/driver_manager.cpp +749 -0
- package/src/duckdb/src/common/arrow/arrow_wrapper.cpp +1 -1
- package/src/duckdb/src/common/tree_renderer.cpp +3 -3
- package/src/duckdb/src/common/types/conflict_manager.cpp +2 -1
- package/src/duckdb/src/execution/column_binding_resolver.cpp +1 -1
- package/src/duckdb/src/execution/operator/aggregate/physical_ungrouped_aggregate.cpp +1 -1
- package/src/duckdb/src/execution/operator/filter/physical_filter.cpp +2 -2
- package/src/duckdb/src/execution/operator/helper/physical_execute.cpp +2 -2
- package/src/duckdb/src/execution/operator/helper/physical_result_collector.cpp +5 -5
- package/src/duckdb/src/execution/operator/join/physical_cross_product.cpp +1 -1
- package/src/duckdb/src/execution/operator/join/physical_delim_join.cpp +11 -10
- package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +3 -3
- package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +9 -9
- package/src/duckdb/src/execution/operator/join/physical_index_join.cpp +4 -4
- package/src/duckdb/src/execution/operator/join/physical_join.cpp +7 -7
- package/src/duckdb/src/execution/operator/join/physical_nested_loop_join.cpp +3 -3
- package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +3 -3
- package/src/duckdb/src/execution/operator/join/physical_positional_join.cpp +2 -2
- package/src/duckdb/src/execution/operator/persistent/csv_reader_options.cpp +8 -9
- package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +20 -19
- package/src/duckdb/src/execution/operator/persistent/physical_export.cpp +3 -3
- package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +25 -24
- package/src/duckdb/src/execution/operator/persistent/physical_update.cpp +1 -1
- package/src/duckdb/src/execution/operator/projection/physical_projection.cpp +2 -2
- package/src/duckdb/src/execution/operator/scan/physical_column_data_scan.cpp +12 -6
- package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +10 -11
- package/src/duckdb/src/execution/operator/set/physical_union.cpp +2 -2
- package/src/duckdb/src/execution/physical_operator.cpp +13 -13
- package/src/duckdb/src/execution/physical_plan/plan_column_data_get.cpp +2 -4
- package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +1 -1
- package/src/duckdb/src/execution/physical_plan/plan_create_table.cpp +5 -5
- package/src/duckdb/src/execution/physical_plan/plan_delete.cpp +3 -3
- package/src/duckdb/src/execution/physical_plan/plan_delim_join.cpp +6 -7
- package/src/duckdb/src/execution/physical_plan/plan_explain.cpp +2 -4
- package/src/duckdb/src/execution/physical_plan/plan_insert.cpp +2 -2
- package/src/duckdb/src/execution/physical_plan/plan_show_select.cpp +2 -4
- package/src/duckdb/src/execution/physical_plan/plan_update.cpp +3 -3
- package/src/duckdb/src/function/compression_config.cpp +9 -9
- package/src/duckdb/src/function/scalar/date/strftime.cpp +1 -1
- package/src/duckdb/src/function/table/copy_csv.cpp +5 -0
- package/src/duckdb/src/function/table/pragma_detailed_profiling_output.cpp +6 -5
- package/src/duckdb/src/function/table/pragma_last_profiling_output.cpp +7 -5
- package/src/duckdb/src/function/table/system/duckdb_databases.cpp +1 -1
- package/src/duckdb/src/function/table/system/duckdb_dependencies.cpp +1 -1
- package/src/duckdb/src/function/table/system/duckdb_extensions.cpp +1 -1
- package/src/duckdb/src/function/table/system/duckdb_indexes.cpp +1 -1
- package/src/duckdb/src/function/table/system/duckdb_keywords.cpp +1 -1
- package/src/duckdb/src/function/table/system/duckdb_schemas.cpp +1 -1
- package/src/duckdb/src/function/table/system/duckdb_sequences.cpp +1 -1
- package/src/duckdb/src/function/table/system/duckdb_settings.cpp +1 -1
- package/src/duckdb/src/function/table/system/duckdb_tables.cpp +1 -1
- package/src/duckdb/src/function/table/system/duckdb_temporary_files.cpp +1 -1
- package/src/duckdb/src/function/table/system/duckdb_types.cpp +1 -1
- package/src/duckdb/src/function/table/system/pragma_collations.cpp +1 -1
- package/src/duckdb/src/function/table/system/pragma_database_size.cpp +1 -1
- package/src/duckdb/src/function/table/system/pragma_storage_info.cpp +5 -5
- package/src/duckdb/src/function/table/system/pragma_table_info.cpp +1 -1
- package/src/duckdb/src/function/table/system/test_all_types.cpp +1 -1
- package/src/duckdb/src/function/table/table_scan.cpp +3 -4
- package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
- package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +3 -3
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_table_entry.hpp +1 -2
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_catalog_entry.hpp +1 -2
- package/src/duckdb/src/include/duckdb/common/adbc/adbc-init.hpp +37 -0
- package/src/duckdb/src/include/duckdb/common/adbc/adbc.h +1088 -0
- package/src/duckdb/src/include/duckdb/common/adbc/adbc.hpp +85 -0
- package/src/duckdb/src/include/duckdb/common/adbc/driver_manager.h +84 -0
- package/src/duckdb/src/include/duckdb/common/helper.hpp +3 -0
- package/src/duckdb/src/include/duckdb/common/types/conflict_manager.hpp +3 -2
- package/src/duckdb/src/include/duckdb/common/types.hpp +0 -1
- package/src/duckdb/src/include/duckdb/execution/executor.hpp +7 -7
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_execute.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_result_collector.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_cross_product.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_delim_join.hpp +3 -3
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_index_join.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_join.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_positional_join.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +2 -1
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_batch_insert.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_export.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_insert.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_column_data_scan.hpp +3 -4
- package/src/duckdb/src/include/duckdb/execution/operator/set/physical_recursive_cte.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/set/physical_union.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/physical_operator.hpp +3 -3
- package/src/duckdb/src/include/duckdb/execution/physical_operator_states.hpp +1 -1
- package/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp +1 -1
- package/src/duckdb/src/include/duckdb/main/config.hpp +2 -2
- package/src/duckdb/src/include/duckdb/main/query_profiler.hpp +10 -9
- package/src/duckdb/src/include/duckdb/parallel/meta_pipeline.hpp +4 -4
- package/src/duckdb/src/include/duckdb/parallel/pipeline.hpp +18 -17
- package/src/duckdb/src/include/duckdb/parallel/pipeline_executor.hpp +2 -2
- package/src/duckdb/src/include/duckdb/planner/bind_context.hpp +14 -17
- package/src/duckdb/src/include/duckdb/planner/binder.hpp +6 -6
- package/src/duckdb/src/include/duckdb/planner/expression_binder/index_binder.hpp +4 -4
- package/src/duckdb/src/include/duckdb/planner/expression_binder/where_binder.hpp +2 -2
- package/src/duckdb/src/include/duckdb/planner/operator/logical_create.hpp +3 -2
- package/src/duckdb/src/include/duckdb/planner/operator/logical_create_table.hpp +2 -2
- package/src/duckdb/src/include/duckdb/planner/operator/logical_delete.hpp +2 -2
- package/src/duckdb/src/include/duckdb/planner/operator/logical_insert.hpp +2 -2
- package/src/duckdb/src/include/duckdb/planner/operator/logical_update.hpp +2 -2
- package/src/duckdb/src/include/duckdb/planner/parsed_data/bound_create_function_info.hpp +3 -2
- package/src/duckdb/src/include/duckdb/planner/parsed_data/bound_create_table_info.hpp +3 -2
- package/src/duckdb/src/include/duckdb/planner/table_binding.hpp +6 -5
- package/src/duckdb/src/include/duckdb/planner/tableref/bound_basetableref.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_compress.hpp +3 -7
- package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_compress.hpp +3 -7
- package/src/duckdb/src/include/duckdb/storage/data_table.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/storage_manager.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/table/column_data_checkpointer.hpp +2 -1
- package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +4 -4
- package/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +3 -3
- package/src/duckdb/src/include/duckdb/transaction/cleanup_state.hpp +3 -3
- package/src/duckdb/src/include/duckdb/transaction/commit_state.hpp +5 -5
- package/src/duckdb/src/include/duckdb/transaction/duck_transaction.hpp +3 -3
- package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +31 -30
- package/src/duckdb/src/include/duckdb/transaction/transaction_data.hpp +2 -1
- package/src/duckdb/src/include/duckdb/transaction/undo_buffer.hpp +1 -1
- package/src/duckdb/src/main/client_context.cpp +1 -1
- package/src/duckdb/src/main/query_profiler.cpp +24 -22
- package/src/duckdb/src/parallel/executor.cpp +55 -49
- package/src/duckdb/src/parallel/meta_pipeline.cpp +5 -5
- package/src/duckdb/src/parallel/pipeline.cpp +43 -26
- package/src/duckdb/src/parallel/pipeline_executor.cpp +22 -22
- package/src/duckdb/src/planner/bind_context.cpp +67 -71
- package/src/duckdb/src/planner/binder/statement/bind_create.cpp +6 -7
- package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +6 -8
- package/src/duckdb/src/planner/binder/statement/bind_delete.cpp +3 -4
- package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +17 -18
- package/src/duckdb/src/planner/binder/statement/bind_update.cpp +16 -17
- package/src/duckdb/src/planner/binder/statement/bind_vacuum.cpp +6 -5
- package/src/duckdb/src/planner/binder/tableref/bind_basetableref.cpp +9 -9
- package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +20 -18
- package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +1 -1
- package/src/duckdb/src/planner/binder.cpp +4 -4
- package/src/duckdb/src/planner/expression_binder/index_binder.cpp +2 -1
- package/src/duckdb/src/planner/expression_binder/where_binder.cpp +3 -2
- package/src/duckdb/src/planner/operator/logical_create_table.cpp +1 -1
- package/src/duckdb/src/planner/operator/logical_delete.cpp +5 -5
- package/src/duckdb/src/planner/operator/logical_insert.cpp +6 -7
- package/src/duckdb/src/planner/operator/logical_update.cpp +6 -7
- package/src/duckdb/src/planner/parsed_data/bound_create_table_info.cpp +4 -5
- package/src/duckdb/src/planner/table_binding.cpp +6 -5
- package/src/duckdb/src/storage/compression/bitpacking.cpp +5 -6
- package/src/duckdb/src/storage/compression/dictionary_compression.cpp +5 -6
- package/src/duckdb/src/storage/compression/fsst.cpp +3 -5
- package/src/duckdb/src/storage/compression/rle.cpp +4 -6
- package/src/duckdb/src/storage/data_table.cpp +27 -28
- package/src/duckdb/src/storage/local_storage.cpp +70 -68
- package/src/duckdb/src/storage/storage_manager.cpp +12 -13
- package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +2 -2
- package/src/duckdb/src/storage/table/column_data.cpp +2 -2
- package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +18 -6
- package/src/duckdb/src/storage/table/column_segment.cpp +23 -24
- package/src/duckdb/src/storage/table/row_group.cpp +3 -3
- package/src/duckdb/src/storage/table/row_group_collection.cpp +1 -1
- package/src/duckdb/src/storage/table/update_segment.cpp +15 -15
- package/src/duckdb/src/storage/wal_replay.cpp +1 -1
- package/src/duckdb/src/transaction/cleanup_state.cpp +10 -10
- package/src/duckdb/src/transaction/commit_state.cpp +19 -19
- package/src/duckdb/src/transaction/duck_transaction.cpp +7 -7
- package/src/duckdb/src/transaction/rollback_state.cpp +1 -1
- package/src/duckdb/src/transaction/undo_buffer.cpp +2 -1
- package/src/duckdb/ub_src_common_adbc.cpp +4 -0
- package/src/duckdb/src/include/duckdb/common/single_thread_ptr.hpp +0 -185
@@ -18,10 +18,10 @@ namespace duckdb {
|
|
18
18
|
//===--------------------------------------------------------------------===//
|
19
19
|
// OptimisticDataWriter
|
20
20
|
//===--------------------------------------------------------------------===//
|
21
|
-
OptimisticDataWriter::OptimisticDataWriter(DataTable
|
21
|
+
OptimisticDataWriter::OptimisticDataWriter(DataTable &table) : table(table) {
|
22
22
|
}
|
23
23
|
|
24
|
-
OptimisticDataWriter::OptimisticDataWriter(DataTable
|
24
|
+
OptimisticDataWriter::OptimisticDataWriter(DataTable &table, OptimisticDataWriter &parent)
|
25
25
|
: table(table), partial_manager(std::move(parent.partial_manager)),
|
26
26
|
written_blocks(std::move(parent.written_blocks)) {
|
27
27
|
if (partial_manager) {
|
@@ -34,13 +34,13 @@ OptimisticDataWriter::~OptimisticDataWriter() {
|
|
34
34
|
|
35
35
|
bool OptimisticDataWriter::PrepareWrite() {
|
36
36
|
// check if we should pre-emptively write the table to disk
|
37
|
-
if (table
|
37
|
+
if (table.info->IsTemporary() || StorageManager::Get(table.info->db).InMemory()) {
|
38
38
|
return false;
|
39
39
|
}
|
40
40
|
// we should! write the second-to-last row group to disk
|
41
41
|
// allocate the partial block-manager if none is allocated yet
|
42
42
|
if (!partial_manager) {
|
43
|
-
auto &block_manager = table
|
43
|
+
auto &block_manager = table.info->table_io_manager->GetBlockManagerForRowData();
|
44
44
|
partial_manager = make_uniq<PartialBlockManager>(block_manager);
|
45
45
|
}
|
46
46
|
return true;
|
@@ -62,7 +62,7 @@ void OptimisticDataWriter::FlushToDisk(RowGroup *row_group) {
|
|
62
62
|
//! The set of column compression types (if any)
|
63
63
|
vector<CompressionType> compression_types;
|
64
64
|
D_ASSERT(compression_types.empty());
|
65
|
-
for (auto &column : table
|
65
|
+
for (auto &column : table.column_definitions) {
|
66
66
|
compression_types.push_back(column.CompressionType());
|
67
67
|
}
|
68
68
|
auto row_group_pointer = row_group->WriteToDisk(*partial_manager, compression_types);
|
@@ -102,7 +102,7 @@ void OptimisticDataWriter::Rollback() {
|
|
102
102
|
partial_manager.reset();
|
103
103
|
}
|
104
104
|
if (!written_blocks.empty()) {
|
105
|
-
auto &block_manager = table
|
105
|
+
auto &block_manager = table.info->table_io_manager->GetBlockManagerForRowData();
|
106
106
|
for (auto block_id : written_blocks) {
|
107
107
|
block_manager.MarkBlockAsFree(block_id);
|
108
108
|
}
|
@@ -113,7 +113,7 @@ void OptimisticDataWriter::Rollback() {
|
|
113
113
|
// Local Table Storage
|
114
114
|
//===--------------------------------------------------------------------===//
|
115
115
|
LocalTableStorage::LocalTableStorage(DataTable &table)
|
116
|
-
:
|
116
|
+
: table_ref(table), allocator(Allocator::Get(table.db)), deleted_rows(0), optimistic_writer(table) {
|
117
117
|
auto types = table.GetTypes();
|
118
118
|
row_groups = make_shared<RowGroupCollection>(table.info, TableIOManager::Get(table).GetBlockManagerForRowData(),
|
119
119
|
types, MAX_ROW_ID, 0);
|
@@ -138,26 +138,26 @@ LocalTableStorage::LocalTableStorage(DataTable &table)
|
|
138
138
|
LocalTableStorage::LocalTableStorage(ClientContext &context, DataTable &new_dt, LocalTableStorage &parent,
|
139
139
|
idx_t changed_idx, const LogicalType &target_type,
|
140
140
|
const vector<column_t> &bound_columns, Expression &cast_expr)
|
141
|
-
:
|
142
|
-
optimistic_writer(
|
141
|
+
: table_ref(new_dt), allocator(Allocator::Get(new_dt.db)), deleted_rows(parent.deleted_rows),
|
142
|
+
optimistic_writer(new_dt, parent.optimistic_writer), optimistic_writers(std::move(parent.optimistic_writers)) {
|
143
143
|
row_groups = parent.row_groups->AlterType(context, changed_idx, target_type, bound_columns, cast_expr);
|
144
144
|
parent.row_groups.reset();
|
145
145
|
indexes.Move(parent.indexes);
|
146
146
|
}
|
147
147
|
|
148
148
|
LocalTableStorage::LocalTableStorage(DataTable &new_dt, LocalTableStorage &parent, idx_t drop_idx)
|
149
|
-
:
|
150
|
-
optimistic_writer(
|
149
|
+
: table_ref(new_dt), allocator(Allocator::Get(new_dt.db)), deleted_rows(parent.deleted_rows),
|
150
|
+
optimistic_writer(new_dt, parent.optimistic_writer), optimistic_writers(std::move(parent.optimistic_writers)) {
|
151
151
|
row_groups = parent.row_groups->RemoveColumn(drop_idx);
|
152
152
|
parent.row_groups.reset();
|
153
153
|
indexes.Move(parent.indexes);
|
154
154
|
}
|
155
155
|
|
156
156
|
LocalTableStorage::LocalTableStorage(ClientContext &context, DataTable &new_dt, LocalTableStorage &parent,
|
157
|
-
ColumnDefinition &new_column, Expression
|
158
|
-
:
|
159
|
-
optimistic_writer(
|
160
|
-
row_groups = parent.row_groups->AddColumn(context, new_column, default_value);
|
157
|
+
ColumnDefinition &new_column, optional_ptr<Expression> default_value)
|
158
|
+
: table_ref(new_dt), allocator(Allocator::Get(new_dt.db)), deleted_rows(parent.deleted_rows),
|
159
|
+
optimistic_writer(new_dt, parent.optimistic_writer), optimistic_writers(std::move(parent.optimistic_writers)) {
|
160
|
+
row_groups = parent.row_groups->AddColumn(context, new_column, default_value.get());
|
161
161
|
parent.row_groups.reset();
|
162
162
|
indexes.Move(parent.indexes);
|
163
163
|
}
|
@@ -165,12 +165,12 @@ LocalTableStorage::LocalTableStorage(ClientContext &context, DataTable &new_dt,
|
|
165
165
|
LocalTableStorage::~LocalTableStorage() {
|
166
166
|
}
|
167
167
|
|
168
|
-
void LocalTableStorage::InitializeScan(CollectionScanState &state, TableFilterSet
|
168
|
+
void LocalTableStorage::InitializeScan(CollectionScanState &state, optional_ptr<TableFilterSet> table_filters) {
|
169
169
|
if (row_groups->GetTotalRows() == 0) {
|
170
170
|
// nothing to scan
|
171
171
|
return;
|
172
172
|
}
|
173
|
-
row_groups->InitializeScan(state, state.GetColumnIds(), table_filters);
|
173
|
+
row_groups->InitializeScan(state, state.GetColumnIds(), table_filters.get());
|
174
174
|
}
|
175
175
|
|
176
176
|
idx_t LocalTableStorage::EstimatedSize() {
|
@@ -228,25 +228,26 @@ PreservedError LocalTableStorage::AppendToIndexes(DuckTransaction &transaction,
|
|
228
228
|
|
229
229
|
void LocalTableStorage::AppendToIndexes(DuckTransaction &transaction, TableAppendState &append_state,
|
230
230
|
idx_t append_count, bool append_to_table) {
|
231
|
+
auto &table = table_ref.get();
|
231
232
|
if (append_to_table) {
|
232
|
-
table
|
233
|
+
table.InitializeAppend(transaction, append_state, append_count);
|
233
234
|
}
|
234
235
|
PreservedError error;
|
235
236
|
if (append_to_table) {
|
236
237
|
// appending: need to scan entire
|
237
238
|
row_groups->Scan(transaction, [&](DataChunk &chunk) -> bool {
|
238
239
|
// append this chunk to the indexes of the table
|
239
|
-
error = table
|
240
|
+
error = table.AppendToIndexes(chunk, append_state.current_row);
|
240
241
|
if (error) {
|
241
242
|
return false;
|
242
243
|
}
|
243
244
|
// append to base table
|
244
|
-
table
|
245
|
+
table.Append(chunk, append_state);
|
245
246
|
return true;
|
246
247
|
});
|
247
248
|
} else {
|
248
|
-
error =
|
249
|
-
|
249
|
+
error =
|
250
|
+
AppendToIndexes(transaction, *row_groups, table.info->indexes, table.GetTypes(), append_state.current_row);
|
250
251
|
}
|
251
252
|
if (error) {
|
252
253
|
// need to revert the append
|
@@ -255,7 +256,7 @@ void LocalTableStorage::AppendToIndexes(DuckTransaction &transaction, TableAppen
|
|
255
256
|
row_groups->Scan(transaction, [&](DataChunk &chunk) -> bool {
|
256
257
|
// append this chunk to the indexes of the table
|
257
258
|
try {
|
258
|
-
table
|
259
|
+
table.RemoveFromIndexes(append_state, chunk, current_row);
|
259
260
|
} catch (Exception &ex) {
|
260
261
|
error = PreservedError(ex);
|
261
262
|
return false;
|
@@ -272,16 +273,16 @@ void LocalTableStorage::AppendToIndexes(DuckTransaction &transaction, TableAppen
|
|
272
273
|
return true;
|
273
274
|
});
|
274
275
|
if (append_to_table) {
|
275
|
-
table
|
276
|
+
table.RevertAppendInternal(append_state.row_start, append_count);
|
276
277
|
}
|
277
278
|
error.Throw();
|
278
279
|
}
|
279
280
|
}
|
280
281
|
|
281
|
-
OptimisticDataWriter
|
282
|
-
auto writer = make_uniq<OptimisticDataWriter>(
|
282
|
+
OptimisticDataWriter &LocalTableStorage::CreateOptimisticWriter() {
|
283
|
+
auto writer = make_uniq<OptimisticDataWriter>(table_ref.get());
|
283
284
|
optimistic_writers.push_back(std::move(writer));
|
284
|
-
return optimistic_writers.back()
|
285
|
+
return *optimistic_writers.back();
|
285
286
|
}
|
286
287
|
|
287
288
|
void LocalTableStorage::Rollback() {
|
@@ -295,22 +296,22 @@ void LocalTableStorage::Rollback() {
|
|
295
296
|
//===--------------------------------------------------------------------===//
|
296
297
|
// LocalTableManager
|
297
298
|
//===--------------------------------------------------------------------===//
|
298
|
-
LocalTableStorage
|
299
|
+
optional_ptr<LocalTableStorage> LocalTableManager::GetStorage(DataTable &table) {
|
299
300
|
lock_guard<mutex> l(table_storage_lock);
|
300
301
|
auto entry = table_storage.find(table);
|
301
302
|
return entry == table_storage.end() ? nullptr : entry->second.get();
|
302
303
|
}
|
303
304
|
|
304
|
-
LocalTableStorage
|
305
|
+
LocalTableStorage &LocalTableManager::GetOrCreateStorage(DataTable &table) {
|
305
306
|
lock_guard<mutex> l(table_storage_lock);
|
306
307
|
auto entry = table_storage.find(table);
|
307
308
|
if (entry == table_storage.end()) {
|
308
|
-
auto new_storage = make_shared<LocalTableStorage>(
|
309
|
+
auto new_storage = make_shared<LocalTableStorage>(table);
|
309
310
|
auto storage = new_storage.get();
|
310
|
-
table_storage.insert(make_pair(table, std::move(new_storage)));
|
311
|
-
return storage;
|
311
|
+
table_storage.insert(make_pair(reference<DataTable>(table), std::move(new_storage)));
|
312
|
+
return *storage;
|
312
313
|
} else {
|
313
|
-
return entry->second.get();
|
314
|
+
return *entry->second.get();
|
314
315
|
}
|
315
316
|
}
|
316
317
|
|
@@ -319,7 +320,7 @@ bool LocalTableManager::IsEmpty() {
|
|
319
320
|
return table_storage.empty();
|
320
321
|
}
|
321
322
|
|
322
|
-
shared_ptr<LocalTableStorage> LocalTableManager::MoveEntry(DataTable
|
323
|
+
shared_ptr<LocalTableStorage> LocalTableManager::MoveEntry(DataTable &table) {
|
323
324
|
lock_guard<mutex> l(table_storage_lock);
|
324
325
|
auto entry = table_storage.find(table);
|
325
326
|
if (entry == table_storage.end()) {
|
@@ -330,7 +331,7 @@ shared_ptr<LocalTableStorage> LocalTableManager::MoveEntry(DataTable *table) {
|
|
330
331
|
return storage_entry;
|
331
332
|
}
|
332
333
|
|
333
|
-
|
334
|
+
reference_map_t<DataTable, shared_ptr<LocalTableStorage>> LocalTableManager::MoveEntries() {
|
334
335
|
lock_guard<mutex> l(table_storage_lock);
|
335
336
|
return std::move(table_storage);
|
336
337
|
}
|
@@ -344,7 +345,7 @@ idx_t LocalTableManager::EstimatedSize() {
|
|
344
345
|
return estimated_size;
|
345
346
|
}
|
346
347
|
|
347
|
-
void LocalTableManager::InsertEntry(DataTable
|
348
|
+
void LocalTableManager::InsertEntry(DataTable &table, shared_ptr<LocalTableStorage> entry) {
|
348
349
|
lock_guard<mutex> l(table_storage_lock);
|
349
350
|
D_ASSERT(table_storage.find(table) == table_storage.end());
|
350
351
|
table_storage[table] = std::move(entry);
|
@@ -375,7 +376,8 @@ LocalStorage &LocalStorage::Get(ClientContext &context, Catalog &catalog) {
|
|
375
376
|
return LocalStorage::Get(context, catalog.GetAttached());
|
376
377
|
}
|
377
378
|
|
378
|
-
void LocalStorage::InitializeScan(DataTable
|
379
|
+
void LocalStorage::InitializeScan(DataTable &table, CollectionScanState &state,
|
380
|
+
optional_ptr<TableFilterSet> table_filters) {
|
379
381
|
auto storage = table_manager.GetStorage(table);
|
380
382
|
if (storage == nullptr) {
|
381
383
|
return;
|
@@ -387,7 +389,7 @@ void LocalStorage::Scan(CollectionScanState &state, const vector<column_t> &colu
|
|
387
389
|
state.Scan(transaction, result);
|
388
390
|
}
|
389
391
|
|
390
|
-
void LocalStorage::InitializeParallelScan(DataTable
|
392
|
+
void LocalStorage::InitializeParallelScan(DataTable &table, ParallelCollectionScanState &state) {
|
391
393
|
auto storage = table_manager.GetStorage(table);
|
392
394
|
if (!storage) {
|
393
395
|
state.max_row = 0;
|
@@ -398,7 +400,7 @@ void LocalStorage::InitializeParallelScan(DataTable *table, ParallelCollectionSc
|
|
398
400
|
}
|
399
401
|
}
|
400
402
|
|
401
|
-
bool LocalStorage::NextParallelScan(ClientContext &context, DataTable
|
403
|
+
bool LocalStorage::NextParallelScan(ClientContext &context, DataTable &table, ParallelCollectionScanState &state,
|
402
404
|
CollectionScanState &scan_state) {
|
403
405
|
auto storage = table_manager.GetStorage(table);
|
404
406
|
if (!storage) {
|
@@ -407,8 +409,8 @@ bool LocalStorage::NextParallelScan(ClientContext &context, DataTable *table, Pa
|
|
407
409
|
return storage->row_groups->NextParallelScan(context, state, scan_state);
|
408
410
|
}
|
409
411
|
|
410
|
-
void LocalStorage::InitializeAppend(LocalAppendState &state, DataTable
|
411
|
-
state.storage = table_manager.GetOrCreateStorage(table);
|
412
|
+
void LocalStorage::InitializeAppend(LocalAppendState &state, DataTable &table) {
|
413
|
+
state.storage = &table_manager.GetOrCreateStorage(table);
|
412
414
|
state.storage->row_groups->InitializeAppend(TransactionData(transaction), state.append_state, 0);
|
413
415
|
}
|
414
416
|
|
@@ -434,29 +436,29 @@ void LocalStorage::FinalizeAppend(LocalAppendState &state) {
|
|
434
436
|
state.storage->row_groups->FinalizeAppend(state.append_state.transaction, state.append_state);
|
435
437
|
}
|
436
438
|
|
437
|
-
void LocalStorage::LocalMerge(DataTable
|
438
|
-
auto storage = table_manager.GetOrCreateStorage(table);
|
439
|
-
if (!storage
|
439
|
+
void LocalStorage::LocalMerge(DataTable &table, RowGroupCollection &collection) {
|
440
|
+
auto &storage = table_manager.GetOrCreateStorage(table);
|
441
|
+
if (!storage.indexes.Empty()) {
|
440
442
|
// append data to indexes if required
|
441
|
-
row_t base_id = MAX_ROW_ID + storage
|
442
|
-
auto error = storage
|
443
|
+
row_t base_id = MAX_ROW_ID + storage.row_groups->GetTotalRows();
|
444
|
+
auto error = storage.AppendToIndexes(transaction, collection, storage.indexes, table.GetTypes(), base_id);
|
443
445
|
if (error) {
|
444
446
|
error.Throw();
|
445
447
|
}
|
446
448
|
}
|
447
|
-
storage
|
449
|
+
storage.row_groups->MergeStorage(collection);
|
448
450
|
}
|
449
451
|
|
450
|
-
OptimisticDataWriter
|
451
|
-
auto storage = table_manager.GetOrCreateStorage(table);
|
452
|
-
return storage
|
452
|
+
OptimisticDataWriter &LocalStorage::CreateOptimisticWriter(DataTable &table) {
|
453
|
+
auto &storage = table_manager.GetOrCreateStorage(table);
|
454
|
+
return storage.CreateOptimisticWriter();
|
453
455
|
}
|
454
456
|
|
455
457
|
bool LocalStorage::ChangesMade() noexcept {
|
456
458
|
return !table_manager.IsEmpty();
|
457
459
|
}
|
458
460
|
|
459
|
-
bool LocalStorage::Find(DataTable
|
461
|
+
bool LocalStorage::Find(DataTable &table) {
|
460
462
|
return table_manager.GetStorage(table) != nullptr;
|
461
463
|
}
|
462
464
|
|
@@ -464,7 +466,7 @@ idx_t LocalStorage::EstimatedSize() {
|
|
464
466
|
return table_manager.EstimatedSize();
|
465
467
|
}
|
466
468
|
|
467
|
-
idx_t LocalStorage::Delete(DataTable
|
469
|
+
idx_t LocalStorage::Delete(DataTable &table, Vector &row_ids, idx_t count) {
|
468
470
|
auto storage = table_manager.GetStorage(table);
|
469
471
|
D_ASSERT(storage);
|
470
472
|
|
@@ -479,7 +481,7 @@ idx_t LocalStorage::Delete(DataTable *table, Vector &row_ids, idx_t count) {
|
|
479
481
|
return delete_count;
|
480
482
|
}
|
481
483
|
|
482
|
-
void LocalStorage::Update(DataTable
|
484
|
+
void LocalStorage::Update(DataTable &table, Vector &row_ids, const vector<PhysicalIndex> &column_ids,
|
483
485
|
DataChunk &updates) {
|
484
486
|
auto storage = table_manager.GetStorage(table);
|
485
487
|
D_ASSERT(storage);
|
@@ -517,7 +519,7 @@ void LocalStorage::Flush(DataTable &table, LocalTableStorage &storage) {
|
|
517
519
|
// append to the indexes and append to the base table
|
518
520
|
storage.AppendToIndexes(transaction, append_state, append_count, true);
|
519
521
|
}
|
520
|
-
transaction.PushAppend(
|
522
|
+
transaction.PushAppend(table, append_state.row_start, append_count);
|
521
523
|
}
|
522
524
|
|
523
525
|
void LocalStorage::Commit(LocalStorage::CommitState &commit_state, DuckTransaction &transaction) {
|
@@ -528,7 +530,7 @@ void LocalStorage::Commit(LocalStorage::CommitState &commit_state, DuckTransacti
|
|
528
530
|
for (auto &entry : table_storage) {
|
529
531
|
auto table = entry.first;
|
530
532
|
auto storage = entry.second.get();
|
531
|
-
Flush(
|
533
|
+
Flush(table, *storage);
|
532
534
|
|
533
535
|
entry.second.reset();
|
534
536
|
}
|
@@ -549,7 +551,7 @@ void LocalStorage::Rollback() {
|
|
549
551
|
}
|
550
552
|
}
|
551
553
|
|
552
|
-
idx_t LocalStorage::AddedRows(DataTable
|
554
|
+
idx_t LocalStorage::AddedRows(DataTable &table) {
|
553
555
|
auto storage = table_manager.GetStorage(table);
|
554
556
|
if (!storage) {
|
555
557
|
return 0;
|
@@ -557,39 +559,39 @@ idx_t LocalStorage::AddedRows(DataTable *table) {
|
|
557
559
|
return storage->row_groups->GetTotalRows() - storage->deleted_rows;
|
558
560
|
}
|
559
561
|
|
560
|
-
void LocalStorage::MoveStorage(DataTable
|
562
|
+
void LocalStorage::MoveStorage(DataTable &old_dt, DataTable &new_dt) {
|
561
563
|
// check if there are any pending appends for the old version of the table
|
562
564
|
auto new_storage = table_manager.MoveEntry(old_dt);
|
563
565
|
if (!new_storage) {
|
564
566
|
return;
|
565
567
|
}
|
566
568
|
// take over the storage from the old entry
|
567
|
-
new_storage->
|
569
|
+
new_storage->table_ref = new_dt;
|
568
570
|
table_manager.InsertEntry(new_dt, std::move(new_storage));
|
569
571
|
}
|
570
572
|
|
571
|
-
void LocalStorage::AddColumn(DataTable
|
572
|
-
Expression
|
573
|
+
void LocalStorage::AddColumn(DataTable &old_dt, DataTable &new_dt, ColumnDefinition &new_column,
|
574
|
+
optional_ptr<Expression> default_value) {
|
573
575
|
// check if there are any pending appends for the old version of the table
|
574
576
|
auto storage = table_manager.MoveEntry(old_dt);
|
575
577
|
if (!storage) {
|
576
578
|
return;
|
577
579
|
}
|
578
|
-
auto new_storage = make_shared<LocalTableStorage>(context,
|
580
|
+
auto new_storage = make_shared<LocalTableStorage>(context, new_dt, *storage, new_column, default_value);
|
579
581
|
table_manager.InsertEntry(new_dt, std::move(new_storage));
|
580
582
|
}
|
581
583
|
|
582
|
-
void LocalStorage::DropColumn(DataTable
|
584
|
+
void LocalStorage::DropColumn(DataTable &old_dt, DataTable &new_dt, idx_t removed_column) {
|
583
585
|
// check if there are any pending appends for the old version of the table
|
584
586
|
auto storage = table_manager.MoveEntry(old_dt);
|
585
587
|
if (!storage) {
|
586
588
|
return;
|
587
589
|
}
|
588
|
-
auto new_storage = make_shared<LocalTableStorage>(
|
590
|
+
auto new_storage = make_shared<LocalTableStorage>(new_dt, *storage, removed_column);
|
589
591
|
table_manager.InsertEntry(new_dt, std::move(new_storage));
|
590
592
|
}
|
591
593
|
|
592
|
-
void LocalStorage::ChangeType(DataTable
|
594
|
+
void LocalStorage::ChangeType(DataTable &old_dt, DataTable &new_dt, idx_t changed_idx, const LogicalType &target_type,
|
593
595
|
const vector<column_t> &bound_columns, Expression &cast_expr) {
|
594
596
|
// check if there are any pending appends for the old version of the table
|
595
597
|
auto storage = table_manager.MoveEntry(old_dt);
|
@@ -597,11 +599,11 @@ void LocalStorage::ChangeType(DataTable *old_dt, DataTable *new_dt, idx_t change
|
|
597
599
|
return;
|
598
600
|
}
|
599
601
|
auto new_storage =
|
600
|
-
make_shared<LocalTableStorage>(context,
|
602
|
+
make_shared<LocalTableStorage>(context, new_dt, *storage, changed_idx, target_type, bound_columns, cast_expr);
|
601
603
|
table_manager.InsertEntry(new_dt, std::move(new_storage));
|
602
604
|
}
|
603
605
|
|
604
|
-
void LocalStorage::FetchChunk(DataTable
|
606
|
+
void LocalStorage::FetchChunk(DataTable &table, Vector &row_ids, idx_t count, const vector<column_t> &col_ids,
|
605
607
|
DataChunk &chunk, ColumnFetchState &fetch_state) {
|
606
608
|
auto storage = table_manager.GetStorage(table);
|
607
609
|
if (!storage) {
|
@@ -611,7 +613,7 @@ void LocalStorage::FetchChunk(DataTable *table, Vector &row_ids, idx_t count, co
|
|
611
613
|
storage->row_groups->Fetch(transaction, chunk, col_ids, row_ids, count, fetch_state);
|
612
614
|
}
|
613
615
|
|
614
|
-
TableIndexList &LocalStorage::GetIndexes(DataTable
|
616
|
+
TableIndexList &LocalStorage::GetIndexes(DataTable &table) {
|
615
617
|
auto storage = table_manager.GetStorage(table);
|
616
618
|
if (!storage) {
|
617
619
|
throw InternalException("LocalStorage::GetIndexes - local storage not found");
|
@@ -620,7 +622,7 @@ TableIndexList &LocalStorage::GetIndexes(DataTable *table) {
|
|
620
622
|
}
|
621
623
|
|
622
624
|
void LocalStorage::VerifyNewConstraint(DataTable &parent, const BoundConstraint &constraint) {
|
623
|
-
auto storage = table_manager.GetStorage(
|
625
|
+
auto storage = table_manager.GetStorage(parent);
|
624
626
|
if (!storage) {
|
625
627
|
return;
|
626
628
|
}
|
@@ -143,12 +143,22 @@ void SingleFileStorageManager::LoadDatabase() {
|
|
143
143
|
class SingleFileStorageCommitState : public StorageCommitState {
|
144
144
|
idx_t initial_wal_size = 0;
|
145
145
|
idx_t initial_written = 0;
|
146
|
-
WriteAheadLog
|
146
|
+
optional_ptr<WriteAheadLog> log;
|
147
147
|
bool checkpoint;
|
148
148
|
|
149
149
|
public:
|
150
150
|
SingleFileStorageCommitState(StorageManager &storage_manager, bool checkpoint);
|
151
|
-
~SingleFileStorageCommitState() override
|
151
|
+
~SingleFileStorageCommitState() override {
|
152
|
+
// If log is non-null, then commit threw an exception before flushing.
|
153
|
+
if (log) {
|
154
|
+
auto &wal = *log.get();
|
155
|
+
wal.skip_writing = false;
|
156
|
+
if (wal.GetTotalWritten() > initial_written) {
|
157
|
+
// remove any entries written into the WAL by truncating it
|
158
|
+
wal.Truncate(initial_wal_size);
|
159
|
+
}
|
160
|
+
}
|
161
|
+
}
|
152
162
|
|
153
163
|
// Make the commit persistent
|
154
164
|
void FlushCommit() override;
|
@@ -189,17 +199,6 @@ void SingleFileStorageCommitState::FlushCommit() {
|
|
189
199
|
log = nullptr;
|
190
200
|
}
|
191
201
|
|
192
|
-
SingleFileStorageCommitState::~SingleFileStorageCommitState() {
|
193
|
-
// If log is non-null, then commit threw an exception before flushing.
|
194
|
-
if (log) {
|
195
|
-
log->skip_writing = false;
|
196
|
-
if (log->GetTotalWritten() > initial_written) {
|
197
|
-
// remove any entries written into the WAL by truncating it
|
198
|
-
log->Truncate(initial_wal_size);
|
199
|
-
}
|
200
|
-
}
|
201
|
-
}
|
202
|
-
|
203
202
|
unique_ptr<StorageCommitState> SingleFileStorageManager::GenStorageCommitState(Transaction &transaction,
|
204
203
|
bool checkpoint) {
|
205
204
|
return make_uniq<SingleFileStorageCommitState>(*this, checkpoint);
|
@@ -135,7 +135,7 @@ void ColumnCheckpointState::FlushSegment(unique_ptr<ColumnSegment> segment, idx_
|
|
135
135
|
// set up the compression function to constant
|
136
136
|
auto &config = DBConfig::GetConfig(db);
|
137
137
|
segment->function =
|
138
|
-
config.GetCompressionFunction(CompressionType::COMPRESSION_CONSTANT, segment->type.InternalType());
|
138
|
+
*config.GetCompressionFunction(CompressionType::COMPRESSION_CONSTANT, segment->type.InternalType());
|
139
139
|
segment->ConvertToPersistent(nullptr, INVALID_BLOCK);
|
140
140
|
}
|
141
141
|
|
@@ -149,7 +149,7 @@ void ColumnCheckpointState::FlushSegment(unique_ptr<ColumnSegment> segment, idx_
|
|
149
149
|
data_pointer.row_start = last_pointer.row_start + last_pointer.tuple_count;
|
150
150
|
}
|
151
151
|
data_pointer.tuple_count = tuple_count;
|
152
|
-
data_pointer.compression_type = segment->function
|
152
|
+
data_pointer.compression_type = segment->function.get().type;
|
153
153
|
|
154
154
|
// append the segment to the new segment tree
|
155
155
|
new_tree.AppendSegment(std::move(segment));
|
@@ -289,7 +289,7 @@ void ColumnData::InitializeAppend(ColumnAppendState &state) {
|
|
289
289
|
|
290
290
|
D_ASSERT(state.current->segment_type == ColumnSegmentType::TRANSIENT);
|
291
291
|
state.current->InitializeAppend(state);
|
292
|
-
D_ASSERT(state.current->function
|
292
|
+
D_ASSERT(state.current->function.get().append);
|
293
293
|
}
|
294
294
|
|
295
295
|
void ColumnData::AppendData(BaseStatistics &stats, ColumnAppendState &state, UnifiedVectorFormat &vdata, idx_t count) {
|
@@ -520,7 +520,7 @@ void ColumnData::GetStorageInfo(idx_t row_group_index, vector<idx_t> col_path, T
|
|
520
520
|
column_info.segment_type = type.ToString();
|
521
521
|
column_info.segment_start = segment->start;
|
522
522
|
column_info.segment_count = segment->count;
|
523
|
-
column_info.compression_type = CompressionTypeToString(segment->function
|
523
|
+
column_info.compression_type = CompressionTypeToString(segment->function.get().type);
|
524
524
|
column_info.segment_stats = segment->stats.statistics.ToString();
|
525
525
|
column_info.has_updates = updates ? true : false;
|
526
526
|
// persistent
|
@@ -14,7 +14,10 @@ ColumnDataCheckpointer::ColumnDataCheckpointer(ColumnData &col_data_p, RowGroup
|
|
14
14
|
intermediate(is_validity ? LogicalType::BOOLEAN : GetType(), true, is_validity),
|
15
15
|
checkpoint_info(checkpoint_info_p) {
|
16
16
|
auto &config = DBConfig::GetConfig(GetDatabase());
|
17
|
-
|
17
|
+
auto functions = config.GetCompressionFunctions(GetType().InternalType());
|
18
|
+
for (auto &func : functions) {
|
19
|
+
compression_functions.push_back(&func.get());
|
20
|
+
}
|
18
21
|
}
|
19
22
|
|
20
23
|
DatabaseInstance &ColumnDataCheckpointer::GetDatabase() {
|
@@ -58,13 +61,14 @@ void ColumnDataCheckpointer::ScanSegments(const std::function<void(Vector &, idx
|
|
58
61
|
}
|
59
62
|
}
|
60
63
|
|
61
|
-
CompressionType ForceCompression(vector<CompressionFunction
|
64
|
+
CompressionType ForceCompression(vector<optional_ptr<CompressionFunction>> &compression_functions,
|
62
65
|
CompressionType compression_type) {
|
63
66
|
// On of the force_compression flags has been set
|
64
67
|
// check if this compression method is available
|
65
68
|
bool found = false;
|
66
69
|
for (idx_t i = 0; i < compression_functions.size(); i++) {
|
67
|
-
|
70
|
+
auto &compression_function = *compression_functions[i];
|
71
|
+
if (compression_function.type == compression_type) {
|
68
72
|
found = true;
|
69
73
|
break;
|
70
74
|
}
|
@@ -74,10 +78,11 @@ CompressionType ForceCompression(vector<CompressionFunction *> &compression_func
|
|
74
78
|
// clear all other compression methods
|
75
79
|
// except the uncompressed method, so we can fall back on that
|
76
80
|
for (idx_t i = 0; i < compression_functions.size(); i++) {
|
77
|
-
|
81
|
+
auto &compression_function = *compression_functions[i];
|
82
|
+
if (compression_function.type == CompressionType::COMPRESSION_UNCOMPRESSED) {
|
78
83
|
continue;
|
79
84
|
}
|
80
|
-
if (
|
85
|
+
if (compression_function.type != compression_type) {
|
81
86
|
compression_functions[i] = nullptr;
|
82
87
|
}
|
83
88
|
}
|
@@ -225,7 +230,7 @@ void ColumnDataCheckpointer::WritePersistentSegments() {
|
|
225
230
|
pointer.block_pointer.offset = segment->GetBlockOffset();
|
226
231
|
pointer.row_start = segment->start;
|
227
232
|
pointer.tuple_count = segment->count;
|
228
|
-
pointer.compression_type = segment->function
|
233
|
+
pointer.compression_type = segment->function.get().type;
|
229
234
|
|
230
235
|
// merge the persistent stats into the global column stats
|
231
236
|
state.global_stats->Merge(segment->stats.statistics);
|
@@ -250,4 +255,11 @@ void ColumnDataCheckpointer::Checkpoint(vector<SegmentNode<ColumnSegment>> nodes
|
|
250
255
|
}
|
251
256
|
}
|
252
257
|
|
258
|
+
CompressionFunction &ColumnDataCheckpointer::GetCompressionFunction(CompressionType compression_type) {
|
259
|
+
auto &db = GetDatabase();
|
260
|
+
auto &column_type = GetType();
|
261
|
+
auto &config = DBConfig::GetConfig(db);
|
262
|
+
return *config.GetCompressionFunction(compression_type, column_type.InternalType());
|
263
|
+
}
|
264
|
+
|
253
265
|
} // namespace duckdb
|