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.
Files changed (74) hide show
  1. package/binding.gyp +1 -0
  2. package/package.json +1 -1
  3. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +6 -6
  4. package/src/duckdb/src/common/field_writer.cpp +1 -0
  5. package/src/duckdb/src/common/local_file_system.cpp +5 -0
  6. package/src/duckdb/src/common/types/interval.cpp +3 -0
  7. package/src/duckdb/src/core_functions/aggregate/nested/list.cpp +6 -1
  8. package/src/duckdb/src/execution/index/art/art.cpp +6 -9
  9. package/src/duckdb/src/execution/index/art/leaf.cpp +4 -4
  10. package/src/duckdb/src/execution/index/art/node.cpp +9 -12
  11. package/src/duckdb/src/execution/index/art/node16.cpp +4 -4
  12. package/src/duckdb/src/execution/index/art/node256.cpp +4 -4
  13. package/src/duckdb/src/execution/index/art/node4.cpp +4 -5
  14. package/src/duckdb/src/execution/index/art/node48.cpp +4 -4
  15. package/src/duckdb/src/execution/index/art/prefix.cpp +4 -6
  16. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  17. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/index_catalog_entry.hpp +1 -1
  18. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +2 -2
  19. package/src/duckdb/src/include/duckdb/execution/index/art/leaf.hpp +4 -4
  20. package/src/duckdb/src/include/duckdb/execution/index/art/node.hpp +6 -4
  21. package/src/duckdb/src/include/duckdb/execution/index/art/node16.hpp +2 -2
  22. package/src/duckdb/src/include/duckdb/execution/index/art/node256.hpp +2 -2
  23. package/src/duckdb/src/include/duckdb/execution/index/art/node4.hpp +2 -2
  24. package/src/duckdb/src/include/duckdb/execution/index/art/node48.hpp +2 -2
  25. package/src/duckdb/src/include/duckdb/execution/index/art/prefix.hpp +2 -2
  26. package/src/duckdb/src/include/duckdb/storage/block.hpp +27 -4
  27. package/src/duckdb/src/include/duckdb/storage/block_manager.hpp +9 -9
  28. package/src/duckdb/src/include/duckdb/storage/checkpoint/row_group_writer.hpp +5 -5
  29. package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_reader.hpp +2 -2
  30. package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp +3 -3
  31. package/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp +19 -16
  32. package/src/duckdb/src/include/duckdb/storage/data_pointer.hpp +1 -1
  33. package/src/duckdb/src/include/duckdb/storage/in_memory_block_manager.hpp +2 -2
  34. package/src/duckdb/src/include/duckdb/storage/index.hpp +2 -2
  35. package/src/duckdb/src/include/duckdb/storage/metadata/metadata_manager.hpp +88 -0
  36. package/src/duckdb/src/include/duckdb/storage/metadata/metadata_reader.hpp +54 -0
  37. package/src/duckdb/src/include/duckdb/storage/metadata/metadata_writer.hpp +45 -0
  38. package/src/duckdb/src/include/duckdb/storage/partial_block_manager.hpp +2 -2
  39. package/src/duckdb/src/include/duckdb/storage/single_file_block_manager.hpp +6 -5
  40. package/src/duckdb/src/include/duckdb/storage/storage_info.hpp +2 -2
  41. package/src/duckdb/src/include/duckdb/storage/storage_manager.hpp +2 -2
  42. package/src/duckdb/src/include/duckdb/storage/table/persistent_table_data.hpp +2 -2
  43. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +1 -1
  44. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +2 -0
  45. package/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp +2 -2
  46. package/src/duckdb/src/include/duckdb/storage/table/table_index_list.hpp +1 -1
  47. package/src/duckdb/src/include/duckdb/storage/table_io_manager.hpp +3 -0
  48. package/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +3 -4
  49. package/src/duckdb/src/parallel/executor.cpp +3 -0
  50. package/src/duckdb/src/storage/buffer/block_manager.cpp +10 -9
  51. package/src/duckdb/src/storage/checkpoint/row_group_writer.cpp +1 -1
  52. package/src/duckdb/src/storage/checkpoint/table_data_reader.cpp +3 -4
  53. package/src/duckdb/src/storage/checkpoint/table_data_writer.cpp +7 -7
  54. package/src/duckdb/src/storage/checkpoint_manager.cpp +49 -43
  55. package/src/duckdb/src/storage/index.cpp +1 -1
  56. package/src/duckdb/src/storage/metadata/metadata_manager.cpp +267 -0
  57. package/src/duckdb/src/storage/metadata/metadata_reader.cpp +80 -0
  58. package/src/duckdb/src/storage/metadata/metadata_writer.cpp +86 -0
  59. package/src/duckdb/src/storage/single_file_block_manager.cpp +47 -52
  60. package/src/duckdb/src/storage/storage_info.cpp +1 -1
  61. package/src/duckdb/src/storage/storage_manager.cpp +4 -3
  62. package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +3 -3
  63. package/src/duckdb/src/storage/table/persistent_table_data.cpp +1 -2
  64. package/src/duckdb/src/storage/table/row_group.cpp +9 -10
  65. package/src/duckdb/src/storage/table/row_group_collection.cpp +6 -3
  66. package/src/duckdb/src/storage/table_index_list.cpp +1 -1
  67. package/src/duckdb/src/storage/wal_replay.cpp +3 -2
  68. package/src/duckdb/src/storage/write_ahead_log.cpp +3 -2
  69. package/src/duckdb/ub_src_storage.cpp +0 -4
  70. package/src/duckdb/ub_src_storage_metadata.cpp +6 -0
  71. package/src/duckdb/src/include/duckdb/storage/meta_block_reader.hpp +0 -46
  72. package/src/duckdb/src/include/duckdb/storage/meta_block_writer.hpp +0 -50
  73. package/src/duckdb/src/storage/meta_block_reader.cpp +0 -69
  74. 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
@@ -2,7 +2,7 @@
2
2
  "name": "duckdb",
3
3
  "main": "./lib/duckdb.js",
4
4
  "types": "./lib/duckdb.d.ts",
5
- "version": "0.8.2-dev2669.0",
5
+ "version": "0.8.2-dev2700.0",
6
6
  "description": "DuckDB node.js API",
7
7
  "gypfile": true,
8
8
  "dependencies": {
@@ -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 *index_block = nullptr) {
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->block_id, index_block->offset);
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 *index_block = nullptr) {
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, &info.indexes[indexes_idx++]);
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
- &info.indexes[indexes_idx++]);
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
  }
@@ -116,6 +116,9 @@ interval_parse_time : {
116
116
  }
117
117
  result.micros += time.micros;
118
118
  found_any = true;
119
+ if (negative) {
120
+ result.micros = -result.micros;
121
+ }
119
122
  goto end_of_string;
120
123
  }
121
124
  interval_parse_identifier:
@@ -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
- D_ASSERT(state.linked_list.total_capacity != 0);
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, const idx_t block_id,
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
- if (block_id != DConstants::INVALID_INDEX) {
57
+ serialized_data_pointer = pointer;
58
+ if (pointer.IsValid()) {
61
59
  tree->SetSerialized();
62
- tree->SetPtr(block_id, block_offset);
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(MetaBlockWriter &writer) {
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 = {(block_id_t)DConstants::INVALID_INDEX, (uint32_t)DConstants::INVALID_INDEX};
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/meta_block_reader.hpp"
6
- #include "duckdb/storage/meta_block_writer.hpp"
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, MetaBlockWriter &writer) {
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, MetaBlockReader &reader) {
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/meta_block_reader.hpp"
13
- #include "duckdb/storage/meta_block_writer.hpp"
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(MetaBlockReader &reader) {
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 == DConstants::INVALID_INDEX) {
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, MetaBlockWriter &writer) {
227
-
225
+ BlockPointer Node::Serialize(ART &art, MetadataWriter &writer) {
228
226
  if (!IsSet()) {
229
- return {(block_id_t)DConstants::INVALID_INDEX, 0};
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
- MetaBlockReader reader(art.table_io_manager.GetIndexBlockManager(), GetBufferId());
261
- reader.offset = GetOffset();
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/meta_block_reader.hpp"
6
- #include "duckdb/storage/meta_block_writer.hpp"
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, MetaBlockWriter &writer) {
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(MetaBlockReader &reader) {
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/meta_block_reader.hpp"
5
- #include "duckdb/storage/meta_block_writer.hpp"
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, MetaBlockWriter &writer) {
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(MetaBlockReader &reader) {
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/meta_block_reader.hpp"
6
- #include "duckdb/storage/meta_block_writer.hpp"
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, MetaBlockWriter &writer) {
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(MetaBlockReader &reader) {
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/meta_block_reader.hpp"
6
- #include "duckdb/storage/meta_block_writer.hpp"
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, MetaBlockWriter &writer) {
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(MetaBlockReader &reader) {
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/meta_block_reader.hpp"
7
- #include "duckdb/storage/meta_block_writer.hpp"
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, MetaBlockWriter &writer) {
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, MetaBlockReader &reader) {
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-dev2669"
2
+ #define DUCKDB_VERSION "0.8.2-dev2700"
3
3
  #endif
4
4
  #ifndef DUCKDB_SOURCE_ID
5
- #define DUCKDB_SOURCE_ID "c6f10389c3"
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"
@@ -10,7 +10,7 @@
10
10
 
11
11
  #include "duckdb/catalog/standard_entry.hpp"
12
12
  #include "duckdb/parser/parsed_data/create_index_info.hpp"
13
- #include "duckdb/storage/meta_block_writer.hpp"
13
+ #include "duckdb/storage/metadata/metadata_writer.hpp"
14
14
 
15
15
  namespace duckdb {
16
16
 
@@ -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
- const idx_t block_id = DConstants::INVALID_INDEX, const idx_t block_offset = DConstants::INVALID_INDEX);
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(MetaBlockWriter &writer) override;
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 MetaBlockWriter;
19
- class MetaBlockReader;
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, MetaBlockWriter &writer);
73
+ static BlockPointer Serialize(ART &art, Node &node, MetadataWriter &writer);
74
74
  //! Deserialize the leaf (chain)
75
- static void Deserialize(ART &art, Node &node, MetaBlockReader &reader);
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 MetaBlockReader;
32
- class MetaBlockWriter;
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(MetaBlockReader &reader);
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, MetaBlockWriter &writer);
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, MetaBlockWriter &writer);
59
+ BlockPointer Serialize(ART &art, MetadataWriter &writer);
60
60
  //! Deserialize this node
61
- void Deserialize(MetaBlockReader &reader);
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, MetaBlockWriter &writer);
62
+ BlockPointer Serialize(ART &art, MetadataWriter &writer);
63
63
  //! Deserialize this node
64
- void Deserialize(MetaBlockReader &reader);
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, MetaBlockWriter &writer);
57
+ BlockPointer Serialize(ART &art, MetadataWriter &writer);
58
58
  //! Deserialize this node
59
- void Deserialize(MetaBlockReader &reader);
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, MetaBlockWriter &writer);
69
+ BlockPointer Serialize(ART &art, MetadataWriter &writer);
70
70
  //! Deserialize this node
71
- void Deserialize(MetaBlockReader &reader);
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, MetaBlockWriter &writer);
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, MetaBlockReader &reader);
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
- BlockPointer() {};
29
- block_id_t block_id {0};
30
- uint32_t offset {0};
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