duckdb 0.8.2-dev2669.0 → 0.8.2-dev2700.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/binding.gyp +1 -0
- package/package.json +1 -1
- package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +6 -6
- package/src/duckdb/src/common/field_writer.cpp +1 -0
- package/src/duckdb/src/common/local_file_system.cpp +5 -0
- package/src/duckdb/src/common/types/interval.cpp +3 -0
- package/src/duckdb/src/core_functions/aggregate/nested/list.cpp +6 -1
- package/src/duckdb/src/execution/index/art/art.cpp +6 -9
- package/src/duckdb/src/execution/index/art/leaf.cpp +4 -4
- package/src/duckdb/src/execution/index/art/node.cpp +9 -12
- package/src/duckdb/src/execution/index/art/node16.cpp +4 -4
- package/src/duckdb/src/execution/index/art/node256.cpp +4 -4
- package/src/duckdb/src/execution/index/art/node4.cpp +4 -5
- package/src/duckdb/src/execution/index/art/node48.cpp +4 -4
- package/src/duckdb/src/execution/index/art/prefix.cpp +4 -6
- package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/index_catalog_entry.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/index/art/leaf.hpp +4 -4
- package/src/duckdb/src/include/duckdb/execution/index/art/node.hpp +6 -4
- package/src/duckdb/src/include/duckdb/execution/index/art/node16.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/index/art/node256.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/index/art/node4.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/index/art/node48.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/index/art/prefix.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/block.hpp +27 -4
- package/src/duckdb/src/include/duckdb/storage/block_manager.hpp +9 -9
- package/src/duckdb/src/include/duckdb/storage/checkpoint/row_group_writer.hpp +5 -5
- package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_reader.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp +3 -3
- package/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp +19 -16
- package/src/duckdb/src/include/duckdb/storage/data_pointer.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/in_memory_block_manager.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/index.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/metadata/metadata_manager.hpp +88 -0
- package/src/duckdb/src/include/duckdb/storage/metadata/metadata_reader.hpp +54 -0
- package/src/duckdb/src/include/duckdb/storage/metadata/metadata_writer.hpp +45 -0
- package/src/duckdb/src/include/duckdb/storage/partial_block_manager.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/single_file_block_manager.hpp +6 -5
- package/src/duckdb/src/include/duckdb/storage/storage_info.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/storage_manager.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/table/persistent_table_data.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +2 -0
- package/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/table/table_index_list.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/table_io_manager.hpp +3 -0
- package/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +3 -4
- package/src/duckdb/src/parallel/executor.cpp +3 -0
- package/src/duckdb/src/storage/buffer/block_manager.cpp +10 -9
- package/src/duckdb/src/storage/checkpoint/row_group_writer.cpp +1 -1
- package/src/duckdb/src/storage/checkpoint/table_data_reader.cpp +3 -4
- package/src/duckdb/src/storage/checkpoint/table_data_writer.cpp +7 -7
- package/src/duckdb/src/storage/checkpoint_manager.cpp +49 -43
- package/src/duckdb/src/storage/index.cpp +1 -1
- package/src/duckdb/src/storage/metadata/metadata_manager.cpp +267 -0
- package/src/duckdb/src/storage/metadata/metadata_reader.cpp +80 -0
- package/src/duckdb/src/storage/metadata/metadata_writer.cpp +86 -0
- package/src/duckdb/src/storage/single_file_block_manager.cpp +47 -52
- package/src/duckdb/src/storage/storage_info.cpp +1 -1
- package/src/duckdb/src/storage/storage_manager.cpp +4 -3
- package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +3 -3
- package/src/duckdb/src/storage/table/persistent_table_data.cpp +1 -2
- package/src/duckdb/src/storage/table/row_group.cpp +9 -10
- package/src/duckdb/src/storage/table/row_group_collection.cpp +6 -3
- package/src/duckdb/src/storage/table_index_list.cpp +1 -1
- package/src/duckdb/src/storage/wal_replay.cpp +3 -2
- package/src/duckdb/src/storage/write_ahead_log.cpp +3 -2
- package/src/duckdb/ub_src_storage.cpp +0 -4
- package/src/duckdb/ub_src_storage_metadata.cpp +6 -0
- package/src/duckdb/src/include/duckdb/storage/meta_block_reader.hpp +0 -46
- package/src/duckdb/src/include/duckdb/storage/meta_block_writer.hpp +0 -50
- package/src/duckdb/src/storage/meta_block_reader.cpp +0 -69
- package/src/duckdb/src/storage/meta_block_writer.cpp +0 -80
package/binding.gyp
CHANGED
@@ -136,6 +136,7 @@
|
|
136
136
|
"src/duckdb/ub_src_storage_checkpoint.cpp",
|
137
137
|
"src/duckdb/ub_src_storage_compression.cpp",
|
138
138
|
"src/duckdb/ub_src_storage_compression_chimp.cpp",
|
139
|
+
"src/duckdb/ub_src_storage_metadata.cpp",
|
139
140
|
"src/duckdb/ub_src_storage_serialization.cpp",
|
140
141
|
"src/duckdb/ub_src_storage_statistics.cpp",
|
141
142
|
"src/duckdb/ub_src_storage_table.cpp",
|
package/package.json
CHANGED
@@ -23,7 +23,7 @@
|
|
23
23
|
namespace duckdb {
|
24
24
|
|
25
25
|
void AddDataTableIndex(DataTable &storage, const ColumnList &columns, const vector<PhysicalIndex> &keys,
|
26
|
-
IndexConstraintType constraint_type, BlockPointer
|
26
|
+
IndexConstraintType constraint_type, BlockPointer index_block = BlockPointer()) {
|
27
27
|
// fetch types and create expressions for the index from the columns
|
28
28
|
vector<column_t> column_ids;
|
29
29
|
vector<unique_ptr<Expression>> unbound_expressions;
|
@@ -41,9 +41,9 @@ void AddDataTableIndex(DataTable &storage, const ColumnList &columns, const vect
|
|
41
41
|
}
|
42
42
|
unique_ptr<ART> art;
|
43
43
|
// create an adaptive radix tree around the expressions
|
44
|
-
if (index_block) {
|
44
|
+
if (index_block.IsValid()) {
|
45
45
|
art = make_uniq<ART>(column_ids, TableIOManager::Get(storage), std::move(unbound_expressions), constraint_type,
|
46
|
-
storage.db, nullptr, index_block
|
46
|
+
storage.db, nullptr, index_block);
|
47
47
|
} else {
|
48
48
|
art = make_uniq<ART>(column_ids, TableIOManager::Get(storage), std::move(unbound_expressions), constraint_type,
|
49
49
|
storage.db);
|
@@ -55,7 +55,7 @@ void AddDataTableIndex(DataTable &storage, const ColumnList &columns, const vect
|
|
55
55
|
}
|
56
56
|
|
57
57
|
void AddDataTableIndex(DataTable &storage, const ColumnList &columns, vector<LogicalIndex> &keys,
|
58
|
-
IndexConstraintType constraint_type, BlockPointer
|
58
|
+
IndexConstraintType constraint_type, BlockPointer index_block = BlockPointer()) {
|
59
59
|
vector<PhysicalIndex> new_keys;
|
60
60
|
new_keys.reserve(keys.size());
|
61
61
|
for (auto &logical_key : keys) {
|
@@ -92,7 +92,7 @@ DuckTableEntry::DuckTableEntry(Catalog &catalog, SchemaCatalogEntry &schema, Bou
|
|
92
92
|
if (info.indexes.empty()) {
|
93
93
|
AddDataTableIndex(*storage, columns, unique.keys, constraint_type);
|
94
94
|
} else {
|
95
|
-
AddDataTableIndex(*storage, columns, unique.keys, constraint_type,
|
95
|
+
AddDataTableIndex(*storage, columns, unique.keys, constraint_type, info.indexes[indexes_idx++]);
|
96
96
|
}
|
97
97
|
} else if (constraint->type == ConstraintType::FOREIGN_KEY) {
|
98
98
|
// foreign key constraint: create a foreign key index
|
@@ -103,7 +103,7 @@ DuckTableEntry::DuckTableEntry(Catalog &catalog, SchemaCatalogEntry &schema, Bou
|
|
103
103
|
AddDataTableIndex(*storage, columns, bfk.info.fk_keys, IndexConstraintType::FOREIGN);
|
104
104
|
} else {
|
105
105
|
AddDataTableIndex(*storage, columns, bfk.info.fk_keys, IndexConstraintType::FOREIGN,
|
106
|
-
|
106
|
+
info.indexes[indexes_idx++]);
|
107
107
|
}
|
108
108
|
}
|
109
109
|
}
|
@@ -72,6 +72,7 @@ FieldReader::FieldReader(Deserializer &source_p) : source(source_p), field_count
|
|
72
72
|
max_field_count = source_p.Read<uint32_t>();
|
73
73
|
total_size = source_p.Read<uint64_t>();
|
74
74
|
D_ASSERT(max_field_count > 0);
|
75
|
+
D_ASSERT(total_size > 0);
|
75
76
|
source.SetRemainingData(total_size);
|
76
77
|
}
|
77
78
|
|
@@ -267,6 +267,11 @@ void LocalFileSystem::Read(FileHandle &handle, void *buffer, int64_t nr_bytes, i
|
|
267
267
|
if (bytes_read == -1) {
|
268
268
|
throw IOException("Could not read from file \"%s\": %s", handle.path, strerror(errno));
|
269
269
|
}
|
270
|
+
if (bytes_read == 0) {
|
271
|
+
throw IOException(
|
272
|
+
"Could not read enough bytes from file \"%s\": attempted to read %llu bytes from location %llu",
|
273
|
+
handle.path, nr_bytes, location);
|
274
|
+
}
|
270
275
|
read_buffer += bytes_read;
|
271
276
|
nr_bytes -= bytes_read;
|
272
277
|
}
|
@@ -77,7 +77,12 @@ static void ListCombineFunction(Vector &states_vector, Vector &combined, Aggrega
|
|
77
77
|
for (idx_t i = 0; i < count; i++) {
|
78
78
|
|
79
79
|
auto &state = *states_ptr[states_data.sel->get_index(i)];
|
80
|
-
|
80
|
+
if (state.linked_list.total_capacity == 0) {
|
81
|
+
// NULL, no need to append
|
82
|
+
// this can happen when adding a FILTER to the grouping, e.g.,
|
83
|
+
// LIST(i) FILTER (WHERE i <> 3)
|
84
|
+
continue;
|
85
|
+
}
|
81
86
|
|
82
87
|
if (combined_ptr[i]->linked_list.total_capacity == 0) {
|
83
88
|
combined_ptr[i]->linked_list = state.linked_list;
|
@@ -33,12 +33,9 @@ struct ARTIndexScanState : public IndexScanState {
|
|
33
33
|
|
34
34
|
ART::ART(const vector<column_t> &column_ids, TableIOManager &table_io_manager,
|
35
35
|
const vector<unique_ptr<Expression>> &unbound_expressions, const IndexConstraintType constraint_type,
|
36
|
-
AttachedDatabase &db, const shared_ptr<vector<FixedSizeAllocator>> &allocators_ptr,
|
37
|
-
const idx_t block_offset)
|
38
|
-
|
36
|
+
AttachedDatabase &db, const shared_ptr<vector<FixedSizeAllocator>> &allocators_ptr, BlockPointer pointer)
|
39
37
|
: Index(db, IndexType::ART, table_io_manager, column_ids, unbound_expressions, constraint_type),
|
40
38
|
allocators(allocators_ptr), owns_data(false) {
|
41
|
-
|
42
39
|
if (!Radix::IsLittleEndian()) {
|
43
40
|
throw NotImplementedException("ART indexes are not supported on big endian architectures");
|
44
41
|
}
|
@@ -57,12 +54,12 @@ ART::ART(const vector<column_t> &column_ids, TableIOManager &table_io_manager,
|
|
57
54
|
|
58
55
|
// set the root node of the tree
|
59
56
|
tree = make_uniq<Node>();
|
60
|
-
|
57
|
+
serialized_data_pointer = pointer;
|
58
|
+
if (pointer.IsValid()) {
|
61
59
|
tree->SetSerialized();
|
62
|
-
tree->SetPtr(block_id,
|
60
|
+
tree->SetPtr(pointer.block_id, pointer.offset);
|
63
61
|
tree->Deserialize(*this);
|
64
62
|
}
|
65
|
-
serialized_data_pointer = BlockPointer(block_id, block_offset);
|
66
63
|
|
67
64
|
// validate the types of the key columns
|
68
65
|
for (idx_t i = 0; i < types.size(); i++) {
|
@@ -974,13 +971,13 @@ void ART::CheckConstraintsForChunk(DataChunk &input, ConflictManager &conflict_m
|
|
974
971
|
// Serialization
|
975
972
|
//===--------------------------------------------------------------------===//
|
976
973
|
|
977
|
-
BlockPointer ART::Serialize(
|
974
|
+
BlockPointer ART::Serialize(MetadataWriter &writer) {
|
978
975
|
|
979
976
|
lock_guard<mutex> l(lock);
|
980
977
|
if (tree->IsSet()) {
|
981
978
|
serialized_data_pointer = tree->Serialize(*this, writer);
|
982
979
|
} else {
|
983
|
-
serialized_data_pointer =
|
980
|
+
serialized_data_pointer = BlockPointer();
|
984
981
|
}
|
985
982
|
|
986
983
|
return serialized_data_pointer;
|
@@ -2,8 +2,8 @@
|
|
2
2
|
|
3
3
|
#include "duckdb/execution/index/art/art.hpp"
|
4
4
|
#include "duckdb/execution/index/art/node.hpp"
|
5
|
-
#include "duckdb/storage/
|
6
|
-
#include "duckdb/storage/
|
5
|
+
#include "duckdb/storage/metadata/metadata_reader.hpp"
|
6
|
+
#include "duckdb/storage/metadata/metadata_writer.hpp"
|
7
7
|
|
8
8
|
namespace duckdb {
|
9
9
|
|
@@ -323,7 +323,7 @@ string Leaf::VerifyAndToString(ART &art, Node &node) {
|
|
323
323
|
return str;
|
324
324
|
}
|
325
325
|
|
326
|
-
BlockPointer Leaf::Serialize(ART &art, Node &node,
|
326
|
+
BlockPointer Leaf::Serialize(ART &art, Node &node, MetadataWriter &writer) {
|
327
327
|
|
328
328
|
if (node.GetType() == NType::LEAF_INLINED) {
|
329
329
|
auto block_pointer = writer.GetBlockPointer();
|
@@ -353,7 +353,7 @@ BlockPointer Leaf::Serialize(ART &art, Node &node, MetaBlockWriter &writer) {
|
|
353
353
|
return block_pointer;
|
354
354
|
}
|
355
355
|
|
356
|
-
void Leaf::Deserialize(ART &art, Node &node,
|
356
|
+
void Leaf::Deserialize(ART &art, Node &node, MetadataReader &reader) {
|
357
357
|
|
358
358
|
auto total_count = reader.Read<idx_t>();
|
359
359
|
reference<Node> ref_node(node);
|
@@ -9,8 +9,8 @@
|
|
9
9
|
#include "duckdb/execution/index/art/node4.hpp"
|
10
10
|
#include "duckdb/execution/index/art/leaf.hpp"
|
11
11
|
#include "duckdb/execution/index/art/prefix.hpp"
|
12
|
-
#include "duckdb/storage/
|
13
|
-
#include "duckdb/storage/
|
12
|
+
#include "duckdb/storage/metadata/metadata_reader.hpp"
|
13
|
+
#include "duckdb/storage/metadata/metadata_writer.hpp"
|
14
14
|
#include "duckdb/storage/table_io_manager.hpp"
|
15
15
|
|
16
16
|
namespace duckdb {
|
@@ -19,13 +19,12 @@ namespace duckdb {
|
|
19
19
|
// Constructors / Destructors
|
20
20
|
//===--------------------------------------------------------------------===//
|
21
21
|
|
22
|
-
Node::Node(
|
23
|
-
|
24
|
-
idx_t block_id = reader.Read<block_id_t>();
|
22
|
+
Node::Node(MetadataReader &reader) {
|
23
|
+
block_id_t block_id = reader.Read<block_id_t>();
|
25
24
|
auto offset = reader.Read<uint32_t>();
|
26
25
|
Reset();
|
27
26
|
|
28
|
-
if (block_id ==
|
27
|
+
if (block_id == INVALID_BLOCK) {
|
29
28
|
return;
|
30
29
|
}
|
31
30
|
|
@@ -223,10 +222,9 @@ optional_ptr<Node> Node::GetNextChild(ART &art, uint8_t &byte, const bool deseri
|
|
223
222
|
// (De)serialization
|
224
223
|
//===--------------------------------------------------------------------===//
|
225
224
|
|
226
|
-
BlockPointer Node::Serialize(ART &art,
|
227
|
-
|
225
|
+
BlockPointer Node::Serialize(ART &art, MetadataWriter &writer) {
|
228
226
|
if (!IsSet()) {
|
229
|
-
return
|
227
|
+
return BlockPointer();
|
230
228
|
}
|
231
229
|
if (IsSerialized()) {
|
232
230
|
Deserialize(art);
|
@@ -254,11 +252,10 @@ BlockPointer Node::Serialize(ART &art, MetaBlockWriter &writer) {
|
|
254
252
|
}
|
255
253
|
|
256
254
|
void Node::Deserialize(ART &art) {
|
257
|
-
|
258
255
|
D_ASSERT(IsSet() && IsSerialized());
|
259
256
|
|
260
|
-
|
261
|
-
reader.
|
257
|
+
BlockPointer pointer(GetBufferId(), GetOffset());
|
258
|
+
MetadataReader reader(art.table_io_manager.GetMetadataManager(), pointer);
|
262
259
|
Reset();
|
263
260
|
SetType(reader.Read<uint8_t>());
|
264
261
|
|
@@ -2,8 +2,8 @@
|
|
2
2
|
|
3
3
|
#include "duckdb/execution/index/art/node4.hpp"
|
4
4
|
#include "duckdb/execution/index/art/node48.hpp"
|
5
|
-
#include "duckdb/storage/
|
6
|
-
#include "duckdb/storage/
|
5
|
+
#include "duckdb/storage/metadata/metadata_reader.hpp"
|
6
|
+
#include "duckdb/storage/metadata/metadata_writer.hpp"
|
7
7
|
|
8
8
|
namespace duckdb {
|
9
9
|
|
@@ -173,7 +173,7 @@ optional_ptr<Node> Node16::GetNextChild(uint8_t &byte) {
|
|
173
173
|
return nullptr;
|
174
174
|
}
|
175
175
|
|
176
|
-
BlockPointer Node16::Serialize(ART &art,
|
176
|
+
BlockPointer Node16::Serialize(ART &art, MetadataWriter &writer) {
|
177
177
|
|
178
178
|
// recurse into children and retrieve child block pointers
|
179
179
|
vector<BlockPointer> child_block_pointers;
|
@@ -203,7 +203,7 @@ BlockPointer Node16::Serialize(ART &art, MetaBlockWriter &writer) {
|
|
203
203
|
return block_pointer;
|
204
204
|
}
|
205
205
|
|
206
|
-
void Node16::Deserialize(
|
206
|
+
void Node16::Deserialize(MetadataReader &reader) {
|
207
207
|
|
208
208
|
count = reader.Read<uint8_t>();
|
209
209
|
|
@@ -1,8 +1,8 @@
|
|
1
1
|
#include "duckdb/execution/index/art/node256.hpp"
|
2
2
|
|
3
3
|
#include "duckdb/execution/index/art/node48.hpp"
|
4
|
-
#include "duckdb/storage/
|
5
|
-
#include "duckdb/storage/
|
4
|
+
#include "duckdb/storage/metadata/metadata_reader.hpp"
|
5
|
+
#include "duckdb/storage/metadata/metadata_writer.hpp"
|
6
6
|
|
7
7
|
namespace duckdb {
|
8
8
|
|
@@ -109,7 +109,7 @@ optional_ptr<Node> Node256::GetNextChild(uint8_t &byte) {
|
|
109
109
|
return nullptr;
|
110
110
|
}
|
111
111
|
|
112
|
-
BlockPointer Node256::Serialize(ART &art,
|
112
|
+
BlockPointer Node256::Serialize(ART &art, MetadataWriter &writer) {
|
113
113
|
|
114
114
|
// recurse into children and retrieve child block pointers
|
115
115
|
vector<BlockPointer> child_block_pointers;
|
@@ -131,7 +131,7 @@ BlockPointer Node256::Serialize(ART &art, MetaBlockWriter &writer) {
|
|
131
131
|
return block_pointer;
|
132
132
|
}
|
133
133
|
|
134
|
-
void Node256::Deserialize(
|
134
|
+
void Node256::Deserialize(MetadataReader &reader) {
|
135
135
|
|
136
136
|
count = reader.Read<uint16_t>();
|
137
137
|
|
@@ -2,8 +2,8 @@
|
|
2
2
|
|
3
3
|
#include "duckdb/execution/index/art/prefix.hpp"
|
4
4
|
#include "duckdb/execution/index/art/node16.hpp"
|
5
|
-
#include "duckdb/storage/
|
6
|
-
#include "duckdb/storage/
|
5
|
+
#include "duckdb/storage/metadata/metadata_reader.hpp"
|
6
|
+
#include "duckdb/storage/metadata/metadata_writer.hpp"
|
7
7
|
|
8
8
|
namespace duckdb {
|
9
9
|
|
@@ -166,7 +166,7 @@ optional_ptr<Node> Node4::GetNextChild(uint8_t &byte) {
|
|
166
166
|
return nullptr;
|
167
167
|
}
|
168
168
|
|
169
|
-
BlockPointer Node4::Serialize(ART &art,
|
169
|
+
BlockPointer Node4::Serialize(ART &art, MetadataWriter &writer) {
|
170
170
|
|
171
171
|
// recurse into children and retrieve child block pointers
|
172
172
|
vector<BlockPointer> child_block_pointers;
|
@@ -196,8 +196,7 @@ BlockPointer Node4::Serialize(ART &art, MetaBlockWriter &writer) {
|
|
196
196
|
return block_pointer;
|
197
197
|
}
|
198
198
|
|
199
|
-
void Node4::Deserialize(
|
200
|
-
|
199
|
+
void Node4::Deserialize(MetadataReader &reader) {
|
201
200
|
count = reader.Read<uint8_t>();
|
202
201
|
|
203
202
|
// read key values
|
@@ -2,8 +2,8 @@
|
|
2
2
|
|
3
3
|
#include "duckdb/execution/index/art/node16.hpp"
|
4
4
|
#include "duckdb/execution/index/art/node256.hpp"
|
5
|
-
#include "duckdb/storage/
|
6
|
-
#include "duckdb/storage/
|
5
|
+
#include "duckdb/storage/metadata/metadata_reader.hpp"
|
6
|
+
#include "duckdb/storage/metadata/metadata_writer.hpp"
|
7
7
|
|
8
8
|
namespace duckdb {
|
9
9
|
|
@@ -168,7 +168,7 @@ optional_ptr<Node> Node48::GetNextChild(uint8_t &byte) {
|
|
168
168
|
return nullptr;
|
169
169
|
}
|
170
170
|
|
171
|
-
BlockPointer Node48::Serialize(ART &art,
|
171
|
+
BlockPointer Node48::Serialize(ART &art, MetadataWriter &writer) {
|
172
172
|
|
173
173
|
// recurse into children and retrieve child block pointers
|
174
174
|
vector<BlockPointer> child_block_pointers;
|
@@ -195,7 +195,7 @@ BlockPointer Node48::Serialize(ART &art, MetaBlockWriter &writer) {
|
|
195
195
|
return block_pointer;
|
196
196
|
}
|
197
197
|
|
198
|
-
void Node48::Deserialize(
|
198
|
+
void Node48::Deserialize(MetadataReader &reader) {
|
199
199
|
|
200
200
|
count = reader.Read<uint8_t>();
|
201
201
|
|
@@ -3,8 +3,8 @@
|
|
3
3
|
#include "duckdb/execution/index/art/art.hpp"
|
4
4
|
#include "duckdb/execution/index/art/art_key.hpp"
|
5
5
|
#include "duckdb/execution/index/art/node.hpp"
|
6
|
-
#include "duckdb/storage/
|
7
|
-
#include "duckdb/storage/
|
6
|
+
#include "duckdb/storage/metadata/metadata_reader.hpp"
|
7
|
+
#include "duckdb/storage/metadata/metadata_writer.hpp"
|
8
8
|
#include "duckdb/common/swap.hpp"
|
9
9
|
|
10
10
|
namespace duckdb {
|
@@ -306,8 +306,7 @@ string Prefix::VerifyAndToString(ART &art, Node &node, const bool only_verify) {
|
|
306
306
|
return str + node_ref.get().VerifyAndToString(art, only_verify);
|
307
307
|
}
|
308
308
|
|
309
|
-
BlockPointer Prefix::Serialize(ART &art, Node &node,
|
310
|
-
|
309
|
+
BlockPointer Prefix::Serialize(ART &art, Node &node, MetadataWriter &writer) {
|
311
310
|
reference<Node> first_non_prefix(node);
|
312
311
|
idx_t total_count = Prefix::TotalCount(art, first_non_prefix);
|
313
312
|
auto child_block_pointer = first_non_prefix.get().Serialize(art, writer);
|
@@ -337,8 +336,7 @@ BlockPointer Prefix::Serialize(ART &art, Node &node, MetaBlockWriter &writer) {
|
|
337
336
|
return block_pointer;
|
338
337
|
}
|
339
338
|
|
340
|
-
void Prefix::Deserialize(ART &art, Node &node,
|
341
|
-
|
339
|
+
void Prefix::Deserialize(ART &art, Node &node, MetadataReader &reader) {
|
342
340
|
auto total_count = reader.Read<idx_t>();
|
343
341
|
reference<Node> current_node(node);
|
344
342
|
|
@@ -1,8 +1,8 @@
|
|
1
1
|
#ifndef DUCKDB_VERSION
|
2
|
-
#define DUCKDB_VERSION "0.8.2-
|
2
|
+
#define DUCKDB_VERSION "0.8.2-dev2700"
|
3
3
|
#endif
|
4
4
|
#ifndef DUCKDB_SOURCE_ID
|
5
|
-
#define DUCKDB_SOURCE_ID "
|
5
|
+
#define DUCKDB_SOURCE_ID "acbbfe0e79"
|
6
6
|
#endif
|
7
7
|
#include "duckdb/function/table/system_functions.hpp"
|
8
8
|
#include "duckdb/main/database.hpp"
|
@@ -36,7 +36,7 @@ public:
|
|
36
36
|
ART(const vector<column_t> &column_ids, TableIOManager &table_io_manager,
|
37
37
|
const vector<unique_ptr<Expression>> &unbound_expressions, const IndexConstraintType constraint_type,
|
38
38
|
AttachedDatabase &db, const shared_ptr<vector<FixedSizeAllocator>> &allocators_ptr = nullptr,
|
39
|
-
|
39
|
+
BlockPointer block = BlockPointer());
|
40
40
|
~ART() override;
|
41
41
|
|
42
42
|
//! Root of the tree
|
@@ -80,7 +80,7 @@ public:
|
|
80
80
|
void SearchEqualJoinNoFetch(ARTKey &key, idx_t &result_size);
|
81
81
|
|
82
82
|
//! Serializes the index and returns the pair of block_id offset positions
|
83
|
-
BlockPointer Serialize(
|
83
|
+
BlockPointer Serialize(MetadataWriter &writer) override;
|
84
84
|
|
85
85
|
//! Merge another index into this index. The lock obtained from InitializeLock must be held, and the other
|
86
86
|
//! index must also be locked during the merge
|
@@ -15,8 +15,8 @@
|
|
15
15
|
namespace duckdb {
|
16
16
|
|
17
17
|
// classes
|
18
|
-
class
|
19
|
-
class
|
18
|
+
class MetadataWriter;
|
19
|
+
class MetadataReader;
|
20
20
|
|
21
21
|
// structs
|
22
22
|
struct BlockPointer;
|
@@ -70,9 +70,9 @@ public:
|
|
70
70
|
static string VerifyAndToString(ART &art, Node &node);
|
71
71
|
|
72
72
|
//! Serialize the leaf (chain)
|
73
|
-
static BlockPointer Serialize(ART &art, Node &node,
|
73
|
+
static BlockPointer Serialize(ART &art, Node &node, MetadataWriter &writer);
|
74
74
|
//! Deserialize the leaf (chain)
|
75
|
-
static void Deserialize(ART &art, Node &node,
|
75
|
+
static void Deserialize(ART &art, Node &node, MetadataReader &reader);
|
76
76
|
|
77
77
|
//! Vacuum the leaf (chain)
|
78
78
|
static void Vacuum(ART &art, Node &node);
|
@@ -12,6 +12,7 @@
|
|
12
12
|
#include "duckdb/common/optional_ptr.hpp"
|
13
13
|
#include "duckdb/common/to_string.hpp"
|
14
14
|
#include "duckdb/common/typedefs.hpp"
|
15
|
+
#include "duckdb/common/limits.hpp"
|
15
16
|
|
16
17
|
namespace duckdb {
|
17
18
|
|
@@ -28,12 +29,13 @@ enum class NType : uint8_t {
|
|
28
29
|
class FixedSizeAllocator;
|
29
30
|
class ART;
|
30
31
|
class Prefix;
|
31
|
-
class
|
32
|
-
class
|
32
|
+
class MetadataReader;
|
33
|
+
class MetadataWriter;
|
33
34
|
|
34
35
|
// structs
|
35
36
|
struct BlockPointer;
|
36
37
|
struct ARTFlags;
|
38
|
+
struct MetaBlockPointer;
|
37
39
|
|
38
40
|
//! The Node is the pointer class of the ART index.
|
39
41
|
//! If the node is serialized, then the pointer points to a storage address (and has no type),
|
@@ -70,7 +72,7 @@ public:
|
|
70
72
|
//! Constructs an empty Node
|
71
73
|
Node() : data(0) {};
|
72
74
|
//! Constructs a serialized Node pointer from a block ID and an offset
|
73
|
-
explicit Node(
|
75
|
+
explicit Node(MetadataReader &reader);
|
74
76
|
//! Constructs an in-memory Node from a buffer ID and an offset
|
75
77
|
Node(const uint32_t buffer_id, const uint32_t offset) : data(0) {
|
76
78
|
SetPtr(buffer_id, offset);
|
@@ -95,7 +97,7 @@ public:
|
|
95
97
|
optional_ptr<Node> GetNextChild(ART &art, uint8_t &byte, const bool deserialize = true) const;
|
96
98
|
|
97
99
|
//! Serialize the node
|
98
|
-
BlockPointer Serialize(ART &art,
|
100
|
+
BlockPointer Serialize(ART &art, MetadataWriter &writer);
|
99
101
|
//! Deserialize the node
|
100
102
|
void Deserialize(ART &art);
|
101
103
|
|
@@ -56,9 +56,9 @@ public:
|
|
56
56
|
optional_ptr<Node> GetNextChild(uint8_t &byte);
|
57
57
|
|
58
58
|
//! Serialize this node
|
59
|
-
BlockPointer Serialize(ART &art,
|
59
|
+
BlockPointer Serialize(ART &art, MetadataWriter &writer);
|
60
60
|
//! Deserialize this node
|
61
|
-
void Deserialize(
|
61
|
+
void Deserialize(MetadataReader &reader);
|
62
62
|
|
63
63
|
//! Vacuum the children of the node
|
64
64
|
void Vacuum(ART &art, const ARTFlags &flags);
|
@@ -59,9 +59,9 @@ public:
|
|
59
59
|
optional_ptr<Node> GetNextChild(uint8_t &byte);
|
60
60
|
|
61
61
|
//! Serialize this node
|
62
|
-
BlockPointer Serialize(ART &art,
|
62
|
+
BlockPointer Serialize(ART &art, MetadataWriter &writer);
|
63
63
|
//! Deserialize this node
|
64
|
-
void Deserialize(
|
64
|
+
void Deserialize(MetadataReader &reader);
|
65
65
|
|
66
66
|
//! Vacuum the children of the node
|
67
67
|
void Vacuum(ART &art, const ARTFlags &flags);
|
@@ -54,9 +54,9 @@ public:
|
|
54
54
|
optional_ptr<Node> GetNextChild(uint8_t &byte);
|
55
55
|
|
56
56
|
//! Serialize this node
|
57
|
-
BlockPointer Serialize(ART &art,
|
57
|
+
BlockPointer Serialize(ART &art, MetadataWriter &writer);
|
58
58
|
//! Deserialize this node
|
59
|
-
void Deserialize(
|
59
|
+
void Deserialize(MetadataReader &reader);
|
60
60
|
|
61
61
|
//! Vacuum the children of the node
|
62
62
|
void Vacuum(ART &art, const ARTFlags &flags);
|
@@ -66,9 +66,9 @@ public:
|
|
66
66
|
optional_ptr<Node> GetNextChild(uint8_t &byte);
|
67
67
|
|
68
68
|
//! Serialize this node
|
69
|
-
BlockPointer Serialize(ART &art,
|
69
|
+
BlockPointer Serialize(ART &art, MetadataWriter &writer);
|
70
70
|
//! Deserialize this node
|
71
|
-
void Deserialize(
|
71
|
+
void Deserialize(MetadataReader &reader);
|
72
72
|
|
73
73
|
//! Vacuum the children of the node
|
74
74
|
void Vacuum(ART &art, const ARTFlags &flags);
|
@@ -74,9 +74,9 @@ public:
|
|
74
74
|
static string VerifyAndToString(ART &art, Node &node, const bool only_verify);
|
75
75
|
|
76
76
|
//! Serialize this node and all subsequent nodes
|
77
|
-
static BlockPointer Serialize(ART &art, Node &node,
|
77
|
+
static BlockPointer Serialize(ART &art, Node &node, MetadataWriter &writer);
|
78
78
|
//! Deserialize this node and all subsequent prefix nodes
|
79
|
-
static void Deserialize(ART &art, Node &node,
|
79
|
+
static void Deserialize(ART &art, Node &node, MetadataReader &reader);
|
80
80
|
|
81
81
|
//! Vacuum the child of the node
|
82
82
|
static void Vacuum(ART &art, Node &node, const ARTFlags &flags);
|
@@ -24,10 +24,33 @@ public:
|
|
24
24
|
};
|
25
25
|
|
26
26
|
struct BlockPointer {
|
27
|
-
BlockPointer(block_id_t block_id_p, uint32_t offset_p) : block_id(block_id_p), offset(offset_p) {
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
BlockPointer(block_id_t block_id_p, uint32_t offset_p) : block_id(block_id_p), offset(offset_p) {
|
28
|
+
}
|
29
|
+
BlockPointer() : block_id(INVALID_BLOCK), offset(0) {
|
30
|
+
}
|
31
|
+
|
32
|
+
block_id_t block_id;
|
33
|
+
uint32_t offset;
|
34
|
+
|
35
|
+
bool IsValid() {
|
36
|
+
return block_id != INVALID_BLOCK;
|
37
|
+
}
|
38
|
+
};
|
39
|
+
|
40
|
+
struct MetaBlockPointer {
|
41
|
+
MetaBlockPointer(idx_t block_pointer, uint32_t offset_p) : block_pointer(block_pointer), offset(offset_p) {
|
42
|
+
}
|
43
|
+
MetaBlockPointer() : block_pointer(DConstants::INVALID_INDEX), offset(0) {
|
44
|
+
}
|
45
|
+
|
46
|
+
idx_t block_pointer;
|
47
|
+
uint32_t offset;
|
48
|
+
|
49
|
+
bool IsValid() {
|
50
|
+
return block_pointer != DConstants::INVALID_INDEX;
|
51
|
+
}
|
52
|
+
block_id_t GetBlockId();
|
53
|
+
uint32_t GetBlockIndex();
|
31
54
|
};
|
32
55
|
|
33
56
|
} // namespace duckdb
|