duckdb 0.7.2-dev2233.0 → 0.7.2-dev2320.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 (176) hide show
  1. package/binding.gyp +1 -0
  2. package/package.json +1 -1
  3. package/src/duckdb/src/catalog/catalog.cpp +18 -17
  4. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +0 -4
  5. package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +0 -4
  6. package/src/duckdb/src/catalog/catalog_set.cpp +3 -3
  7. package/src/duckdb/src/common/adbc/adbc.cpp +441 -0
  8. package/src/duckdb/src/common/adbc/driver_manager.cpp +749 -0
  9. package/src/duckdb/src/common/arrow/arrow_wrapper.cpp +1 -1
  10. package/src/duckdb/src/common/tree_renderer.cpp +3 -3
  11. package/src/duckdb/src/common/types/conflict_manager.cpp +2 -1
  12. package/src/duckdb/src/execution/column_binding_resolver.cpp +1 -1
  13. package/src/duckdb/src/execution/operator/aggregate/physical_ungrouped_aggregate.cpp +1 -1
  14. package/src/duckdb/src/execution/operator/filter/physical_filter.cpp +2 -2
  15. package/src/duckdb/src/execution/operator/helper/physical_execute.cpp +2 -2
  16. package/src/duckdb/src/execution/operator/helper/physical_result_collector.cpp +5 -5
  17. package/src/duckdb/src/execution/operator/join/physical_cross_product.cpp +1 -1
  18. package/src/duckdb/src/execution/operator/join/physical_delim_join.cpp +11 -10
  19. package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +3 -3
  20. package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +9 -9
  21. package/src/duckdb/src/execution/operator/join/physical_index_join.cpp +4 -4
  22. package/src/duckdb/src/execution/operator/join/physical_join.cpp +7 -7
  23. package/src/duckdb/src/execution/operator/join/physical_nested_loop_join.cpp +3 -3
  24. package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +3 -3
  25. package/src/duckdb/src/execution/operator/join/physical_positional_join.cpp +2 -2
  26. package/src/duckdb/src/execution/operator/persistent/csv_reader_options.cpp +8 -9
  27. package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +20 -19
  28. package/src/duckdb/src/execution/operator/persistent/physical_export.cpp +3 -3
  29. package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +25 -24
  30. package/src/duckdb/src/execution/operator/persistent/physical_update.cpp +1 -1
  31. package/src/duckdb/src/execution/operator/projection/physical_projection.cpp +2 -2
  32. package/src/duckdb/src/execution/operator/scan/physical_column_data_scan.cpp +12 -6
  33. package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +10 -11
  34. package/src/duckdb/src/execution/operator/set/physical_union.cpp +2 -2
  35. package/src/duckdb/src/execution/physical_operator.cpp +13 -13
  36. package/src/duckdb/src/execution/physical_plan/plan_column_data_get.cpp +2 -4
  37. package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +1 -1
  38. package/src/duckdb/src/execution/physical_plan/plan_create_table.cpp +5 -5
  39. package/src/duckdb/src/execution/physical_plan/plan_delete.cpp +3 -3
  40. package/src/duckdb/src/execution/physical_plan/plan_delim_join.cpp +6 -7
  41. package/src/duckdb/src/execution/physical_plan/plan_explain.cpp +2 -4
  42. package/src/duckdb/src/execution/physical_plan/plan_insert.cpp +2 -2
  43. package/src/duckdb/src/execution/physical_plan/plan_show_select.cpp +2 -4
  44. package/src/duckdb/src/execution/physical_plan/plan_update.cpp +3 -3
  45. package/src/duckdb/src/function/compression_config.cpp +9 -9
  46. package/src/duckdb/src/function/scalar/date/strftime.cpp +1 -1
  47. package/src/duckdb/src/function/table/copy_csv.cpp +5 -0
  48. package/src/duckdb/src/function/table/pragma_detailed_profiling_output.cpp +6 -5
  49. package/src/duckdb/src/function/table/pragma_last_profiling_output.cpp +7 -5
  50. package/src/duckdb/src/function/table/system/duckdb_databases.cpp +1 -1
  51. package/src/duckdb/src/function/table/system/duckdb_dependencies.cpp +1 -1
  52. package/src/duckdb/src/function/table/system/duckdb_extensions.cpp +1 -1
  53. package/src/duckdb/src/function/table/system/duckdb_indexes.cpp +1 -1
  54. package/src/duckdb/src/function/table/system/duckdb_keywords.cpp +1 -1
  55. package/src/duckdb/src/function/table/system/duckdb_schemas.cpp +1 -1
  56. package/src/duckdb/src/function/table/system/duckdb_sequences.cpp +1 -1
  57. package/src/duckdb/src/function/table/system/duckdb_settings.cpp +1 -1
  58. package/src/duckdb/src/function/table/system/duckdb_tables.cpp +1 -1
  59. package/src/duckdb/src/function/table/system/duckdb_temporary_files.cpp +1 -1
  60. package/src/duckdb/src/function/table/system/duckdb_types.cpp +1 -1
  61. package/src/duckdb/src/function/table/system/pragma_collations.cpp +1 -1
  62. package/src/duckdb/src/function/table/system/pragma_database_size.cpp +1 -1
  63. package/src/duckdb/src/function/table/system/pragma_storage_info.cpp +5 -5
  64. package/src/duckdb/src/function/table/system/pragma_table_info.cpp +1 -1
  65. package/src/duckdb/src/function/table/system/test_all_types.cpp +1 -1
  66. package/src/duckdb/src/function/table/table_scan.cpp +3 -4
  67. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  68. package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +3 -3
  69. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_table_entry.hpp +1 -2
  70. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_catalog_entry.hpp +1 -2
  71. package/src/duckdb/src/include/duckdb/common/adbc/adbc-init.hpp +37 -0
  72. package/src/duckdb/src/include/duckdb/common/adbc/adbc.h +1088 -0
  73. package/src/duckdb/src/include/duckdb/common/adbc/adbc.hpp +85 -0
  74. package/src/duckdb/src/include/duckdb/common/adbc/driver_manager.h +84 -0
  75. package/src/duckdb/src/include/duckdb/common/helper.hpp +3 -0
  76. package/src/duckdb/src/include/duckdb/common/types/conflict_manager.hpp +3 -2
  77. package/src/duckdb/src/include/duckdb/common/types.hpp +0 -1
  78. package/src/duckdb/src/include/duckdb/execution/executor.hpp +7 -7
  79. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_execute.hpp +1 -1
  80. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_result_collector.hpp +1 -1
  81. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_cross_product.hpp +1 -1
  82. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_delim_join.hpp +3 -3
  83. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_index_join.hpp +1 -1
  84. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_join.hpp +1 -1
  85. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_positional_join.hpp +1 -1
  86. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +2 -1
  87. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_batch_insert.hpp +2 -2
  88. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_export.hpp +1 -1
  89. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_insert.hpp +2 -2
  90. package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_column_data_scan.hpp +3 -4
  91. package/src/duckdb/src/include/duckdb/execution/operator/set/physical_recursive_cte.hpp +1 -1
  92. package/src/duckdb/src/include/duckdb/execution/operator/set/physical_union.hpp +1 -1
  93. package/src/duckdb/src/include/duckdb/execution/physical_operator.hpp +3 -3
  94. package/src/duckdb/src/include/duckdb/execution/physical_operator_states.hpp +1 -1
  95. package/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp +1 -1
  96. package/src/duckdb/src/include/duckdb/main/config.hpp +2 -2
  97. package/src/duckdb/src/include/duckdb/main/query_profiler.hpp +10 -9
  98. package/src/duckdb/src/include/duckdb/parallel/meta_pipeline.hpp +4 -4
  99. package/src/duckdb/src/include/duckdb/parallel/pipeline.hpp +18 -17
  100. package/src/duckdb/src/include/duckdb/parallel/pipeline_executor.hpp +2 -2
  101. package/src/duckdb/src/include/duckdb/planner/bind_context.hpp +14 -17
  102. package/src/duckdb/src/include/duckdb/planner/binder.hpp +6 -6
  103. package/src/duckdb/src/include/duckdb/planner/expression_binder/index_binder.hpp +4 -4
  104. package/src/duckdb/src/include/duckdb/planner/expression_binder/where_binder.hpp +2 -2
  105. package/src/duckdb/src/include/duckdb/planner/operator/logical_create.hpp +3 -2
  106. package/src/duckdb/src/include/duckdb/planner/operator/logical_create_table.hpp +2 -2
  107. package/src/duckdb/src/include/duckdb/planner/operator/logical_delete.hpp +2 -2
  108. package/src/duckdb/src/include/duckdb/planner/operator/logical_insert.hpp +2 -2
  109. package/src/duckdb/src/include/duckdb/planner/operator/logical_update.hpp +2 -2
  110. package/src/duckdb/src/include/duckdb/planner/parsed_data/bound_create_function_info.hpp +3 -2
  111. package/src/duckdb/src/include/duckdb/planner/parsed_data/bound_create_table_info.hpp +3 -2
  112. package/src/duckdb/src/include/duckdb/planner/table_binding.hpp +6 -5
  113. package/src/duckdb/src/include/duckdb/planner/tableref/bound_basetableref.hpp +2 -2
  114. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_compress.hpp +3 -7
  115. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_compress.hpp +3 -7
  116. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +1 -1
  117. package/src/duckdb/src/include/duckdb/storage/storage_manager.hpp +1 -1
  118. package/src/duckdb/src/include/duckdb/storage/table/column_data_checkpointer.hpp +2 -1
  119. package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +2 -2
  120. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +1 -1
  121. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +1 -1
  122. package/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +4 -4
  123. package/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +3 -3
  124. package/src/duckdb/src/include/duckdb/transaction/cleanup_state.hpp +3 -3
  125. package/src/duckdb/src/include/duckdb/transaction/commit_state.hpp +5 -5
  126. package/src/duckdb/src/include/duckdb/transaction/duck_transaction.hpp +3 -3
  127. package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +31 -30
  128. package/src/duckdb/src/include/duckdb/transaction/transaction_data.hpp +2 -1
  129. package/src/duckdb/src/include/duckdb/transaction/undo_buffer.hpp +1 -1
  130. package/src/duckdb/src/main/client_context.cpp +1 -1
  131. package/src/duckdb/src/main/query_profiler.cpp +24 -22
  132. package/src/duckdb/src/parallel/executor.cpp +55 -49
  133. package/src/duckdb/src/parallel/meta_pipeline.cpp +5 -5
  134. package/src/duckdb/src/parallel/pipeline.cpp +43 -26
  135. package/src/duckdb/src/parallel/pipeline_executor.cpp +22 -22
  136. package/src/duckdb/src/planner/bind_context.cpp +67 -71
  137. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +6 -7
  138. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +6 -8
  139. package/src/duckdb/src/planner/binder/statement/bind_delete.cpp +3 -4
  140. package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +17 -18
  141. package/src/duckdb/src/planner/binder/statement/bind_update.cpp +16 -17
  142. package/src/duckdb/src/planner/binder/statement/bind_vacuum.cpp +6 -5
  143. package/src/duckdb/src/planner/binder/tableref/bind_basetableref.cpp +9 -9
  144. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +20 -18
  145. package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +1 -1
  146. package/src/duckdb/src/planner/binder.cpp +4 -4
  147. package/src/duckdb/src/planner/expression_binder/index_binder.cpp +2 -1
  148. package/src/duckdb/src/planner/expression_binder/where_binder.cpp +3 -2
  149. package/src/duckdb/src/planner/operator/logical_create_table.cpp +1 -1
  150. package/src/duckdb/src/planner/operator/logical_delete.cpp +5 -5
  151. package/src/duckdb/src/planner/operator/logical_insert.cpp +6 -7
  152. package/src/duckdb/src/planner/operator/logical_update.cpp +6 -7
  153. package/src/duckdb/src/planner/parsed_data/bound_create_table_info.cpp +4 -5
  154. package/src/duckdb/src/planner/table_binding.cpp +6 -5
  155. package/src/duckdb/src/storage/compression/bitpacking.cpp +5 -6
  156. package/src/duckdb/src/storage/compression/dictionary_compression.cpp +5 -6
  157. package/src/duckdb/src/storage/compression/fsst.cpp +3 -5
  158. package/src/duckdb/src/storage/compression/rle.cpp +4 -6
  159. package/src/duckdb/src/storage/data_table.cpp +27 -28
  160. package/src/duckdb/src/storage/local_storage.cpp +70 -68
  161. package/src/duckdb/src/storage/storage_manager.cpp +12 -13
  162. package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +2 -2
  163. package/src/duckdb/src/storage/table/column_data.cpp +2 -2
  164. package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +18 -6
  165. package/src/duckdb/src/storage/table/column_segment.cpp +23 -24
  166. package/src/duckdb/src/storage/table/row_group.cpp +3 -3
  167. package/src/duckdb/src/storage/table/row_group_collection.cpp +1 -1
  168. package/src/duckdb/src/storage/table/update_segment.cpp +15 -15
  169. package/src/duckdb/src/storage/wal_replay.cpp +1 -1
  170. package/src/duckdb/src/transaction/cleanup_state.cpp +10 -10
  171. package/src/duckdb/src/transaction/commit_state.cpp +19 -19
  172. package/src/duckdb/src/transaction/duck_transaction.cpp +7 -7
  173. package/src/duckdb/src/transaction/rollback_state.cpp +1 -1
  174. package/src/duckdb/src/transaction/undo_buffer.cpp +2 -1
  175. package/src/duckdb/ub_src_common_adbc.cpp +4 -0
  176. package/src/duckdb/src/include/duckdb/common/single_thread_ptr.hpp +0 -185
@@ -18,10 +18,10 @@ namespace duckdb {
18
18
  //===--------------------------------------------------------------------===//
19
19
  // OptimisticDataWriter
20
20
  //===--------------------------------------------------------------------===//
21
- OptimisticDataWriter::OptimisticDataWriter(DataTable *table) : table(table) {
21
+ OptimisticDataWriter::OptimisticDataWriter(DataTable &table) : table(table) {
22
22
  }
23
23
 
24
- OptimisticDataWriter::OptimisticDataWriter(DataTable *table, OptimisticDataWriter &parent)
24
+ OptimisticDataWriter::OptimisticDataWriter(DataTable &table, OptimisticDataWriter &parent)
25
25
  : table(table), partial_manager(std::move(parent.partial_manager)),
26
26
  written_blocks(std::move(parent.written_blocks)) {
27
27
  if (partial_manager) {
@@ -34,13 +34,13 @@ OptimisticDataWriter::~OptimisticDataWriter() {
34
34
 
35
35
  bool OptimisticDataWriter::PrepareWrite() {
36
36
  // check if we should pre-emptively write the table to disk
37
- if (table->info->IsTemporary() || StorageManager::Get(table->info->db).InMemory()) {
37
+ if (table.info->IsTemporary() || StorageManager::Get(table.info->db).InMemory()) {
38
38
  return false;
39
39
  }
40
40
  // we should! write the second-to-last row group to disk
41
41
  // allocate the partial block-manager if none is allocated yet
42
42
  if (!partial_manager) {
43
- auto &block_manager = table->info->table_io_manager->GetBlockManagerForRowData();
43
+ auto &block_manager = table.info->table_io_manager->GetBlockManagerForRowData();
44
44
  partial_manager = make_uniq<PartialBlockManager>(block_manager);
45
45
  }
46
46
  return true;
@@ -62,7 +62,7 @@ void OptimisticDataWriter::FlushToDisk(RowGroup *row_group) {
62
62
  //! The set of column compression types (if any)
63
63
  vector<CompressionType> compression_types;
64
64
  D_ASSERT(compression_types.empty());
65
- for (auto &column : table->column_definitions) {
65
+ for (auto &column : table.column_definitions) {
66
66
  compression_types.push_back(column.CompressionType());
67
67
  }
68
68
  auto row_group_pointer = row_group->WriteToDisk(*partial_manager, compression_types);
@@ -102,7 +102,7 @@ void OptimisticDataWriter::Rollback() {
102
102
  partial_manager.reset();
103
103
  }
104
104
  if (!written_blocks.empty()) {
105
- auto &block_manager = table->info->table_io_manager->GetBlockManagerForRowData();
105
+ auto &block_manager = table.info->table_io_manager->GetBlockManagerForRowData();
106
106
  for (auto block_id : written_blocks) {
107
107
  block_manager.MarkBlockAsFree(block_id);
108
108
  }
@@ -113,7 +113,7 @@ void OptimisticDataWriter::Rollback() {
113
113
  // Local Table Storage
114
114
  //===--------------------------------------------------------------------===//
115
115
  LocalTableStorage::LocalTableStorage(DataTable &table)
116
- : table(&table), allocator(Allocator::Get(table.db)), deleted_rows(0), optimistic_writer(&table) {
116
+ : table_ref(table), allocator(Allocator::Get(table.db)), deleted_rows(0), optimistic_writer(table) {
117
117
  auto types = table.GetTypes();
118
118
  row_groups = make_shared<RowGroupCollection>(table.info, TableIOManager::Get(table).GetBlockManagerForRowData(),
119
119
  types, MAX_ROW_ID, 0);
@@ -138,26 +138,26 @@ LocalTableStorage::LocalTableStorage(DataTable &table)
138
138
  LocalTableStorage::LocalTableStorage(ClientContext &context, DataTable &new_dt, LocalTableStorage &parent,
139
139
  idx_t changed_idx, const LogicalType &target_type,
140
140
  const vector<column_t> &bound_columns, Expression &cast_expr)
141
- : table(&new_dt), allocator(Allocator::Get(table->db)), deleted_rows(parent.deleted_rows),
142
- optimistic_writer(table, parent.optimistic_writer), optimistic_writers(std::move(parent.optimistic_writers)) {
141
+ : table_ref(new_dt), allocator(Allocator::Get(new_dt.db)), deleted_rows(parent.deleted_rows),
142
+ optimistic_writer(new_dt, parent.optimistic_writer), optimistic_writers(std::move(parent.optimistic_writers)) {
143
143
  row_groups = parent.row_groups->AlterType(context, changed_idx, target_type, bound_columns, cast_expr);
144
144
  parent.row_groups.reset();
145
145
  indexes.Move(parent.indexes);
146
146
  }
147
147
 
148
148
  LocalTableStorage::LocalTableStorage(DataTable &new_dt, LocalTableStorage &parent, idx_t drop_idx)
149
- : table(&new_dt), allocator(Allocator::Get(table->db)), deleted_rows(parent.deleted_rows),
150
- optimistic_writer(table, parent.optimistic_writer), optimistic_writers(std::move(parent.optimistic_writers)) {
149
+ : table_ref(new_dt), allocator(Allocator::Get(new_dt.db)), deleted_rows(parent.deleted_rows),
150
+ optimistic_writer(new_dt, parent.optimistic_writer), optimistic_writers(std::move(parent.optimistic_writers)) {
151
151
  row_groups = parent.row_groups->RemoveColumn(drop_idx);
152
152
  parent.row_groups.reset();
153
153
  indexes.Move(parent.indexes);
154
154
  }
155
155
 
156
156
  LocalTableStorage::LocalTableStorage(ClientContext &context, DataTable &new_dt, LocalTableStorage &parent,
157
- ColumnDefinition &new_column, Expression *default_value)
158
- : table(&new_dt), allocator(Allocator::Get(table->db)), deleted_rows(parent.deleted_rows),
159
- optimistic_writer(table, parent.optimistic_writer), optimistic_writers(std::move(parent.optimistic_writers)) {
160
- row_groups = parent.row_groups->AddColumn(context, new_column, default_value);
157
+ ColumnDefinition &new_column, optional_ptr<Expression> default_value)
158
+ : table_ref(new_dt), allocator(Allocator::Get(new_dt.db)), deleted_rows(parent.deleted_rows),
159
+ optimistic_writer(new_dt, parent.optimistic_writer), optimistic_writers(std::move(parent.optimistic_writers)) {
160
+ row_groups = parent.row_groups->AddColumn(context, new_column, default_value.get());
161
161
  parent.row_groups.reset();
162
162
  indexes.Move(parent.indexes);
163
163
  }
@@ -165,12 +165,12 @@ LocalTableStorage::LocalTableStorage(ClientContext &context, DataTable &new_dt,
165
165
  LocalTableStorage::~LocalTableStorage() {
166
166
  }
167
167
 
168
- void LocalTableStorage::InitializeScan(CollectionScanState &state, TableFilterSet *table_filters) {
168
+ void LocalTableStorage::InitializeScan(CollectionScanState &state, optional_ptr<TableFilterSet> table_filters) {
169
169
  if (row_groups->GetTotalRows() == 0) {
170
170
  // nothing to scan
171
171
  return;
172
172
  }
173
- row_groups->InitializeScan(state, state.GetColumnIds(), table_filters);
173
+ row_groups->InitializeScan(state, state.GetColumnIds(), table_filters.get());
174
174
  }
175
175
 
176
176
  idx_t LocalTableStorage::EstimatedSize() {
@@ -228,25 +228,26 @@ PreservedError LocalTableStorage::AppendToIndexes(DuckTransaction &transaction,
228
228
 
229
229
  void LocalTableStorage::AppendToIndexes(DuckTransaction &transaction, TableAppendState &append_state,
230
230
  idx_t append_count, bool append_to_table) {
231
+ auto &table = table_ref.get();
231
232
  if (append_to_table) {
232
- table->InitializeAppend(transaction, append_state, append_count);
233
+ table.InitializeAppend(transaction, append_state, append_count);
233
234
  }
234
235
  PreservedError error;
235
236
  if (append_to_table) {
236
237
  // appending: need to scan entire
237
238
  row_groups->Scan(transaction, [&](DataChunk &chunk) -> bool {
238
239
  // append this chunk to the indexes of the table
239
- error = table->AppendToIndexes(chunk, append_state.current_row);
240
+ error = table.AppendToIndexes(chunk, append_state.current_row);
240
241
  if (error) {
241
242
  return false;
242
243
  }
243
244
  // append to base table
244
- table->Append(chunk, append_state);
245
+ table.Append(chunk, append_state);
245
246
  return true;
246
247
  });
247
248
  } else {
248
- error = AppendToIndexes(transaction, *row_groups, table->info->indexes, table->GetTypes(),
249
- append_state.current_row);
249
+ error =
250
+ AppendToIndexes(transaction, *row_groups, table.info->indexes, table.GetTypes(), append_state.current_row);
250
251
  }
251
252
  if (error) {
252
253
  // need to revert the append
@@ -255,7 +256,7 @@ void LocalTableStorage::AppendToIndexes(DuckTransaction &transaction, TableAppen
255
256
  row_groups->Scan(transaction, [&](DataChunk &chunk) -> bool {
256
257
  // append this chunk to the indexes of the table
257
258
  try {
258
- table->RemoveFromIndexes(append_state, chunk, current_row);
259
+ table.RemoveFromIndexes(append_state, chunk, current_row);
259
260
  } catch (Exception &ex) {
260
261
  error = PreservedError(ex);
261
262
  return false;
@@ -272,16 +273,16 @@ void LocalTableStorage::AppendToIndexes(DuckTransaction &transaction, TableAppen
272
273
  return true;
273
274
  });
274
275
  if (append_to_table) {
275
- table->RevertAppendInternal(append_state.row_start, append_count);
276
+ table.RevertAppendInternal(append_state.row_start, append_count);
276
277
  }
277
278
  error.Throw();
278
279
  }
279
280
  }
280
281
 
281
- OptimisticDataWriter *LocalTableStorage::CreateOptimisticWriter() {
282
- auto writer = make_uniq<OptimisticDataWriter>(table);
282
+ OptimisticDataWriter &LocalTableStorage::CreateOptimisticWriter() {
283
+ auto writer = make_uniq<OptimisticDataWriter>(table_ref.get());
283
284
  optimistic_writers.push_back(std::move(writer));
284
- return optimistic_writers.back().get();
285
+ return *optimistic_writers.back();
285
286
  }
286
287
 
287
288
  void LocalTableStorage::Rollback() {
@@ -295,22 +296,22 @@ void LocalTableStorage::Rollback() {
295
296
  //===--------------------------------------------------------------------===//
296
297
  // LocalTableManager
297
298
  //===--------------------------------------------------------------------===//
298
- LocalTableStorage *LocalTableManager::GetStorage(DataTable *table) {
299
+ optional_ptr<LocalTableStorage> LocalTableManager::GetStorage(DataTable &table) {
299
300
  lock_guard<mutex> l(table_storage_lock);
300
301
  auto entry = table_storage.find(table);
301
302
  return entry == table_storage.end() ? nullptr : entry->second.get();
302
303
  }
303
304
 
304
- LocalTableStorage *LocalTableManager::GetOrCreateStorage(DataTable *table) {
305
+ LocalTableStorage &LocalTableManager::GetOrCreateStorage(DataTable &table) {
305
306
  lock_guard<mutex> l(table_storage_lock);
306
307
  auto entry = table_storage.find(table);
307
308
  if (entry == table_storage.end()) {
308
- auto new_storage = make_shared<LocalTableStorage>(*table);
309
+ auto new_storage = make_shared<LocalTableStorage>(table);
309
310
  auto storage = new_storage.get();
310
- table_storage.insert(make_pair(table, std::move(new_storage)));
311
- return storage;
311
+ table_storage.insert(make_pair(reference<DataTable>(table), std::move(new_storage)));
312
+ return *storage;
312
313
  } else {
313
- return entry->second.get();
314
+ return *entry->second.get();
314
315
  }
315
316
  }
316
317
 
@@ -319,7 +320,7 @@ bool LocalTableManager::IsEmpty() {
319
320
  return table_storage.empty();
320
321
  }
321
322
 
322
- shared_ptr<LocalTableStorage> LocalTableManager::MoveEntry(DataTable *table) {
323
+ shared_ptr<LocalTableStorage> LocalTableManager::MoveEntry(DataTable &table) {
323
324
  lock_guard<mutex> l(table_storage_lock);
324
325
  auto entry = table_storage.find(table);
325
326
  if (entry == table_storage.end()) {
@@ -330,7 +331,7 @@ shared_ptr<LocalTableStorage> LocalTableManager::MoveEntry(DataTable *table) {
330
331
  return storage_entry;
331
332
  }
332
333
 
333
- unordered_map<DataTable *, shared_ptr<LocalTableStorage>> LocalTableManager::MoveEntries() {
334
+ reference_map_t<DataTable, shared_ptr<LocalTableStorage>> LocalTableManager::MoveEntries() {
334
335
  lock_guard<mutex> l(table_storage_lock);
335
336
  return std::move(table_storage);
336
337
  }
@@ -344,7 +345,7 @@ idx_t LocalTableManager::EstimatedSize() {
344
345
  return estimated_size;
345
346
  }
346
347
 
347
- void LocalTableManager::InsertEntry(DataTable *table, shared_ptr<LocalTableStorage> entry) {
348
+ void LocalTableManager::InsertEntry(DataTable &table, shared_ptr<LocalTableStorage> entry) {
348
349
  lock_guard<mutex> l(table_storage_lock);
349
350
  D_ASSERT(table_storage.find(table) == table_storage.end());
350
351
  table_storage[table] = std::move(entry);
@@ -375,7 +376,8 @@ LocalStorage &LocalStorage::Get(ClientContext &context, Catalog &catalog) {
375
376
  return LocalStorage::Get(context, catalog.GetAttached());
376
377
  }
377
378
 
378
- void LocalStorage::InitializeScan(DataTable *table, CollectionScanState &state, TableFilterSet *table_filters) {
379
+ void LocalStorage::InitializeScan(DataTable &table, CollectionScanState &state,
380
+ optional_ptr<TableFilterSet> table_filters) {
379
381
  auto storage = table_manager.GetStorage(table);
380
382
  if (storage == nullptr) {
381
383
  return;
@@ -387,7 +389,7 @@ void LocalStorage::Scan(CollectionScanState &state, const vector<column_t> &colu
387
389
  state.Scan(transaction, result);
388
390
  }
389
391
 
390
- void LocalStorage::InitializeParallelScan(DataTable *table, ParallelCollectionScanState &state) {
392
+ void LocalStorage::InitializeParallelScan(DataTable &table, ParallelCollectionScanState &state) {
391
393
  auto storage = table_manager.GetStorage(table);
392
394
  if (!storage) {
393
395
  state.max_row = 0;
@@ -398,7 +400,7 @@ void LocalStorage::InitializeParallelScan(DataTable *table, ParallelCollectionSc
398
400
  }
399
401
  }
400
402
 
401
- bool LocalStorage::NextParallelScan(ClientContext &context, DataTable *table, ParallelCollectionScanState &state,
403
+ bool LocalStorage::NextParallelScan(ClientContext &context, DataTable &table, ParallelCollectionScanState &state,
402
404
  CollectionScanState &scan_state) {
403
405
  auto storage = table_manager.GetStorage(table);
404
406
  if (!storage) {
@@ -407,8 +409,8 @@ bool LocalStorage::NextParallelScan(ClientContext &context, DataTable *table, Pa
407
409
  return storage->row_groups->NextParallelScan(context, state, scan_state);
408
410
  }
409
411
 
410
- void LocalStorage::InitializeAppend(LocalAppendState &state, DataTable *table) {
411
- state.storage = table_manager.GetOrCreateStorage(table);
412
+ void LocalStorage::InitializeAppend(LocalAppendState &state, DataTable &table) {
413
+ state.storage = &table_manager.GetOrCreateStorage(table);
412
414
  state.storage->row_groups->InitializeAppend(TransactionData(transaction), state.append_state, 0);
413
415
  }
414
416
 
@@ -434,29 +436,29 @@ void LocalStorage::FinalizeAppend(LocalAppendState &state) {
434
436
  state.storage->row_groups->FinalizeAppend(state.append_state.transaction, state.append_state);
435
437
  }
436
438
 
437
- void LocalStorage::LocalMerge(DataTable *table, RowGroupCollection &collection) {
438
- auto storage = table_manager.GetOrCreateStorage(table);
439
- if (!storage->indexes.Empty()) {
439
+ void LocalStorage::LocalMerge(DataTable &table, RowGroupCollection &collection) {
440
+ auto &storage = table_manager.GetOrCreateStorage(table);
441
+ if (!storage.indexes.Empty()) {
440
442
  // append data to indexes if required
441
- row_t base_id = MAX_ROW_ID + storage->row_groups->GetTotalRows();
442
- auto error = storage->AppendToIndexes(transaction, collection, storage->indexes, table->GetTypes(), base_id);
443
+ row_t base_id = MAX_ROW_ID + storage.row_groups->GetTotalRows();
444
+ auto error = storage.AppendToIndexes(transaction, collection, storage.indexes, table.GetTypes(), base_id);
443
445
  if (error) {
444
446
  error.Throw();
445
447
  }
446
448
  }
447
- storage->row_groups->MergeStorage(collection);
449
+ storage.row_groups->MergeStorage(collection);
448
450
  }
449
451
 
450
- OptimisticDataWriter *LocalStorage::CreateOptimisticWriter(DataTable *table) {
451
- auto storage = table_manager.GetOrCreateStorage(table);
452
- return storage->CreateOptimisticWriter();
452
+ OptimisticDataWriter &LocalStorage::CreateOptimisticWriter(DataTable &table) {
453
+ auto &storage = table_manager.GetOrCreateStorage(table);
454
+ return storage.CreateOptimisticWriter();
453
455
  }
454
456
 
455
457
  bool LocalStorage::ChangesMade() noexcept {
456
458
  return !table_manager.IsEmpty();
457
459
  }
458
460
 
459
- bool LocalStorage::Find(DataTable *table) {
461
+ bool LocalStorage::Find(DataTable &table) {
460
462
  return table_manager.GetStorage(table) != nullptr;
461
463
  }
462
464
 
@@ -464,7 +466,7 @@ idx_t LocalStorage::EstimatedSize() {
464
466
  return table_manager.EstimatedSize();
465
467
  }
466
468
 
467
- idx_t LocalStorage::Delete(DataTable *table, Vector &row_ids, idx_t count) {
469
+ idx_t LocalStorage::Delete(DataTable &table, Vector &row_ids, idx_t count) {
468
470
  auto storage = table_manager.GetStorage(table);
469
471
  D_ASSERT(storage);
470
472
 
@@ -479,7 +481,7 @@ idx_t LocalStorage::Delete(DataTable *table, Vector &row_ids, idx_t count) {
479
481
  return delete_count;
480
482
  }
481
483
 
482
- void LocalStorage::Update(DataTable *table, Vector &row_ids, const vector<PhysicalIndex> &column_ids,
484
+ void LocalStorage::Update(DataTable &table, Vector &row_ids, const vector<PhysicalIndex> &column_ids,
483
485
  DataChunk &updates) {
484
486
  auto storage = table_manager.GetStorage(table);
485
487
  D_ASSERT(storage);
@@ -517,7 +519,7 @@ void LocalStorage::Flush(DataTable &table, LocalTableStorage &storage) {
517
519
  // append to the indexes and append to the base table
518
520
  storage.AppendToIndexes(transaction, append_state, append_count, true);
519
521
  }
520
- transaction.PushAppend(&table, append_state.row_start, append_count);
522
+ transaction.PushAppend(table, append_state.row_start, append_count);
521
523
  }
522
524
 
523
525
  void LocalStorage::Commit(LocalStorage::CommitState &commit_state, DuckTransaction &transaction) {
@@ -528,7 +530,7 @@ void LocalStorage::Commit(LocalStorage::CommitState &commit_state, DuckTransacti
528
530
  for (auto &entry : table_storage) {
529
531
  auto table = entry.first;
530
532
  auto storage = entry.second.get();
531
- Flush(*table, *storage);
533
+ Flush(table, *storage);
532
534
 
533
535
  entry.second.reset();
534
536
  }
@@ -549,7 +551,7 @@ void LocalStorage::Rollback() {
549
551
  }
550
552
  }
551
553
 
552
- idx_t LocalStorage::AddedRows(DataTable *table) {
554
+ idx_t LocalStorage::AddedRows(DataTable &table) {
553
555
  auto storage = table_manager.GetStorage(table);
554
556
  if (!storage) {
555
557
  return 0;
@@ -557,39 +559,39 @@ idx_t LocalStorage::AddedRows(DataTable *table) {
557
559
  return storage->row_groups->GetTotalRows() - storage->deleted_rows;
558
560
  }
559
561
 
560
- void LocalStorage::MoveStorage(DataTable *old_dt, DataTable *new_dt) {
562
+ void LocalStorage::MoveStorage(DataTable &old_dt, DataTable &new_dt) {
561
563
  // check if there are any pending appends for the old version of the table
562
564
  auto new_storage = table_manager.MoveEntry(old_dt);
563
565
  if (!new_storage) {
564
566
  return;
565
567
  }
566
568
  // take over the storage from the old entry
567
- new_storage->table = new_dt;
569
+ new_storage->table_ref = new_dt;
568
570
  table_manager.InsertEntry(new_dt, std::move(new_storage));
569
571
  }
570
572
 
571
- void LocalStorage::AddColumn(DataTable *old_dt, DataTable *new_dt, ColumnDefinition &new_column,
572
- Expression *default_value) {
573
+ void LocalStorage::AddColumn(DataTable &old_dt, DataTable &new_dt, ColumnDefinition &new_column,
574
+ optional_ptr<Expression> default_value) {
573
575
  // check if there are any pending appends for the old version of the table
574
576
  auto storage = table_manager.MoveEntry(old_dt);
575
577
  if (!storage) {
576
578
  return;
577
579
  }
578
- auto new_storage = make_shared<LocalTableStorage>(context, *new_dt, *storage, new_column, default_value);
580
+ auto new_storage = make_shared<LocalTableStorage>(context, new_dt, *storage, new_column, default_value);
579
581
  table_manager.InsertEntry(new_dt, std::move(new_storage));
580
582
  }
581
583
 
582
- void LocalStorage::DropColumn(DataTable *old_dt, DataTable *new_dt, idx_t removed_column) {
584
+ void LocalStorage::DropColumn(DataTable &old_dt, DataTable &new_dt, idx_t removed_column) {
583
585
  // check if there are any pending appends for the old version of the table
584
586
  auto storage = table_manager.MoveEntry(old_dt);
585
587
  if (!storage) {
586
588
  return;
587
589
  }
588
- auto new_storage = make_shared<LocalTableStorage>(*new_dt, *storage, removed_column);
590
+ auto new_storage = make_shared<LocalTableStorage>(new_dt, *storage, removed_column);
589
591
  table_manager.InsertEntry(new_dt, std::move(new_storage));
590
592
  }
591
593
 
592
- void LocalStorage::ChangeType(DataTable *old_dt, DataTable *new_dt, idx_t changed_idx, const LogicalType &target_type,
594
+ void LocalStorage::ChangeType(DataTable &old_dt, DataTable &new_dt, idx_t changed_idx, const LogicalType &target_type,
593
595
  const vector<column_t> &bound_columns, Expression &cast_expr) {
594
596
  // check if there are any pending appends for the old version of the table
595
597
  auto storage = table_manager.MoveEntry(old_dt);
@@ -597,11 +599,11 @@ void LocalStorage::ChangeType(DataTable *old_dt, DataTable *new_dt, idx_t change
597
599
  return;
598
600
  }
599
601
  auto new_storage =
600
- make_shared<LocalTableStorage>(context, *new_dt, *storage, changed_idx, target_type, bound_columns, cast_expr);
602
+ make_shared<LocalTableStorage>(context, new_dt, *storage, changed_idx, target_type, bound_columns, cast_expr);
601
603
  table_manager.InsertEntry(new_dt, std::move(new_storage));
602
604
  }
603
605
 
604
- void LocalStorage::FetchChunk(DataTable *table, Vector &row_ids, idx_t count, const vector<column_t> &col_ids,
606
+ void LocalStorage::FetchChunk(DataTable &table, Vector &row_ids, idx_t count, const vector<column_t> &col_ids,
605
607
  DataChunk &chunk, ColumnFetchState &fetch_state) {
606
608
  auto storage = table_manager.GetStorage(table);
607
609
  if (!storage) {
@@ -611,7 +613,7 @@ void LocalStorage::FetchChunk(DataTable *table, Vector &row_ids, idx_t count, co
611
613
  storage->row_groups->Fetch(transaction, chunk, col_ids, row_ids, count, fetch_state);
612
614
  }
613
615
 
614
- TableIndexList &LocalStorage::GetIndexes(DataTable *table) {
616
+ TableIndexList &LocalStorage::GetIndexes(DataTable &table) {
615
617
  auto storage = table_manager.GetStorage(table);
616
618
  if (!storage) {
617
619
  throw InternalException("LocalStorage::GetIndexes - local storage not found");
@@ -620,7 +622,7 @@ TableIndexList &LocalStorage::GetIndexes(DataTable *table) {
620
622
  }
621
623
 
622
624
  void LocalStorage::VerifyNewConstraint(DataTable &parent, const BoundConstraint &constraint) {
623
- auto storage = table_manager.GetStorage(&parent);
625
+ auto storage = table_manager.GetStorage(parent);
624
626
  if (!storage) {
625
627
  return;
626
628
  }
@@ -143,12 +143,22 @@ void SingleFileStorageManager::LoadDatabase() {
143
143
  class SingleFileStorageCommitState : public StorageCommitState {
144
144
  idx_t initial_wal_size = 0;
145
145
  idx_t initial_written = 0;
146
- WriteAheadLog *log;
146
+ optional_ptr<WriteAheadLog> log;
147
147
  bool checkpoint;
148
148
 
149
149
  public:
150
150
  SingleFileStorageCommitState(StorageManager &storage_manager, bool checkpoint);
151
- ~SingleFileStorageCommitState() override;
151
+ ~SingleFileStorageCommitState() override {
152
+ // If log is non-null, then commit threw an exception before flushing.
153
+ if (log) {
154
+ auto &wal = *log.get();
155
+ wal.skip_writing = false;
156
+ if (wal.GetTotalWritten() > initial_written) {
157
+ // remove any entries written into the WAL by truncating it
158
+ wal.Truncate(initial_wal_size);
159
+ }
160
+ }
161
+ }
152
162
 
153
163
  // Make the commit persistent
154
164
  void FlushCommit() override;
@@ -189,17 +199,6 @@ void SingleFileStorageCommitState::FlushCommit() {
189
199
  log = nullptr;
190
200
  }
191
201
 
192
- SingleFileStorageCommitState::~SingleFileStorageCommitState() {
193
- // If log is non-null, then commit threw an exception before flushing.
194
- if (log) {
195
- log->skip_writing = false;
196
- if (log->GetTotalWritten() > initial_written) {
197
- // remove any entries written into the WAL by truncating it
198
- log->Truncate(initial_wal_size);
199
- }
200
- }
201
- }
202
-
203
202
  unique_ptr<StorageCommitState> SingleFileStorageManager::GenStorageCommitState(Transaction &transaction,
204
203
  bool checkpoint) {
205
204
  return make_uniq<SingleFileStorageCommitState>(*this, checkpoint);
@@ -135,7 +135,7 @@ void ColumnCheckpointState::FlushSegment(unique_ptr<ColumnSegment> segment, idx_
135
135
  // set up the compression function to constant
136
136
  auto &config = DBConfig::GetConfig(db);
137
137
  segment->function =
138
- config.GetCompressionFunction(CompressionType::COMPRESSION_CONSTANT, segment->type.InternalType());
138
+ *config.GetCompressionFunction(CompressionType::COMPRESSION_CONSTANT, segment->type.InternalType());
139
139
  segment->ConvertToPersistent(nullptr, INVALID_BLOCK);
140
140
  }
141
141
 
@@ -149,7 +149,7 @@ void ColumnCheckpointState::FlushSegment(unique_ptr<ColumnSegment> segment, idx_
149
149
  data_pointer.row_start = last_pointer.row_start + last_pointer.tuple_count;
150
150
  }
151
151
  data_pointer.tuple_count = tuple_count;
152
- data_pointer.compression_type = segment->function->type;
152
+ data_pointer.compression_type = segment->function.get().type;
153
153
 
154
154
  // append the segment to the new segment tree
155
155
  new_tree.AppendSegment(std::move(segment));
@@ -289,7 +289,7 @@ void ColumnData::InitializeAppend(ColumnAppendState &state) {
289
289
 
290
290
  D_ASSERT(state.current->segment_type == ColumnSegmentType::TRANSIENT);
291
291
  state.current->InitializeAppend(state);
292
- D_ASSERT(state.current->function->append);
292
+ D_ASSERT(state.current->function.get().append);
293
293
  }
294
294
 
295
295
  void ColumnData::AppendData(BaseStatistics &stats, ColumnAppendState &state, UnifiedVectorFormat &vdata, idx_t count) {
@@ -520,7 +520,7 @@ void ColumnData::GetStorageInfo(idx_t row_group_index, vector<idx_t> col_path, T
520
520
  column_info.segment_type = type.ToString();
521
521
  column_info.segment_start = segment->start;
522
522
  column_info.segment_count = segment->count;
523
- column_info.compression_type = CompressionTypeToString(segment->function->type);
523
+ column_info.compression_type = CompressionTypeToString(segment->function.get().type);
524
524
  column_info.segment_stats = segment->stats.statistics.ToString();
525
525
  column_info.has_updates = updates ? true : false;
526
526
  // persistent
@@ -14,7 +14,10 @@ ColumnDataCheckpointer::ColumnDataCheckpointer(ColumnData &col_data_p, RowGroup
14
14
  intermediate(is_validity ? LogicalType::BOOLEAN : GetType(), true, is_validity),
15
15
  checkpoint_info(checkpoint_info_p) {
16
16
  auto &config = DBConfig::GetConfig(GetDatabase());
17
- compression_functions = config.GetCompressionFunctions(GetType().InternalType());
17
+ auto functions = config.GetCompressionFunctions(GetType().InternalType());
18
+ for (auto &func : functions) {
19
+ compression_functions.push_back(&func.get());
20
+ }
18
21
  }
19
22
 
20
23
  DatabaseInstance &ColumnDataCheckpointer::GetDatabase() {
@@ -58,13 +61,14 @@ void ColumnDataCheckpointer::ScanSegments(const std::function<void(Vector &, idx
58
61
  }
59
62
  }
60
63
 
61
- CompressionType ForceCompression(vector<CompressionFunction *> &compression_functions,
64
+ CompressionType ForceCompression(vector<optional_ptr<CompressionFunction>> &compression_functions,
62
65
  CompressionType compression_type) {
63
66
  // On of the force_compression flags has been set
64
67
  // check if this compression method is available
65
68
  bool found = false;
66
69
  for (idx_t i = 0; i < compression_functions.size(); i++) {
67
- if (compression_functions[i]->type == compression_type) {
70
+ auto &compression_function = *compression_functions[i];
71
+ if (compression_function.type == compression_type) {
68
72
  found = true;
69
73
  break;
70
74
  }
@@ -74,10 +78,11 @@ CompressionType ForceCompression(vector<CompressionFunction *> &compression_func
74
78
  // clear all other compression methods
75
79
  // except the uncompressed method, so we can fall back on that
76
80
  for (idx_t i = 0; i < compression_functions.size(); i++) {
77
- if (compression_functions[i]->type == CompressionType::COMPRESSION_UNCOMPRESSED) {
81
+ auto &compression_function = *compression_functions[i];
82
+ if (compression_function.type == CompressionType::COMPRESSION_UNCOMPRESSED) {
78
83
  continue;
79
84
  }
80
- if (compression_functions[i]->type != compression_type) {
85
+ if (compression_function.type != compression_type) {
81
86
  compression_functions[i] = nullptr;
82
87
  }
83
88
  }
@@ -225,7 +230,7 @@ void ColumnDataCheckpointer::WritePersistentSegments() {
225
230
  pointer.block_pointer.offset = segment->GetBlockOffset();
226
231
  pointer.row_start = segment->start;
227
232
  pointer.tuple_count = segment->count;
228
- pointer.compression_type = segment->function->type;
233
+ pointer.compression_type = segment->function.get().type;
229
234
 
230
235
  // merge the persistent stats into the global column stats
231
236
  state.global_stats->Merge(segment->stats.statistics);
@@ -250,4 +255,11 @@ void ColumnDataCheckpointer::Checkpoint(vector<SegmentNode<ColumnSegment>> nodes
250
255
  }
251
256
  }
252
257
 
258
+ CompressionFunction &ColumnDataCheckpointer::GetCompressionFunction(CompressionType compression_type) {
259
+ auto &db = GetDatabase();
260
+ auto &column_type = GetType();
261
+ auto &config = DBConfig::GetConfig(db);
262
+ return *config.GetCompressionFunction(compression_type, column_type.InternalType());
263
+ }
264
+
253
265
  } // namespace duckdb