duckdb 0.7.2-dev2820.0 → 0.7.2-dev2995.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/extension/icu/icu-datepart.cpp +55 -1
- package/src/duckdb/extension/parquet/parquet-extension.cpp +5 -4
- package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +18 -7
- package/src/duckdb/src/catalog/default/default_functions.cpp +2 -0
- package/src/duckdb/src/common/arrow/arrow_appender.cpp +3 -3
- package/src/duckdb/src/common/arrow/arrow_converter.cpp +2 -2
- package/src/duckdb/src/common/local_file_system.cpp +1 -3
- package/src/duckdb/src/common/multi_file_reader.cpp +11 -8
- package/src/duckdb/src/common/sort/partition_state.cpp +1 -1
- package/src/duckdb/src/common/string_util.cpp +6 -1
- package/src/duckdb/src/core_functions/function_list.cpp +2 -0
- package/src/duckdb/src/core_functions/scalar/string/format_bytes.cpp +29 -0
- package/src/duckdb/src/execution/index/art/art.cpp +5 -1
- package/src/duckdb/src/execution/operator/aggregate/physical_hash_aggregate.cpp +62 -43
- package/src/duckdb/src/execution/operator/aggregate/physical_perfecthash_aggregate.cpp +17 -11
- package/src/duckdb/src/execution/operator/aggregate/physical_ungrouped_aggregate.cpp +32 -39
- package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +10 -9
- package/src/duckdb/src/execution/operator/helper/physical_batch_collector.cpp +4 -4
- package/src/duckdb/src/execution/operator/helper/physical_explain_analyze.cpp +6 -21
- package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +13 -13
- package/src/duckdb/src/execution/operator/helper/physical_limit_percent.cpp +15 -14
- package/src/duckdb/src/execution/operator/helper/physical_load.cpp +3 -2
- package/src/duckdb/src/execution/operator/helper/physical_materialized_collector.cpp +4 -4
- package/src/duckdb/src/execution/operator/helper/physical_pragma.cpp +4 -2
- package/src/duckdb/src/execution/operator/helper/physical_prepare.cpp +4 -2
- package/src/duckdb/src/execution/operator/helper/physical_reservoir_sample.cpp +10 -8
- package/src/duckdb/src/execution/operator/helper/physical_reset.cpp +4 -3
- package/src/duckdb/src/execution/operator/helper/physical_set.cpp +7 -6
- package/src/duckdb/src/execution/operator/helper/physical_transaction.cpp +4 -2
- package/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp +8 -8
- package/src/duckdb/src/execution/operator/join/physical_asof_join.cpp +17 -16
- package/src/duckdb/src/execution/operator/join/physical_blockwise_nl_join.cpp +10 -8
- package/src/duckdb/src/execution/operator/join/physical_cross_product.cpp +3 -4
- package/src/duckdb/src/execution/operator/join/physical_delim_join.cpp +5 -5
- package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +16 -15
- package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +13 -12
- package/src/duckdb/src/execution/operator/join/physical_nested_loop_join.cpp +12 -10
- package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +13 -11
- package/src/duckdb/src/execution/operator/join/physical_positional_join.cpp +8 -6
- package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +1 -1
- package/src/duckdb/src/execution/operator/order/physical_order.cpp +13 -13
- package/src/duckdb/src/execution/operator/order/physical_top_n.cpp +8 -8
- package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +160 -145
- package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +10 -25
- package/src/duckdb/src/execution/operator/persistent/physical_delete.cpp +14 -19
- package/src/duckdb/src/execution/operator/persistent/physical_export.cpp +7 -6
- package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +18 -30
- package/src/duckdb/src/execution/operator/persistent/physical_update.cpp +14 -18
- package/src/duckdb/src/execution/operator/scan/physical_column_data_scan.cpp +6 -4
- package/src/duckdb/src/execution/operator/scan/physical_dummy_scan.cpp +4 -19
- package/src/duckdb/src/execution/operator/scan/physical_empty_result.cpp +3 -2
- package/src/duckdb/src/execution/operator/scan/physical_positional_scan.cpp +14 -5
- package/src/duckdb/src/execution/operator/scan/physical_table_scan.cpp +6 -4
- package/src/duckdb/src/execution/operator/schema/physical_alter.cpp +3 -19
- package/src/duckdb/src/execution/operator/schema/physical_attach.cpp +4 -18
- package/src/duckdb/src/execution/operator/schema/physical_create_function.cpp +4 -19
- package/src/duckdb/src/execution/operator/schema/physical_create_index.cpp +8 -9
- package/src/duckdb/src/execution/operator/schema/physical_create_schema.cpp +4 -19
- package/src/duckdb/src/execution/operator/schema/physical_create_sequence.cpp +4 -19
- package/src/duckdb/src/execution/operator/schema/physical_create_table.cpp +4 -19
- package/src/duckdb/src/execution/operator/schema/physical_create_type.cpp +20 -28
- package/src/duckdb/src/execution/operator/schema/physical_create_view.cpp +4 -19
- package/src/duckdb/src/execution/operator/schema/physical_detach.cpp +4 -19
- package/src/duckdb/src/execution/operator/schema/physical_drop.cpp +3 -19
- package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +9 -8
- package/src/duckdb/src/execution/operator/set/physical_union.cpp +1 -1
- package/src/duckdb/src/execution/physical_operator.cpp +11 -5
- package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +16 -16
- package/src/duckdb/src/function/table/arrow_conversion.cpp +3 -3
- package/src/duckdb/src/function/table/read_csv.cpp +7 -4
- package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_catalog_entry.hpp +7 -1
- package/src/duckdb/src/include/duckdb/common/enums/operator_result_type.hpp +16 -4
- package/src/duckdb/src/include/duckdb/common/multi_file_reader.hpp +5 -4
- package/src/duckdb/src/include/duckdb/common/optional_idx.hpp +45 -0
- package/src/duckdb/src/include/duckdb/common/set.hpp +2 -1
- package/src/duckdb/src/include/duckdb/core_functions/scalar/string_functions.hpp +15 -0
- package/src/duckdb/src/include/duckdb/execution/executor.hpp +10 -1
- package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_hash_aggregate.hpp +5 -8
- package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_perfecthash_aggregate.hpp +2 -4
- package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_ungrouped_aggregate.hpp +3 -7
- package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_window.hpp +2 -4
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_batch_collector.hpp +1 -2
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_explain_analyze.hpp +2 -5
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_limit.hpp +2 -4
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_limit_percent.hpp +2 -4
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_load.hpp +1 -2
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_materialized_collector.hpp +1 -2
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_pragma.hpp +1 -2
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_prepare.hpp +1 -2
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_reservoir_sample.hpp +2 -4
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_reset.hpp +1 -2
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_set.hpp +1 -2
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_transaction.hpp +1 -2
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_vacuum.hpp +2 -4
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_asof_join.hpp +2 -4
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_blockwise_nl_join.hpp +2 -4
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_cross_product.hpp +1 -2
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_delim_join.hpp +1 -2
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_hash_join.hpp +2 -4
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_iejoin.hpp +2 -4
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_nested_loop_join.hpp +2 -4
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_piecewise_merge_join.hpp +2 -4
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_positional_join.hpp +2 -4
- package/src/duckdb/src/include/duckdb/execution/operator/order/physical_order.hpp +2 -4
- package/src/duckdb/src/include/duckdb/execution/operator/order/physical_top_n.hpp +2 -4
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_batch_insert.hpp +3 -5
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_copy_to_file.hpp +2 -5
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_delete.hpp +2 -4
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_export.hpp +2 -4
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_insert.hpp +2 -4
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_update.hpp +2 -4
- package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_column_data_scan.hpp +1 -2
- package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_dummy_scan.hpp +1 -3
- package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_empty_result.hpp +1 -2
- package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_positional_scan.hpp +1 -2
- package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_table_scan.hpp +1 -2
- package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_alter.hpp +1 -3
- package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_attach.hpp +1 -3
- package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_function.hpp +1 -3
- package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_index.hpp +2 -4
- package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_schema.hpp +1 -3
- package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_sequence.hpp +1 -3
- package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_table.hpp +1 -3
- package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_type.hpp +6 -5
- package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_view.hpp +1 -3
- package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_detach.hpp +1 -3
- package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_drop.hpp +1 -3
- package/src/duckdb/src/include/duckdb/execution/operator/set/physical_recursive_cte.hpp +2 -4
- package/src/duckdb/src/include/duckdb/execution/physical_operator.hpp +7 -4
- package/src/duckdb/src/include/duckdb/execution/physical_operator_states.hpp +26 -6
- package/src/duckdb/src/include/duckdb/execution/radix_partitioned_hashtable.hpp +5 -5
- package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +2 -1
- package/src/duckdb/src/include/duckdb/function/table_function.hpp +0 -1
- package/src/duckdb/src/include/duckdb/main/client_config.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/config.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/database.hpp +1 -0
- package/src/duckdb/src/include/duckdb/main/database_manager.hpp +3 -0
- package/src/duckdb/src/include/duckdb/main/extension_helper.hpp +0 -2
- package/src/duckdb/src/include/duckdb/parallel/event.hpp +1 -1
- package/src/duckdb/src/include/duckdb/parallel/interrupt.hpp +63 -0
- package/src/duckdb/src/include/duckdb/parallel/pipeline.hpp +16 -3
- package/src/duckdb/src/include/duckdb/parallel/pipeline_executor.hpp +51 -7
- package/src/duckdb/src/include/duckdb/parallel/task.hpp +21 -2
- package/src/duckdb/src/include/duckdb/parallel/task_counter.hpp +2 -2
- package/src/duckdb/src/include/duckdb/parallel/task_scheduler.hpp +2 -2
- package/src/duckdb/src/include/duckdb/parser/tableref/pivotref.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/transformer.hpp +5 -1
- package/src/duckdb/src/include/duckdb/planner/column_binding.hpp +6 -0
- package/src/duckdb/src/include/duckdb/planner/expression/bound_columnref_expression.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_aggregate.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_column_data_get.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_cteref.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_delete.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_delim_get.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_dummy_scan.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_expression_get.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_insert.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_pivot.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_projection.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_recursive_cte.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_set_operation.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_unnest.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_update.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_window.hpp +1 -0
- package/src/duckdb/src/include/duckdb/storage/data_table.hpp +1 -0
- package/src/duckdb/src/include/duckdb/storage/optimistic_data_writer.hpp +46 -0
- package/src/duckdb/src/include/duckdb/storage/partial_block_manager.hpp +24 -3
- package/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp +46 -1
- package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +9 -10
- package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/table/list_column_data.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +3 -3
- package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +1 -0
- package/src/duckdb/src/include/duckdb/storage/table/segment_base.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +22 -0
- package/src/duckdb/src/include/duckdb/storage/table/standard_column_data.hpp +3 -3
- package/src/duckdb/src/include/duckdb/storage/table/struct_column_data.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +0 -2
- package/src/duckdb/src/include/duckdb/storage/table/validity_column_data.hpp +1 -2
- package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +9 -34
- package/src/duckdb/src/include/duckdb/verification/no_operator_caching_verifier.hpp +25 -0
- package/src/duckdb/src/include/duckdb/verification/statement_verifier.hpp +5 -0
- package/src/duckdb/src/main/attached_database.cpp +5 -3
- package/src/duckdb/src/main/client_verify.cpp +4 -0
- package/src/duckdb/src/main/config.cpp +4 -0
- package/src/duckdb/src/main/database.cpp +45 -48
- package/src/duckdb/src/main/extension/extension_load.cpp +32 -49
- package/src/duckdb/src/parallel/event.cpp +1 -1
- package/src/duckdb/src/parallel/executor.cpp +39 -3
- package/src/duckdb/src/parallel/executor_task.cpp +11 -0
- package/src/duckdb/src/parallel/interrupt.cpp +57 -0
- package/src/duckdb/src/parallel/pipeline.cpp +49 -6
- package/src/duckdb/src/parallel/pipeline_executor.cpp +248 -69
- package/src/duckdb/src/parallel/pipeline_initialize_event.cpp +1 -1
- package/src/duckdb/src/parallel/task_scheduler.cpp +57 -22
- package/src/duckdb/src/parser/base_expression.cpp +6 -0
- package/src/duckdb/src/parser/transform/statement/transform_create_function.cpp +1 -4
- package/src/duckdb/src/parser/transform/statement/transform_create_view.cpp +2 -4
- package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +43 -24
- package/src/duckdb/src/parser/transform/tableref/transform_pivot.cpp +3 -0
- package/src/duckdb/src/planner/binder/statement/bind_create.cpp +17 -28
- package/src/duckdb/src/planner/expression/bound_columnref_expression.cpp +17 -3
- package/src/duckdb/src/planner/expression/bound_reference_expression.cpp +8 -2
- package/src/duckdb/src/planner/operator/logical_aggregate.cpp +13 -1
- package/src/duckdb/src/planner/operator/logical_column_data_get.cpp +11 -0
- package/src/duckdb/src/planner/operator/logical_cteref.cpp +11 -0
- package/src/duckdb/src/planner/operator/logical_delete.cpp +10 -0
- package/src/duckdb/src/planner/operator/logical_delim_get.cpp +12 -1
- package/src/duckdb/src/planner/operator/logical_dummy_scan.cpp +12 -1
- package/src/duckdb/src/planner/operator/logical_expression_get.cpp +12 -1
- package/src/duckdb/src/planner/operator/logical_get.cpp +10 -4
- package/src/duckdb/src/planner/operator/logical_insert.cpp +12 -1
- package/src/duckdb/src/planner/operator/logical_pivot.cpp +11 -0
- package/src/duckdb/src/planner/operator/logical_projection.cpp +11 -0
- package/src/duckdb/src/planner/operator/logical_recursive_cte.cpp +11 -0
- package/src/duckdb/src/planner/operator/logical_set_operation.cpp +11 -0
- package/src/duckdb/src/planner/operator/logical_unnest.cpp +12 -1
- package/src/duckdb/src/planner/operator/logical_update.cpp +10 -0
- package/src/duckdb/src/planner/operator/logical_window.cpp +11 -0
- package/src/duckdb/src/storage/checkpoint_manager.cpp +1 -1
- package/src/duckdb/src/storage/data_table.cpp +5 -0
- package/src/duckdb/src/storage/local_storage.cpp +40 -110
- package/src/duckdb/src/storage/optimistic_data_writer.cpp +96 -0
- package/src/duckdb/src/storage/partial_block_manager.cpp +73 -9
- package/src/duckdb/src/storage/single_file_block_manager.cpp +3 -1
- package/src/duckdb/src/storage/standard_buffer_manager.cpp +17 -12
- package/src/duckdb/src/storage/statistics/base_statistics.cpp +3 -0
- package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +90 -82
- package/src/duckdb/src/storage/table/column_data.cpp +19 -45
- package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +7 -7
- package/src/duckdb/src/storage/table/column_segment.cpp +1 -1
- package/src/duckdb/src/storage/table/list_column_data.cpp +6 -11
- package/src/duckdb/src/storage/table/row_group.cpp +13 -14
- package/src/duckdb/src/storage/table/row_group_collection.cpp +10 -4
- package/src/duckdb/src/storage/table/standard_column_data.cpp +6 -10
- package/src/duckdb/src/storage/table/struct_column_data.cpp +7 -13
- package/src/duckdb/src/storage/table/update_segment.cpp +0 -25
- package/src/duckdb/src/storage/table/validity_column_data.cpp +2 -6
- package/src/duckdb/src/transaction/commit_state.cpp +4 -4
- package/src/duckdb/src/verification/no_operator_caching_verifier.cpp +13 -0
- package/src/duckdb/src/verification/statement_verifier.cpp +4 -0
- package/src/duckdb/third_party/fmt/format.cc +0 -5
- package/src/duckdb/third_party/fmt/include/fmt/core.h +10 -12
- package/src/duckdb/third_party/fmt/include/fmt/format-inl.h +2 -33
- package/src/duckdb/third_party/fmt/include/fmt/format.h +61 -24
- package/src/duckdb/third_party/fmt/include/fmt/printf.h +15 -1
- package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +1 -0
- package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +10735 -10674
- package/src/duckdb/ub_src_core_functions_scalar_string.cpp +2 -0
- package/src/duckdb/ub_src_parallel.cpp +2 -0
- package/src/duckdb/ub_src_storage.cpp +2 -0
@@ -90,15 +90,18 @@ TempBufferPoolReservation StandardBufferManager::EvictBlocksOrThrow(idx_t memory
|
|
90
90
|
ARGS... args) {
|
91
91
|
auto r = buffer_pool.EvictBlocks(memory_delta, buffer_pool.maximum_memory, buffer);
|
92
92
|
if (!r.success) {
|
93
|
-
|
93
|
+
string extra_text = StringUtil::Format(" (%s/%s used)", StringUtil::BytesToHumanReadableString(GetUsedMemory()),
|
94
|
+
StringUtil::BytesToHumanReadableString(GetMaxMemory()));
|
95
|
+
extra_text += InMemoryWarning();
|
96
|
+
throw OutOfMemoryException(args..., extra_text);
|
94
97
|
}
|
95
98
|
return std::move(r.reservation);
|
96
99
|
}
|
97
100
|
|
98
101
|
shared_ptr<BlockHandle> StandardBufferManager::RegisterSmallMemory(idx_t block_size) {
|
99
102
|
D_ASSERT(block_size < Storage::BLOCK_SIZE);
|
100
|
-
auto res = EvictBlocksOrThrow(block_size, nullptr, "could not allocate block of
|
101
|
-
block_size
|
103
|
+
auto res = EvictBlocksOrThrow(block_size, nullptr, "could not allocate block of size %s%s",
|
104
|
+
StringUtil::BytesToHumanReadableString(block_size));
|
102
105
|
|
103
106
|
auto buffer = ConstructManagedBuffer(block_size, nullptr, FileBufferType::TINY_BUFFER);
|
104
107
|
|
@@ -112,9 +115,8 @@ shared_ptr<BlockHandle> StandardBufferManager::RegisterMemory(idx_t block_size,
|
|
112
115
|
auto alloc_size = GetAllocSize(block_size);
|
113
116
|
// first evict blocks until we have enough memory to store this buffer
|
114
117
|
unique_ptr<FileBuffer> reusable_buffer;
|
115
|
-
auto res =
|
116
|
-
|
117
|
-
alloc_size, GetUsedMemory(), GetMaxMemory());
|
118
|
+
auto res = EvictBlocksOrThrow(alloc_size, &reusable_buffer, "could not allocate block of size %s%s",
|
119
|
+
StringUtil::BytesToHumanReadableString(alloc_size));
|
118
120
|
|
119
121
|
auto buffer = ConstructManagedBuffer(block_size, std::move(reusable_buffer));
|
120
122
|
|
@@ -144,8 +146,9 @@ void StandardBufferManager::ReAllocate(shared_ptr<BlockHandle> &handle, idx_t bl
|
|
144
146
|
return;
|
145
147
|
} else if (memory_delta > 0) {
|
146
148
|
// evict blocks until we have space to resize this block
|
147
|
-
auto reservation = EvictBlocksOrThrow(memory_delta, nullptr, "failed to resize block from %
|
148
|
-
handle->memory_usage,
|
149
|
+
auto reservation = EvictBlocksOrThrow(memory_delta, nullptr, "failed to resize block from %s to %s%s",
|
150
|
+
StringUtil::BytesToHumanReadableString(handle->memory_usage),
|
151
|
+
StringUtil::BytesToHumanReadableString(req.alloc_size));
|
149
152
|
// EvictBlocks decrements 'current_memory' for us.
|
150
153
|
handle->memory_charge.Merge(std::move(reservation));
|
151
154
|
} else {
|
@@ -171,8 +174,8 @@ BufferHandle StandardBufferManager::Pin(shared_ptr<BlockHandle> &handle) {
|
|
171
174
|
}
|
172
175
|
// evict blocks until we have space for the current block
|
173
176
|
unique_ptr<FileBuffer> reusable_buffer;
|
174
|
-
auto reservation =
|
175
|
-
|
177
|
+
auto reservation = EvictBlocksOrThrow(required_memory, &reusable_buffer, "failed to pin block of size %s%s",
|
178
|
+
StringUtil::BytesToHumanReadableString(required_memory));
|
176
179
|
// lock the handle again and repeat the check (in case anybody loaded in the mean time)
|
177
180
|
lock_guard<mutex> lock(handle->lock);
|
178
181
|
// check if the block is already loaded
|
@@ -732,7 +735,8 @@ void StandardBufferManager::ReserveMemory(idx_t size) {
|
|
732
735
|
if (size == 0) {
|
733
736
|
return;
|
734
737
|
}
|
735
|
-
auto reservation = EvictBlocksOrThrow(size, nullptr, "failed to reserve memory data of size %
|
738
|
+
auto reservation = EvictBlocksOrThrow(size, nullptr, "failed to reserve memory data of size %s%s",
|
739
|
+
StringUtil::BytesToHumanReadableString(size));
|
736
740
|
reservation.size = 0;
|
737
741
|
}
|
738
742
|
|
@@ -748,7 +752,8 @@ void StandardBufferManager::FreeReservedMemory(idx_t size) {
|
|
748
752
|
//===--------------------------------------------------------------------===//
|
749
753
|
data_ptr_t StandardBufferManager::BufferAllocatorAllocate(PrivateAllocatorData *private_data, idx_t size) {
|
750
754
|
auto &data = (BufferAllocatorData &)*private_data;
|
751
|
-
auto reservation = data.manager.EvictBlocksOrThrow(size, nullptr, "failed to allocate data of size %
|
755
|
+
auto reservation = data.manager.EvictBlocksOrThrow(size, nullptr, "failed to allocate data of size %s%s",
|
756
|
+
StringUtil::BytesToHumanReadableString(size));
|
752
757
|
// We rely on manual tracking of this one. :(
|
753
758
|
reservation.size = 0;
|
754
759
|
return Allocator::Get(data.manager.db).AllocateData(size);
|
@@ -271,6 +271,7 @@ void BaseStatistics::Serialize(Serializer &serializer) const {
|
|
271
271
|
FieldWriter writer(serializer);
|
272
272
|
writer.WriteField<bool>(has_null);
|
273
273
|
writer.WriteField<bool>(has_no_null);
|
274
|
+
writer.WriteField<idx_t>(distinct_count);
|
274
275
|
Serialize(writer);
|
275
276
|
writer.Finalize();
|
276
277
|
}
|
@@ -316,9 +317,11 @@ BaseStatistics BaseStatistics::Deserialize(Deserializer &source, LogicalType typ
|
|
316
317
|
FieldReader reader(source);
|
317
318
|
bool has_null = reader.ReadRequired<bool>();
|
318
319
|
bool has_no_null = reader.ReadRequired<bool>();
|
320
|
+
idx_t distinct_count = reader.ReadRequired<idx_t>();
|
319
321
|
auto result = DeserializeType(reader, std::move(type));
|
320
322
|
result.has_null = has_null;
|
321
323
|
result.has_no_null = has_no_null;
|
324
|
+
result.distinct_count = distinct_count;
|
322
325
|
reader.Finalize();
|
323
326
|
return result;
|
324
327
|
}
|
@@ -22,86 +22,103 @@ unique_ptr<BaseStatistics> ColumnCheckpointState::GetStatistics() {
|
|
22
22
|
return std::move(global_stats);
|
23
23
|
}
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
};
|
31
|
-
|
32
|
-
public:
|
33
|
-
PartialBlockForCheckpoint(ColumnData *first_data, ColumnSegment *first_segment, BlockManager &block_manager,
|
34
|
-
PartialBlockState state)
|
35
|
-
: PartialBlock(state), first_data(first_data), first_segment(first_segment), block_manager(block_manager) {
|
36
|
-
}
|
25
|
+
PartialBlockForCheckpoint::PartialBlockForCheckpoint(ColumnData &data, ColumnSegment &segment,
|
26
|
+
BlockManager &block_manager, PartialBlockState state)
|
27
|
+
: PartialBlock(state), block_manager(block_manager), block(segment.block) {
|
28
|
+
AddSegmentToTail(data, segment, 0);
|
29
|
+
}
|
37
30
|
|
38
|
-
|
39
|
-
|
40
|
-
|
31
|
+
PartialBlockForCheckpoint::~PartialBlockForCheckpoint() {
|
32
|
+
D_ASSERT(IsFlushed() || Exception::UncaughtException());
|
33
|
+
}
|
41
34
|
|
42
|
-
|
43
|
-
//
|
44
|
-
|
45
|
-
|
46
|
-
// and all segments to have their references updated
|
47
|
-
// (via ColumnSegment::ConvertToPersistent)
|
48
|
-
ColumnData *first_data;
|
49
|
-
ColumnSegment *first_segment;
|
50
|
-
BlockManager &block_manager;
|
51
|
-
vector<PartialColumnSegment> tail_segments;
|
52
|
-
|
53
|
-
private:
|
54
|
-
struct UninitializedRegion {
|
55
|
-
idx_t start;
|
56
|
-
idx_t end;
|
57
|
-
};
|
58
|
-
vector<UninitializedRegion> uninitialized_regions;
|
59
|
-
|
60
|
-
public:
|
61
|
-
bool IsFlushed() {
|
62
|
-
// first_segment is zeroed on Flush
|
63
|
-
return !first_segment;
|
64
|
-
}
|
35
|
+
bool PartialBlockForCheckpoint::IsFlushed() {
|
36
|
+
// segments are cleared on Flush
|
37
|
+
return segments.empty();
|
38
|
+
}
|
65
39
|
|
66
|
-
|
67
|
-
|
68
|
-
|
40
|
+
void PartialBlockForCheckpoint::AddUninitializedRegion(idx_t start, idx_t end) {
|
41
|
+
uninitialized_regions.push_back({start, end});
|
42
|
+
}
|
69
43
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
// memset any free space at the end of the block to 0 prior to writing to disk
|
81
|
-
memset(handle.Ptr() + Storage::BLOCK_SIZE - free_space_left, 0, free_space_left);
|
44
|
+
void PartialBlockForCheckpoint::Flush(idx_t free_space_left) {
|
45
|
+
if (IsFlushed()) {
|
46
|
+
throw InternalException("Flush called on partial block that was already flushed");
|
47
|
+
}
|
48
|
+
// if we have any free space or uninitialized regions we need to zero-initialize them
|
49
|
+
if (free_space_left > 0 || !uninitialized_regions.empty()) {
|
50
|
+
auto handle = block_manager.buffer_manager.Pin(block);
|
51
|
+
// memset any uninitialized regions
|
52
|
+
for (auto &uninitialized : uninitialized_regions) {
|
53
|
+
memset(handle.Ptr() + uninitialized.start, 0, uninitialized.end - uninitialized.start);
|
82
54
|
}
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
55
|
+
// memset any free space at the end of the block to 0 prior to writing to disk
|
56
|
+
memset(handle.Ptr() + Storage::BLOCK_SIZE - free_space_left, 0, free_space_left);
|
57
|
+
}
|
58
|
+
// At this point, we've already copied all data from tail_segments
|
59
|
+
// into the page owned by first_segment. We flush all segment data to
|
60
|
+
// disk with the following call.
|
61
|
+
// persist the first segment to disk and point the remaining segments to the same block
|
62
|
+
bool fetch_new_block = state.block_id == INVALID_BLOCK;
|
63
|
+
if (fetch_new_block) {
|
64
|
+
state.block_id = block_manager.GetFreeBlockId();
|
65
|
+
}
|
66
|
+
for (idx_t i = 0; i < segments.size(); i++) {
|
67
|
+
auto &segment = segments[i];
|
68
|
+
segment.data.IncrementVersion();
|
69
|
+
if (i == 0) {
|
70
|
+
// the first segment is converted to persistent - this writes the data for ALL segments to disk
|
71
|
+
D_ASSERT(segment.offset_in_block == 0);
|
72
|
+
segment.segment.ConvertToPersistent(&block_manager, state.block_id);
|
73
|
+
// update the block after it has been converted to a persistent segment
|
74
|
+
block = segment.segment.block;
|
75
|
+
} else {
|
76
|
+
// subsequent segments are MARKED as persistent - they don't need to be rewritten
|
77
|
+
segment.segment.MarkAsPersistent(block, segment.offset_in_block);
|
78
|
+
if (fetch_new_block) {
|
79
|
+
// if we fetched a new block we need to increase the reference count to the block
|
80
|
+
block_manager.IncreaseBlockReferenceCount(state.block_id);
|
81
|
+
}
|
90
82
|
}
|
91
|
-
first_segment = nullptr;
|
92
|
-
tail_segments.clear();
|
93
83
|
}
|
84
|
+
Clear();
|
85
|
+
}
|
94
86
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
87
|
+
void PartialBlockForCheckpoint::Clear() {
|
88
|
+
uninitialized_regions.clear();
|
89
|
+
block.reset();
|
90
|
+
segments.clear();
|
91
|
+
}
|
92
|
+
|
93
|
+
void PartialBlockForCheckpoint::Merge(PartialBlock &other_p, idx_t offset, idx_t other_size) {
|
94
|
+
auto &other = other_p.Cast<PartialBlockForCheckpoint>();
|
95
|
+
|
96
|
+
auto &buffer_manager = block_manager.buffer_manager;
|
97
|
+
// pin the source block
|
98
|
+
auto old_handle = buffer_manager.Pin(other.block);
|
99
|
+
// pin the target block
|
100
|
+
auto new_handle = buffer_manager.Pin(block);
|
101
|
+
// memcpy the contents of the old block to the new block
|
102
|
+
memcpy(new_handle.Ptr() + offset, old_handle.Ptr(), other_size);
|
103
|
+
|
104
|
+
// now copy over all of the segments to the new block
|
105
|
+
// move over the uninitialized regions
|
106
|
+
for (auto ®ion : other.uninitialized_regions) {
|
107
|
+
region.start += offset;
|
108
|
+
region.end += offset;
|
109
|
+
uninitialized_regions.push_back(region);
|
99
110
|
}
|
100
111
|
|
101
|
-
|
102
|
-
|
112
|
+
// move over the segments
|
113
|
+
for (auto &segment : other.segments) {
|
114
|
+
AddSegmentToTail(segment.data, segment.segment, segment.offset_in_block + offset);
|
103
115
|
}
|
104
|
-
|
116
|
+
other.Clear();
|
117
|
+
}
|
118
|
+
|
119
|
+
void PartialBlockForCheckpoint::AddSegmentToTail(ColumnData &data, ColumnSegment &segment, uint32_t offset_in_block) {
|
120
|
+
segments.emplace_back(data, segment, offset_in_block);
|
121
|
+
}
|
105
122
|
|
106
123
|
void ColumnCheckpointState::FlushSegment(unique_ptr<ColumnSegment> segment, idx_t segment_size) {
|
107
124
|
D_ASSERT(segment_size <= Storage::BLOCK_SIZE);
|
@@ -128,14 +145,14 @@ void ColumnCheckpointState::FlushSegment(unique_ptr<ColumnSegment> segment, idx_
|
|
128
145
|
if (allocation.partial_block) {
|
129
146
|
// Use an existing block.
|
130
147
|
D_ASSERT(offset_in_block > 0);
|
131
|
-
auto pstate =
|
148
|
+
auto &pstate = allocation.partial_block->Cast<PartialBlockForCheckpoint>();
|
132
149
|
// pin the source block
|
133
150
|
auto old_handle = buffer_manager.Pin(segment->block);
|
134
151
|
// pin the target block
|
135
|
-
auto new_handle = buffer_manager.Pin(pstate
|
152
|
+
auto new_handle = buffer_manager.Pin(pstate.block);
|
136
153
|
// memcpy the contents of the old block to the new block
|
137
154
|
memcpy(new_handle.Ptr() + offset_in_block, old_handle.Ptr(), segment_size);
|
138
|
-
pstate
|
155
|
+
pstate.AddSegmentToTail(column_data, *segment, offset_in_block);
|
139
156
|
} else {
|
140
157
|
// Create a new block for future reuse.
|
141
158
|
if (segment->SegmentSize() != Storage::BLOCK_SIZE) {
|
@@ -146,7 +163,7 @@ void ColumnCheckpointState::FlushSegment(unique_ptr<ColumnSegment> segment, idx_
|
|
146
163
|
}
|
147
164
|
D_ASSERT(offset_in_block == 0);
|
148
165
|
allocation.partial_block = make_uniq<PartialBlockForCheckpoint>(
|
149
|
-
|
166
|
+
column_data, *segment, *allocation.block_manager, allocation.state);
|
150
167
|
}
|
151
168
|
// Writer will decide whether to reuse this block.
|
152
169
|
partial_block_manager.RegisterPartialBlock(std::move(allocation));
|
@@ -180,13 +197,4 @@ void ColumnCheckpointState::WriteDataPointers(RowGroupWriter &writer) {
|
|
180
197
|
writer.WriteColumnDataPointers(*this);
|
181
198
|
}
|
182
199
|
|
183
|
-
void ColumnCheckpointState::GetBlockIds(unordered_set<block_id_t> &result) {
|
184
|
-
for (auto &pointer : data_pointers) {
|
185
|
-
if (pointer.block_pointer.block_id == INVALID_BLOCK) {
|
186
|
-
continue;
|
187
|
-
}
|
188
|
-
result.insert(pointer.block_pointer.block_id);
|
189
|
-
}
|
190
|
-
}
|
191
|
-
|
192
200
|
} // namespace duckdb
|
@@ -21,7 +21,7 @@
|
|
21
21
|
namespace duckdb {
|
22
22
|
|
23
23
|
ColumnData::ColumnData(BlockManager &block_manager, DataTableInfo &info, idx_t column_index, idx_t start_row,
|
24
|
-
LogicalType type_p, ColumnData
|
24
|
+
LogicalType type_p, optional_ptr<ColumnData> parent)
|
25
25
|
: start(start_row), count(0), block_manager(block_manager), info(info), column_index(column_index),
|
26
26
|
type(std::move(type_p)), parent(parent), version(0) {
|
27
27
|
if (!parent) {
|
@@ -29,24 +29,17 @@ ColumnData::ColumnData(BlockManager &block_manager, DataTableInfo &info, idx_t c
|
|
29
29
|
}
|
30
30
|
}
|
31
31
|
|
32
|
-
ColumnData
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
updates = make_uniq<UpdateSegment>(*other.updates, *this);
|
38
|
-
}
|
39
|
-
if (other.stats) {
|
40
|
-
stats = make_uniq<SegmentStatistics>(other.stats->statistics.Copy());
|
41
|
-
}
|
32
|
+
ColumnData::~ColumnData() {
|
33
|
+
}
|
34
|
+
|
35
|
+
void ColumnData::SetStart(idx_t new_start) {
|
36
|
+
this->start = new_start;
|
42
37
|
idx_t offset = 0;
|
43
|
-
for (auto &segment :
|
44
|
-
|
38
|
+
for (auto &segment : data.Segments()) {
|
39
|
+
segment.start = start + offset;
|
45
40
|
offset += segment.count;
|
46
41
|
}
|
47
|
-
|
48
|
-
|
49
|
-
ColumnData::~ColumnData() {
|
42
|
+
data.Reinitialize();
|
50
43
|
}
|
51
44
|
|
52
45
|
DatabaseInstance &ColumnData::GetDatabase() const {
|
@@ -278,8 +271,8 @@ void ColumnData::InitializeAppend(ColumnAppendState &state) {
|
|
278
271
|
AppendTransientSegment(l, start);
|
279
272
|
}
|
280
273
|
auto segment = data.GetLastSegment(l);
|
281
|
-
if (segment->segment_type == ColumnSegmentType::PERSISTENT) {
|
282
|
-
//
|
274
|
+
if (segment->segment_type == ColumnSegmentType::PERSISTENT || !segment->function.get().init_append) {
|
275
|
+
// we cannot append to this segment - append a new segment
|
283
276
|
auto total_rows = segment->start + segment->count;
|
284
277
|
AppendTransientSegment(l, total_rows);
|
285
278
|
state.current = data.GetLastSegment(l);
|
@@ -418,9 +411,9 @@ unique_ptr<ColumnCheckpointState> ColumnData::CreateCheckpointState(RowGroup &ro
|
|
418
411
|
return make_uniq<ColumnCheckpointState>(row_group, *this, partial_block_manager);
|
419
412
|
}
|
420
413
|
|
421
|
-
void ColumnData::CheckpointScan(ColumnSegment
|
414
|
+
void ColumnData::CheckpointScan(ColumnSegment &segment, ColumnScanState &state, idx_t row_group_start, idx_t count,
|
422
415
|
Vector &scan_vector) {
|
423
|
-
segment
|
416
|
+
segment.Scan(state, count, scan_vector, 0, true);
|
424
417
|
if (updates) {
|
425
418
|
scan_vector.Flatten(count);
|
426
419
|
updates->FetchCommittedRange(state.row_index - row_group_start, count, scan_vector);
|
@@ -489,7 +482,7 @@ void ColumnData::DeserializeColumn(Deserializer &source) {
|
|
489
482
|
|
490
483
|
shared_ptr<ColumnData> ColumnData::Deserialize(BlockManager &block_manager, DataTableInfo &info, idx_t column_index,
|
491
484
|
idx_t start_row, Deserializer &source, const LogicalType &type,
|
492
|
-
ColumnData
|
485
|
+
optional_ptr<ColumnData> parent) {
|
493
486
|
auto entry = ColumnData::CreateColumn(block_manager, info, column_index, start_row, type, parent);
|
494
487
|
entry->DeserializeColumn(source);
|
495
488
|
return entry;
|
@@ -565,48 +558,29 @@ void ColumnData::Verify(RowGroup &parent) {
|
|
565
558
|
|
566
559
|
template <class RET, class OP>
|
567
560
|
static RET CreateColumnInternal(BlockManager &block_manager, DataTableInfo &info, idx_t column_index, idx_t start_row,
|
568
|
-
const LogicalType &type, ColumnData
|
561
|
+
const LogicalType &type, optional_ptr<ColumnData> parent) {
|
569
562
|
if (type.InternalType() == PhysicalType::STRUCT) {
|
570
563
|
return OP::template Create<StructColumnData>(block_manager, info, column_index, start_row, type, parent);
|
571
564
|
} else if (type.InternalType() == PhysicalType::LIST) {
|
572
565
|
return OP::template Create<ListColumnData>(block_manager, info, column_index, start_row, type, parent);
|
573
566
|
} else if (type.id() == LogicalTypeId::VALIDITY) {
|
574
|
-
return OP::template Create<ValidityColumnData>(block_manager, info, column_index, start_row, parent);
|
567
|
+
return OP::template Create<ValidityColumnData>(block_manager, info, column_index, start_row, *parent);
|
575
568
|
}
|
576
569
|
return OP::template Create<StandardColumnData>(block_manager, info, column_index, start_row, type, parent);
|
577
570
|
}
|
578
571
|
|
579
|
-
template <class RET, class OP>
|
580
|
-
static RET CreateColumnInternal(ColumnData &other, idx_t start_row, ColumnData *parent) {
|
581
|
-
if (other.type.InternalType() == PhysicalType::STRUCT) {
|
582
|
-
return OP::template Create<StructColumnData>(other, start_row, parent);
|
583
|
-
} else if (other.type.InternalType() == PhysicalType::LIST) {
|
584
|
-
return OP::template Create<ListColumnData>(other, start_row, parent);
|
585
|
-
} else if (other.type.id() == LogicalTypeId::VALIDITY) {
|
586
|
-
return OP::template Create<ValidityColumnData>(other, start_row, parent);
|
587
|
-
}
|
588
|
-
return OP::template Create<StandardColumnData>(other, start_row, parent);
|
589
|
-
}
|
590
|
-
|
591
572
|
shared_ptr<ColumnData> ColumnData::CreateColumn(BlockManager &block_manager, DataTableInfo &info, idx_t column_index,
|
592
|
-
idx_t start_row, const LogicalType &type,
|
573
|
+
idx_t start_row, const LogicalType &type,
|
574
|
+
optional_ptr<ColumnData> parent) {
|
593
575
|
return CreateColumnInternal<shared_ptr<ColumnData>, SharedConstructor>(block_manager, info, column_index, start_row,
|
594
576
|
type, parent);
|
595
577
|
}
|
596
578
|
|
597
|
-
shared_ptr<ColumnData> ColumnData::CreateColumn(ColumnData &other, idx_t start_row, ColumnData *parent) {
|
598
|
-
return CreateColumnInternal<shared_ptr<ColumnData>, SharedConstructor>(other, start_row, parent);
|
599
|
-
}
|
600
|
-
|
601
579
|
unique_ptr<ColumnData> ColumnData::CreateColumnUnique(BlockManager &block_manager, DataTableInfo &info,
|
602
580
|
idx_t column_index, idx_t start_row, const LogicalType &type,
|
603
|
-
ColumnData
|
581
|
+
optional_ptr<ColumnData> parent) {
|
604
582
|
return CreateColumnInternal<unique_ptr<ColumnData>, UniqueConstructor>(block_manager, info, column_index, start_row,
|
605
583
|
type, parent);
|
606
584
|
}
|
607
585
|
|
608
|
-
unique_ptr<ColumnData> ColumnData::CreateColumnUnique(ColumnData &other, idx_t start_row, ColumnData *parent) {
|
609
|
-
return CreateColumnInternal<unique_ptr<ColumnData>, UniqueConstructor>(other, start_row, parent);
|
610
|
-
}
|
611
|
-
|
612
586
|
} // namespace duckdb
|
@@ -43,16 +43,16 @@ ColumnCheckpointState &ColumnDataCheckpointer::GetCheckpointState() {
|
|
43
43
|
void ColumnDataCheckpointer::ScanSegments(const std::function<void(Vector &, idx_t)> &callback) {
|
44
44
|
Vector scan_vector(intermediate.GetType(), nullptr);
|
45
45
|
for (idx_t segment_idx = 0; segment_idx < nodes.size(); segment_idx++) {
|
46
|
-
auto segment = nodes[segment_idx].node
|
46
|
+
auto &segment = *nodes[segment_idx].node;
|
47
47
|
ColumnScanState scan_state;
|
48
|
-
scan_state.current = segment;
|
49
|
-
segment
|
48
|
+
scan_state.current = &segment;
|
49
|
+
segment.InitializeScan(scan_state);
|
50
50
|
|
51
|
-
for (idx_t base_row_index = 0; base_row_index < segment
|
51
|
+
for (idx_t base_row_index = 0; base_row_index < segment.count; base_row_index += STANDARD_VECTOR_SIZE) {
|
52
52
|
scan_vector.Reference(intermediate);
|
53
53
|
|
54
|
-
idx_t count = MinValue<idx_t>(segment
|
55
|
-
scan_state.row_index = segment
|
54
|
+
idx_t count = MinValue<idx_t>(segment.count - base_row_index, STANDARD_VECTOR_SIZE);
|
55
|
+
scan_state.row_index = segment.start + base_row_index;
|
56
56
|
|
57
57
|
col_data.CheckpointScan(segment, scan_state, row_group.start, count, scan_vector);
|
58
58
|
|
@@ -250,7 +250,7 @@ void ColumnDataCheckpointer::Checkpoint(vector<SegmentNode<ColumnSegment>> nodes
|
|
250
250
|
// no changes: only need to write the metadata for this column
|
251
251
|
WritePersistentSegments();
|
252
252
|
} else {
|
253
|
-
// there are changes: rewrite the set of columns
|
253
|
+
// there are changes: rewrite the set of columns);
|
254
254
|
WriteToDisk();
|
255
255
|
}
|
256
256
|
}
|
@@ -172,7 +172,7 @@ void ColumnSegment::RevertAppend(idx_t start_row) {
|
|
172
172
|
//===--------------------------------------------------------------------===//
|
173
173
|
// Convert To Persistent
|
174
174
|
//===--------------------------------------------------------------------===//
|
175
|
-
void ColumnSegment::ConvertToPersistent(BlockManager
|
175
|
+
void ColumnSegment::ConvertToPersistent(optional_ptr<BlockManager> block_manager, block_id_t block_id_p) {
|
176
176
|
D_ASSERT(segment_type == ColumnSegmentType::TRANSIENT);
|
177
177
|
segment_type = ColumnSegmentType::PERSISTENT;
|
178
178
|
|
@@ -8,19 +8,19 @@
|
|
8
8
|
namespace duckdb {
|
9
9
|
|
10
10
|
ListColumnData::ListColumnData(BlockManager &block_manager, DataTableInfo &info, idx_t column_index, idx_t start_row,
|
11
|
-
LogicalType type_p, ColumnData
|
11
|
+
LogicalType type_p, optional_ptr<ColumnData> parent)
|
12
12
|
: ColumnData(block_manager, info, column_index, start_row, std::move(type_p), parent),
|
13
|
-
validity(block_manager, info, 0, start_row, this) {
|
13
|
+
validity(block_manager, info, 0, start_row, *this) {
|
14
14
|
D_ASSERT(type.InternalType() == PhysicalType::LIST);
|
15
15
|
auto &child_type = ListType::GetChildType(type);
|
16
16
|
// the child column, with column index 1 (0 is the validity mask)
|
17
17
|
child_column = ColumnData::CreateColumnUnique(block_manager, info, 1, start_row, child_type, this);
|
18
18
|
}
|
19
19
|
|
20
|
-
ListColumnData::
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
void ListColumnData::SetStart(idx_t new_start) {
|
21
|
+
ColumnData::SetStart(new_start);
|
22
|
+
child_column->SetStart(new_start);
|
23
|
+
validity.SetStart(new_start);
|
24
24
|
}
|
25
25
|
|
26
26
|
bool ListColumnData::CheckZonemap(ColumnScanState &state, TableFilter &filter) {
|
@@ -322,11 +322,6 @@ public:
|
|
322
322
|
validity_state->WriteDataPointers(writer);
|
323
323
|
child_state->WriteDataPointers(writer);
|
324
324
|
}
|
325
|
-
void GetBlockIds(unordered_set<block_id_t> &result) override {
|
326
|
-
ColumnCheckpointState::GetBlockIds(result);
|
327
|
-
validity_state->GetBlockIds(result);
|
328
|
-
child_state->GetBlockIds(result);
|
329
|
-
}
|
330
325
|
};
|
331
326
|
|
332
327
|
unique_ptr<ColumnCheckpointState> ListColumnData::CreateCheckpointState(RowGroup &row_group,
|
@@ -45,16 +45,15 @@ RowGroup::RowGroup(RowGroupCollection &collection, RowGroupPointer &&pointer)
|
|
45
45
|
Verify();
|
46
46
|
}
|
47
47
|
|
48
|
-
RowGroup::
|
49
|
-
|
50
|
-
|
51
|
-
for (auto &column :
|
52
|
-
|
48
|
+
void RowGroup::MoveToCollection(RowGroupCollection &collection, idx_t new_start) {
|
49
|
+
this->collection = collection;
|
50
|
+
this->start = new_start;
|
51
|
+
for (auto &column : GetColumns()) {
|
52
|
+
column->SetStart(new_start);
|
53
53
|
}
|
54
54
|
if (version_info) {
|
55
|
-
version_info->SetStart(
|
55
|
+
version_info->SetStart(new_start);
|
56
56
|
}
|
57
|
-
Verify();
|
58
57
|
}
|
59
58
|
|
60
59
|
void VersionNode::SetStart(idx_t start) {
|
@@ -101,8 +100,8 @@ ColumnData &RowGroup::GetColumn(idx_t c) {
|
|
101
100
|
if (column_pointers.size() != columns.size()) {
|
102
101
|
throw InternalException("Lazy loading a column but the pointer was not set");
|
103
102
|
}
|
104
|
-
auto &block_manager =
|
105
|
-
auto &types =
|
103
|
+
auto &block_manager = GetCollection().GetBlockManager();
|
104
|
+
auto &types = GetCollection().GetTypes();
|
106
105
|
auto &block_pointer = column_pointers[c];
|
107
106
|
MetaBlockReader column_data_reader(block_manager, block_pointer.block_id);
|
108
107
|
column_data_reader.offset = block_pointer.offset;
|
@@ -113,14 +112,14 @@ ColumnData &RowGroup::GetColumn(idx_t c) {
|
|
113
112
|
}
|
114
113
|
|
115
114
|
DatabaseInstance &RowGroup::GetDatabase() {
|
116
|
-
return
|
115
|
+
return GetCollection().GetDatabase();
|
117
116
|
}
|
118
117
|
|
119
118
|
BlockManager &RowGroup::GetBlockManager() {
|
120
|
-
return
|
119
|
+
return GetCollection().GetBlockManager();
|
121
120
|
}
|
122
121
|
DataTableInfo &RowGroup::GetTableInfo() {
|
123
|
-
return
|
122
|
+
return GetCollection().GetTableInfo();
|
124
123
|
}
|
125
124
|
|
126
125
|
void RowGroup::InitializeEmpty(const vector<LogicalType> &types) {
|
@@ -231,7 +230,7 @@ unique_ptr<RowGroup> RowGroup::AlterType(RowGroupCollection &new_collection, con
|
|
231
230
|
column_data->InitializeAppend(append_state);
|
232
231
|
|
233
232
|
// scan the original table, and fill the new column with the transformed value
|
234
|
-
scan_state.Initialize(
|
233
|
+
scan_state.Initialize(GetCollection().GetTypes());
|
235
234
|
InitializeScan(scan_state);
|
236
235
|
|
237
236
|
DataChunk append_chunk;
|
@@ -537,7 +536,7 @@ void RowGroup::Scan(TransactionData transaction, CollectionScanState &state, Dat
|
|
537
536
|
}
|
538
537
|
|
539
538
|
void RowGroup::ScanCommitted(CollectionScanState &state, DataChunk &result, TableScanType type) {
|
540
|
-
auto &transaction_manager = DuckTransactionManager::Get(
|
539
|
+
auto &transaction_manager = DuckTransactionManager::Get(GetCollection().GetAttached());
|
541
540
|
|
542
541
|
auto lowest_active_start = transaction_manager.LowestActiveStart();
|
543
542
|
auto lowest_active_id = transaction_manager.LowestActiveId();
|
@@ -96,6 +96,10 @@ RowGroup *RowGroupCollection::GetRowGroup(int64_t index) {
|
|
96
96
|
return (RowGroup *)row_groups->GetSegmentByIndex(index);
|
97
97
|
}
|
98
98
|
|
99
|
+
idx_t RowGroupCollection::RowGroupCount() {
|
100
|
+
return row_groups->GetSegmentCount();
|
101
|
+
}
|
102
|
+
|
99
103
|
void RowGroupCollection::Verify() {
|
100
104
|
#ifdef DEBUG
|
101
105
|
idx_t current_total_rows = 0;
|
@@ -444,10 +448,12 @@ void RowGroupCollection::RevertAppendInternal(idx_t start_row, idx_t count) {
|
|
444
448
|
void RowGroupCollection::MergeStorage(RowGroupCollection &data) {
|
445
449
|
D_ASSERT(data.types == types);
|
446
450
|
auto index = row_start + total_rows.load();
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
+
auto segments = data.row_groups->MoveSegments();
|
452
|
+
for (auto &entry : segments) {
|
453
|
+
auto &row_group = entry.node;
|
454
|
+
row_group->MoveToCollection(*this, index);
|
455
|
+
index += row_group->count;
|
456
|
+
row_groups->AppendSegment(std::move(row_group));
|
451
457
|
}
|
452
458
|
stats.MergeStats(data.stats);
|
453
459
|
total_rows += data.total_rows.load();
|