duckdb 0.7.2-dev1734.0 → 0.7.2-dev1867.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 (155) 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 +4 -4
  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/types/batched_data_collection.cpp +2 -1
  12. package/src/duckdb/src/common/types/column_data_allocator.cpp +1 -0
  13. package/src/duckdb/src/common/types/vector.cpp +2 -2
  14. package/src/duckdb/src/common/types.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/persistent/physical_batch_insert.cpp +14 -13
  19. package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +20 -20
  20. package/src/duckdb/src/execution/operator/schema/physical_create_table.cpp +2 -2
  21. package/src/duckdb/src/execution/physical_plan/plan_create_index.cpp +1 -1
  22. package/src/duckdb/src/execution/physical_plan/plan_create_table.cpp +3 -3
  23. package/src/duckdb/src/execution/physical_plan/plan_delete.cpp +1 -1
  24. package/src/duckdb/src/execution/physical_plan/plan_insert.cpp +1 -1
  25. package/src/duckdb/src/execution/physical_plan/plan_update.cpp +1 -1
  26. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +3 -3
  27. package/src/duckdb/src/function/cast/cast_function_set.cpp +2 -1
  28. package/src/duckdb/src/function/scalar/math/numeric.cpp +57 -0
  29. package/src/duckdb/src/function/scalar/math_functions.cpp +1 -0
  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/hex.cpp +261 -78
  33. package/src/duckdb/src/function/scalar/string/regexp.cpp +145 -28
  34. package/src/duckdb/src/function/scalar/string_functions.cpp +1 -0
  35. package/src/duckdb/src/function/table/checkpoint.cpp +4 -4
  36. package/src/duckdb/src/function/table/system/duckdb_columns.cpp +24 -24
  37. package/src/duckdb/src/function/table/system/duckdb_constraints.cpp +7 -6
  38. package/src/duckdb/src/function/table/system/duckdb_databases.cpp +1 -1
  39. package/src/duckdb/src/function/table/system/duckdb_dependencies.cpp +11 -11
  40. package/src/duckdb/src/function/table/system/pragma_database_size.cpp +1 -1
  41. package/src/duckdb/src/function/table/system/pragma_table_info.cpp +17 -18
  42. package/src/duckdb/src/function/table/table_scan.cpp +8 -11
  43. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  44. package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +9 -9
  45. package/src/duckdb/src/include/duckdb/catalog/catalog_entry_map.hpp +38 -0
  46. package/src/duckdb/src/include/duckdb/catalog/catalog_transaction.hpp +4 -3
  47. package/src/duckdb/src/include/duckdb/catalog/default/default_functions.hpp +2 -2
  48. package/src/duckdb/src/include/duckdb/catalog/default/default_types.hpp +2 -2
  49. package/src/duckdb/src/include/duckdb/catalog/default/default_views.hpp +2 -2
  50. package/src/duckdb/src/include/duckdb/catalog/dependency.hpp +4 -5
  51. package/src/duckdb/src/include/duckdb/catalog/dependency_list.hpp +4 -5
  52. package/src/duckdb/src/include/duckdb/catalog/dependency_manager.hpp +10 -9
  53. package/src/duckdb/src/include/duckdb/common/allocator.hpp +2 -1
  54. package/src/duckdb/src/include/duckdb/common/bit_utils.hpp +147 -0
  55. package/src/duckdb/src/include/duckdb/common/field_writer.hpp +1 -1
  56. package/src/duckdb/src/include/duckdb/common/helper.hpp +9 -0
  57. package/src/duckdb/src/include/duckdb/common/hugeint.hpp +1 -0
  58. package/src/duckdb/src/include/duckdb/common/optional_ptr.hpp +29 -6
  59. package/src/duckdb/src/include/duckdb/common/serializer/buffered_file_reader.hpp +6 -5
  60. package/src/duckdb/src/include/duckdb/common/serializer.hpp +1 -1
  61. package/src/duckdb/src/include/duckdb/common/string_util.hpp +7 -0
  62. package/src/duckdb/src/include/duckdb/common/types/row_data_collection.hpp +1 -0
  63. package/src/duckdb/src/include/duckdb/common/types.hpp +1 -1
  64. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_batch_insert.hpp +2 -2
  65. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_insert.hpp +5 -5
  66. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_table.hpp +2 -2
  67. package/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp +3 -2
  68. package/src/duckdb/src/include/duckdb/function/scalar/math_functions.hpp +4 -0
  69. package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +4 -0
  70. package/src/duckdb/src/include/duckdb/main/database_manager.hpp +4 -3
  71. package/src/duckdb/src/include/duckdb/main/query_result.hpp +3 -2
  72. package/src/duckdb/src/include/duckdb/optimizer/filter_combiner.hpp +7 -7
  73. package/src/duckdb/src/include/duckdb/optimizer/matcher/expression_matcher.hpp +11 -11
  74. package/src/duckdb/src/include/duckdb/optimizer/matcher/set_matcher.hpp +8 -8
  75. package/src/duckdb/src/include/duckdb/optimizer/rule/arithmetic_simplification.hpp +1 -1
  76. package/src/duckdb/src/include/duckdb/optimizer/rule/case_simplification.hpp +1 -1
  77. package/src/duckdb/src/include/duckdb/optimizer/rule/comparison_simplification.hpp +1 -1
  78. package/src/duckdb/src/include/duckdb/optimizer/rule/conjunction_simplification.hpp +2 -2
  79. package/src/duckdb/src/include/duckdb/optimizer/rule/constant_folding.hpp +1 -1
  80. package/src/duckdb/src/include/duckdb/optimizer/rule/date_part_simplification.hpp +1 -1
  81. package/src/duckdb/src/include/duckdb/optimizer/rule/distributivity.hpp +1 -1
  82. package/src/duckdb/src/include/duckdb/optimizer/rule/empty_needle_removal.hpp +1 -1
  83. package/src/duckdb/src/include/duckdb/optimizer/rule/enum_comparison.hpp +1 -1
  84. package/src/duckdb/src/include/duckdb/optimizer/rule/equal_or_null_simplification.hpp +1 -1
  85. package/src/duckdb/src/include/duckdb/optimizer/rule/in_clause_simplification.hpp +1 -1
  86. package/src/duckdb/src/include/duckdb/optimizer/rule/like_optimizations.hpp +1 -1
  87. package/src/duckdb/src/include/duckdb/optimizer/rule/move_constants.hpp +1 -1
  88. package/src/duckdb/src/include/duckdb/optimizer/rule/ordered_aggregate_optimizer.hpp +1 -1
  89. package/src/duckdb/src/include/duckdb/optimizer/rule/regex_optimizations.hpp +1 -1
  90. package/src/duckdb/src/include/duckdb/optimizer/rule.hpp +2 -2
  91. package/src/duckdb/src/include/duckdb/parser/base_expression.hpp +1 -1
  92. package/src/duckdb/src/include/duckdb/parser/expression_map.hpp +19 -6
  93. package/src/duckdb/src/include/duckdb/parser/expression_util.hpp +1 -1
  94. package/src/duckdb/src/include/duckdb/planner/expression.hpp +5 -2
  95. package/src/duckdb/src/include/duckdb/planner/expression_binder/base_select_binder.hpp +1 -1
  96. package/src/duckdb/src/include/duckdb/planner/expression_binder/order_binder.hpp +3 -3
  97. package/src/duckdb/src/include/duckdb/storage/buffer/block_handle.hpp +15 -7
  98. package/src/duckdb/src/include/duckdb/storage/buffer/buffer_pool.hpp +3 -0
  99. package/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp +49 -126
  100. package/src/duckdb/src/include/duckdb/storage/compression/chimp/algorithm/chimp128.hpp +1 -0
  101. package/src/duckdb/src/include/duckdb/storage/compression/chimp/algorithm/chimp_utils.hpp +0 -97
  102. package/src/duckdb/src/include/duckdb/storage/compression/patas/algorithm/patas.hpp +1 -0
  103. package/src/duckdb/src/include/duckdb/storage/meta_block_reader.hpp +5 -5
  104. package/src/duckdb/src/include/duckdb/storage/standard_buffer_manager.hpp +159 -0
  105. package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +1 -0
  106. package/src/duckdb/src/include/duckdb/transaction/meta_transaction.hpp +6 -5
  107. package/src/duckdb/src/main/client_context.cpp +1 -1
  108. package/src/duckdb/src/main/database.cpp +2 -1
  109. package/src/duckdb/src/main/database_manager.cpp +4 -4
  110. package/src/duckdb/src/optimizer/common_aggregate_optimizer.cpp +2 -2
  111. package/src/duckdb/src/optimizer/cse_optimizer.cpp +4 -4
  112. package/src/duckdb/src/optimizer/deliminator.cpp +13 -11
  113. package/src/duckdb/src/optimizer/expression_rewriter.cpp +2 -2
  114. package/src/duckdb/src/optimizer/filter_combiner.cpp +67 -65
  115. package/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp +1 -0
  116. package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +26 -25
  117. package/src/duckdb/src/optimizer/matcher/expression_matcher.cpp +23 -21
  118. package/src/duckdb/src/optimizer/rule/arithmetic_simplification.cpp +3 -3
  119. package/src/duckdb/src/optimizer/rule/case_simplification.cpp +2 -2
  120. package/src/duckdb/src/optimizer/rule/comparison_simplification.cpp +6 -7
  121. package/src/duckdb/src/optimizer/rule/conjunction_simplification.cpp +9 -8
  122. package/src/duckdb/src/optimizer/rule/constant_folding.cpp +7 -7
  123. package/src/duckdb/src/optimizer/rule/date_part_simplification.cpp +3 -3
  124. package/src/duckdb/src/optimizer/rule/distributivity.cpp +5 -5
  125. package/src/duckdb/src/optimizer/rule/empty_needle_removal.cpp +6 -6
  126. package/src/duckdb/src/optimizer/rule/enum_comparison.cpp +4 -4
  127. package/src/duckdb/src/optimizer/rule/equal_or_null_simplification.cpp +23 -26
  128. package/src/duckdb/src/optimizer/rule/in_clause_simplification_rule.cpp +2 -3
  129. package/src/duckdb/src/optimizer/rule/like_optimizations.cpp +3 -3
  130. package/src/duckdb/src/optimizer/rule/move_constants.cpp +6 -6
  131. package/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp +2 -2
  132. package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +11 -10
  133. package/src/duckdb/src/parser/expression_util.cpp +6 -6
  134. package/src/duckdb/src/parser/transform/helpers/transform_groupby.cpp +3 -3
  135. package/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp +2 -2
  136. package/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +3 -3
  137. package/src/duckdb/src/planner/binder/query_node/bind_setop_node.cpp +5 -5
  138. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +2 -2
  139. package/src/duckdb/src/planner/expression_binder/base_select_binder.cpp +4 -4
  140. package/src/duckdb/src/planner/expression_binder/order_binder.cpp +3 -3
  141. package/src/duckdb/src/storage/buffer/block_handle.cpp +7 -6
  142. package/src/duckdb/src/storage/buffer/block_manager.cpp +3 -1
  143. package/src/duckdb/src/storage/buffer/buffer_handle.cpp +1 -0
  144. package/src/duckdb/src/storage/buffer/buffer_pool.cpp +6 -2
  145. package/src/duckdb/src/storage/buffer/buffer_pool_reservation.cpp +7 -4
  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/ub_src_function_scalar_string.cpp +2 -0
  155. package/src/duckdb/ub_src_storage.cpp +2 -0
@@ -29,8 +29,8 @@ public:
29
29
 
30
30
  /* The double {{}} in the intializer for excluded_entries is intentional, workaround for bug in gcc-4.9 */
31
31
  template <class T, class MATCHER>
32
- static bool MatchRecursive(vector<unique_ptr<MATCHER>> &matchers, vector<T *> &entries, vector<T *> &bindings,
33
- unordered_set<idx_t> excluded_entries, idx_t m_idx = 0) {
32
+ static bool MatchRecursive(vector<unique_ptr<MATCHER>> &matchers, vector<reference<T>> &entries,
33
+ vector<reference<T>> &bindings, unordered_set<idx_t> excluded_entries, idx_t m_idx = 0) {
34
34
  if (m_idx == matchers.size()) {
35
35
  // matched all matchers!
36
36
  return true;
@@ -65,8 +65,8 @@ public:
65
65
  }
66
66
 
67
67
  template <class T, class MATCHER>
68
- static bool Match(vector<unique_ptr<MATCHER>> &matchers, vector<T *> &entries, vector<T *> &bindings,
69
- Policy policy) {
68
+ static bool Match(vector<unique_ptr<MATCHER>> &matchers, vector<reference<T>> &entries,
69
+ vector<reference<T>> &bindings, Policy policy) {
70
70
  if (policy == Policy::ORDERED) {
71
71
  // ordered policy, count has to match
72
72
  if (matchers.size() != entries.size()) {
@@ -100,12 +100,12 @@ public:
100
100
  }
101
101
 
102
102
  template <class T, class MATCHER>
103
- static bool Match(vector<unique_ptr<MATCHER>> &matchers, vector<unique_ptr<T>> &entries, vector<T *> &bindings,
104
- Policy policy) {
103
+ static bool Match(vector<unique_ptr<MATCHER>> &matchers, vector<unique_ptr<T>> &entries,
104
+ vector<reference<T>> &bindings, Policy policy) {
105
105
  // convert vector of unique_ptr to vector of normal pointers
106
- vector<T *> ptr_entries;
106
+ vector<reference<T>> ptr_entries;
107
107
  for (auto &entry : entries) {
108
- ptr_entries.push_back(entry.get());
108
+ ptr_entries.push_back(*entry);
109
109
  }
110
110
  // then just call the normal match function
111
111
  return Match(matchers, ptr_entries, bindings, policy);
@@ -18,7 +18,7 @@ class ArithmeticSimplificationRule : public Rule {
18
18
  public:
19
19
  explicit ArithmeticSimplificationRule(ExpressionRewriter &rewriter);
20
20
 
21
- unique_ptr<Expression> Apply(LogicalOperator &op, vector<Expression *> &bindings, bool &changes_made,
21
+ unique_ptr<Expression> Apply(LogicalOperator &op, vector<reference<Expression>> &bindings, bool &changes_made,
22
22
  bool is_root) override;
23
23
  };
24
24
 
@@ -17,7 +17,7 @@ class CaseSimplificationRule : public Rule {
17
17
  public:
18
18
  explicit CaseSimplificationRule(ExpressionRewriter &rewriter);
19
19
 
20
- unique_ptr<Expression> Apply(LogicalOperator &op, vector<Expression *> &bindings, bool &changes_made,
20
+ unique_ptr<Expression> Apply(LogicalOperator &op, vector<reference<Expression>> &bindings, bool &changes_made,
21
21
  bool is_root) override;
22
22
  };
23
23
 
@@ -17,7 +17,7 @@ class ComparisonSimplificationRule : public Rule {
17
17
  public:
18
18
  explicit ComparisonSimplificationRule(ExpressionRewriter &rewriter);
19
19
 
20
- unique_ptr<Expression> Apply(LogicalOperator &op, vector<Expression *> &bindings, bool &changes_made,
20
+ unique_ptr<Expression> Apply(LogicalOperator &op, vector<reference<Expression>> &bindings, bool &changes_made,
21
21
  bool is_root) override;
22
22
  };
23
23
 
@@ -17,10 +17,10 @@ class ConjunctionSimplificationRule : public Rule {
17
17
  public:
18
18
  explicit ConjunctionSimplificationRule(ExpressionRewriter &rewriter);
19
19
 
20
- unique_ptr<Expression> Apply(LogicalOperator &op, vector<Expression *> &bindings, bool &changes_made,
20
+ unique_ptr<Expression> Apply(LogicalOperator &op, vector<reference<Expression>> &bindings, bool &changes_made,
21
21
  bool is_root) override;
22
22
 
23
- unique_ptr<Expression> RemoveExpression(BoundConjunctionExpression &conj, Expression *expr);
23
+ unique_ptr<Expression> RemoveExpression(BoundConjunctionExpression &conj, const Expression &expr);
24
24
  };
25
25
 
26
26
  } // namespace duckdb
@@ -17,7 +17,7 @@ class ConstantFoldingRule : public Rule {
17
17
  public:
18
18
  explicit ConstantFoldingRule(ExpressionRewriter &rewriter);
19
19
 
20
- unique_ptr<Expression> Apply(LogicalOperator &op, vector<Expression *> &bindings, bool &changes_made,
20
+ unique_ptr<Expression> Apply(LogicalOperator &op, vector<reference<Expression>> &bindings, bool &changes_made,
21
21
  bool is_root) override;
22
22
  };
23
23
 
@@ -18,7 +18,7 @@ class DatePartSimplificationRule : public Rule {
18
18
  public:
19
19
  explicit DatePartSimplificationRule(ExpressionRewriter &rewriter);
20
20
 
21
- unique_ptr<Expression> Apply(LogicalOperator &op, vector<Expression *> &bindings, bool &changes_made,
21
+ unique_ptr<Expression> Apply(LogicalOperator &op, vector<reference<Expression>> &bindings, bool &changes_made,
22
22
  bool is_root) override;
23
23
  };
24
24
 
@@ -18,7 +18,7 @@ class DistributivityRule : public Rule {
18
18
  public:
19
19
  explicit DistributivityRule(ExpressionRewriter &rewriter);
20
20
 
21
- unique_ptr<Expression> Apply(LogicalOperator &op, vector<Expression *> &bindings, bool &changes_made,
21
+ unique_ptr<Expression> Apply(LogicalOperator &op, vector<reference<Expression>> &bindings, bool &changes_made,
22
22
  bool is_root) override;
23
23
 
24
24
  private:
@@ -18,7 +18,7 @@ class EmptyNeedleRemovalRule : public Rule {
18
18
  public:
19
19
  explicit EmptyNeedleRemovalRule(ExpressionRewriter &rewriter);
20
20
 
21
- unique_ptr<Expression> Apply(LogicalOperator &op, vector<Expression *> &bindings, bool &changes_made,
21
+ unique_ptr<Expression> Apply(LogicalOperator &op, vector<reference<Expression>> &bindings, bool &changes_made,
22
22
  bool is_root) override;
23
23
  };
24
24
 
@@ -17,7 +17,7 @@ class EnumComparisonRule : public Rule {
17
17
  public:
18
18
  explicit EnumComparisonRule(ExpressionRewriter &rewriter);
19
19
 
20
- unique_ptr<Expression> Apply(LogicalOperator &op, vector<Expression *> &bindings, bool &changes_made,
20
+ unique_ptr<Expression> Apply(LogicalOperator &op, vector<reference<Expression>> &bindings, bool &changes_made,
21
21
  bool is_root) override;
22
22
  };
23
23
 
@@ -18,7 +18,7 @@ class EqualOrNullSimplification : public Rule {
18
18
  public:
19
19
  explicit EqualOrNullSimplification(ExpressionRewriter &rewriter);
20
20
 
21
- unique_ptr<Expression> Apply(LogicalOperator &op, vector<Expression *> &bindings, bool &changes_made,
21
+ unique_ptr<Expression> Apply(LogicalOperator &op, vector<reference<Expression>> &bindings, bool &changes_made,
22
22
  bool is_root) override;
23
23
  };
24
24
 
@@ -17,7 +17,7 @@ class InClauseSimplificationRule : public Rule {
17
17
  public:
18
18
  explicit InClauseSimplificationRule(ExpressionRewriter &rewriter);
19
19
 
20
- unique_ptr<Expression> Apply(LogicalOperator &op, vector<Expression *> &bindings, bool &changes_made,
20
+ unique_ptr<Expression> Apply(LogicalOperator &op, vector<reference<Expression>> &bindings, bool &changes_made,
21
21
  bool is_root) override;
22
22
  };
23
23
 
@@ -18,7 +18,7 @@ class LikeOptimizationRule : public Rule {
18
18
  public:
19
19
  explicit LikeOptimizationRule(ExpressionRewriter &rewriter);
20
20
 
21
- unique_ptr<Expression> Apply(LogicalOperator &op, vector<Expression *> &bindings, bool &changes_made,
21
+ unique_ptr<Expression> Apply(LogicalOperator &op, vector<reference<Expression>> &bindings, bool &changes_made,
22
22
  bool is_root) override;
23
23
 
24
24
  unique_ptr<Expression> ApplyRule(BoundFunctionExpression &expr, ScalarFunction function, string pattern,
@@ -18,7 +18,7 @@ class MoveConstantsRule : public Rule {
18
18
  public:
19
19
  explicit MoveConstantsRule(ExpressionRewriter &rewriter);
20
20
 
21
- unique_ptr<Expression> Apply(LogicalOperator &op, vector<Expression *> &bindings, bool &changes_made,
21
+ unique_ptr<Expression> Apply(LogicalOperator &op, vector<reference<Expression>> &bindings, bool &changes_made,
22
22
  bool is_root) override;
23
23
  };
24
24
 
@@ -17,7 +17,7 @@ class OrderedAggregateOptimizer : public Rule {
17
17
  public:
18
18
  explicit OrderedAggregateOptimizer(ExpressionRewriter &rewriter);
19
19
 
20
- unique_ptr<Expression> Apply(LogicalOperator &op, vector<Expression *> &bindings, bool &changes_made,
20
+ unique_ptr<Expression> Apply(LogicalOperator &op, vector<reference<Expression>> &bindings, bool &changes_made,
21
21
  bool is_root) override;
22
22
  };
23
23
 
@@ -17,7 +17,7 @@ class RegexOptimizationRule : public Rule {
17
17
  public:
18
18
  explicit RegexOptimizationRule(ExpressionRewriter &rewriter);
19
19
 
20
- unique_ptr<Expression> Apply(LogicalOperator &op, vector<Expression *> &bindings, bool &changes_made,
20
+ unique_ptr<Expression> Apply(LogicalOperator &op, vector<reference<Expression>> &bindings, bool &changes_made,
21
21
  bool is_root) override;
22
22
 
23
23
  unique_ptr<Expression> ApplyRule(BoundFunctionExpression *expr, ScalarFunction function, string pattern,
@@ -29,8 +29,8 @@ public:
29
29
  unique_ptr<ExpressionMatcher> root;
30
30
 
31
31
  ClientContext &GetContext() const;
32
- virtual unique_ptr<Expression> Apply(LogicalOperator &op, vector<Expression *> &bindings, bool &fixed_point,
33
- bool is_root) = 0;
32
+ virtual unique_ptr<Expression> Apply(LogicalOperator &op, vector<reference<Expression>> &bindings,
33
+ bool &fixed_point, bool is_root) = 0;
34
34
  };
35
35
 
36
36
  } // namespace duckdb
@@ -73,7 +73,7 @@ public:
73
73
  //! Returns true if this expression is equal to another expression
74
74
  virtual bool Equals(const BaseExpression *other) const;
75
75
 
76
- static bool Equals(BaseExpression *left, BaseExpression *right) {
76
+ static bool Equals(const BaseExpression *left, const BaseExpression *right) {
77
77
  if (left == right) {
78
78
  return true;
79
79
  }
@@ -11,25 +11,38 @@
11
11
  #include "duckdb/common/unordered_map.hpp"
12
12
  #include "duckdb/common/unordered_set.hpp"
13
13
  #include "duckdb/parser/base_expression.hpp"
14
+ #include "duckdb/parser/parsed_expression.hpp"
15
+ #include "duckdb/planner/expression.hpp"
14
16
 
15
17
  namespace duckdb {
16
18
  class Expression;
17
19
 
20
+ template <class T>
18
21
  struct ExpressionHashFunction {
19
- uint64_t operator()(const BaseExpression *const &expr) const {
20
- return (uint64_t)expr->Hash();
22
+ uint64_t operator()(const reference<T> &expr) const {
23
+ return (uint64_t)expr.get().Hash();
21
24
  }
22
25
  };
23
26
 
27
+ template <class T>
24
28
  struct ExpressionEquality {
25
- bool operator()(const BaseExpression *const &a, const BaseExpression *const &b) const {
26
- return a->Equals(b);
29
+ bool operator()(const reference<T> &a, const reference<T> &b) const {
30
+ return a.get().Equals(&b.get());
27
31
  }
28
32
  };
29
33
 
30
34
  template <typename T>
31
- using expression_map_t = unordered_map<BaseExpression *, T, ExpressionHashFunction, ExpressionEquality>;
35
+ using expression_map_t =
36
+ unordered_map<reference<Expression>, T, ExpressionHashFunction<Expression>, ExpressionEquality<Expression>>;
32
37
 
33
- using expression_set_t = unordered_set<BaseExpression *, ExpressionHashFunction, ExpressionEquality>;
38
+ using expression_set_t =
39
+ unordered_set<reference<Expression>, ExpressionHashFunction<Expression>, ExpressionEquality<Expression>>;
40
+
41
+ template <typename T>
42
+ using parsed_expression_map_t = unordered_map<reference<ParsedExpression>, T, ExpressionHashFunction<ParsedExpression>,
43
+ ExpressionEquality<ParsedExpression>>;
44
+
45
+ using parsed_expression_set_t = unordered_set<reference<ParsedExpression>, ExpressionHashFunction<ParsedExpression>,
46
+ ExpressionEquality<ParsedExpression>>;
34
47
 
35
48
  } // namespace duckdb
@@ -28,7 +28,7 @@ public:
28
28
  private:
29
29
  template <class T>
30
30
  static bool ExpressionListEquals(const vector<unique_ptr<T>> &a, const vector<unique_ptr<T>> &b);
31
- template <class T>
31
+ template <class T, class EXPRESSION_MAP>
32
32
  static bool ExpressionSetEquals(const vector<unique_ptr<T>> &a, const vector<unique_ptr<T>> &b);
33
33
  };
34
34
 
@@ -48,8 +48,11 @@ public:
48
48
  return return_type == ((Expression *)other)->return_type;
49
49
  }
50
50
 
51
- static bool Equals(Expression *left, Expression *right) {
52
- return BaseExpression::Equals((BaseExpression *)left, (BaseExpression *)right);
51
+ static bool Equals(const Expression *left, const Expression *right) {
52
+ return BaseExpression::Equals((const BaseExpression *)left, (const BaseExpression *)right);
53
+ }
54
+ static bool Equals(const Expression &left, const Expression &right) {
55
+ return left.Equals(&right);
53
56
  }
54
57
  //! Create a copy of this expression
55
58
  virtual unique_ptr<Expression> Copy() = 0;
@@ -19,7 +19,7 @@ class WindowExpression;
19
19
  class BoundSelectNode;
20
20
 
21
21
  struct BoundGroupInformation {
22
- expression_map_t<idx_t> map;
22
+ parsed_expression_map_t<idx_t> map;
23
23
  case_insensitive_map_t<idx_t> alias_map;
24
24
  };
25
25
 
@@ -22,9 +22,9 @@ class SelectNode;
22
22
  class OrderBinder {
23
23
  public:
24
24
  OrderBinder(vector<Binder *> binders, idx_t projection_index, case_insensitive_map_t<idx_t> &alias_map,
25
- expression_map_t<idx_t> &projection_map, idx_t max_count);
25
+ parsed_expression_map_t<idx_t> &projection_map, idx_t max_count);
26
26
  OrderBinder(vector<Binder *> binders, idx_t projection_index, SelectNode &node,
27
- case_insensitive_map_t<idx_t> &alias_map, expression_map_t<idx_t> &projection_map);
27
+ case_insensitive_map_t<idx_t> &alias_map, parsed_expression_map_t<idx_t> &projection_map);
28
28
 
29
29
  public:
30
30
  unique_ptr<Expression> Bind(unique_ptr<ParsedExpression> expr);
@@ -51,7 +51,7 @@ private:
51
51
  idx_t max_count;
52
52
  vector<unique_ptr<ParsedExpression>> *extra_list;
53
53
  case_insensitive_map_t<idx_t> &alias_map;
54
- expression_map_t<idx_t> &projection_map;
54
+ parsed_expression_map_t<idx_t> &projection_map;
55
55
  };
56
56
 
57
57
  } // namespace duckdb
@@ -24,9 +24,9 @@ enum class BlockState : uint8_t { BLOCK_UNLOADED = 0, BLOCK_LOADED = 1 };
24
24
 
25
25
  struct BufferPoolReservation {
26
26
  idx_t size {0};
27
+ BufferPool &pool;
27
28
 
28
- BufferPoolReservation() {
29
- }
29
+ BufferPoolReservation(BufferPool &pool);
30
30
  BufferPoolReservation(const BufferPoolReservation &) = delete;
31
31
  BufferPoolReservation &operator=(const BufferPoolReservation &) = delete;
32
32
 
@@ -35,18 +35,17 @@ struct BufferPoolReservation {
35
35
 
36
36
  ~BufferPoolReservation();
37
37
 
38
- void Resize(atomic<idx_t> &counter, idx_t new_size);
38
+ void Resize(idx_t new_size);
39
39
  void Merge(BufferPoolReservation &&src);
40
40
  };
41
41
 
42
42
  struct TempBufferPoolReservation : BufferPoolReservation {
43
- atomic<idx_t> &counter;
44
- TempBufferPoolReservation(atomic<idx_t> &counter, idx_t size) : counter(counter) {
45
- Resize(counter, size);
43
+ TempBufferPoolReservation(BufferPool &pool, idx_t size) : BufferPoolReservation(pool) {
44
+ Resize(size);
46
45
  }
47
46
  TempBufferPoolReservation(TempBufferPoolReservation &&) = default;
48
47
  ~TempBufferPoolReservation() {
49
- Resize(counter, 0);
48
+ Resize(0);
50
49
  }
51
50
  };
52
51
 
@@ -55,6 +54,7 @@ class BlockHandle {
55
54
  friend struct BufferEvictionNode;
56
55
  friend class BufferHandle;
57
56
  friend class BufferManager;
57
+ friend class StandardBufferManager;
58
58
  friend class BufferPool;
59
59
 
60
60
  public:
@@ -70,6 +70,14 @@ public:
70
70
  return block_id;
71
71
  }
72
72
 
73
+ void ResizeBuffer(idx_t block_size, int64_t memory_delta) {
74
+ D_ASSERT(buffer);
75
+ // resize and adjust current memory
76
+ buffer->Resize(block_size);
77
+ memory_usage += memory_delta;
78
+ D_ASSERT(memory_usage == buffer->AllocSize());
79
+ }
80
+
73
81
  int32_t Readers() const {
74
82
  return readers;
75
83
  }
@@ -30,6 +30,7 @@ class BufferPool {
30
30
  friend class BlockHandle;
31
31
  friend class BlockManager;
32
32
  friend class BufferManager;
33
+ friend class StandardBufferManager;
33
34
 
34
35
  public:
35
36
  explicit BufferPool(idx_t maximum_memory);
@@ -39,6 +40,8 @@ public:
39
40
  //! blocks can be evicted
40
41
  void SetLimit(idx_t limit, const char *exception_postscript);
41
42
 
43
+ void IncreaseUsedMemory(idx_t size);
44
+
42
45
  idx_t GetUsedMemory();
43
46
 
44
47
  idx_t GetMaxMemory();
@@ -8,156 +8,79 @@
8
8
 
9
9
  #pragma once
10
10
 
11
- #include "duckdb/common/allocator.hpp"
12
- #include "duckdb/common/atomic.hpp"
13
- #include "duckdb/common/file_system.hpp"
14
- #include "duckdb/common/mutex.hpp"
15
- #include "duckdb/common/unordered_map.hpp"
16
- #include "duckdb/storage/block_manager.hpp"
17
- #include "duckdb/storage/buffer/block_handle.hpp"
11
+ #include "duckdb/storage/buffer_manager.hpp"
18
12
  #include "duckdb/storage/buffer/buffer_handle.hpp"
19
- #include "duckdb/storage/buffer/buffer_pool.hpp"
13
+ #include "duckdb/storage/block_manager.hpp"
14
+ #include "duckdb/common/file_system.hpp"
20
15
  #include "duckdb/storage/buffer/temporary_file_information.hpp"
16
+ #include "duckdb/main/config.hpp"
21
17
 
22
18
  namespace duckdb {
23
- class BlockManager;
24
- class DatabaseInstance;
25
- class TemporaryDirectoryHandle;
26
- struct EvictionQueue;
27
19
 
28
- //! The BufferManager is in charge of handling memory management for a single database. It cooperatively shares a
29
- //! BufferPool with other BufferManagers, belonging to different databases. It hands out memory buffers that can
30
- //! be used by the database internally, and offers configuration options specific to a database, which need not be
31
- //! shared by the BufferPool, including whether to support swapping temp buffers to disk, and where to swap them to.
20
+ class Allocator;
21
+ class BufferPool;
22
+
32
23
  class BufferManager {
33
24
  friend class BufferHandle;
34
25
  friend class BlockHandle;
35
26
  friend class BlockManager;
36
27
 
37
28
  public:
38
- BufferManager(DatabaseInstance &db, string temp_directory);
39
- virtual ~BufferManager();
40
-
41
- //! Registers an in-memory buffer that cannot be unloaded until it is destroyed
42
- //! This buffer can be small (smaller than BLOCK_SIZE)
43
- //! Unpin and pin are nops on this block of memory
44
- shared_ptr<BlockHandle> RegisterSmallMemory(idx_t block_size);
45
-
46
- //! Allocate an in-memory buffer with a single pin.
47
- //! The allocated memory is released when the buffer handle is destroyed.
48
- DUCKDB_API BufferHandle Allocate(idx_t block_size, bool can_destroy = true,
49
- shared_ptr<BlockHandle> *block = nullptr);
29
+ BufferManager() {
30
+ }
31
+ virtual ~BufferManager() {
32
+ }
50
33
 
34
+ public:
35
+ static unique_ptr<BufferManager> CreateStandardBufferManager(DatabaseInstance &db, DBConfig &config);
36
+ virtual BufferHandle Allocate(idx_t block_size, bool can_destroy = true,
37
+ shared_ptr<BlockHandle> *block = nullptr) = 0;
51
38
  //! Reallocate an in-memory buffer that is pinned.
52
- void ReAllocate(shared_ptr<BlockHandle> &handle, idx_t block_size);
53
-
54
- BufferHandle Pin(shared_ptr<BlockHandle> &handle);
55
- void Unpin(shared_ptr<BlockHandle> &handle);
56
-
57
- DUCKDB_API static BufferManager &GetBufferManager(ClientContext &context);
58
- DUCKDB_API static BufferManager &GetBufferManager(DatabaseInstance &db);
59
- DUCKDB_API static BufferManager &GetBufferManager(AttachedDatabase &db);
60
-
39
+ virtual void ReAllocate(shared_ptr<BlockHandle> &handle, idx_t block_size) = 0;
40
+ virtual BufferHandle Pin(shared_ptr<BlockHandle> &handle) = 0;
41
+ virtual void Unpin(shared_ptr<BlockHandle> &handle) = 0;
61
42
  //! Returns the currently allocated memory
62
- idx_t GetUsedMemory() {
63
- return buffer_pool.current_memory;
64
- }
43
+ virtual idx_t GetUsedMemory() const = 0;
65
44
  //! Returns the maximum available memory
66
- idx_t GetMaxMemory() {
67
- return buffer_pool.maximum_memory;
68
- }
69
-
45
+ virtual idx_t GetMaxMemory() const = 0;
46
+ virtual shared_ptr<BlockHandle> RegisterSmallMemory(idx_t block_size);
47
+ virtual DUCKDB_API Allocator &GetBufferAllocator();
48
+ virtual DUCKDB_API void ReserveMemory(idx_t size);
49
+ virtual DUCKDB_API void FreeReservedMemory(idx_t size);
50
+ //! Set a new memory limit to the buffer manager, throws an exception if the new limit is too low and not enough
51
+ //! blocks can be evicted
52
+ virtual void SetLimit(idx_t limit = (idx_t)-1);
53
+ virtual vector<TemporaryFileInformation> GetTemporaryFiles();
54
+ virtual const string &GetTemporaryDirectory();
55
+ virtual void SetTemporaryDirectory(const string &new_dir);
56
+ virtual DatabaseInstance &GetDatabase();
57
+ virtual bool HasTemporaryDirectory() const;
58
+ //! Construct a managed buffer.
59
+ virtual unique_ptr<FileBuffer> ConstructManagedBuffer(idx_t size, unique_ptr<FileBuffer> &&source,
60
+ FileBufferType type = FileBufferType::MANAGED_BUFFER);
70
61
  //! Increases the currently allocated memory, but the actual allocation does not go through the buffer manager
71
- void IncreaseUsedMemory(idx_t size);
62
+ virtual void IncreaseUsedMemory(idx_t size, bool unsafe = false) = 0;
72
63
  //! Decrease the currently allocated memory, but the actual deallocation does not go through the buffer manager
73
- void DecreaseUsedMemory(idx_t size);
74
-
75
- const string &GetTemporaryDirectory() {
76
- return temp_directory;
77
- }
78
-
79
- void SetTemporaryDirectory(string new_dir);
80
-
81
- DUCKDB_API Allocator &GetBufferAllocator();
64
+ virtual void DecreaseUsedMemory(idx_t size) = 0;
65
+ //! Get the underlying buffer pool responsible for managing the buffers
66
+ virtual BufferPool &GetBufferPool();
82
67
 
83
- DatabaseInstance &GetDatabase() {
84
- return db;
85
- }
68
+ // Static methods
86
69
 
87
- BufferPool &GetBufferPool() {
88
- return buffer_pool;
89
- }
70
+ DUCKDB_API static BufferManager &GetBufferManager(DatabaseInstance &db);
71
+ DUCKDB_API static BufferManager &GetBufferManager(ClientContext &context);
72
+ DUCKDB_API static BufferManager &GetBufferManager(AttachedDatabase &db);
90
73
 
91
74
  static idx_t GetAllocSize(idx_t block_size) {
92
75
  return AlignValue<idx_t, Storage::SECTOR_SIZE>(block_size + Storage::BLOCK_HEADER_SIZE);
93
76
  }
94
77
 
95
- //! Construct a managed buffer.
96
- unique_ptr<FileBuffer> ConstructManagedBuffer(idx_t size, unique_ptr<FileBuffer> &&source,
97
- FileBufferType type = FileBufferType::MANAGED_BUFFER);
98
-
99
- DUCKDB_API void ReserveMemory(idx_t size);
100
- DUCKDB_API void FreeReservedMemory(idx_t size);
101
-
102
- //! Set a new memory limit to the buffer pool, throws an exception if the new limit is too low and not enough
103
- //! blocks can be evicted. (Sugar for calling method directly on the BufferPool.)
104
- void SetLimit(idx_t limit = (idx_t)-1) {
105
- buffer_pool.SetLimit(limit, InMemoryWarning());
106
- }
107
- //! Returns a list of all temporary files
108
- vector<TemporaryFileInformation> GetTemporaryFiles();
109
-
110
- private:
111
- //! Register an in-memory buffer of arbitrary size, as long as it is >= BLOCK_SIZE. can_destroy signifies whether or
112
- //! not the buffer can be destroyed when unpinned, or whether or not it needs to be written to a temporary file so
113
- //! it can be reloaded. The resulting buffer will already be allocated, but needs to be pinned in order to be used.
114
- //! This needs to be private to prevent creating blocks without ever pinning them:
115
- //! blocks that are never pinned are never added to the eviction queue
116
- shared_ptr<BlockHandle> RegisterMemory(idx_t block_size, bool can_destroy);
117
-
118
- //! Write a temporary buffer to disk
119
- void WriteTemporaryBuffer(block_id_t block_id, FileBuffer &buffer);
120
- //! Read a temporary buffer from disk
121
- unique_ptr<FileBuffer> ReadTemporaryBuffer(block_id_t id, unique_ptr<FileBuffer> buffer = nullptr);
122
- //! Get the path of the temporary buffer
123
- string GetTemporaryPath(block_id_t id);
124
-
125
- void DeleteTemporaryFile(block_id_t id);
126
-
127
- void RequireTemporaryDirectory();
128
-
129
- const char *InMemoryWarning();
130
-
131
- static data_ptr_t BufferAllocatorAllocate(PrivateAllocatorData *private_data, idx_t size);
132
- static void BufferAllocatorFree(PrivateAllocatorData *private_data, data_ptr_t pointer, idx_t size);
133
- static data_ptr_t BufferAllocatorRealloc(PrivateAllocatorData *private_data, data_ptr_t pointer, idx_t old_size,
134
- idx_t size);
135
-
136
- //! When the BlockHandle reaches 0 readers, this creates a new FileBuffer for this BlockHandle and
137
- //! overwrites the data within with garbage. Any readers that do not hold the pin will notice
138
- void VerifyZeroReaders(shared_ptr<BlockHandle> &handle);
139
-
140
- //! Helper
141
- template <typename... ARGS>
142
- TempBufferPoolReservation EvictBlocksOrThrow(idx_t extra_memory, unique_ptr<FileBuffer> *buffer, ARGS...);
143
-
144
- private:
145
- //! The database instance
146
- DatabaseInstance &db;
147
- //! The buffer pool
148
- BufferPool &buffer_pool;
149
- //! The directory name where temporary files are stored
150
- string temp_directory;
151
- //! Lock for creating the temp handle
152
- mutex temp_handle_lock;
153
- //! Handle for the temporary directory
154
- unique_ptr<TemporaryDirectoryHandle> temp_directory_handle;
155
- //! The temporary id used for managed buffers
156
- atomic<block_id_t> temporary_id;
157
- //! Allocator associated with the buffer manager, that passes all allocations through this buffer manager
158
- Allocator buffer_allocator;
159
- //! Block manager for temp data
160
- unique_ptr<BlockManager> temp_block_manager;
78
+ protected:
79
+ virtual void PurgeQueue() = 0;
80
+ virtual void AddToEvictionQueue(shared_ptr<BlockHandle> &handle);
81
+ virtual void WriteTemporaryBuffer(block_id_t block_id, FileBuffer &buffer);
82
+ virtual unique_ptr<FileBuffer> ReadTemporaryBuffer(block_id_t id, unique_ptr<FileBuffer> buffer);
83
+ virtual void DeleteTemporaryFile(block_id_t id);
161
84
  };
162
85
 
163
86
  } // namespace duckdb
@@ -17,6 +17,7 @@
17
17
  #include "duckdb/common/likely.hpp"
18
18
  #include "duckdb/storage/compression/chimp/algorithm/packed_data.hpp"
19
19
  #include "duckdb/common/limits.hpp"
20
+ #include "duckdb/common/bit_utils.hpp"
20
21
 
21
22
  #include "duckdb/storage/compression/chimp/algorithm/bit_reader.hpp"
22
23
  #include "duckdb/storage/compression/chimp/algorithm/output_bit_stream.hpp"