duckdb 0.7.2-dev1803.0 → 0.7.2-dev1898.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 (158) hide show
  1. package/package.json +1 -1
  2. package/src/duckdb/src/catalog/catalog.cpp +27 -27
  3. package/src/duckdb/src/catalog/catalog_entry/duck_schema_entry.cpp +6 -6
  4. package/src/duckdb/src/catalog/catalog_set.cpp +27 -25
  5. package/src/duckdb/src/catalog/default/default_functions.cpp +6 -6
  6. package/src/duckdb/src/catalog/default/default_types.cpp +4 -4
  7. package/src/duckdb/src/catalog/default/default_views.cpp +4 -4
  8. package/src/duckdb/src/catalog/dependency_list.cpp +7 -6
  9. package/src/duckdb/src/catalog/dependency_manager.cpp +44 -38
  10. package/src/duckdb/src/common/serializer/buffered_file_reader.cpp +11 -6
  11. package/src/duckdb/src/common/sort/sorted_block.cpp +9 -4
  12. package/src/duckdb/src/common/types/batched_data_collection.cpp +2 -1
  13. package/src/duckdb/src/common/types/column_data_allocator.cpp +1 -0
  14. package/src/duckdb/src/common/types/vector.cpp +2 -2
  15. package/src/duckdb/src/common/vector_operations/vector_copy.cpp +14 -11
  16. package/src/duckdb/src/execution/operator/aggregate/distinct_aggregate_data.cpp +1 -1
  17. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +51 -50
  18. package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +4 -0
  19. package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +14 -13
  20. package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +20 -20
  21. package/src/duckdb/src/execution/operator/schema/physical_create_table.cpp +2 -2
  22. package/src/duckdb/src/execution/physical_plan/plan_create_index.cpp +1 -1
  23. package/src/duckdb/src/execution/physical_plan/plan_create_table.cpp +3 -3
  24. package/src/duckdb/src/execution/physical_plan/plan_delete.cpp +1 -1
  25. package/src/duckdb/src/execution/physical_plan/plan_insert.cpp +1 -1
  26. package/src/duckdb/src/execution/physical_plan/plan_update.cpp +1 -1
  27. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +172 -63
  28. package/src/duckdb/src/function/cast/cast_function_set.cpp +2 -1
  29. package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +15 -9
  30. package/src/duckdb/src/function/scalar/sequence/nextval.cpp +29 -29
  31. package/src/duckdb/src/function/scalar/string/damerau_levenshtein.cpp +106 -0
  32. package/src/duckdb/src/function/scalar/string/regexp.cpp +145 -28
  33. package/src/duckdb/src/function/scalar/string_functions.cpp +1 -0
  34. package/src/duckdb/src/function/table/checkpoint.cpp +4 -4
  35. package/src/duckdb/src/function/table/system/duckdb_columns.cpp +24 -24
  36. package/src/duckdb/src/function/table/system/duckdb_constraints.cpp +7 -6
  37. package/src/duckdb/src/function/table/system/duckdb_databases.cpp +1 -1
  38. package/src/duckdb/src/function/table/system/duckdb_dependencies.cpp +11 -11
  39. package/src/duckdb/src/function/table/system/pragma_database_size.cpp +1 -1
  40. package/src/duckdb/src/function/table/system/pragma_table_info.cpp +17 -18
  41. package/src/duckdb/src/function/table/table_scan.cpp +8 -11
  42. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  43. package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +9 -9
  44. package/src/duckdb/src/include/duckdb/catalog/catalog_entry_map.hpp +38 -0
  45. package/src/duckdb/src/include/duckdb/catalog/catalog_transaction.hpp +4 -3
  46. package/src/duckdb/src/include/duckdb/catalog/default/default_functions.hpp +2 -2
  47. package/src/duckdb/src/include/duckdb/catalog/default/default_types.hpp +2 -2
  48. package/src/duckdb/src/include/duckdb/catalog/default/default_views.hpp +2 -2
  49. package/src/duckdb/src/include/duckdb/catalog/dependency.hpp +4 -5
  50. package/src/duckdb/src/include/duckdb/catalog/dependency_list.hpp +4 -5
  51. package/src/duckdb/src/include/duckdb/catalog/dependency_manager.hpp +10 -9
  52. package/src/duckdb/src/include/duckdb/common/allocator.hpp +2 -1
  53. package/src/duckdb/src/include/duckdb/common/field_writer.hpp +1 -1
  54. package/src/duckdb/src/include/duckdb/common/helper.hpp +9 -0
  55. package/src/duckdb/src/include/duckdb/common/optional_ptr.hpp +29 -6
  56. package/src/duckdb/src/include/duckdb/common/serializer/buffered_file_reader.hpp +6 -5
  57. package/src/duckdb/src/include/duckdb/common/serializer.hpp +1 -1
  58. package/src/duckdb/src/include/duckdb/common/types/row_data_collection.hpp +1 -0
  59. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_batch_insert.hpp +2 -2
  60. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_insert.hpp +5 -5
  61. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_table.hpp +2 -2
  62. package/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp +3 -2
  63. package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +4 -0
  64. package/src/duckdb/src/include/duckdb/main/client_config.hpp +5 -0
  65. package/src/duckdb/src/include/duckdb/main/database_manager.hpp +4 -3
  66. package/src/duckdb/src/include/duckdb/main/query_result.hpp +3 -2
  67. package/src/duckdb/src/include/duckdb/main/settings.hpp +19 -0
  68. package/src/duckdb/src/include/duckdb/optimizer/filter_combiner.hpp +7 -7
  69. package/src/duckdb/src/include/duckdb/optimizer/matcher/expression_matcher.hpp +11 -11
  70. package/src/duckdb/src/include/duckdb/optimizer/matcher/set_matcher.hpp +8 -8
  71. package/src/duckdb/src/include/duckdb/optimizer/rule/arithmetic_simplification.hpp +1 -1
  72. package/src/duckdb/src/include/duckdb/optimizer/rule/case_simplification.hpp +1 -1
  73. package/src/duckdb/src/include/duckdb/optimizer/rule/comparison_simplification.hpp +1 -1
  74. package/src/duckdb/src/include/duckdb/optimizer/rule/conjunction_simplification.hpp +2 -2
  75. package/src/duckdb/src/include/duckdb/optimizer/rule/constant_folding.hpp +1 -1
  76. package/src/duckdb/src/include/duckdb/optimizer/rule/date_part_simplification.hpp +1 -1
  77. package/src/duckdb/src/include/duckdb/optimizer/rule/distributivity.hpp +1 -1
  78. package/src/duckdb/src/include/duckdb/optimizer/rule/empty_needle_removal.hpp +1 -1
  79. package/src/duckdb/src/include/duckdb/optimizer/rule/enum_comparison.hpp +1 -1
  80. package/src/duckdb/src/include/duckdb/optimizer/rule/equal_or_null_simplification.hpp +1 -1
  81. package/src/duckdb/src/include/duckdb/optimizer/rule/in_clause_simplification.hpp +1 -1
  82. package/src/duckdb/src/include/duckdb/optimizer/rule/like_optimizations.hpp +1 -1
  83. package/src/duckdb/src/include/duckdb/optimizer/rule/move_constants.hpp +1 -1
  84. package/src/duckdb/src/include/duckdb/optimizer/rule/ordered_aggregate_optimizer.hpp +1 -1
  85. package/src/duckdb/src/include/duckdb/optimizer/rule/regex_optimizations.hpp +1 -1
  86. package/src/duckdb/src/include/duckdb/optimizer/rule.hpp +2 -2
  87. package/src/duckdb/src/include/duckdb/parser/base_expression.hpp +1 -1
  88. package/src/duckdb/src/include/duckdb/parser/expression_map.hpp +19 -6
  89. package/src/duckdb/src/include/duckdb/parser/expression_util.hpp +1 -1
  90. package/src/duckdb/src/include/duckdb/parser/parser.hpp +1 -7
  91. package/src/duckdb/src/include/duckdb/parser/parser_options.hpp +23 -0
  92. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +5 -3
  93. package/src/duckdb/src/include/duckdb/planner/expression.hpp +5 -2
  94. package/src/duckdb/src/include/duckdb/planner/expression_binder/base_select_binder.hpp +1 -1
  95. package/src/duckdb/src/include/duckdb/planner/expression_binder/order_binder.hpp +3 -3
  96. package/src/duckdb/src/include/duckdb/storage/buffer/block_handle.hpp +10 -2
  97. package/src/duckdb/src/include/duckdb/storage/buffer/buffer_pool.hpp +1 -0
  98. package/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp +49 -126
  99. package/src/duckdb/src/include/duckdb/storage/meta_block_reader.hpp +5 -5
  100. package/src/duckdb/src/include/duckdb/storage/standard_buffer_manager.hpp +159 -0
  101. package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +1 -0
  102. package/src/duckdb/src/include/duckdb/transaction/meta_transaction.hpp +6 -5
  103. package/src/duckdb/src/main/client_context.cpp +5 -3
  104. package/src/duckdb/src/main/config.cpp +2 -0
  105. package/src/duckdb/src/main/database.cpp +2 -1
  106. package/src/duckdb/src/main/database_manager.cpp +4 -4
  107. package/src/duckdb/src/main/settings/settings.cpp +36 -0
  108. package/src/duckdb/src/optimizer/common_aggregate_optimizer.cpp +2 -2
  109. package/src/duckdb/src/optimizer/cse_optimizer.cpp +4 -4
  110. package/src/duckdb/src/optimizer/deliminator.cpp +13 -11
  111. package/src/duckdb/src/optimizer/expression_rewriter.cpp +2 -2
  112. package/src/duckdb/src/optimizer/filter_combiner.cpp +67 -65
  113. package/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp +1 -0
  114. package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +26 -25
  115. package/src/duckdb/src/optimizer/matcher/expression_matcher.cpp +23 -21
  116. package/src/duckdb/src/optimizer/rule/arithmetic_simplification.cpp +7 -6
  117. package/src/duckdb/src/optimizer/rule/case_simplification.cpp +2 -2
  118. package/src/duckdb/src/optimizer/rule/comparison_simplification.cpp +6 -7
  119. package/src/duckdb/src/optimizer/rule/conjunction_simplification.cpp +9 -8
  120. package/src/duckdb/src/optimizer/rule/constant_folding.cpp +7 -7
  121. package/src/duckdb/src/optimizer/rule/date_part_simplification.cpp +3 -3
  122. package/src/duckdb/src/optimizer/rule/distributivity.cpp +5 -5
  123. package/src/duckdb/src/optimizer/rule/empty_needle_removal.cpp +6 -6
  124. package/src/duckdb/src/optimizer/rule/enum_comparison.cpp +4 -4
  125. package/src/duckdb/src/optimizer/rule/equal_or_null_simplification.cpp +23 -26
  126. package/src/duckdb/src/optimizer/rule/in_clause_simplification_rule.cpp +2 -3
  127. package/src/duckdb/src/optimizer/rule/like_optimizations.cpp +3 -3
  128. package/src/duckdb/src/optimizer/rule/move_constants.cpp +6 -6
  129. package/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp +2 -2
  130. package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +3 -3
  131. package/src/duckdb/src/parser/expression_util.cpp +6 -6
  132. package/src/duckdb/src/parser/parser.cpp +1 -1
  133. package/src/duckdb/src/parser/transform/expression/transform_operator.cpp +7 -3
  134. package/src/duckdb/src/parser/transform/helpers/transform_groupby.cpp +3 -3
  135. package/src/duckdb/src/parser/transformer.cpp +6 -5
  136. package/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp +2 -2
  137. package/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +3 -3
  138. package/src/duckdb/src/planner/binder/query_node/bind_setop_node.cpp +5 -5
  139. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +2 -2
  140. package/src/duckdb/src/planner/expression_binder/base_select_binder.cpp +4 -4
  141. package/src/duckdb/src/planner/expression_binder/order_binder.cpp +3 -3
  142. package/src/duckdb/src/storage/buffer/block_handle.cpp +3 -2
  143. package/src/duckdb/src/storage/buffer/block_manager.cpp +3 -1
  144. package/src/duckdb/src/storage/buffer/buffer_handle.cpp +1 -0
  145. package/src/duckdb/src/storage/buffer/buffer_pool_reservation.cpp +3 -0
  146. package/src/duckdb/src/storage/buffer_manager.cpp +35 -726
  147. package/src/duckdb/src/storage/checkpoint_manager.cpp +2 -2
  148. package/src/duckdb/src/storage/meta_block_reader.cpp +6 -5
  149. package/src/duckdb/src/storage/standard_buffer_manager.cpp +801 -0
  150. package/src/duckdb/src/storage/wal_replay.cpp +2 -2
  151. package/src/duckdb/src/transaction/meta_transaction.cpp +13 -13
  152. package/src/duckdb/src/transaction/transaction.cpp +1 -1
  153. package/src/duckdb/src/transaction/transaction_context.cpp +1 -1
  154. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +949 -947
  155. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +16431 -16385
  156. package/src/duckdb/third_party/libpg_query/src_backend_parser_scan.cpp +503 -493
  157. package/src/duckdb/ub_src_function_scalar_string.cpp +2 -0
  158. package/src/duckdb/ub_src_storage.cpp +2 -0
@@ -17,10 +17,10 @@
17
17
  namespace duckdb {
18
18
 
19
19
  struct PragmaTableFunctionData : public TableFunctionData {
20
- explicit PragmaTableFunctionData(CatalogEntry *entry_p) : entry(entry_p) {
20
+ explicit PragmaTableFunctionData(CatalogEntry &entry_p) : entry(entry_p) {
21
21
  }
22
22
 
23
- CatalogEntry *entry;
23
+ CatalogEntry &entry;
24
24
  };
25
25
 
26
26
  struct PragmaTableOperatorData : public GlobalTableFunctionState {
@@ -55,20 +55,20 @@ static unique_ptr<FunctionData> PragmaTableInfoBind(ClientContext &context, Tabl
55
55
  // look up the table name in the catalog
56
56
  Binder::BindSchemaOrCatalog(context, qname.catalog, qname.schema);
57
57
  auto entry = Catalog::GetEntry(context, CatalogType::TABLE_ENTRY, qname.catalog, qname.schema, qname.name);
58
- return make_uniq<PragmaTableFunctionData>(entry);
58
+ return make_uniq<PragmaTableFunctionData>(*entry);
59
59
  }
60
60
 
61
61
  unique_ptr<GlobalTableFunctionState> PragmaTableInfoInit(ClientContext &context, TableFunctionInitInput &input) {
62
62
  return make_uniq<PragmaTableOperatorData>();
63
63
  }
64
64
 
65
- static void CheckConstraints(TableCatalogEntry *table, const ColumnDefinition &column, bool &out_not_null,
65
+ static void CheckConstraints(TableCatalogEntry &table, const ColumnDefinition &column, bool &out_not_null,
66
66
  bool &out_pk) {
67
67
  out_not_null = false;
68
68
  out_pk = false;
69
69
  // check all constraints
70
70
  // FIXME: this is pretty inefficient, it probably doesn't matter
71
- for (auto &constraint : table->GetConstraints()) {
71
+ for (auto &constraint : table.GetConstraints()) {
72
72
  switch (constraint->type) {
73
73
  case ConstraintType::NOT_NULL: {
74
74
  auto &not_null = constraint->Cast<NotNullConstraint>();
@@ -79,7 +79,6 @@ static void CheckConstraints(TableCatalogEntry *table, const ColumnDefinition &c
79
79
  }
80
80
  case ConstraintType::UNIQUE: {
81
81
  auto &unique = constraint->Cast<UniqueConstraint>();
82
-
83
82
  if (unique.is_primary_key) {
84
83
  if (unique.index == column.Logical()) {
85
84
  out_pk = true;
@@ -96,20 +95,20 @@ static void CheckConstraints(TableCatalogEntry *table, const ColumnDefinition &c
96
95
  }
97
96
  }
98
97
 
99
- static void PragmaTableInfoTable(PragmaTableOperatorData &data, TableCatalogEntry *table, DataChunk &output) {
100
- if (data.offset >= table->GetColumns().LogicalColumnCount()) {
98
+ static void PragmaTableInfoTable(PragmaTableOperatorData &data, TableCatalogEntry &table, DataChunk &output) {
99
+ if (data.offset >= table.GetColumns().LogicalColumnCount()) {
101
100
  // finished returning values
102
101
  return;
103
102
  }
104
103
  // start returning values
105
104
  // either fill up the chunk or return all the remaining columns
106
- idx_t next = MinValue<idx_t>(data.offset + STANDARD_VECTOR_SIZE, table->GetColumns().LogicalColumnCount());
105
+ idx_t next = MinValue<idx_t>(data.offset + STANDARD_VECTOR_SIZE, table.GetColumns().LogicalColumnCount());
107
106
  output.SetCardinality(next - data.offset);
108
107
 
109
108
  for (idx_t i = data.offset; i < next; i++) {
110
109
  bool not_null, pk;
111
110
  auto index = i - data.offset;
112
- auto &column = table->GetColumn(LogicalIndex(i));
111
+ auto &column = table.GetColumn(LogicalIndex(i));
113
112
  D_ASSERT(column.Oid() < (idx_t)NumericLimits<int32_t>::Maximum());
114
113
  CheckConstraints(table, column, not_null, pk);
115
114
 
@@ -131,20 +130,20 @@ static void PragmaTableInfoTable(PragmaTableOperatorData &data, TableCatalogEntr
131
130
  data.offset = next;
132
131
  }
133
132
 
134
- static void PragmaTableInfoView(PragmaTableOperatorData &data, ViewCatalogEntry *view, DataChunk &output) {
135
- if (data.offset >= view->types.size()) {
133
+ static void PragmaTableInfoView(PragmaTableOperatorData &data, ViewCatalogEntry &view, DataChunk &output) {
134
+ if (data.offset >= view.types.size()) {
136
135
  // finished returning values
137
136
  return;
138
137
  }
139
138
  // start returning values
140
139
  // either fill up the chunk or return all the remaining columns
141
- idx_t next = MinValue<idx_t>(data.offset + STANDARD_VECTOR_SIZE, view->types.size());
140
+ idx_t next = MinValue<idx_t>(data.offset + STANDARD_VECTOR_SIZE, view.types.size());
142
141
  output.SetCardinality(next - data.offset);
143
142
 
144
143
  for (idx_t i = data.offset; i < next; i++) {
145
144
  auto index = i - data.offset;
146
- auto type = view->types[i];
147
- auto &name = view->aliases[i];
145
+ auto type = view.types[i];
146
+ auto &name = view.aliases[i];
148
147
  // return values:
149
148
  // "cid", PhysicalType::INT32
150
149
 
@@ -166,12 +165,12 @@ static void PragmaTableInfoView(PragmaTableOperatorData &data, ViewCatalogEntry
166
165
  static void PragmaTableInfoFunction(ClientContext &context, TableFunctionInput &data_p, DataChunk &output) {
167
166
  auto &bind_data = (PragmaTableFunctionData &)*data_p.bind_data;
168
167
  auto &state = data_p.global_state->Cast<PragmaTableOperatorData>();
169
- switch (bind_data.entry->type) {
168
+ switch (bind_data.entry.type) {
170
169
  case CatalogType::TABLE_ENTRY:
171
- PragmaTableInfoTable(state, (TableCatalogEntry *)bind_data.entry, output);
170
+ PragmaTableInfoTable(state, bind_data.entry.Cast<TableCatalogEntry>(), output);
172
171
  break;
173
172
  case CatalogType::VIEW_ENTRY:
174
- PragmaTableInfoView(state, (ViewCatalogEntry *)bind_data.entry, output);
173
+ PragmaTableInfoView(state, bind_data.entry.Cast<ViewCatalogEntry>(), output);
175
174
  break;
176
175
  default:
177
176
  throw NotImplementedException("Unimplemented catalog type for pragma_table_info");
@@ -185,7 +185,7 @@ BindInfo TableScanGetBindInfo(const FunctionData *bind_data) {
185
185
 
186
186
  void TableScanDependency(DependencyList &entries, const FunctionData *bind_data_p) {
187
187
  auto &bind_data = bind_data_p->Cast<TableScanBindData>();
188
- entries.AddDependency(bind_data.table);
188
+ entries.AddDependency(*bind_data.table);
189
189
  }
190
190
 
191
191
  unique_ptr<NodeStatistics> TableScanCardinality(ClientContext &context, const FunctionData *bind_data_p) {
@@ -302,30 +302,27 @@ void TableScanPushdownComplexFilter(ClientContext &context, LogicalGet &get, Fun
302
302
  ExpressionType low_comparison_type = ExpressionType::INVALID, high_comparison_type = ExpressionType::INVALID;
303
303
  // try to find a matching index for any of the filter expressions
304
304
  for (auto &filter : filters) {
305
- auto expr = filter.get();
305
+ auto &expr = *filter;
306
306
 
307
307
  // create a matcher for a comparison with a constant
308
308
  ComparisonExpressionMatcher matcher;
309
309
  // match on a comparison type
310
310
  matcher.expr_type = make_uniq<ComparisonExpressionTypeMatcher>();
311
311
  // match on a constant comparison with the indexed expression
312
- matcher.matchers.push_back(make_uniq<ExpressionEqualityMatcher>(index_expression.get()));
312
+ matcher.matchers.push_back(make_uniq<ExpressionEqualityMatcher>(*index_expression));
313
313
  matcher.matchers.push_back(make_uniq<ConstantExpressionMatcher>());
314
314
 
315
315
  matcher.policy = SetMatcher::Policy::UNORDERED;
316
316
 
317
- vector<Expression *> bindings;
317
+ vector<reference<Expression>> bindings;
318
318
  if (matcher.Match(expr, bindings)) {
319
319
  // range or equality comparison with constant value
320
320
  // we can use our index here
321
321
  // bindings[0] = the expression
322
322
  // bindings[1] = the index expression
323
323
  // bindings[2] = the constant
324
- auto &comparison = bindings[0]->Cast<BoundComparisonExpression>();
325
- D_ASSERT(bindings[0]->GetExpressionClass() == ExpressionClass::BOUND_COMPARISON);
326
- D_ASSERT(bindings[2]->type == ExpressionType::VALUE_CONSTANT);
327
-
328
- auto constant_value = bindings[2]->Cast<BoundConstantExpression>().value;
324
+ auto &comparison = bindings[0].get().Cast<BoundComparisonExpression>();
325
+ auto constant_value = bindings[2].get().Cast<BoundConstantExpression>().value;
329
326
  auto comparison_type = comparison.type;
330
327
  if (comparison.left->type == ExpressionType::VALUE_CONSTANT) {
331
328
  // the expression is on the right side, we flip them around
@@ -346,9 +343,9 @@ void TableScanPushdownComplexFilter(ClientContext &context, LogicalGet &get, Fun
346
343
  high_value = constant_value;
347
344
  high_comparison_type = comparison_type;
348
345
  }
349
- } else if (expr->type == ExpressionType::COMPARE_BETWEEN) {
346
+ } else if (expr.type == ExpressionType::COMPARE_BETWEEN) {
350
347
  // BETWEEN expression
351
- auto &between = expr->Cast<BoundBetweenExpression>();
348
+ auto &between = expr.Cast<BoundBetweenExpression>();
352
349
  if (!between.input->Equals(index_expression.get())) {
353
350
  // expression doesn't match the current index expression
354
351
  continue;
@@ -1,8 +1,8 @@
1
1
  #ifndef DUCKDB_VERSION
2
- #define DUCKDB_VERSION "0.7.2-dev1803"
2
+ #define DUCKDB_VERSION "0.7.2-dev1898"
3
3
  #endif
4
4
  #ifndef DUCKDB_SOURCE_ID
5
- #define DUCKDB_SOURCE_ID "cc6160599b"
5
+ #define DUCKDB_SOURCE_ID "eaf507009f"
6
6
  #endif
7
7
  #include "duckdb/function/table/system_functions.hpp"
8
8
  #include "duckdb/main/database.hpp"
@@ -146,31 +146,31 @@ public:
146
146
  DUCKDB_API CatalogEntry *CreateIndex(ClientContext &context, CreateIndexInfo *info);
147
147
 
148
148
  //! Creates a table in the catalog.
149
- DUCKDB_API CatalogEntry *CreateTable(CatalogTransaction transaction, SchemaCatalogEntry *schema,
149
+ DUCKDB_API CatalogEntry *CreateTable(CatalogTransaction transaction, SchemaCatalogEntry &schema,
150
150
  BoundCreateTableInfo *info);
151
151
  //! Create a table function in the catalog
152
- DUCKDB_API CatalogEntry *CreateTableFunction(CatalogTransaction transaction, SchemaCatalogEntry *schema,
152
+ DUCKDB_API CatalogEntry *CreateTableFunction(CatalogTransaction transaction, SchemaCatalogEntry &schema,
153
153
  CreateTableFunctionInfo *info);
154
154
  //! Create a copy function in the catalog
155
- DUCKDB_API CatalogEntry *CreateCopyFunction(CatalogTransaction transaction, SchemaCatalogEntry *schema,
155
+ DUCKDB_API CatalogEntry *CreateCopyFunction(CatalogTransaction transaction, SchemaCatalogEntry &schema,
156
156
  CreateCopyFunctionInfo *info);
157
157
  //! Create a pragma function in the catalog
158
- DUCKDB_API CatalogEntry *CreatePragmaFunction(CatalogTransaction transaction, SchemaCatalogEntry *schema,
158
+ DUCKDB_API CatalogEntry *CreatePragmaFunction(CatalogTransaction transaction, SchemaCatalogEntry &schema,
159
159
  CreatePragmaFunctionInfo *info);
160
160
  //! Create a scalar or aggregate function in the catalog
161
- DUCKDB_API CatalogEntry *CreateFunction(CatalogTransaction transaction, SchemaCatalogEntry *schema,
161
+ DUCKDB_API CatalogEntry *CreateFunction(CatalogTransaction transaction, SchemaCatalogEntry &schema,
162
162
  CreateFunctionInfo *info);
163
163
  //! Creates a view in the catalog
164
- DUCKDB_API CatalogEntry *CreateView(CatalogTransaction transaction, SchemaCatalogEntry *schema,
164
+ DUCKDB_API CatalogEntry *CreateView(CatalogTransaction transaction, SchemaCatalogEntry &schema,
165
165
  CreateViewInfo *info);
166
166
  //! Creates a table in the catalog.
167
- DUCKDB_API CatalogEntry *CreateSequence(CatalogTransaction transaction, SchemaCatalogEntry *schema,
167
+ DUCKDB_API CatalogEntry *CreateSequence(CatalogTransaction transaction, SchemaCatalogEntry &schema,
168
168
  CreateSequenceInfo *info);
169
169
  //! Creates a enum in the catalog.
170
- DUCKDB_API CatalogEntry *CreateType(CatalogTransaction transaction, SchemaCatalogEntry *schema,
170
+ DUCKDB_API CatalogEntry *CreateType(CatalogTransaction transaction, SchemaCatalogEntry &schema,
171
171
  CreateTypeInfo *info);
172
172
  //! Creates a collation in the catalog
173
- DUCKDB_API CatalogEntry *CreateCollation(CatalogTransaction transaction, SchemaCatalogEntry *schema,
173
+ DUCKDB_API CatalogEntry *CreateCollation(CatalogTransaction transaction, SchemaCatalogEntry &schema,
174
174
  CreateCollationInfo *info);
175
175
 
176
176
  //! Drops an entry from the catalog
@@ -0,0 +1,38 @@
1
+ //===----------------------------------------------------------------------===//
2
+ // DuckDB
3
+ //
4
+ // duckdb/catalog/catalog_entry_map.hpp
5
+ //
6
+ //
7
+ //===----------------------------------------------------------------------===//
8
+
9
+ #pragma once
10
+
11
+ #include "duckdb/common/common.hpp"
12
+ #include "duckdb/common/unordered_set.hpp"
13
+ #include "duckdb/common/unordered_map.hpp"
14
+
15
+ namespace duckdb {
16
+ class CatalogEntry;
17
+
18
+ struct CatalogEntryHashFunction {
19
+ uint64_t operator()(const reference<CatalogEntry> &a) const {
20
+ std::hash<void *> hash_func;
21
+ return hash_func((void *)&a.get());
22
+ }
23
+ };
24
+
25
+ struct CatalogEntryEquality {
26
+ bool operator()(const reference<CatalogEntry> &a, const reference<CatalogEntry> &b) const {
27
+ return RefersToSameObject(a, b);
28
+ }
29
+ };
30
+
31
+ using catalog_entry_set_t = unordered_set<reference<CatalogEntry>, CatalogEntryHashFunction, CatalogEntryEquality>;
32
+
33
+ template <typename T>
34
+ using catalog_entry_map_t = unordered_map<reference<CatalogEntry>, T, CatalogEntryHashFunction, CatalogEntryEquality>;
35
+
36
+ using catalog_entry_vector_t = vector<reference<CatalogEntry>>;
37
+
38
+ } // namespace duckdb
@@ -9,6 +9,7 @@
9
9
  #pragma once
10
10
 
11
11
  #include "duckdb/common/common.hpp"
12
+ #include "duckdb/common/optional_ptr.hpp"
12
13
 
13
14
  namespace duckdb {
14
15
  class Catalog;
@@ -20,9 +21,9 @@ struct CatalogTransaction {
20
21
  CatalogTransaction(Catalog &catalog, ClientContext &context);
21
22
  CatalogTransaction(DatabaseInstance &db, transaction_t transaction_id_p, transaction_t start_time_p);
22
23
 
23
- DatabaseInstance *db;
24
- ClientContext *context;
25
- Transaction *transaction;
24
+ optional_ptr<DatabaseInstance> db;
25
+ optional_ptr<ClientContext> context;
26
+ optional_ptr<Transaction> transaction;
26
27
  transaction_t transaction_id;
27
28
  transaction_t start_time;
28
29
 
@@ -23,9 +23,9 @@ struct DefaultMacro {
23
23
 
24
24
  class DefaultFunctionGenerator : public DefaultGenerator {
25
25
  public:
26
- DefaultFunctionGenerator(Catalog &catalog, SchemaCatalogEntry *schema);
26
+ DefaultFunctionGenerator(Catalog &catalog, SchemaCatalogEntry &schema);
27
27
 
28
- SchemaCatalogEntry *schema;
28
+ SchemaCatalogEntry &schema;
29
29
 
30
30
  DUCKDB_API static unique_ptr<CreateMacroInfo> CreateInternalMacroInfo(DefaultMacro &default_macro);
31
31
  DUCKDB_API static unique_ptr<CreateMacroInfo> CreateInternalTableMacroInfo(DefaultMacro &default_macro);
@@ -16,9 +16,9 @@ class SchemaCatalogEntry;
16
16
 
17
17
  class DefaultTypeGenerator : public DefaultGenerator {
18
18
  public:
19
- DefaultTypeGenerator(Catalog &catalog, SchemaCatalogEntry *schema);
19
+ DefaultTypeGenerator(Catalog &catalog, SchemaCatalogEntry &schema);
20
20
 
21
- SchemaCatalogEntry *schema;
21
+ SchemaCatalogEntry &schema;
22
22
 
23
23
  public:
24
24
  DUCKDB_API static LogicalTypeId GetDefaultType(const string &name);
@@ -16,9 +16,9 @@ class SchemaCatalogEntry;
16
16
 
17
17
  class DefaultViewGenerator : public DefaultGenerator {
18
18
  public:
19
- DefaultViewGenerator(Catalog &catalog, SchemaCatalogEntry *schema);
19
+ DefaultViewGenerator(Catalog &catalog, SchemaCatalogEntry &schema);
20
20
 
21
- SchemaCatalogEntry *schema;
21
+ SchemaCatalogEntry &schema;
22
22
 
23
23
  public:
24
24
  unique_ptr<CatalogEntry> CreateDefaultEntry(ClientContext &context, const string &entry_name) override;
@@ -22,13 +22,13 @@ enum class DependencyType {
22
22
  };
23
23
 
24
24
  struct Dependency {
25
- Dependency(CatalogEntry *entry, DependencyType dependency_type = DependencyType::DEPENDENCY_REGULAR)
25
+ Dependency(CatalogEntry &entry, DependencyType dependency_type = DependencyType::DEPENDENCY_REGULAR)
26
26
  : // NOLINT: Allow implicit conversion from `CatalogEntry`
27
27
  entry(entry), dependency_type(dependency_type) {
28
28
  }
29
29
 
30
30
  //! The catalog entry this depends on
31
- CatalogEntry *entry;
31
+ reference<CatalogEntry> entry;
32
32
  //! The type of dependency
33
33
  DependencyType dependency_type;
34
34
  };
@@ -36,16 +36,15 @@ struct Dependency {
36
36
  struct DependencyHashFunction {
37
37
  uint64_t operator()(const Dependency &a) const {
38
38
  std::hash<void *> hash_func;
39
- return hash_func((void *)a.entry);
39
+ return hash_func((void *)&a.entry.get());
40
40
  }
41
41
  };
42
42
 
43
43
  struct DependencyEquality {
44
44
  bool operator()(const Dependency &a, const Dependency &b) const {
45
- return a.entry == b.entry;
45
+ return RefersToSameObject(a.entry, b.entry);
46
46
  }
47
47
  };
48
-
49
48
  using dependency_set_t = unordered_set<Dependency, DependencyHashFunction, DependencyEquality>;
50
49
 
51
50
  } // namespace duckdb
@@ -8,8 +8,7 @@
8
8
 
9
9
  #pragma once
10
10
 
11
- #include "duckdb/common/common.hpp"
12
- #include "duckdb/common/unordered_set.hpp"
11
+ #include "duckdb/catalog/catalog_entry_map.hpp"
13
12
 
14
13
  namespace duckdb {
15
14
  class Catalog;
@@ -20,11 +19,11 @@ class DependencyList {
20
19
  friend class DependencyManager;
21
20
 
22
21
  public:
23
- DUCKDB_API void AddDependency(CatalogEntry *entry);
22
+ DUCKDB_API void AddDependency(CatalogEntry &entry);
24
23
 
25
- DUCKDB_API void VerifyDependencies(Catalog *catalog, const string &name);
24
+ DUCKDB_API void VerifyDependencies(Catalog &catalog, const string &name);
26
25
 
27
26
  private:
28
- unordered_set<CatalogEntry *> set;
27
+ catalog_entry_set_t set;
29
28
  };
30
29
  } // namespace duckdb
@@ -11,6 +11,7 @@
11
11
  #include "duckdb/catalog/catalog_entry.hpp"
12
12
  #include "duckdb/catalog/catalog_set.hpp"
13
13
  #include "duckdb/catalog/dependency.hpp"
14
+ #include "duckdb/catalog/catalog_entry_map.hpp"
14
15
  #include "duckdb/catalog/catalog_transaction.hpp"
15
16
 
16
17
  #include <functional>
@@ -28,26 +29,26 @@ public:
28
29
  explicit DependencyManager(DuckCatalog &catalog);
29
30
 
30
31
  //! Erase the object from the DependencyManager; this should only happen when the object itself is destroyed
31
- void EraseObject(CatalogEntry *object);
32
+ void EraseObject(CatalogEntry &object);
32
33
 
33
34
  //! Scans all dependencies, returning pairs of (object, dependent)
34
- void Scan(const std::function<void(CatalogEntry *, CatalogEntry *, DependencyType)> &callback);
35
+ void Scan(const std::function<void(CatalogEntry &, CatalogEntry &, DependencyType)> &callback);
35
36
 
36
- void AddOwnership(CatalogTransaction transaction, CatalogEntry *owner, CatalogEntry *entry);
37
+ void AddOwnership(CatalogTransaction transaction, CatalogEntry &owner, CatalogEntry &entry);
37
38
 
38
39
  private:
39
40
  DuckCatalog &catalog;
40
41
  //! Map of objects that DEPEND on [object], i.e. [object] can only be deleted when all entries in the dependency map
41
42
  //! are deleted.
42
- unordered_map<CatalogEntry *, dependency_set_t> dependents_map;
43
+ catalog_entry_map_t<dependency_set_t> dependents_map;
43
44
  //! Map of objects that the source object DEPENDS on, i.e. when any of the entries in the vector perform a CASCADE
44
45
  //! drop then [object] is deleted as well
45
- unordered_map<CatalogEntry *, unordered_set<CatalogEntry *>> dependencies_map;
46
+ catalog_entry_map_t<catalog_entry_set_t> dependencies_map;
46
47
 
47
48
  private:
48
- void AddObject(CatalogTransaction transaction, CatalogEntry *object, DependencyList &dependencies);
49
- void DropObject(CatalogTransaction transaction, CatalogEntry *object, bool cascade);
50
- void AlterObject(CatalogTransaction transaction, CatalogEntry *old_obj, CatalogEntry *new_obj);
51
- void EraseObjectInternal(CatalogEntry *object);
49
+ void AddObject(CatalogTransaction transaction, CatalogEntry &object, DependencyList &dependencies);
50
+ void DropObject(CatalogTransaction transaction, CatalogEntry &object, bool cascade);
51
+ void AlterObject(CatalogTransaction transaction, CatalogEntry &old_obj, CatalogEntry &new_obj);
52
+ void EraseObjectInternal(CatalogEntry &object);
52
53
  };
53
54
  } // namespace duckdb
@@ -9,6 +9,7 @@
9
9
  #pragma once
10
10
 
11
11
  #include "duckdb/common/common.hpp"
12
+ #include "duckdb/common/optional_ptr.hpp"
12
13
 
13
14
  namespace duckdb {
14
15
  class Allocator;
@@ -56,7 +57,7 @@ public:
56
57
  void Reset();
57
58
 
58
59
  private:
59
- Allocator *allocator;
60
+ optional_ptr<Allocator> allocator;
60
61
  data_ptr_t pointer;
61
62
  idx_t allocated_size;
62
63
  };
@@ -167,7 +167,7 @@ public:
167
167
  return root.GetContext();
168
168
  }
169
169
 
170
- Catalog *GetCatalog() override {
170
+ optional_ptr<Catalog> GetCatalog() override {
171
171
  return root.GetCatalog();
172
172
  }
173
173
 
@@ -170,4 +170,13 @@ void AssignSharedPointer(shared_ptr<T> &target, const shared_ptr<T> &source) {
170
170
  }
171
171
  }
172
172
 
173
+ template<typename T>
174
+ using reference = std::reference_wrapper<T>;
175
+
176
+ //! Returns whether or not two reference wrappers refer to the same object
177
+ template<class T>
178
+ bool RefersToSameObject(const reference<T> &A, const reference<T> &B) {
179
+ return &A.get() == &B.get();
180
+ }
181
+
173
182
  } // namespace duckdb
@@ -22,19 +22,42 @@ public:
22
22
  optional_ptr(const unique_ptr<T> &ptr_p) : ptr(ptr_p.get()) { // NOLINT: allow implicit creation from unique pointer
23
23
  }
24
24
 
25
+ void CheckValid() const {
26
+ if (!ptr) {
27
+ throw InternalException("Attempting to dereference an optional pointer that is not set");
28
+ }
29
+ }
30
+
25
31
  operator bool() const {
26
32
  return ptr;
27
33
  }
28
34
  T &operator*() {
29
- if (!ptr) {
30
- throw InternalException("Attempting to dereference an optional pointer that is not set");
31
- }
35
+ CheckValid();
36
+ return *ptr;
37
+ }
38
+ const T &operator*() const {
39
+ CheckValid();
32
40
  return *ptr;
33
41
  }
34
42
  T *operator->() {
35
- if (!ptr) {
36
- throw InternalException("Attempting to call a method on an optional pointer that is not set");
37
- }
43
+ CheckValid();
44
+ return ptr;
45
+ }
46
+ const T *operator->() const {
47
+ CheckValid();
48
+ return ptr;
49
+ }
50
+ T *get() {
51
+ // CheckValid();
52
+ return ptr;
53
+ }
54
+ const T *get() const {
55
+ // CheckValid();
56
+ return ptr;
57
+ }
58
+ // this looks dirty - but this is the default behavior of raw pointers
59
+ T *get_mutable() const {
60
+ // CheckValid();
38
61
  return ptr;
39
62
  }
40
63
 
@@ -14,16 +14,14 @@ namespace duckdb {
14
14
 
15
15
  class BufferedFileReader : public Deserializer {
16
16
  public:
17
- BufferedFileReader(FileSystem &fs, const char *path, ClientContext *context,
18
- FileLockType lock_type = FileLockType::READ_LOCK, FileOpener *opener = nullptr);
17
+ BufferedFileReader(FileSystem &fs, const char *path, optional_ptr<ClientContext> context,
18
+ FileLockType lock_type = FileLockType::READ_LOCK, optional_ptr<FileOpener> opener = nullptr);
19
19
 
20
20
  FileSystem &fs;
21
21
  unique_ptr<data_t[]> data;
22
22
  idx_t offset;
23
23
  idx_t read_data;
24
24
  unique_ptr<FileHandle> handle;
25
- ClientContext *context;
26
- Catalog *catalog = nullptr;
27
25
 
28
26
  public:
29
27
  void ReadData(data_ptr_t buffer, uint64_t read_size) override;
@@ -39,11 +37,14 @@ public:
39
37
 
40
38
  ClientContext &GetContext() override;
41
39
 
42
- Catalog *GetCatalog() override;
40
+ optional_ptr<Catalog> GetCatalog() override;
41
+ void SetCatalog(Catalog &catalog);
43
42
 
44
43
  private:
45
44
  idx_t file_size;
46
45
  idx_t total_read;
46
+ optional_ptr<ClientContext> context;
47
+ optional_ptr<Catalog> catalog;
47
48
  };
48
49
 
49
50
  } // namespace duckdb
@@ -120,7 +120,7 @@ public:
120
120
  };
121
121
 
122
122
  //! Gets the catalog for the deserializer
123
- virtual Catalog *GetCatalog() {
123
+ virtual optional_ptr<Catalog> GetCatalog() {
124
124
  return nullptr;
125
125
  };
126
126
 
@@ -11,6 +11,7 @@
11
11
  #include "duckdb/common/common.hpp"
12
12
  #include "duckdb/common/types/vector.hpp"
13
13
  #include "duckdb/storage/buffer_manager.hpp"
14
+ #include "duckdb/storage/buffer/block_handle.hpp"
14
15
 
15
16
  namespace duckdb {
16
17
 
@@ -22,7 +22,7 @@ public:
22
22
  physical_index_vector_t<idx_t> column_index_map, vector<unique_ptr<Expression>> bound_defaults,
23
23
  idx_t estimated_cardinality);
24
24
  //! CREATE TABLE AS
25
- PhysicalBatchInsert(LogicalOperator &op, SchemaCatalogEntry *schema, unique_ptr<BoundCreateTableInfo> info,
25
+ PhysicalBatchInsert(LogicalOperator &op, SchemaCatalogEntry &schema, unique_ptr<BoundCreateTableInfo> info,
26
26
  idx_t estimated_cardinality);
27
27
 
28
28
  //! The map from insert column index to table column index
@@ -34,7 +34,7 @@ public:
34
34
  //! The default expressions of the columns for which no value is provided
35
35
  vector<unique_ptr<Expression>> bound_defaults;
36
36
  //! Table schema, in case of CREATE TABLE AS
37
- SchemaCatalogEntry *schema;
37
+ optional_ptr<SchemaCatalogEntry> schema;
38
38
  //! Create table info, in case of CREATE TABLE AS
39
39
  unique_ptr<BoundCreateTableInfo> info;
40
40
  // Which action to perform on conflict
@@ -32,7 +32,7 @@ public:
32
32
  unique_ptr<Expression> on_conflict_condition, unique_ptr<Expression> do_update_condition,
33
33
  unordered_set<column_t> on_conflict_filter, vector<column_t> columns_to_fetch);
34
34
  //! CREATE TABLE AS
35
- PhysicalInsert(LogicalOperator &op, SchemaCatalogEntry *schema, unique_ptr<BoundCreateTableInfo> info,
35
+ PhysicalInsert(LogicalOperator &op, SchemaCatalogEntry &schema, unique_ptr<BoundCreateTableInfo> info,
36
36
  idx_t estimated_cardinality, bool parallel);
37
37
 
38
38
  //! The map from insert column index to table column index
@@ -46,7 +46,7 @@ public:
46
46
  //! If the returning statement is present, return the whole chunk
47
47
  bool return_chunk;
48
48
  //! Table schema, in case of CREATE TABLE AS
49
- SchemaCatalogEntry *schema;
49
+ optional_ptr<SchemaCatalogEntry> schema;
50
50
  //! Create table info, in case of CREATE TABLE AS
51
51
  unique_ptr<BoundCreateTableInfo> info;
52
52
  //! Whether or not the INSERT can be executed in parallel
@@ -109,15 +109,15 @@ public:
109
109
  public:
110
110
  static void GetInsertInfo(const BoundCreateTableInfo &info, vector<LogicalType> &insert_types,
111
111
  vector<unique_ptr<Expression>> &bound_defaults);
112
- static void ResolveDefaults(TableCatalogEntry *table, DataChunk &chunk,
112
+ static void ResolveDefaults(const TableCatalogEntry &table, DataChunk &chunk,
113
113
  const physical_index_vector_t<idx_t> &column_index_map,
114
114
  ExpressionExecutor &defaults_executor, DataChunk &result);
115
115
 
116
116
  protected:
117
117
  void CombineExistingAndInsertTuples(DataChunk &result, DataChunk &scan_chunk, DataChunk &input_chunk,
118
118
  ClientContext &client) const;
119
- void OnConflictHandling(TableCatalogEntry *table, ExecutionContext &context, InsertLocalState &lstate) const;
120
- void PerformOnConflictAction(ExecutionContext &context, DataChunk &chunk, TableCatalogEntry *table,
119
+ void OnConflictHandling(TableCatalogEntry &table, ExecutionContext &context, InsertLocalState &lstate) const;
120
+ void PerformOnConflictAction(ExecutionContext &context, DataChunk &chunk, TableCatalogEntry &table,
121
121
  Vector &row_ids) const;
122
122
  void RegisterUpdatedRows(InsertLocalState &lstate, const Vector &row_ids, idx_t count) const;
123
123
  };
@@ -19,11 +19,11 @@ public:
19
19
  static constexpr const PhysicalOperatorType TYPE = PhysicalOperatorType::CREATE_TABLE;
20
20
 
21
21
  public:
22
- PhysicalCreateTable(LogicalOperator &op, SchemaCatalogEntry *schema, unique_ptr<BoundCreateTableInfo> info,
22
+ PhysicalCreateTable(LogicalOperator &op, SchemaCatalogEntry &schema, unique_ptr<BoundCreateTableInfo> info,
23
23
  idx_t estimated_cardinality);
24
24
 
25
25
  //! Schema to insert to
26
- SchemaCatalogEntry *schema;
26
+ SchemaCatalogEntry &schema;
27
27
  //! Table name to create
28
28
  unique_ptr<BoundCreateTableInfo> info;
29
29