duckdb 0.8.2-dev2673.0 → 0.8.2-dev2809.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 (117) hide show
  1. package/binding.gyp +1 -0
  2. package/package.json +1 -1
  3. package/src/duckdb/extension/icu/icu-makedate.cpp +12 -6
  4. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +6 -6
  5. package/src/duckdb/src/common/adbc/adbc.cpp +52 -21
  6. package/src/duckdb/src/common/adbc/driver_manager.cpp +12 -2
  7. package/src/duckdb/src/common/enum_util.cpp +5 -0
  8. package/src/duckdb/src/common/field_writer.cpp +1 -0
  9. package/src/duckdb/src/common/local_file_system.cpp +5 -0
  10. package/src/duckdb/src/common/types/interval.cpp +3 -0
  11. package/src/duckdb/src/common/types/row/row_data_collection_scanner.cpp +35 -5
  12. package/src/duckdb/src/execution/index/art/art.cpp +6 -9
  13. package/src/duckdb/src/execution/index/art/leaf.cpp +4 -4
  14. package/src/duckdb/src/execution/index/art/node.cpp +9 -12
  15. package/src/duckdb/src/execution/index/art/node16.cpp +4 -4
  16. package/src/duckdb/src/execution/index/art/node256.cpp +4 -4
  17. package/src/duckdb/src/execution/index/art/node4.cpp +4 -5
  18. package/src/duckdb/src/execution/index/art/node48.cpp +4 -4
  19. package/src/duckdb/src/execution/index/art/prefix.cpp +4 -6
  20. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +283 -91
  21. package/src/duckdb/src/execution/operator/filter/physical_filter.cpp +1 -1
  22. package/src/duckdb/src/execution/operator/join/physical_comparison_join.cpp +1 -2
  23. package/src/duckdb/src/execution/operator/scan/physical_table_scan.cpp +1 -1
  24. package/src/duckdb/src/execution/physical_plan_generator.cpp +1 -6
  25. package/src/duckdb/src/execution/window_executor.cpp +10 -1
  26. package/src/duckdb/src/function/table/version/pragma_version.cpp +5 -2
  27. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/index_catalog_entry.hpp +1 -1
  28. package/src/duckdb/src/include/duckdb/common/adbc/adbc.hpp +2 -0
  29. package/src/duckdb/src/include/duckdb/common/enums/pending_execution_result.hpp +1 -1
  30. package/src/duckdb/src/include/duckdb/common/types/row/row_data_collection_scanner.hpp +5 -1
  31. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +2 -2
  32. package/src/duckdb/src/include/duckdb/execution/index/art/leaf.hpp +4 -4
  33. package/src/duckdb/src/include/duckdb/execution/index/art/node.hpp +6 -4
  34. package/src/duckdb/src/include/duckdb/execution/index/art/node16.hpp +2 -2
  35. package/src/duckdb/src/include/duckdb/execution/index/art/node256.hpp +2 -2
  36. package/src/duckdb/src/include/duckdb/execution/index/art/node4.hpp +2 -2
  37. package/src/duckdb/src/include/duckdb/execution/index/art/node48.hpp +2 -2
  38. package/src/duckdb/src/include/duckdb/execution/index/art/prefix.hpp +2 -2
  39. package/src/duckdb/src/include/duckdb/execution/physical_operator.hpp +0 -2
  40. package/src/duckdb/src/include/duckdb/main/pending_query_result.hpp +5 -0
  41. package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +37 -63
  42. package/src/duckdb/src/include/duckdb/optimizer/join_order/cost_model.hpp +37 -0
  43. package/src/duckdb/src/include/duckdb/optimizer/join_order/join_node.hpp +14 -29
  44. package/src/duckdb/src/include/duckdb/optimizer/join_order/join_order_optimizer.hpp +7 -21
  45. package/src/duckdb/src/include/duckdb/optimizer/join_order/join_relation.hpp +0 -11
  46. package/src/duckdb/src/include/duckdb/optimizer/join_order/plan_enumerator.hpp +89 -0
  47. package/src/duckdb/src/include/duckdb/optimizer/join_order/query_graph.hpp +17 -31
  48. package/src/duckdb/src/include/duckdb/optimizer/join_order/query_graph_manager.hpp +113 -0
  49. package/src/duckdb/src/include/duckdb/optimizer/join_order/relation_manager.hpp +73 -0
  50. package/src/duckdb/src/include/duckdb/optimizer/join_order/relation_statistics_helper.hpp +73 -0
  51. package/src/duckdb/src/include/duckdb/parallel/task_scheduler.hpp +4 -1
  52. package/src/duckdb/src/include/duckdb/planner/logical_operator.hpp +0 -2
  53. package/src/duckdb/src/include/duckdb/storage/block.hpp +27 -4
  54. package/src/duckdb/src/include/duckdb/storage/block_manager.hpp +9 -9
  55. package/src/duckdb/src/include/duckdb/storage/checkpoint/row_group_writer.hpp +5 -5
  56. package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_reader.hpp +2 -2
  57. package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp +3 -3
  58. package/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp +19 -16
  59. package/src/duckdb/src/include/duckdb/storage/data_pointer.hpp +1 -1
  60. package/src/duckdb/src/include/duckdb/storage/in_memory_block_manager.hpp +2 -2
  61. package/src/duckdb/src/include/duckdb/storage/index.hpp +2 -2
  62. package/src/duckdb/src/include/duckdb/storage/metadata/metadata_manager.hpp +88 -0
  63. package/src/duckdb/src/include/duckdb/storage/metadata/metadata_reader.hpp +54 -0
  64. package/src/duckdb/src/include/duckdb/storage/metadata/metadata_writer.hpp +45 -0
  65. package/src/duckdb/src/include/duckdb/storage/partial_block_manager.hpp +2 -2
  66. package/src/duckdb/src/include/duckdb/storage/single_file_block_manager.hpp +6 -5
  67. package/src/duckdb/src/include/duckdb/storage/storage_info.hpp +2 -2
  68. package/src/duckdb/src/include/duckdb/storage/storage_manager.hpp +2 -2
  69. package/src/duckdb/src/include/duckdb/storage/table/persistent_table_data.hpp +2 -2
  70. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +1 -1
  71. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +2 -0
  72. package/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp +2 -2
  73. package/src/duckdb/src/include/duckdb/storage/table/table_index_list.hpp +1 -1
  74. package/src/duckdb/src/include/duckdb/storage/table_io_manager.hpp +3 -0
  75. package/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +3 -4
  76. package/src/duckdb/src/include/duckdb.h +11 -1
  77. package/src/duckdb/src/main/capi/pending-c.cpp +17 -0
  78. package/src/duckdb/src/main/pending_query_result.cpp +9 -1
  79. package/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp +79 -325
  80. package/src/duckdb/src/optimizer/join_order/cost_model.cpp +19 -0
  81. package/src/duckdb/src/optimizer/join_order/join_node.cpp +5 -37
  82. package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +48 -1078
  83. package/src/duckdb/src/optimizer/join_order/plan_enumerator.cpp +552 -0
  84. package/src/duckdb/src/optimizer/join_order/query_graph.cpp +32 -29
  85. package/src/duckdb/src/optimizer/join_order/query_graph_manager.cpp +409 -0
  86. package/src/duckdb/src/optimizer/join_order/relation_manager.cpp +356 -0
  87. package/src/duckdb/src/optimizer/join_order/relation_statistics_helper.cpp +351 -0
  88. package/src/duckdb/src/parallel/executor.cpp +6 -0
  89. package/src/duckdb/src/parallel/task_scheduler.cpp +7 -0
  90. package/src/duckdb/src/planner/binder/statement/bind_execute.cpp +1 -1
  91. package/src/duckdb/src/planner/operator/logical_get.cpp +4 -0
  92. package/src/duckdb/src/storage/buffer/block_manager.cpp +10 -9
  93. package/src/duckdb/src/storage/checkpoint/row_group_writer.cpp +1 -1
  94. package/src/duckdb/src/storage/checkpoint/table_data_reader.cpp +3 -4
  95. package/src/duckdb/src/storage/checkpoint/table_data_writer.cpp +7 -7
  96. package/src/duckdb/src/storage/checkpoint_manager.cpp +49 -43
  97. package/src/duckdb/src/storage/index.cpp +1 -1
  98. package/src/duckdb/src/storage/metadata/metadata_manager.cpp +267 -0
  99. package/src/duckdb/src/storage/metadata/metadata_reader.cpp +80 -0
  100. package/src/duckdb/src/storage/metadata/metadata_writer.cpp +86 -0
  101. package/src/duckdb/src/storage/single_file_block_manager.cpp +47 -52
  102. package/src/duckdb/src/storage/storage_info.cpp +1 -1
  103. package/src/duckdb/src/storage/storage_manager.cpp +4 -3
  104. package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +3 -3
  105. package/src/duckdb/src/storage/table/persistent_table_data.cpp +1 -2
  106. package/src/duckdb/src/storage/table/row_group.cpp +9 -10
  107. package/src/duckdb/src/storage/table/row_group_collection.cpp +6 -3
  108. package/src/duckdb/src/storage/table_index_list.cpp +1 -1
  109. package/src/duckdb/src/storage/wal_replay.cpp +3 -2
  110. package/src/duckdb/src/storage/write_ahead_log.cpp +3 -2
  111. package/src/duckdb/ub_src_optimizer_join_order.cpp +10 -0
  112. package/src/duckdb/ub_src_storage.cpp +0 -4
  113. package/src/duckdb/ub_src_storage_metadata.cpp +6 -0
  114. package/src/duckdb/src/include/duckdb/storage/meta_block_reader.hpp +0 -46
  115. package/src/duckdb/src/include/duckdb/storage/meta_block_writer.hpp +0 -50
  116. package/src/duckdb/src/storage/meta_block_reader.cpp +0 -69
  117. package/src/duckdb/src/storage/meta_block_writer.cpp +0 -80
@@ -14,7 +14,7 @@
14
14
  #include "duckdb/common/sort/sort.hpp"
15
15
  #include "duckdb/parser/parsed_expression.hpp"
16
16
  #include "duckdb/planner/expression.hpp"
17
- #include "duckdb/storage/meta_block_writer.hpp"
17
+ #include "duckdb/storage/metadata/metadata_writer.hpp"
18
18
  #include "duckdb/execution/expression_executor.hpp"
19
19
  #include "duckdb/common/types/constraint_conflict_info.hpp"
20
20
 
@@ -126,7 +126,7 @@ public:
126
126
  }
127
127
 
128
128
  //! Serializes the index and returns the pair of block_id offset positions
129
- virtual BlockPointer Serialize(MetaBlockWriter &writer);
129
+ virtual BlockPointer Serialize(MetadataWriter &writer);
130
130
  //! Returns the serialized data pointer to the block and offset of the serialized index
131
131
  BlockPointer GetSerializedDataPointer() const {
132
132
  return serialized_data_pointer;
@@ -0,0 +1,88 @@
1
+ //===----------------------------------------------------------------------===//
2
+ // DuckDB
3
+ //
4
+ // duckdb/storage/metadata/metadata_manager.hpp
5
+ //
6
+ //
7
+ //===----------------------------------------------------------------------===//
8
+
9
+ #pragma once
10
+
11
+ #include "duckdb/common/common.hpp"
12
+ #include "duckdb/common/serializer.hpp"
13
+ #include "duckdb/storage/block.hpp"
14
+ #include "duckdb/storage/block_manager.hpp"
15
+ #include "duckdb/common/set.hpp"
16
+ #include "duckdb/storage/buffer/buffer_handle.hpp"
17
+
18
+ namespace duckdb {
19
+ class DatabaseInstance;
20
+
21
+ struct MetadataBlock {
22
+ shared_ptr<BlockHandle> block;
23
+ block_id_t block_id;
24
+ vector<uint8_t> free_blocks;
25
+
26
+ void Serialize(Serializer &serializer);
27
+ static MetadataBlock Deserialize(Deserializer &source);
28
+
29
+ idx_t FreeBlocksToInteger();
30
+ void FreeBlocksFromInteger(idx_t blocks);
31
+ };
32
+
33
+ struct MetadataPointer {
34
+ idx_t block_index : 56;
35
+ uint8_t index : 8;
36
+ };
37
+
38
+ struct MetadataHandle {
39
+ MetadataPointer pointer;
40
+ BufferHandle handle;
41
+ };
42
+
43
+ class MetadataManager {
44
+ public:
45
+ //! The size of metadata blocks
46
+ static constexpr const idx_t METADATA_BLOCK_SIZE = 4088;
47
+ //! The amount of metadata blocks per storage block
48
+ static constexpr const idx_t METADATA_BLOCK_COUNT = 64;
49
+
50
+ public:
51
+ MetadataManager(BlockManager &block_manager, BufferManager &buffer_manager);
52
+ ~MetadataManager();
53
+
54
+ MetadataHandle AllocateHandle();
55
+ MetadataHandle Pin(MetadataPointer pointer);
56
+
57
+ MetaBlockPointer GetDiskPointer(MetadataPointer pointer, uint32_t offset = 0);
58
+ MetadataPointer FromDiskPointer(MetaBlockPointer pointer);
59
+ MetadataPointer RegisterDiskPointer(MetaBlockPointer pointer);
60
+
61
+ static BlockPointer ToBlockPointer(MetaBlockPointer meta_pointer);
62
+ static MetaBlockPointer FromBlockPointer(BlockPointer block_pointer);
63
+
64
+ //! Flush all blocks to disk
65
+ void Flush();
66
+
67
+ void MarkBlocksAsModified();
68
+
69
+ idx_t BlockCount();
70
+
71
+ void Serialize(Serializer &serializer);
72
+ void Deserialize(Deserializer &source);
73
+
74
+ protected:
75
+ BlockManager &block_manager;
76
+ BufferManager &buffer_manager;
77
+ unordered_map<block_id_t, MetadataBlock> blocks;
78
+ unordered_map<block_id_t, idx_t> modified_blocks;
79
+
80
+ protected:
81
+ block_id_t AllocateNewBlock();
82
+ block_id_t GetNextBlockId();
83
+
84
+ void AddBlock(MetadataBlock new_block, bool if_exists = false);
85
+ void AddAndRegisterBlock(MetadataBlock block);
86
+ };
87
+
88
+ } // namespace duckdb
@@ -0,0 +1,54 @@
1
+ //===----------------------------------------------------------------------===//
2
+ // DuckDB
3
+ //
4
+ // duckdb/storage/metadata/metadata_reader.hpp
5
+ //
6
+ //
7
+ //===----------------------------------------------------------------------===//
8
+
9
+ #pragma once
10
+
11
+ #include "duckdb/storage/metadata/metadata_manager.hpp"
12
+
13
+ namespace duckdb {
14
+
15
+ enum class BlockReaderType { EXISTING_BLOCKS, REGISTER_BLOCKS };
16
+
17
+ class MetadataReader : public Deserializer {
18
+ public:
19
+ MetadataReader(MetadataManager &manager, MetaBlockPointer pointer,
20
+ BlockReaderType type = BlockReaderType::EXISTING_BLOCKS);
21
+ MetadataReader(MetadataManager &manager, BlockPointer pointer);
22
+ ~MetadataReader() override;
23
+
24
+ public:
25
+ //! Read content of size read_size into the buffer
26
+ void ReadData(data_ptr_t buffer, idx_t read_size) override;
27
+
28
+ MetaBlockPointer GetMetaBlockPointer();
29
+
30
+ MetadataManager &GetMetadataManager() {
31
+ return manager;
32
+ }
33
+
34
+ private:
35
+ data_ptr_t BasePtr();
36
+ data_ptr_t Ptr();
37
+
38
+ void ReadNextBlock();
39
+
40
+ MetadataPointer FromDiskPointer(MetaBlockPointer pointer);
41
+
42
+ private:
43
+ MetadataManager &manager;
44
+ BlockReaderType type;
45
+ MetadataHandle block;
46
+ MetadataPointer next_pointer;
47
+ bool has_next_block;
48
+ idx_t index;
49
+ idx_t offset;
50
+ idx_t next_offset;
51
+ idx_t capacity;
52
+ };
53
+
54
+ } // namespace duckdb
@@ -0,0 +1,45 @@
1
+ //===----------------------------------------------------------------------===//
2
+ // DuckDB
3
+ //
4
+ // duckdb/storage/metadata/metadata_writer.hpp
5
+ //
6
+ //
7
+ //===----------------------------------------------------------------------===//
8
+
9
+ #pragma once
10
+
11
+ #include "duckdb/storage/metadata/metadata_manager.hpp"
12
+
13
+ namespace duckdb {
14
+
15
+ class MetadataWriter : public Serializer {
16
+ public:
17
+ explicit MetadataWriter(MetadataManager &manager);
18
+ ~MetadataWriter() override;
19
+
20
+ public:
21
+ void WriteData(const_data_ptr_t buffer, idx_t write_size) override;
22
+
23
+ void Flush();
24
+
25
+ BlockPointer GetBlockPointer();
26
+ MetaBlockPointer GetMetaBlockPointer();
27
+
28
+ protected:
29
+ virtual MetadataHandle NextHandle();
30
+
31
+ private:
32
+ data_ptr_t BasePtr();
33
+ data_ptr_t Ptr();
34
+
35
+ void NextBlock();
36
+
37
+ private:
38
+ MetadataManager &manager;
39
+ MetadataHandle block;
40
+ MetadataPointer current_pointer;
41
+ idx_t capacity;
42
+ idx_t offset;
43
+ };
44
+
45
+ } // namespace duckdb
@@ -11,14 +11,14 @@
11
11
  #include "duckdb/common/common.hpp"
12
12
  #include "duckdb/common/map.hpp"
13
13
  #include "duckdb/storage/storage_manager.hpp"
14
- #include "duckdb/storage/meta_block_writer.hpp"
14
+ #include "duckdb/storage/metadata/metadata_writer.hpp"
15
15
  #include "duckdb/storage/data_pointer.hpp"
16
16
 
17
17
  namespace duckdb {
18
18
  class DatabaseInstance;
19
19
  class ClientContext;
20
20
  class ColumnSegment;
21
- class MetaBlockReader;
21
+ class MetadataReader;
22
22
  class SchemaCatalogEntry;
23
23
  class SequenceCatalogEntry;
24
24
  class TableCatalogEntry;
@@ -20,6 +20,7 @@
20
20
  namespace duckdb {
21
21
 
22
22
  class DatabaseInstance;
23
+ struct MetadataHandle;
23
24
 
24
25
  struct StorageManagerOptions {
25
26
  bool read_only = false;
@@ -45,7 +46,7 @@ public:
45
46
  //! Return the next free block id
46
47
  block_id_t GetFreeBlockId() override;
47
48
  //! Returns whether or not a specified block is the root block
48
- bool IsRootBlock(block_id_t root) override;
49
+ bool IsRootBlock(MetaBlockPointer root) override;
49
50
  //! Mark a block as free (immediately re-writeable)
50
51
  void MarkBlockAsFree(block_id_t block_id) override;
51
52
  //! Mark a block as modified (re-writeable after a checkpoint)
@@ -53,7 +54,7 @@ public:
53
54
  //! Increase the reference count of a block. The block should hold at least one reference
54
55
  void IncreaseBlockReferenceCount(block_id_t block_id) override;
55
56
  //! Return the meta block id
56
- block_id_t GetMetaBlock() override;
57
+ idx_t GetMetaBlock() override;
57
58
  //! Read the content of the block from disk
58
59
  void Read(Block &block) override;
59
60
  //! Write the given block to disk
@@ -78,7 +79,7 @@ private:
78
79
  void ChecksumAndWrite(FileBuffer &handle, uint64_t location) const;
79
80
 
80
81
  //! Return the blocks to which we will write the free list and modified blocks
81
- vector<block_id_t> GetFreeListBlocks();
82
+ vector<MetadataHandle> GetFreeListBlocks();
82
83
 
83
84
  private:
84
85
  AttachedDatabase &db;
@@ -99,11 +100,11 @@ private:
99
100
  //! The list of blocks that will be added to the free list
100
101
  unordered_set<block_id_t> modified_blocks;
101
102
  //! The current meta block id
102
- block_id_t meta_block;
103
+ idx_t meta_block;
103
104
  //! The current maximum block id, this id will be given away first after the free_list runs out
104
105
  block_id_t max_block;
105
106
  //! The block id where the free list can be found
106
- block_id_t free_list_id;
107
+ idx_t free_list_id;
107
108
  //! The current header iteration count
108
109
  uint64_t iteration_count;
109
110
  //! The storage manager options
@@ -65,9 +65,9 @@ struct DatabaseHeader {
65
65
  //! The iteration count, increases by 1 every time the storage is checkpointed.
66
66
  uint64_t iteration;
67
67
  //! A pointer to the initial meta block
68
- block_id_t meta_block;
68
+ idx_t meta_block;
69
69
  //! A pointer to the block containing the free list
70
- block_id_t free_list;
70
+ idx_t free_list;
71
71
  //! The number of blocks that is in the file as of this database header. If the file is larger than BLOCK_SIZE *
72
72
  //! block_count any blocks appearing AFTER block_count are implicitly part of the free_list.
73
73
  uint64_t block_count;
@@ -65,7 +65,7 @@ public:
65
65
 
66
66
  virtual bool AutomaticCheckpoint(idx_t estimated_wal_bytes) = 0;
67
67
  virtual unique_ptr<StorageCommitState> GenStorageCommitState(Transaction &transaction, bool checkpoint) = 0;
68
- virtual bool IsCheckpointClean(block_id_t checkpoint_id) = 0;
68
+ virtual bool IsCheckpointClean(MetaBlockPointer checkpoint_id) = 0;
69
69
  virtual void CreateCheckpoint(bool delete_wal = false, bool force_checkpoint = false) = 0;
70
70
  virtual DatabaseSize GetDatabaseSize() = 0;
71
71
  virtual shared_ptr<TableIOManager> GetTableIOManager(BoundCreateTableInfo *info) = 0;
@@ -109,7 +109,7 @@ public:
109
109
  public:
110
110
  bool AutomaticCheckpoint(idx_t estimated_wal_bytes) override;
111
111
  unique_ptr<StorageCommitState> GenStorageCommitState(Transaction &transaction, bool checkpoint) override;
112
- bool IsCheckpointClean(block_id_t checkpoint_id) override;
112
+ bool IsCheckpointClean(MetaBlockPointer checkpoint_id) override;
113
113
  void CreateCheckpoint(bool delete_wal, bool force_checkpoint) override;
114
114
  DatabaseSize GetDatabaseSize() override;
115
115
  shared_ptr<TableIOManager> GetTableIOManager(BoundCreateTableInfo *info) override;
@@ -12,6 +12,7 @@
12
12
  #include "duckdb/common/vector.hpp"
13
13
  #include "duckdb/storage/data_pointer.hpp"
14
14
  #include "duckdb/storage/table/table_statistics.hpp"
15
+ #include "duckdb/storage/metadata/metadata_manager.hpp"
15
16
 
16
17
  namespace duckdb {
17
18
  class BaseStatistics;
@@ -24,8 +25,7 @@ public:
24
25
  TableStatistics table_stats;
25
26
  idx_t total_rows;
26
27
  idx_t row_group_count;
27
- block_id_t block_id;
28
- idx_t offset;
28
+ MetaBlockPointer block_pointer;
29
29
  };
30
30
 
31
31
  } // namespace duckdb
@@ -162,7 +162,7 @@ private:
162
162
  private:
163
163
  mutex row_group_lock;
164
164
  mutex stats_lock;
165
- vector<BlockPointer> column_pointers;
165
+ vector<MetaBlockPointer> column_pointers;
166
166
  unique_ptr<atomic<bool>[]> is_loaded;
167
167
  };
168
168
 
@@ -27,6 +27,7 @@ class DuckTransaction;
27
27
  class BoundConstraint;
28
28
  class RowGroupSegmentTree;
29
29
  struct ColumnSegmentInfo;
30
+ class MetadataManager;
30
31
 
31
32
  class RowGroupCollection {
32
33
  public:
@@ -106,6 +107,7 @@ public:
106
107
  BlockManager &GetBlockManager() {
107
108
  return block_manager;
108
109
  }
110
+ MetadataManager &GetMetadataManager();
109
111
  DataTableInfo &GetTableInfo() {
110
112
  return *info;
111
113
  }
@@ -14,7 +14,7 @@
14
14
  namespace duckdb {
15
15
  struct DataTableInfo;
16
16
  class PersistentTableData;
17
- class MetaBlockReader;
17
+ class MetadataReader;
18
18
 
19
19
  class RowGroupSegmentTree : public SegmentTree<RowGroup, true> {
20
20
  public:
@@ -29,7 +29,7 @@ protected:
29
29
  RowGroupCollection &collection;
30
30
  idx_t current_row_group;
31
31
  idx_t max_row_group;
32
- unique_ptr<MetaBlockReader> reader;
32
+ unique_ptr<MetadataReader> reader;
33
33
  };
34
34
 
35
35
  } // namespace duckdb
@@ -47,7 +47,7 @@ public:
47
47
  void VerifyForeignKey(const vector<PhysicalIndex> &fk_keys, DataChunk &chunk, ConflictManager &conflict_manager);
48
48
 
49
49
  //! Serialize all indexes owned by this table, returns a vector of block info of all indexes
50
- vector<BlockPointer> SerializeIndexes(duckdb::MetaBlockWriter &writer);
50
+ vector<BlockPointer> SerializeIndexes(duckdb::MetadataWriter &writer);
51
51
 
52
52
  vector<column_t> GetRequiredColumns();
53
53
 
@@ -13,6 +13,7 @@
13
13
  namespace duckdb {
14
14
  class BlockManager;
15
15
  class DataTable;
16
+ class MetadataManager;
16
17
 
17
18
  class TableIOManager {
18
19
  public:
@@ -27,6 +28,8 @@ public:
27
28
 
28
29
  //! The block manager used for storing row group data
29
30
  virtual BlockManager &GetBlockManagerForRowData() = 0;
31
+
32
+ virtual MetadataManager &GetMetadataManager() = 0;
30
33
  };
31
34
 
32
35
  } // namespace duckdb
@@ -39,8 +39,7 @@ class TransactionManager;
39
39
  class ReplayState {
40
40
  public:
41
41
  ReplayState(AttachedDatabase &db, ClientContext &context, Deserializer &source)
42
- : db(db), context(context), catalog(db.GetCatalog()), source(source), deserialize_only(false),
43
- checkpoint_id(INVALID_BLOCK) {
42
+ : db(db), context(context), catalog(db.GetCatalog()), source(source), deserialize_only(false) {
44
43
  }
45
44
 
46
45
  AttachedDatabase &db;
@@ -49,7 +48,7 @@ public:
49
48
  Deserializer &source;
50
49
  optional_ptr<TableCatalogEntry> current_table;
51
50
  bool deserialize_only;
52
- block_id_t checkpoint_id;
51
+ MetaBlockPointer checkpoint_id;
53
52
 
54
53
  public:
55
54
  void ReplayEntry(WALType entry_type);
@@ -157,7 +156,7 @@ public:
157
156
  void Delete();
158
157
  void Flush();
159
158
 
160
- void WriteCheckpoint(block_id_t meta_block);
159
+ void WriteCheckpoint(MetaBlockPointer meta_block);
161
160
 
162
161
  protected:
163
162
  AttachedDatabase &database;
@@ -308,7 +308,8 @@ typedef enum { DuckDBSuccess = 0, DuckDBError = 1 } duckdb_state;
308
308
  typedef enum {
309
309
  DUCKDB_PENDING_RESULT_READY = 0,
310
310
  DUCKDB_PENDING_RESULT_NOT_READY = 1,
311
- DUCKDB_PENDING_ERROR = 2
311
+ DUCKDB_PENDING_ERROR = 2,
312
+ DUCKDB_PENDING_NO_TASKS_AVAILABLE = 3
312
313
  } duckdb_pending_state;
313
314
 
314
315
  //===--------------------------------------------------------------------===//
@@ -1260,6 +1261,15 @@ Otherwise, all remaining tasks must be executed first.
1260
1261
  */
1261
1262
  DUCKDB_API duckdb_state duckdb_execute_pending(duckdb_pending_result pending_result, duckdb_result *out_result);
1262
1263
 
1264
+ /*!
1265
+ Returns whether a duckdb_pending_state is finished executing. For example if `pending_state` is
1266
+ DUCKDB_PENDING_RESULT_READY, this function will return true.
1267
+
1268
+ * pending_state: The pending state on which to decide whether to finish execution.
1269
+ * returns: Boolean indicating pending execution should be considered finished.
1270
+ */
1271
+ DUCKDB_API bool duckdb_pending_execution_is_finished(duckdb_pending_state pending_state);
1272
+
1263
1273
  //===--------------------------------------------------------------------===//
1264
1274
  // Value Interface
1265
1275
  //===--------------------------------------------------------------------===//
@@ -92,6 +92,8 @@ duckdb_pending_state duckdb_pending_execute_task(duckdb_pending_result pending_r
92
92
  switch (return_value) {
93
93
  case PendingExecutionResult::RESULT_READY:
94
94
  return DUCKDB_PENDING_RESULT_READY;
95
+ case PendingExecutionResult::NO_TASKS_AVAILABLE:
96
+ return DUCKDB_PENDING_NO_TASKS_AVAILABLE;
95
97
  case PendingExecutionResult::RESULT_NOT_READY:
96
98
  return DUCKDB_PENDING_RESULT_NOT_READY;
97
99
  default:
@@ -99,6 +101,21 @@ duckdb_pending_state duckdb_pending_execute_task(duckdb_pending_result pending_r
99
101
  }
100
102
  }
101
103
 
104
+ bool duckdb_pending_execution_is_finished(duckdb_pending_state pending_state) {
105
+ switch (pending_state) {
106
+ case DUCKDB_PENDING_RESULT_READY:
107
+ return PendingQueryResult::IsFinished(PendingExecutionResult::RESULT_READY);
108
+ case DUCKDB_PENDING_NO_TASKS_AVAILABLE:
109
+ return PendingQueryResult::IsFinished(PendingExecutionResult::NO_TASKS_AVAILABLE);
110
+ case DUCKDB_PENDING_RESULT_NOT_READY:
111
+ return PendingQueryResult::IsFinished(PendingExecutionResult::RESULT_NOT_READY);
112
+ case DUCKDB_PENDING_ERROR:
113
+ return PendingQueryResult::IsFinished(PendingExecutionResult::EXECUTION_ERROR);
114
+ default:
115
+ return PendingQueryResult::IsFinished(PendingExecutionResult::EXECUTION_ERROR);
116
+ }
117
+ }
118
+
102
119
  duckdb_state duckdb_execute_pending(duckdb_pending_result pending_result, duckdb_result *out_result) {
103
120
  if (!pending_result || !out_result) {
104
121
  return DuckDBError;
@@ -55,7 +55,8 @@ PendingExecutionResult PendingQueryResult::ExecuteTaskInternal(ClientContextLock
55
55
 
56
56
  unique_ptr<QueryResult> PendingQueryResult::ExecuteInternal(ClientContextLock &lock) {
57
57
  CheckExecutableInternal(lock);
58
- while (ExecuteTaskInternal(lock) == PendingExecutionResult::RESULT_NOT_READY) {
58
+ // Busy wait while execution is not finished
59
+ while (!IsFinished(ExecuteTaskInternal(lock))) {
59
60
  }
60
61
  if (HasError()) {
61
62
  return make_uniq<MaterializedQueryResult>(error);
@@ -74,4 +75,11 @@ void PendingQueryResult::Close() {
74
75
  context.reset();
75
76
  }
76
77
 
78
+ bool PendingQueryResult::IsFinished(PendingExecutionResult result) {
79
+ if (result == PendingExecutionResult::RESULT_READY || result == PendingExecutionResult::EXECUTION_ERROR) {
80
+ return true;
81
+ }
82
+ return false;
83
+ }
84
+
77
85
  } // namespace duckdb