duckdb 0.7.2-dev717.0 → 0.7.2-dev865.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 +2 -0
- package/lib/duckdb.d.ts +12 -1
- package/lib/duckdb.js +19 -0
- package/package.json +1 -1
- package/src/duckdb/extension/json/include/json_common.hpp +1 -0
- package/src/duckdb/extension/json/include/json_functions.hpp +1 -0
- package/src/duckdb/extension/json/include/json_serializer.hpp +77 -0
- package/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp +147 -0
- package/src/duckdb/extension/json/json_functions.cpp +1 -0
- package/src/duckdb/extension/json/json_scan.cpp +2 -2
- package/src/duckdb/extension/json/json_serializer.cpp +217 -0
- package/src/duckdb/src/catalog/catalog.cpp +21 -5
- package/src/duckdb/src/common/enums/expression_type.cpp +8 -222
- package/src/duckdb/src/common/enums/join_type.cpp +3 -22
- package/src/duckdb/src/common/exception.cpp +2 -2
- package/src/duckdb/src/common/serializer/enum_serializer.cpp +1172 -0
- package/src/duckdb/src/common/types/value.cpp +117 -93
- package/src/duckdb/src/common/types/vector.cpp +140 -1
- package/src/duckdb/src/common/types.cpp +166 -89
- package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +3 -0
- package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +5 -8
- package/src/duckdb/src/function/scalar/date/date_part.cpp +2 -2
- package/src/duckdb/src/function/scalar/date/date_trunc.cpp +2 -2
- package/src/duckdb/src/function/scalar/list/list_aggregates.cpp +1 -1
- package/src/duckdb/src/function/scalar/list/list_lambdas.cpp +4 -0
- package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +8 -8
- package/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp +243 -0
- package/src/duckdb/src/function/scalar/string/regexp/regexp_util.cpp +79 -0
- package/src/duckdb/src/function/scalar/string/regexp.cpp +21 -80
- package/src/duckdb/src/function/table/arrow_conversion.cpp +7 -1
- package/src/duckdb/src/function/table/table_scan.cpp +1 -1
- package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
- package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +3 -0
- package/src/duckdb/src/include/duckdb/common/enums/aggregate_handling.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/enums/expression_type.hpp +2 -3
- package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/enums/order_type.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/enums/set_operation_type.hpp +2 -1
- package/src/duckdb/src/include/duckdb/common/exception.hpp +40 -9
- package/src/duckdb/src/include/duckdb/common/preserved_error.hpp +3 -0
- package/src/duckdb/src/include/duckdb/common/serializer/enum_serializer.hpp +113 -0
- package/src/duckdb/src/include/duckdb/common/serializer/format_deserializer.hpp +336 -0
- package/src/duckdb/src/include/duckdb/common/serializer/format_serializer.hpp +268 -0
- package/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp +126 -0
- package/src/duckdb/src/include/duckdb/common/string_util.hpp +12 -0
- package/src/duckdb/src/include/duckdb/common/types/value.hpp +2 -31
- package/src/duckdb/src/include/duckdb/common/types/vector.hpp +3 -0
- package/src/duckdb/src/include/duckdb/common/types.hpp +8 -2
- package/src/duckdb/src/include/duckdb/function/scalar/regexp.hpp +81 -1
- package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +1 -0
- package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/between_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/expression/bound_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/case_expression.hpp +5 -0
- package/src/duckdb/src/include/duckdb/parser/expression/cast_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/collate_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/columnref_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/comparison_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/conjunction_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/constant_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/expression/default_expression.hpp +1 -0
- package/src/duckdb/src/include/duckdb/parser/expression/function_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/operator_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/parameter_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/star_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/subquery_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +5 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/sample_options.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_expression.hpp +5 -0
- package/src/duckdb/src/include/duckdb/parser/query_node/recursive_cte_node.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/query_node/select_node.hpp +5 -0
- package/src/duckdb/src/include/duckdb/parser/query_node/set_operation_node.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/query_node.hpp +11 -1
- package/src/duckdb/src/include/duckdb/parser/result_modifier.hpp +24 -1
- package/src/duckdb/src/include/duckdb/parser/sql_statement.hpp +2 -1
- package/src/duckdb/src/include/duckdb/parser/statement/select_statement.hpp +6 -1
- package/src/duckdb/src/include/duckdb/parser/tableref/basetableref.hpp +4 -0
- package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/tableref/expressionlistref.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/tableref/joinref.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/tableref/pivotref.hpp +9 -0
- package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/tableref/table_function_ref.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/tableref.hpp +3 -1
- package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats.hpp +9 -52
- package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats_union.hpp +62 -0
- package/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp +2 -1
- package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +6 -3
- package/src/duckdb/src/include/duckdb/storage/table/column_data_checkpointer.hpp +3 -2
- package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +5 -3
- package/src/duckdb/src/include/duckdb/storage/table/persistent_table_data.hpp +4 -1
- package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +6 -3
- package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +5 -3
- package/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp +37 -0
- package/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp +8 -1
- package/src/duckdb/src/include/duckdb/storage/table/segment_base.hpp +4 -3
- package/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +271 -26
- package/src/duckdb/src/main/extension/extension_install.cpp +7 -2
- package/src/duckdb/src/optimizer/deliminator.cpp +1 -1
- package/src/duckdb/src/optimizer/filter_combiner.cpp +1 -1
- package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +3 -3
- package/src/duckdb/src/optimizer/rule/move_constants.cpp +2 -2
- package/src/duckdb/src/optimizer/statistics/operator/propagate_filter.cpp +1 -1
- package/src/duckdb/src/parser/common_table_expression_info.cpp +19 -0
- package/src/duckdb/src/parser/expression/between_expression.cpp +17 -0
- package/src/duckdb/src/parser/expression/case_expression.cpp +28 -0
- package/src/duckdb/src/parser/expression/cast_expression.cpp +17 -0
- package/src/duckdb/src/parser/expression/collate_expression.cpp +16 -0
- package/src/duckdb/src/parser/expression/columnref_expression.cpp +15 -0
- package/src/duckdb/src/parser/expression/comparison_expression.cpp +16 -0
- package/src/duckdb/src/parser/expression/conjunction_expression.cpp +15 -0
- package/src/duckdb/src/parser/expression/constant_expression.cpp +14 -0
- package/src/duckdb/src/parser/expression/default_expression.cpp +7 -0
- package/src/duckdb/src/parser/expression/function_expression.cpp +35 -0
- package/src/duckdb/src/parser/expression/lambda_expression.cpp +16 -0
- package/src/duckdb/src/parser/expression/operator_expression.cpp +15 -0
- package/src/duckdb/src/parser/expression/parameter_expression.cpp +15 -0
- package/src/duckdb/src/parser/expression/positional_reference_expression.cpp +14 -0
- package/src/duckdb/src/parser/expression/star_expression.cpp +20 -0
- package/src/duckdb/src/parser/expression/subquery_expression.cpp +20 -0
- package/src/duckdb/src/parser/expression/window_expression.cpp +43 -0
- package/src/duckdb/src/parser/parsed_data/sample_options.cpp +22 -10
- package/src/duckdb/src/parser/parsed_expression.cpp +72 -0
- package/src/duckdb/src/parser/query_node/recursive_cte_node.cpp +21 -0
- package/src/duckdb/src/parser/query_node/select_node.cpp +31 -0
- package/src/duckdb/src/parser/query_node/set_operation_node.cpp +17 -0
- package/src/duckdb/src/parser/query_node.cpp +50 -0
- package/src/duckdb/src/parser/result_modifier.cpp +78 -0
- package/src/duckdb/src/parser/statement/select_statement.cpp +12 -0
- package/src/duckdb/src/parser/tableref/basetableref.cpp +21 -0
- package/src/duckdb/src/parser/tableref/emptytableref.cpp +4 -0
- package/src/duckdb/src/parser/tableref/expressionlistref.cpp +17 -0
- package/src/duckdb/src/parser/tableref/joinref.cpp +25 -0
- package/src/duckdb/src/parser/tableref/pivotref.cpp +53 -0
- package/src/duckdb/src/parser/tableref/subqueryref.cpp +15 -0
- package/src/duckdb/src/parser/tableref/table_function.cpp +17 -0
- package/src/duckdb/src/parser/tableref.cpp +46 -0
- package/src/duckdb/src/parser/transform/expression/transform_array_access.cpp +11 -0
- package/src/duckdb/src/parser/transform/expression/transform_bool_expr.cpp +1 -1
- package/src/duckdb/src/parser/transform/expression/transform_operator.cpp +1 -1
- package/src/duckdb/src/parser/transform/expression/transform_subquery.cpp +1 -1
- package/src/duckdb/src/planner/binder/expression/bind_function_expression.cpp +22 -4
- package/src/duckdb/src/planner/binder/expression/bind_subquery_expression.cpp +4 -0
- package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +1 -1
- package/src/duckdb/src/planner/expression/bound_expression.cpp +4 -0
- package/src/duckdb/src/storage/checkpoint/table_data_reader.cpp +3 -11
- package/src/duckdb/src/storage/checkpoint/table_data_writer.cpp +6 -0
- package/src/duckdb/src/storage/checkpoint_manager.cpp +1 -0
- package/src/duckdb/src/storage/compression/numeric_constant.cpp +2 -2
- package/src/duckdb/src/storage/data_table.cpp +1 -1
- package/src/duckdb/src/storage/statistics/numeric_stats.cpp +145 -83
- package/src/duckdb/src/storage/statistics/numeric_stats_union.cpp +65 -0
- package/src/duckdb/src/storage/storage_info.cpp +1 -1
- package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +1 -6
- package/src/duckdb/src/storage/table/column_data.cpp +29 -35
- package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +5 -5
- package/src/duckdb/src/storage/table/column_segment.cpp +8 -7
- package/src/duckdb/src/storage/table/list_column_data.cpp +2 -1
- package/src/duckdb/src/storage/table/persistent_table_data.cpp +2 -1
- package/src/duckdb/src/storage/table/row_group.cpp +9 -9
- package/src/duckdb/src/storage/table/row_group_collection.cpp +82 -66
- package/src/duckdb/src/storage/table/scan_state.cpp +22 -3
- package/src/duckdb/src/storage/table/standard_column_data.cpp +1 -0
- package/src/duckdb/src/storage/table/struct_column_data.cpp +1 -0
- package/src/duckdb/src/verification/deserialized_statement_verifier.cpp +0 -1
- package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +11780 -11512
- package/src/duckdb/third_party/re2/re2/re2.cc +9 -0
- package/src/duckdb/third_party/re2/re2/re2.h +2 -0
- package/src/duckdb/ub_extension_json_json_functions.cpp +2 -0
- package/src/duckdb/ub_src_common_serializer.cpp +2 -0
- package/src/duckdb/ub_src_function_scalar_string_regexp.cpp +4 -0
- package/src/duckdb/ub_src_parser.cpp +2 -0
- package/src/duckdb/ub_src_storage_statistics.cpp +2 -0
- package/src/duckdb/ub_src_storage_table.cpp +0 -2
- package/src/utils.cpp +12 -0
- package/test/extension.test.ts +44 -26
- package/src/duckdb/src/storage/table/segment_tree.cpp +0 -179
@@ -38,7 +38,7 @@ ColumnCheckpointState &ColumnDataCheckpointer::GetCheckpointState() {
|
|
38
38
|
void ColumnDataCheckpointer::ScanSegments(const std::function<void(Vector &, idx_t)> &callback) {
|
39
39
|
Vector scan_vector(intermediate.GetType(), nullptr);
|
40
40
|
for (idx_t segment_idx = 0; segment_idx < nodes.size(); segment_idx++) {
|
41
|
-
auto segment =
|
41
|
+
auto segment = nodes[segment_idx].node.get();
|
42
42
|
ColumnScanState scan_state;
|
43
43
|
scan_state.current = segment;
|
44
44
|
segment->InitializeScan(scan_state);
|
@@ -163,7 +163,7 @@ void ColumnDataCheckpointer::WriteToDisk() {
|
|
163
163
|
// since the segments will be rewritten their old on disk data is no longer required
|
164
164
|
auto &block_manager = col_data.block_manager;
|
165
165
|
for (idx_t segment_idx = 0; segment_idx < nodes.size(); segment_idx++) {
|
166
|
-
auto segment =
|
166
|
+
auto segment = nodes[segment_idx].node.get();
|
167
167
|
if (segment->segment_type == ColumnSegmentType::PERSISTENT) {
|
168
168
|
// persistent segment has updates: mark it as modified and rewrite the block with the merged updates
|
169
169
|
auto block_id = segment->GetBlockId();
|
@@ -194,7 +194,7 @@ void ColumnDataCheckpointer::WriteToDisk() {
|
|
194
194
|
|
195
195
|
bool ColumnDataCheckpointer::HasChanges() {
|
196
196
|
for (idx_t segment_idx = 0; segment_idx < nodes.size(); segment_idx++) {
|
197
|
-
auto segment =
|
197
|
+
auto segment = nodes[segment_idx].node.get();
|
198
198
|
if (segment->segment_type == ColumnSegmentType::TRANSIENT) {
|
199
199
|
// transient segment: always need to write to disk
|
200
200
|
return true;
|
@@ -214,7 +214,7 @@ void ColumnDataCheckpointer::WritePersistentSegments() {
|
|
214
214
|
// all segments are persistent and there are no updates
|
215
215
|
// we only need to write the metadata
|
216
216
|
for (idx_t segment_idx = 0; segment_idx < nodes.size(); segment_idx++) {
|
217
|
-
auto segment =
|
217
|
+
auto segment = nodes[segment_idx].node.get();
|
218
218
|
D_ASSERT(segment->segment_type == ColumnSegmentType::PERSISTENT);
|
219
219
|
|
220
220
|
// set up the data pointer directly using the data from the persistent segment
|
@@ -235,7 +235,7 @@ void ColumnDataCheckpointer::WritePersistentSegments() {
|
|
235
235
|
}
|
236
236
|
}
|
237
237
|
|
238
|
-
void ColumnDataCheckpointer::Checkpoint(vector<SegmentNode
|
238
|
+
void ColumnDataCheckpointer::Checkpoint(vector<SegmentNode<ColumnSegment>> nodes) {
|
239
239
|
D_ASSERT(!nodes.empty());
|
240
240
|
this->nodes = std::move(nodes);
|
241
241
|
// first check if any of the segments have changes
|
@@ -58,9 +58,10 @@ unique_ptr<ColumnSegment> ColumnSegment::CreateSegment(ColumnSegment &other, idx
|
|
58
58
|
ColumnSegment::ColumnSegment(DatabaseInstance &db, shared_ptr<BlockHandle> block, LogicalType type_p,
|
59
59
|
ColumnSegmentType segment_type, idx_t start, idx_t count, CompressionFunction *function_p,
|
60
60
|
BaseStatistics statistics, block_id_t block_id_p, idx_t offset_p, idx_t segment_size_p)
|
61
|
-
: SegmentBase(start, count), db(db), type(std::move(type_p)),
|
62
|
-
|
63
|
-
block_id(block_id_p), offset(offset_p),
|
61
|
+
: SegmentBase<ColumnSegment>(start, count), db(db), type(std::move(type_p)),
|
62
|
+
type_size(GetTypeIdSize(type.InternalType())), segment_type(segment_type), function(function_p),
|
63
|
+
stats(std::move(statistics)), block(std::move(block)), block_id(block_id_p), offset(offset_p),
|
64
|
+
segment_size(segment_size_p) {
|
64
65
|
D_ASSERT(function);
|
65
66
|
if (function->init_segment) {
|
66
67
|
segment_state = function->init_segment(*this, block_id);
|
@@ -68,10 +69,10 @@ ColumnSegment::ColumnSegment(DatabaseInstance &db, shared_ptr<BlockHandle> block
|
|
68
69
|
}
|
69
70
|
|
70
71
|
ColumnSegment::ColumnSegment(ColumnSegment &other, idx_t start)
|
71
|
-
: SegmentBase(start, other.count), db(other.db), type(std::move(other.type)),
|
72
|
-
|
73
|
-
block(std::move(other.block)), block_id(other.block_id), offset(other.offset),
|
74
|
-
segment_state(std::move(other.segment_state)) {
|
72
|
+
: SegmentBase<ColumnSegment>(start, other.count.load()), db(other.db), type(std::move(other.type)),
|
73
|
+
type_size(other.type_size), segment_type(other.segment_type), function(other.function),
|
74
|
+
stats(std::move(other.stats)), block(std::move(other.block)), block_id(other.block_id), offset(other.offset),
|
75
|
+
segment_size(other.segment_size), segment_state(std::move(other.segment_state)) {
|
75
76
|
}
|
76
77
|
|
77
78
|
ColumnSegment::~ColumnSegment() {
|
@@ -1,6 +1,7 @@
|
|
1
1
|
#include "duckdb/storage/table/list_column_data.hpp"
|
2
2
|
#include "duckdb/storage/statistics/list_stats.hpp"
|
3
3
|
#include "duckdb/transaction/transaction.hpp"
|
4
|
+
#include "duckdb/storage/table/column_checkpoint_state.hpp"
|
4
5
|
|
5
6
|
namespace duckdb {
|
6
7
|
|
@@ -40,7 +41,7 @@ void ListColumnData::InitializeScan(ColumnScanState &state) {
|
|
40
41
|
}
|
41
42
|
|
42
43
|
uint64_t ListColumnData::FetchListOffset(idx_t row_idx) {
|
43
|
-
auto segment =
|
44
|
+
auto segment = data.GetSegment(row_idx);
|
44
45
|
ColumnFetchState fetch_state;
|
45
46
|
Vector result(type, 1);
|
46
47
|
segment->FetchRow(fetch_state, row_idx, result, 0);
|
@@ -3,7 +3,8 @@
|
|
3
3
|
|
4
4
|
namespace duckdb {
|
5
5
|
|
6
|
-
PersistentTableData::PersistentTableData(idx_t column_count)
|
6
|
+
PersistentTableData::PersistentTableData(idx_t column_count)
|
7
|
+
: total_rows(0), row_group_count(0), block_id(INVALID_BLOCK), offset(0) {
|
7
8
|
}
|
8
9
|
|
9
10
|
PersistentTableData::~PersistentTableData() {
|
@@ -4,7 +4,7 @@
|
|
4
4
|
#include "duckdb/common/exception.hpp"
|
5
5
|
#include "duckdb/common/field_writer.hpp"
|
6
6
|
#include "duckdb/storage/table/column_data.hpp"
|
7
|
-
#include "duckdb/storage/table/
|
7
|
+
#include "duckdb/storage/table/column_checkpoint_state.hpp"
|
8
8
|
#include "duckdb/storage/table/update_segment.hpp"
|
9
9
|
#include "duckdb/common/chrono.hpp"
|
10
10
|
#include "duckdb/planner/table_filter.hpp"
|
@@ -23,14 +23,14 @@ constexpr const idx_t RowGroup::ROW_GROUP_SIZE;
|
|
23
23
|
|
24
24
|
RowGroup::RowGroup(AttachedDatabase &db, BlockManager &block_manager, DataTableInfo &table_info, idx_t start,
|
25
25
|
idx_t count)
|
26
|
-
: SegmentBase(start, count), db(db), block_manager(block_manager), table_info(table_info) {
|
26
|
+
: SegmentBase<RowGroup>(start, count), db(db), block_manager(block_manager), table_info(table_info) {
|
27
27
|
|
28
28
|
Verify();
|
29
29
|
}
|
30
30
|
|
31
31
|
RowGroup::RowGroup(AttachedDatabase &db, BlockManager &block_manager, DataTableInfo &table_info,
|
32
32
|
const vector<LogicalType> &types, RowGroupPointer &&pointer)
|
33
|
-
: SegmentBase(pointer.row_start, pointer.tuple_count), db(db), block_manager(block_manager),
|
33
|
+
: SegmentBase<RowGroup>(pointer.row_start, pointer.tuple_count), db(db), block_manager(block_manager),
|
34
34
|
table_info(table_info) {
|
35
35
|
// deserialize the columns
|
36
36
|
if (pointer.data_pointers.size() != types.size()) {
|
@@ -54,7 +54,7 @@ RowGroup::RowGroup(AttachedDatabase &db, BlockManager &block_manager, DataTableI
|
|
54
54
|
}
|
55
55
|
|
56
56
|
RowGroup::RowGroup(RowGroup &row_group, idx_t start)
|
57
|
-
: SegmentBase(start, row_group.count), db(row_group.db), block_manager(row_group.block_manager),
|
57
|
+
: SegmentBase<RowGroup>(start, row_group.count.load()), db(row_group.db), block_manager(row_group.block_manager),
|
58
58
|
table_info(row_group.table_info), version_info(std::move(row_group.version_info)),
|
59
59
|
stats(std::move(row_group.stats)) {
|
60
60
|
for (auto &column : row_group.columns) {
|
@@ -822,22 +822,22 @@ void RowGroup::Serialize(RowGroupPointer &pointer, Serializer &main_serializer)
|
|
822
822
|
writer.Finalize();
|
823
823
|
}
|
824
824
|
|
825
|
-
RowGroupPointer RowGroup::Deserialize(Deserializer &main_source, const
|
825
|
+
RowGroupPointer RowGroup::Deserialize(Deserializer &main_source, const vector<LogicalType> &columns) {
|
826
826
|
RowGroupPointer result;
|
827
827
|
|
828
828
|
FieldReader reader(main_source);
|
829
829
|
result.row_start = reader.ReadRequired<uint64_t>();
|
830
830
|
result.tuple_count = reader.ReadRequired<uint64_t>();
|
831
831
|
|
832
|
-
auto physical_columns = columns.
|
832
|
+
auto physical_columns = columns.size();
|
833
833
|
result.data_pointers.reserve(physical_columns);
|
834
834
|
result.statistics.reserve(physical_columns);
|
835
835
|
|
836
836
|
auto &source = reader.GetSource();
|
837
|
-
for (auto &
|
838
|
-
result.statistics.push_back(BaseStatistics::Deserialize(source,
|
837
|
+
for (auto &col_type : columns) {
|
838
|
+
result.statistics.push_back(BaseStatistics::Deserialize(source, col_type));
|
839
839
|
}
|
840
|
-
for (idx_t i = 0; i < columns.
|
840
|
+
for (idx_t i = 0; i < columns.size(); i++) {
|
841
841
|
BlockPointer pointer;
|
842
842
|
pointer.block_id = source.Read<block_id_t>();
|
843
843
|
pointer.offset = source.Read<uint64_t>();
|
@@ -6,14 +6,48 @@
|
|
6
6
|
#include "duckdb/transaction/transaction.hpp"
|
7
7
|
#include "duckdb/planner/constraints/bound_not_null_constraint.hpp"
|
8
8
|
#include "duckdb/storage/checkpoint/table_data_writer.hpp"
|
9
|
+
#include "duckdb/storage/table/row_group_segment_tree.hpp"
|
10
|
+
#include "duckdb/storage/meta_block_reader.hpp"
|
9
11
|
|
10
12
|
namespace duckdb {
|
11
13
|
|
14
|
+
//===--------------------------------------------------------------------===//
|
15
|
+
// Row Group Segment Tree
|
16
|
+
//===--------------------------------------------------------------------===//
|
17
|
+
RowGroupSegmentTree::RowGroupSegmentTree(DataTableInfo &table_info_p, BlockManager &block_manager_p,
|
18
|
+
vector<LogicalType> column_types_p)
|
19
|
+
: SegmentTree<RowGroup, true>(), info(table_info_p), block_manager(block_manager_p),
|
20
|
+
column_types(std::move(column_types_p)), current_row_group(0), max_row_group(0) {
|
21
|
+
}
|
22
|
+
RowGroupSegmentTree::~RowGroupSegmentTree() {
|
23
|
+
}
|
24
|
+
|
25
|
+
void RowGroupSegmentTree::Initialize(PersistentTableData &data) {
|
26
|
+
D_ASSERT(data.row_group_count > 0);
|
27
|
+
current_row_group = 0;
|
28
|
+
max_row_group = data.row_group_count;
|
29
|
+
finished_loading = false;
|
30
|
+
reader = make_unique<MetaBlockReader>(block_manager, data.block_id);
|
31
|
+
reader->offset = data.offset;
|
32
|
+
}
|
33
|
+
|
34
|
+
unique_ptr<RowGroup> RowGroupSegmentTree::LoadSegment() {
|
35
|
+
if (current_row_group >= max_row_group) {
|
36
|
+
finished_loading = true;
|
37
|
+
return nullptr;
|
38
|
+
}
|
39
|
+
auto row_group_pointer = RowGroup::Deserialize(*reader, column_types);
|
40
|
+
current_row_group++;
|
41
|
+
return make_unique<RowGroup>(info.db, block_manager, info, column_types, std::move(row_group_pointer));
|
42
|
+
}
|
43
|
+
//===--------------------------------------------------------------------===//
|
44
|
+
// Row Group Collection
|
45
|
+
//===--------------------------------------------------------------------===//
|
12
46
|
RowGroupCollection::RowGroupCollection(shared_ptr<DataTableInfo> info_p, BlockManager &block_manager,
|
13
47
|
vector<LogicalType> types_p, idx_t row_start_p, idx_t total_rows_p)
|
14
48
|
: block_manager(block_manager), total_rows(total_rows_p), info(std::move(info_p)), types(std::move(types_p)),
|
15
49
|
row_start(row_start_p) {
|
16
|
-
row_groups = make_shared<
|
50
|
+
row_groups = make_shared<RowGroupSegmentTree>(*info, block_manager, types);
|
17
51
|
}
|
18
52
|
|
19
53
|
idx_t RowGroupCollection::GetTotalRows() const {
|
@@ -34,14 +68,8 @@ Allocator &RowGroupCollection::GetAllocator() const {
|
|
34
68
|
void RowGroupCollection::Initialize(PersistentTableData &data) {
|
35
69
|
D_ASSERT(this->row_start == 0);
|
36
70
|
auto l = row_groups->Lock();
|
37
|
-
|
38
|
-
|
39
|
-
auto row_group_count = new_row_group->start + new_row_group->count;
|
40
|
-
if (row_group_count > this->total_rows) {
|
41
|
-
this->total_rows = row_group_count;
|
42
|
-
}
|
43
|
-
row_groups->AppendSegment(l, std::move(new_row_group));
|
44
|
-
}
|
71
|
+
this->total_rows = data.total_rows;
|
72
|
+
row_groups->Initialize(data);
|
45
73
|
stats.Initialize(types, data);
|
46
74
|
}
|
47
75
|
|
@@ -64,8 +92,7 @@ void RowGroupCollection::Verify() {
|
|
64
92
|
#ifdef DEBUG
|
65
93
|
idx_t current_total_rows = 0;
|
66
94
|
row_groups->Verify();
|
67
|
-
for (auto
|
68
|
-
auto &row_group = (RowGroup &)*segment;
|
95
|
+
for (auto &row_group : row_groups->Segments()) {
|
69
96
|
row_group.Verify();
|
70
97
|
D_ASSERT(row_group.start == this->row_start + current_total_rows);
|
71
98
|
current_total_rows += row_group.count;
|
@@ -79,11 +106,12 @@ void RowGroupCollection::Verify() {
|
|
79
106
|
//===--------------------------------------------------------------------===//
|
80
107
|
void RowGroupCollection::InitializeScan(CollectionScanState &state, const vector<column_t> &column_ids,
|
81
108
|
TableFilterSet *table_filters) {
|
82
|
-
auto row_group =
|
109
|
+
auto row_group = row_groups->GetRootSegment();
|
83
110
|
D_ASSERT(row_group);
|
111
|
+
state.row_groups = row_groups.get();
|
84
112
|
state.max_row = row_start + total_rows;
|
85
113
|
while (row_group && !row_group->InitializeScan(state.row_group_state)) {
|
86
|
-
row_group = (
|
114
|
+
row_group = row_groups->GetNextSegment(row_group);
|
87
115
|
}
|
88
116
|
}
|
89
117
|
|
@@ -93,8 +121,9 @@ void RowGroupCollection::InitializeCreateIndexScan(CreateIndexScanState &state)
|
|
93
121
|
|
94
122
|
void RowGroupCollection::InitializeScanWithOffset(CollectionScanState &state, const vector<column_t> &column_ids,
|
95
123
|
idx_t start_row, idx_t end_row) {
|
96
|
-
auto row_group =
|
124
|
+
auto row_group = row_groups->GetSegment(start_row);
|
97
125
|
D_ASSERT(row_group);
|
126
|
+
state.row_groups = row_groups.get();
|
98
127
|
state.max_row = end_row;
|
99
128
|
idx_t start_vector = (start_row - row_group->start) / STANDARD_VECTOR_SIZE;
|
100
129
|
if (!row_group->InitializeScanWithOffset(state.row_group_state, start_vector)) {
|
@@ -102,14 +131,17 @@ void RowGroupCollection::InitializeScanWithOffset(CollectionScanState &state, co
|
|
102
131
|
}
|
103
132
|
}
|
104
133
|
|
105
|
-
bool RowGroupCollection::InitializeScanInRowGroup(CollectionScanState &state,
|
134
|
+
bool RowGroupCollection::InitializeScanInRowGroup(CollectionScanState &state,
|
135
|
+
ParallelCollectionScanState ¶llel_state, idx_t vector_index,
|
106
136
|
idx_t max_row) {
|
107
137
|
state.max_row = max_row;
|
108
|
-
|
138
|
+
state.row_groups = parallel_state.collection->row_groups.get();
|
139
|
+
return parallel_state.current_row_group->InitializeScanWithOffset(state.row_group_state, vector_index);
|
109
140
|
}
|
110
141
|
|
111
142
|
void RowGroupCollection::InitializeParallelScan(ParallelCollectionScanState &state) {
|
112
|
-
state.
|
143
|
+
state.collection = this;
|
144
|
+
state.current_row_group = row_groups->GetRootSegment();
|
113
145
|
state.vector_index = 0;
|
114
146
|
state.max_row = row_start + total_rows;
|
115
147
|
state.batch_index = 0;
|
@@ -131,15 +163,15 @@ bool RowGroupCollection::NextParallelScan(ClientContext &context, ParallelCollec
|
|
131
163
|
max_row = state.current_row_group->start + state.current_row_group->count;
|
132
164
|
}
|
133
165
|
max_row = MinValue<idx_t>(max_row, state.max_row);
|
134
|
-
bool need_to_scan = InitializeScanInRowGroup(scan_state, state
|
166
|
+
bool need_to_scan = InitializeScanInRowGroup(scan_state, state, vector_index, max_row);
|
135
167
|
if (ClientConfig::GetConfig(context).verify_parallelism) {
|
136
168
|
state.vector_index++;
|
137
169
|
if (state.vector_index * STANDARD_VECTOR_SIZE >= state.current_row_group->count) {
|
138
|
-
state.current_row_group = (
|
170
|
+
state.current_row_group = row_groups->GetNextSegment(state.current_row_group);
|
139
171
|
state.vector_index = 0;
|
140
172
|
}
|
141
173
|
} else {
|
142
|
-
state.current_row_group = (
|
174
|
+
state.current_row_group = row_groups->GetNextSegment(state.current_row_group);
|
143
175
|
}
|
144
176
|
scan_state.batch_index = ++state.batch_index;
|
145
177
|
if (!need_to_scan) {
|
@@ -204,7 +236,7 @@ void RowGroupCollection::Fetch(TransactionData transaction, DataChunk &result, c
|
|
204
236
|
// in parallel append scenarios it is possible for the row_id
|
205
237
|
continue;
|
206
238
|
}
|
207
|
-
row_group =
|
239
|
+
row_group = row_groups->GetSegmentByIndex(l, segment_index);
|
208
240
|
}
|
209
241
|
if (!row_group->Fetch(transaction, row_id - row_group->start)) {
|
210
242
|
continue;
|
@@ -246,7 +278,7 @@ void RowGroupCollection::InitializeAppend(TransactionData transaction, TableAppe
|
|
246
278
|
// empty row group collection: empty first row group
|
247
279
|
AppendRowGroup(l, row_start);
|
248
280
|
}
|
249
|
-
state.start_row_group =
|
281
|
+
state.start_row_group = row_groups->GetLastSegment(l);
|
250
282
|
D_ASSERT(this->row_start + total_rows == state.start_row_group->start + state.start_row_group->count);
|
251
283
|
state.start_row_group->InitializeAppend(state.row_group_append_state);
|
252
284
|
state.remaining = append_count;
|
@@ -306,7 +338,7 @@ bool RowGroupCollection::Append(DataChunk &chunk, TableAppendState &state) {
|
|
306
338
|
auto l = row_groups->Lock();
|
307
339
|
AppendRowGroup(l, next_start);
|
308
340
|
// set up the append state for this row_group
|
309
|
-
auto last_row_group =
|
341
|
+
auto last_row_group = row_groups->GetLastSegment(l);
|
310
342
|
last_row_group->InitializeAppend(state.row_group_append_state);
|
311
343
|
if (state.remaining > 0) {
|
312
344
|
last_row_group->AppendVersionInfo(state.transaction, state.remaining);
|
@@ -331,7 +363,7 @@ void RowGroupCollection::FinalizeAppend(TransactionData transaction, TableAppend
|
|
331
363
|
auto append_count = MinValue<idx_t>(remaining, RowGroup::ROW_GROUP_SIZE - row_group->count);
|
332
364
|
row_group->AppendVersionInfo(transaction, append_count);
|
333
365
|
remaining -= append_count;
|
334
|
-
row_group = (
|
366
|
+
row_group = row_groups->GetNextSegment(row_group);
|
335
367
|
}
|
336
368
|
total_rows += state.total_append_count;
|
337
369
|
|
@@ -342,7 +374,7 @@ void RowGroupCollection::FinalizeAppend(TransactionData transaction, TableAppend
|
|
342
374
|
}
|
343
375
|
|
344
376
|
void RowGroupCollection::CommitAppend(transaction_t commit_id, idx_t row_start, idx_t count) {
|
345
|
-
auto row_group =
|
377
|
+
auto row_group = row_groups->GetSegment(row_start);
|
346
378
|
D_ASSERT(row_group);
|
347
379
|
idx_t current_row = row_start;
|
348
380
|
idx_t remaining = count;
|
@@ -357,7 +389,7 @@ void RowGroupCollection::CommitAppend(transaction_t commit_id, idx_t row_start,
|
|
357
389
|
if (remaining == 0) {
|
358
390
|
break;
|
359
391
|
}
|
360
|
-
row_group = (
|
392
|
+
row_group = row_groups->GetNextSegment(row_group);
|
361
393
|
}
|
362
394
|
}
|
363
395
|
|
@@ -371,7 +403,7 @@ void RowGroupCollection::RevertAppendInternal(idx_t start_row, idx_t count) {
|
|
371
403
|
// find the segment index that the current row belongs to
|
372
404
|
idx_t segment_index = row_groups->GetSegmentIndex(l, start_row);
|
373
405
|
auto segment = row_groups->GetSegmentByIndex(l, segment_index);
|
374
|
-
auto &info =
|
406
|
+
auto &info = *segment;
|
375
407
|
|
376
408
|
// remove any segments AFTER this segment: they should be deleted entirely
|
377
409
|
row_groups->EraseSegments(l, segment_index);
|
@@ -383,8 +415,7 @@ void RowGroupCollection::RevertAppendInternal(idx_t start_row, idx_t count) {
|
|
383
415
|
void RowGroupCollection::MergeStorage(RowGroupCollection &data) {
|
384
416
|
D_ASSERT(data.types == types);
|
385
417
|
auto index = row_start + total_rows.load();
|
386
|
-
for (auto
|
387
|
-
auto &row_group = (RowGroup &)*segment;
|
418
|
+
for (auto &row_group : data.row_groups->Segments()) {
|
388
419
|
auto new_group = make_unique<RowGroup>(row_group, index);
|
389
420
|
index += new_group->count;
|
390
421
|
row_groups->AppendSegment(std::move(new_group));
|
@@ -405,7 +436,7 @@ idx_t RowGroupCollection::Delete(TransactionData transaction, DataTable *table,
|
|
405
436
|
idx_t pos = 0;
|
406
437
|
do {
|
407
438
|
idx_t start = pos;
|
408
|
-
auto row_group =
|
439
|
+
auto row_group = row_groups->GetSegment(ids[start]);
|
409
440
|
for (pos++; pos < count; pos++) {
|
410
441
|
D_ASSERT(ids[pos] >= 0);
|
411
442
|
// check if this id still belongs to this row group
|
@@ -431,7 +462,7 @@ void RowGroupCollection::Update(TransactionData transaction, row_t *ids, const v
|
|
431
462
|
idx_t pos = 0;
|
432
463
|
do {
|
433
464
|
idx_t start = pos;
|
434
|
-
auto row_group =
|
465
|
+
auto row_group = row_groups->GetSegment(ids[pos]);
|
435
466
|
row_t base_id =
|
436
467
|
row_group->start + ((ids[pos] - row_group->start) / STANDARD_VECTOR_SIZE * STANDARD_VECTOR_SIZE);
|
437
468
|
row_t max_id = MinValue<row_t>(base_id + STANDARD_VECTOR_SIZE, row_group->start + row_group->count);
|
@@ -461,7 +492,7 @@ void RowGroupCollection::RemoveFromIndexes(TableIndexList &indexes, Vector &row_
|
|
461
492
|
auto row_ids = FlatVector::GetData<row_t>(row_identifiers);
|
462
493
|
|
463
494
|
// figure out which row_group to fetch from
|
464
|
-
auto row_group =
|
495
|
+
auto row_group = row_groups->GetSegment(row_ids[0]);
|
465
496
|
auto row_group_vector_idx = (row_ids[0] - row_group->start) / STANDARD_VECTOR_SIZE;
|
466
497
|
auto base_row_id = row_group_vector_idx * STANDARD_VECTOR_SIZE + row_group->start;
|
467
498
|
|
@@ -506,7 +537,7 @@ void RowGroupCollection::UpdateColumn(TransactionData transaction, Vector &row_i
|
|
506
537
|
}
|
507
538
|
// find the row_group this id belongs to
|
508
539
|
auto primary_column_idx = column_path[0];
|
509
|
-
auto row_group =
|
540
|
+
auto row_group = row_groups->GetSegment(first_id);
|
510
541
|
row_group->UpdateColumn(transaction, updates, row_ids, column_path);
|
511
542
|
|
512
543
|
row_group->MergeIntoStatistics(primary_column_idx, stats.GetStats(primary_column_idx).Statistics());
|
@@ -516,10 +547,9 @@ void RowGroupCollection::UpdateColumn(TransactionData transaction, Vector &row_i
|
|
516
547
|
// Checkpoint
|
517
548
|
//===--------------------------------------------------------------------===//
|
518
549
|
void RowGroupCollection::Checkpoint(TableDataWriter &writer, TableStatistics &global_stats) {
|
519
|
-
for (auto row_group
|
520
|
-
|
521
|
-
auto
|
522
|
-
auto pointer = row_group->Checkpoint(*rowg_writer, global_stats);
|
550
|
+
for (auto &row_group : row_groups->Segments()) {
|
551
|
+
auto rowg_writer = writer.GetRowGroupWriter(row_group);
|
552
|
+
auto pointer = row_group.Checkpoint(*rowg_writer, global_stats);
|
523
553
|
writer.AddRowGroup(std::move(pointer), std::move(rowg_writer));
|
524
554
|
}
|
525
555
|
}
|
@@ -528,18 +558,14 @@ void RowGroupCollection::Checkpoint(TableDataWriter &writer, TableStatistics &gl
|
|
528
558
|
// CommitDrop
|
529
559
|
//===--------------------------------------------------------------------===//
|
530
560
|
void RowGroupCollection::CommitDropColumn(idx_t index) {
|
531
|
-
auto
|
532
|
-
|
533
|
-
segment->CommitDropColumn(index);
|
534
|
-
segment = (RowGroup *)segment->Next();
|
561
|
+
for (auto &row_group : row_groups->Segments()) {
|
562
|
+
row_group.CommitDropColumn(index);
|
535
563
|
}
|
536
564
|
}
|
537
565
|
|
538
566
|
void RowGroupCollection::CommitDropTable() {
|
539
|
-
auto
|
540
|
-
|
541
|
-
segment->CommitDrop();
|
542
|
-
segment = (RowGroup *)segment->Next();
|
567
|
+
for (auto &row_group : row_groups->Segments()) {
|
568
|
+
row_group.CommitDrop();
|
543
569
|
}
|
544
570
|
}
|
545
571
|
|
@@ -547,13 +573,8 @@ void RowGroupCollection::CommitDropTable() {
|
|
547
573
|
// GetStorageInfo
|
548
574
|
//===--------------------------------------------------------------------===//
|
549
575
|
void RowGroupCollection::GetStorageInfo(TableStorageInfo &result) {
|
550
|
-
auto row_group
|
551
|
-
|
552
|
-
while (row_group) {
|
553
|
-
row_group->GetStorageInfo(row_group_index, result);
|
554
|
-
row_group_index++;
|
555
|
-
|
556
|
-
row_group = (RowGroup *)row_group->Next();
|
576
|
+
for (auto &row_group : row_groups->Segments()) {
|
577
|
+
row_group.GetStorageInfo(row_group.index, result);
|
557
578
|
}
|
558
579
|
}
|
559
580
|
|
@@ -582,14 +603,12 @@ shared_ptr<RowGroupCollection> RowGroupCollection::AddColumn(ClientContext &cont
|
|
582
603
|
|
583
604
|
// fill the column with its DEFAULT value, or NULL if none is specified
|
584
605
|
auto new_stats = make_unique<SegmentStatistics>(new_column.GetType());
|
585
|
-
auto current_row_group
|
586
|
-
|
587
|
-
auto new_row_group = current_row_group->AddColumn(new_column, executor, default_value, default_vector);
|
606
|
+
for (auto ¤t_row_group : row_groups->Segments()) {
|
607
|
+
auto new_row_group = current_row_group.AddColumn(new_column, executor, default_value, default_vector);
|
588
608
|
// merge in the statistics
|
589
609
|
new_row_group->MergeIntoStatistics(new_column_idx, new_column_stats.Statistics());
|
590
610
|
|
591
611
|
result->row_groups->AppendSegment(std::move(new_row_group));
|
592
|
-
current_row_group = (RowGroup *)current_row_group->Next();
|
593
612
|
}
|
594
613
|
return result;
|
595
614
|
}
|
@@ -603,11 +622,9 @@ shared_ptr<RowGroupCollection> RowGroupCollection::RemoveColumn(idx_t col_idx) {
|
|
603
622
|
make_shared<RowGroupCollection>(info, block_manager, std::move(new_types), row_start, total_rows.load());
|
604
623
|
result->stats.InitializeRemoveColumn(stats, col_idx);
|
605
624
|
|
606
|
-
auto current_row_group
|
607
|
-
|
608
|
-
auto new_row_group = current_row_group->RemoveColumn(col_idx);
|
625
|
+
for (auto ¤t_row_group : row_groups->Segments()) {
|
626
|
+
auto new_row_group = current_row_group.RemoveColumn(col_idx);
|
609
627
|
result->row_groups->AppendSegment(std::move(new_row_group));
|
610
|
-
current_row_group = (RowGroup *)current_row_group->Next();
|
611
628
|
}
|
612
629
|
return result;
|
613
630
|
}
|
@@ -642,14 +659,12 @@ shared_ptr<RowGroupCollection> RowGroupCollection::AlterType(ClientContext &cont
|
|
642
659
|
scan_state.table_state.max_row = row_start + total_rows;
|
643
660
|
|
644
661
|
// now alter the type of the column within all of the row_groups individually
|
645
|
-
auto current_row_group = (RowGroup *)row_groups->GetRootSegment();
|
646
662
|
auto &changed_stats = result->stats.GetStats(changed_idx);
|
647
|
-
|
648
|
-
auto new_row_group = current_row_group
|
649
|
-
|
663
|
+
for (auto ¤t_row_group : row_groups->Segments()) {
|
664
|
+
auto new_row_group = current_row_group.AlterType(target_type, changed_idx, executor,
|
665
|
+
scan_state.table_state.row_group_state, scan_chunk);
|
650
666
|
new_row_group->MergeIntoStatistics(changed_idx, changed_stats.Statistics());
|
651
667
|
result->row_groups->AppendSegment(std::move(new_row_group));
|
652
|
-
current_row_group = (RowGroup *)current_row_group->Next();
|
653
668
|
}
|
654
669
|
|
655
670
|
return result;
|
@@ -677,7 +692,8 @@ void RowGroupCollection::VerifyNewConstraint(DataTable &parent, const BoundConst
|
|
677
692
|
InitializeCreateIndexScan(state);
|
678
693
|
while (true) {
|
679
694
|
scan_chunk.Reset();
|
680
|
-
state.table_state.ScanCommitted(scan_chunk,
|
695
|
+
state.table_state.ScanCommitted(scan_chunk, state.segment_lock,
|
696
|
+
TableScanType::TABLE_SCAN_COMMITTED_ROWS_OMIT_PERMANENTLY_DELETED);
|
681
697
|
if (scan_chunk.size() == 0) {
|
682
698
|
break;
|
683
699
|
}
|
@@ -2,6 +2,9 @@
|
|
2
2
|
#include "duckdb/storage/table/row_group.hpp"
|
3
3
|
#include "duckdb/storage/table/column_segment.hpp"
|
4
4
|
#include "duckdb/transaction/duck_transaction.hpp"
|
5
|
+
#include "duckdb/storage/table/column_data.hpp"
|
6
|
+
#include "duckdb/storage/table/row_group_collection.hpp"
|
7
|
+
#include "duckdb/storage/table/row_group_segment_tree.hpp"
|
5
8
|
|
6
9
|
namespace duckdb {
|
7
10
|
|
@@ -35,7 +38,7 @@ void ColumnScanState::NextInternal(idx_t count) {
|
|
35
38
|
}
|
36
39
|
row_index += count;
|
37
40
|
while (row_index >= current->start + current->count) {
|
38
|
-
current = (
|
41
|
+
current = segment_tree->GetNextSegment(current);
|
39
42
|
initialized = false;
|
40
43
|
segment_checked = false;
|
41
44
|
if (!current) {
|
@@ -92,7 +95,7 @@ bool CollectionScanState::Scan(DuckTransaction &transaction, DataChunk &result)
|
|
92
95
|
return true;
|
93
96
|
} else {
|
94
97
|
do {
|
95
|
-
current_row_group = row_group_state.row_group = (
|
98
|
+
current_row_group = row_group_state.row_group = row_groups->GetNextSegment(current_row_group);
|
96
99
|
if (current_row_group) {
|
97
100
|
bool scan_row_group = current_row_group->InitializeScan(row_group_state);
|
98
101
|
if (scan_row_group) {
|
@@ -106,6 +109,22 @@ bool CollectionScanState::Scan(DuckTransaction &transaction, DataChunk &result)
|
|
106
109
|
return false;
|
107
110
|
}
|
108
111
|
|
112
|
+
bool CollectionScanState::ScanCommitted(DataChunk &result, SegmentLock &l, TableScanType type) {
|
113
|
+
auto current_row_group = row_group_state.row_group;
|
114
|
+
while (current_row_group) {
|
115
|
+
current_row_group->ScanCommitted(row_group_state, result, type);
|
116
|
+
if (result.size() > 0) {
|
117
|
+
return true;
|
118
|
+
} else {
|
119
|
+
current_row_group = row_group_state.row_group = row_groups->GetNextSegment(l, current_row_group);
|
120
|
+
if (current_row_group) {
|
121
|
+
current_row_group->InitializeScan(row_group_state);
|
122
|
+
}
|
123
|
+
}
|
124
|
+
}
|
125
|
+
return false;
|
126
|
+
}
|
127
|
+
|
109
128
|
bool CollectionScanState::ScanCommitted(DataChunk &result, TableScanType type) {
|
110
129
|
auto current_row_group = row_group_state.row_group;
|
111
130
|
while (current_row_group) {
|
@@ -113,7 +132,7 @@ bool CollectionScanState::ScanCommitted(DataChunk &result, TableScanType type) {
|
|
113
132
|
if (result.size() > 0) {
|
114
133
|
return true;
|
115
134
|
} else {
|
116
|
-
current_row_group = row_group_state.row_group = (
|
135
|
+
current_row_group = row_group_state.row_group = row_groups->GetNextSegment(current_row_group);
|
117
136
|
if (current_row_group) {
|
118
137
|
current_row_group->InitializeScan(row_group_state);
|
119
138
|
}
|