duckdb 0.7.2-dev2320.0 → 0.7.2-dev2410.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 (200) hide show
  1. package/package.json +1 -1
  2. package/src/data_chunk.cpp +1 -1
  3. package/src/duckdb/extension/icu/icu-extension.cpp +2 -2
  4. package/src/duckdb/extension/icu/icu-makedate.cpp +52 -0
  5. package/src/duckdb/extension/icu/icu-strptime.cpp +1 -1
  6. package/src/duckdb/extension/icu/third_party/icu/i18n/calendar.cpp +4 -0
  7. package/src/duckdb/extension/icu/third_party/icu/i18n/dangical.cpp +28 -28
  8. package/src/duckdb/extension/icu/third_party/icu/i18n/dangical.h +4 -4
  9. package/src/duckdb/extension/json/include/json_common.hpp +1 -1
  10. package/src/duckdb/extension/json/json_functions/json_create.cpp +1 -1
  11. package/src/duckdb/extension/json/json_functions/json_transform.cpp +1 -1
  12. package/src/duckdb/extension/json/json_functions.cpp +2 -2
  13. package/src/duckdb/extension/json/json_serializer.cpp +1 -1
  14. package/src/duckdb/extension/parquet/column_reader.cpp +1 -1
  15. package/src/duckdb/extension/parquet/column_writer.cpp +3 -3
  16. package/src/duckdb/src/catalog/catalog_entry/scalar_macro_catalog_entry.cpp +2 -2
  17. package/src/duckdb/src/common/arrow/arrow_appender.cpp +2 -2
  18. package/src/duckdb/src/common/enums/physical_operator_type.cpp +2 -0
  19. package/src/duckdb/src/common/file_buffer.cpp +8 -0
  20. package/src/duckdb/src/common/operator/cast_operators.cpp +24 -25
  21. package/src/duckdb/src/common/radix_partitioning.cpp +34 -0
  22. package/src/duckdb/src/common/row_operations/row_heap_scatter.cpp +2 -2
  23. package/src/duckdb/src/common/row_operations/row_scatter.cpp +1 -1
  24. package/src/duckdb/src/common/sort/partition_state.cpp +44 -124
  25. package/src/duckdb/src/common/sort/sorted_block.cpp +1 -1
  26. package/src/duckdb/src/common/types/bit.cpp +18 -18
  27. package/src/duckdb/src/common/types/blob.cpp +7 -7
  28. package/src/duckdb/src/common/types/column/column_data_allocator.cpp +1 -1
  29. package/src/duckdb/src/common/types/column/column_data_collection.cpp +1 -1
  30. package/src/duckdb/src/common/types/hash.cpp +1 -1
  31. package/src/duckdb/src/common/types/hyperloglog.cpp +1 -1
  32. package/src/duckdb/src/common/types/row/tuple_data_scatter_gather.cpp +2 -2
  33. package/src/duckdb/src/common/types/string_heap.cpp +2 -2
  34. package/src/duckdb/src/common/types/string_type.cpp +2 -2
  35. package/src/duckdb/src/common/types/timestamp.cpp +1 -1
  36. package/src/duckdb/src/common/types/vector.cpp +7 -7
  37. package/src/duckdb/src/execution/index/art/art_key.cpp +2 -2
  38. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +144 -31
  39. package/src/duckdb/src/execution/operator/join/physical_asof_join.cpp +698 -0
  40. package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +1 -1
  41. package/src/duckdb/src/execution/operator/schema/physical_create_type.cpp +1 -1
  42. package/src/duckdb/src/execution/physical_plan/plan_asof_join.cpp +7 -1
  43. package/src/duckdb/src/function/aggregate/distributive/arg_min_max.cpp +2 -2
  44. package/src/duckdb/src/function/aggregate/distributive/bitagg.cpp +2 -2
  45. package/src/duckdb/src/function/aggregate/distributive/bitstring_agg.cpp +2 -2
  46. package/src/duckdb/src/function/aggregate/distributive/first.cpp +2 -2
  47. package/src/duckdb/src/function/aggregate/distributive/kurtosis.cpp +3 -2
  48. package/src/duckdb/src/function/aggregate/distributive/minmax.cpp +2 -2
  49. package/src/duckdb/src/function/aggregate/distributive/skew.cpp +5 -1
  50. package/src/duckdb/src/function/aggregate/distributive/string_agg.cpp +1 -1
  51. package/src/duckdb/src/function/cast/list_casts.cpp +1 -1
  52. package/src/duckdb/src/function/cast/struct_cast.cpp +1 -1
  53. package/src/duckdb/src/function/cast/vector_cast_helpers.cpp +3 -3
  54. package/src/duckdb/src/function/scalar/bit/bitstring.cpp +1 -1
  55. package/src/duckdb/src/function/scalar/blob/encode.cpp +1 -1
  56. package/src/duckdb/src/function/scalar/date/strftime.cpp +3 -3
  57. package/src/duckdb/src/function/scalar/generic/current_setting.cpp +1 -1
  58. package/src/duckdb/src/function/scalar/list/list_sort.cpp +30 -56
  59. package/src/duckdb/src/function/scalar/string/ascii.cpp +1 -1
  60. package/src/duckdb/src/function/scalar/string/caseconvert.cpp +2 -2
  61. package/src/duckdb/src/function/scalar/string/concat.cpp +6 -6
  62. package/src/duckdb/src/function/scalar/string/contains.cpp +2 -2
  63. package/src/duckdb/src/function/scalar/string/damerau_levenshtein.cpp +2 -2
  64. package/src/duckdb/src/function/scalar/string/hex.cpp +4 -4
  65. package/src/duckdb/src/function/scalar/string/instr.cpp +1 -1
  66. package/src/duckdb/src/function/scalar/string/jaccard.cpp +1 -1
  67. package/src/duckdb/src/function/scalar/string/jaro_winkler.cpp +5 -5
  68. package/src/duckdb/src/function/scalar/string/length.cpp +1 -1
  69. package/src/duckdb/src/function/scalar/string/levenshtein.cpp +2 -2
  70. package/src/duckdb/src/function/scalar/string/like.cpp +10 -11
  71. package/src/duckdb/src/function/scalar/string/mismatches.cpp +2 -2
  72. package/src/duckdb/src/function/scalar/string/nfc_normalize.cpp +1 -1
  73. package/src/duckdb/src/function/scalar/string/pad.cpp +3 -3
  74. package/src/duckdb/src/function/scalar/string/prefix.cpp +2 -2
  75. package/src/duckdb/src/function/scalar/string/printf.cpp +1 -1
  76. package/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp +4 -4
  77. package/src/duckdb/src/function/scalar/string/repeat.cpp +1 -1
  78. package/src/duckdb/src/function/scalar/string/replace.cpp +3 -3
  79. package/src/duckdb/src/function/scalar/string/reverse.cpp +1 -1
  80. package/src/duckdb/src/function/scalar/string/starts_with.cpp +2 -2
  81. package/src/duckdb/src/function/scalar/string/string_split.cpp +3 -3
  82. package/src/duckdb/src/function/scalar/string/strip_accents.cpp +2 -2
  83. package/src/duckdb/src/function/scalar/string/substring.cpp +3 -3
  84. package/src/duckdb/src/function/scalar/string/suffix.cpp +2 -2
  85. package/src/duckdb/src/function/scalar/string/translate.cpp +3 -3
  86. package/src/duckdb/src/function/scalar/string/trim.cpp +3 -3
  87. package/src/duckdb/src/function/scalar/struct/struct_extract.cpp +1 -1
  88. package/src/duckdb/src/function/scalar/system/aggregate_export.cpp +5 -7
  89. package/src/duckdb/src/function/scalar/union/union_extract.cpp +1 -1
  90. package/src/duckdb/src/function/table/copy_csv.cpp +1 -1
  91. package/src/duckdb/src/function/table/system/duckdb_functions.cpp +2 -2
  92. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  93. package/src/duckdb/src/include/duckdb/common/crypto/md5.hpp +1 -1
  94. package/src/duckdb/src/include/duckdb/common/enums/debug_initialize.hpp +17 -0
  95. package/src/duckdb/src/include/duckdb/common/enums/order_type.hpp +8 -0
  96. package/src/duckdb/src/include/duckdb/common/enums/physical_operator_type.hpp +1 -0
  97. package/src/duckdb/src/include/duckdb/common/file_buffer.hpp +3 -0
  98. package/src/duckdb/src/include/duckdb/common/radix.hpp +1 -1
  99. package/src/duckdb/src/include/duckdb/common/radix_partitioning.hpp +3 -0
  100. package/src/duckdb/src/include/duckdb/common/sort/partition_state.hpp +11 -60
  101. package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +8 -6
  102. package/src/duckdb/src/include/duckdb/common/types/vector_buffer.hpp +1 -1
  103. package/src/duckdb/src/include/duckdb/execution/operator/join/outer_join_marker.hpp +6 -1
  104. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_asof_join.hpp +93 -0
  105. package/src/duckdb/src/include/duckdb/execution/physical_operator.hpp +1 -1
  106. package/src/duckdb/src/include/duckdb/function/macro_function.hpp +17 -0
  107. package/src/duckdb/src/include/duckdb/function/scalar/regexp.hpp +1 -1
  108. package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +2 -2
  109. package/src/duckdb/src/include/duckdb/function/scalar_macro_function.hpp +3 -0
  110. package/src/duckdb/src/include/duckdb/function/table_macro_function.hpp +3 -0
  111. package/src/duckdb/src/include/duckdb/main/capi/cast/utils.hpp +1 -1
  112. package/src/duckdb/src/include/duckdb/main/client_config.hpp +2 -0
  113. package/src/duckdb/src/include/duckdb/main/config.hpp +7 -2
  114. package/src/duckdb/src/include/duckdb/main/settings.hpp +13 -3
  115. package/src/duckdb/src/include/duckdb/optimizer/cse_optimizer.hpp +1 -1
  116. package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +4 -2
  117. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +1 -0
  118. package/src/duckdb/src/include/duckdb/planner/binder.hpp +1 -1
  119. package/src/duckdb/src/include/duckdb/planner/expression_binder/aggregate_binder.hpp +1 -1
  120. package/src/duckdb/src/include/duckdb/planner/expression_binder/alter_binder.hpp +1 -1
  121. package/src/duckdb/src/include/duckdb/planner/expression_binder/base_select_binder.hpp +4 -3
  122. package/src/duckdb/src/include/duckdb/planner/expression_binder/check_binder.hpp +1 -1
  123. package/src/duckdb/src/include/duckdb/planner/expression_binder/constant_binder.hpp +1 -1
  124. package/src/duckdb/src/include/duckdb/planner/expression_binder/group_binder.hpp +1 -1
  125. package/src/duckdb/src/include/duckdb/planner/expression_binder/having_binder.hpp +2 -2
  126. package/src/duckdb/src/include/duckdb/planner/expression_binder/index_binder.hpp +1 -1
  127. package/src/duckdb/src/include/duckdb/planner/expression_binder/insert_binder.hpp +1 -1
  128. package/src/duckdb/src/include/duckdb/planner/expression_binder/lateral_binder.hpp +2 -2
  129. package/src/duckdb/src/include/duckdb/planner/expression_binder/qualify_binder.hpp +2 -2
  130. package/src/duckdb/src/include/duckdb/planner/expression_binder/relation_binder.hpp +1 -1
  131. package/src/duckdb/src/include/duckdb/planner/expression_binder/returning_binder.hpp +1 -1
  132. package/src/duckdb/src/include/duckdb/planner/expression_binder/table_function_binder.hpp +1 -1
  133. package/src/duckdb/src/include/duckdb/planner/expression_binder/update_binder.hpp +1 -1
  134. package/src/duckdb/src/include/duckdb/planner/expression_binder/where_binder.hpp +2 -2
  135. package/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +12 -9
  136. package/src/duckdb/src/include/duckdb/storage/block_manager.hpp +1 -0
  137. package/src/duckdb/src/include/duckdb/storage/in_memory_block_manager.hpp +3 -0
  138. package/src/duckdb/src/include/duckdb/storage/partial_block_manager.hpp +2 -1
  139. package/src/duckdb/src/include/duckdb/storage/single_file_block_manager.hpp +11 -5
  140. package/src/duckdb/src/include/duckdb/storage/string_uncompressed.hpp +1 -1
  141. package/src/duckdb/src/main/capi/cast/from_decimal-c.cpp +1 -1
  142. package/src/duckdb/src/main/capi/result-c.cpp +2 -2
  143. package/src/duckdb/src/main/config.cpp +26 -0
  144. package/src/duckdb/src/main/settings/settings.cpp +31 -8
  145. package/src/duckdb/src/optimizer/cse_optimizer.cpp +9 -8
  146. package/src/duckdb/src/parser/expression/subquery_expression.cpp +1 -1
  147. package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +2 -0
  148. package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +33 -29
  149. package/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp +8 -10
  150. package/src/duckdb/src/planner/binder/expression/bind_cast_expression.cpp +1 -1
  151. package/src/duckdb/src/planner/binder/expression/bind_collate_expression.cpp +2 -2
  152. package/src/duckdb/src/planner/binder/expression/bind_columnref_expression.cpp +1 -1
  153. package/src/duckdb/src/planner/binder/expression/bind_function_expression.cpp +8 -7
  154. package/src/duckdb/src/planner/binder/expression/bind_lambda.cpp +2 -2
  155. package/src/duckdb/src/planner/binder/expression/bind_macro_expression.cpp +6 -6
  156. package/src/duckdb/src/planner/binder/expression/bind_operator_expression.cpp +2 -2
  157. package/src/duckdb/src/planner/binder/expression/bind_subquery_expression.cpp +1 -1
  158. package/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp +6 -14
  159. package/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +2 -5
  160. package/src/duckdb/src/planner/binder/query_node/bind_table_macro_node.cpp +1 -1
  161. package/src/duckdb/src/planner/binder/query_node/plan_select_node.cpp +8 -8
  162. package/src/duckdb/src/planner/binder/query_node/plan_subquery.cpp +5 -5
  163. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +2 -2
  164. package/src/duckdb/src/planner/binder/statement/bind_delete.cpp +1 -1
  165. package/src/duckdb/src/planner/binder/statement/bind_update.cpp +2 -2
  166. package/src/duckdb/src/planner/binder/tableref/plan_expressionlistref.cpp +1 -1
  167. package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +4 -4
  168. package/src/duckdb/src/planner/expression.cpp +2 -1
  169. package/src/duckdb/src/planner/expression_binder/aggregate_binder.cpp +2 -2
  170. package/src/duckdb/src/planner/expression_binder/alter_binder.cpp +2 -2
  171. package/src/duckdb/src/planner/expression_binder/base_select_binder.cpp +4 -4
  172. package/src/duckdb/src/planner/expression_binder/check_binder.cpp +4 -4
  173. package/src/duckdb/src/planner/expression_binder/column_alias_binder.cpp +1 -1
  174. package/src/duckdb/src/planner/expression_binder/constant_binder.cpp +3 -3
  175. package/src/duckdb/src/planner/expression_binder/group_binder.cpp +2 -2
  176. package/src/duckdb/src/planner/expression_binder/having_binder.cpp +4 -4
  177. package/src/duckdb/src/planner/expression_binder/index_binder.cpp +2 -2
  178. package/src/duckdb/src/planner/expression_binder/insert_binder.cpp +2 -2
  179. package/src/duckdb/src/planner/expression_binder/lateral_binder.cpp +3 -3
  180. package/src/duckdb/src/planner/expression_binder/qualify_binder.cpp +4 -4
  181. package/src/duckdb/src/planner/expression_binder/relation_binder.cpp +2 -2
  182. package/src/duckdb/src/planner/expression_binder/returning_binder.cpp +2 -2
  183. package/src/duckdb/src/planner/expression_binder/table_function_binder.cpp +3 -3
  184. package/src/duckdb/src/planner/expression_binder/update_binder.cpp +2 -2
  185. package/src/duckdb/src/planner/expression_binder/where_binder.cpp +4 -4
  186. package/src/duckdb/src/planner/expression_binder.cpp +12 -12
  187. package/src/duckdb/src/storage/buffer/block_manager.cpp +1 -2
  188. package/src/duckdb/src/storage/checkpoint/write_overflow_strings_to_disk.cpp +2 -2
  189. package/src/duckdb/src/storage/compression/dictionary_compression.cpp +1 -1
  190. package/src/duckdb/src/storage/compression/fsst.cpp +3 -3
  191. package/src/duckdb/src/storage/compression/string_uncompressed.cpp +1 -1
  192. package/src/duckdb/src/storage/meta_block_writer.cpp +4 -0
  193. package/src/duckdb/src/storage/partial_block_manager.cpp +11 -4
  194. package/src/duckdb/src/storage/single_file_block_manager.cpp +16 -9
  195. package/src/duckdb/src/storage/standard_buffer_manager.cpp +5 -2
  196. package/src/duckdb/src/storage/statistics/string_stats.cpp +2 -2
  197. package/src/duckdb/src/storage/storage_manager.cpp +7 -2
  198. package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +21 -1
  199. package/src/duckdb/ub_src_execution_operator_join.cpp +2 -0
  200. package/src/statement.cpp +3 -3
@@ -158,11 +158,8 @@ void Binder::BindModifiers(OrderBinder &order_binder, QueryNode &statement, Boun
158
158
  vector<unique_ptr<ParsedExpression>> order_list;
159
159
  order_binders[0]->ExpandStarExpression(std::move(order_node.expression), order_list);
160
160
 
161
- auto type =
162
- order_node.type == OrderType::ORDER_DEFAULT ? config.options.default_order_type : order_node.type;
163
- auto null_order = order_node.null_order == OrderByNullType::ORDER_DEFAULT
164
- ? config.options.default_null_order
165
- : order_node.null_order;
161
+ auto type = config.ResolveOrder(order_node.type);
162
+ auto null_order = config.ResolveNullOrder(type, order_node.null_order);
166
163
  for (auto &order_expr : order_list) {
167
164
  auto bound_expr = BindOrderExpression(order_binder, std::move(order_expr));
168
165
  if (!bound_expr) {
@@ -19,7 +19,7 @@ namespace duckdb {
19
19
  unique_ptr<QueryNode> Binder::BindTableMacro(FunctionExpression &function, TableMacroCatalogEntry *macro_func,
20
20
  idx_t depth) {
21
21
 
22
- auto &macro_def = (TableMacroFunction &)*macro_func->function;
22
+ auto &macro_def = macro_func->function->Cast<TableMacroFunction>();
23
23
  auto node = macro_def.query_node->Copy();
24
24
 
25
25
  // auto &macro_def = *macro_func->function;
@@ -9,7 +9,7 @@
9
9
  namespace duckdb {
10
10
 
11
11
  unique_ptr<LogicalOperator> Binder::PlanFilter(unique_ptr<Expression> condition, unique_ptr<LogicalOperator> root) {
12
- PlanSubqueries(&condition, &root);
12
+ PlanSubqueries(condition, root);
13
13
  auto filter = make_uniq<LogicalFilter>(std::move(condition));
14
14
  filter->AddChild(std::move(root));
15
15
  return std::move(filter);
@@ -34,12 +34,12 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundSelectNode &statement) {
34
34
  if (!statement.groups.group_expressions.empty()) {
35
35
  // visit the groups
36
36
  for (auto &group : statement.groups.group_expressions) {
37
- PlanSubqueries(&group, &root);
37
+ PlanSubqueries(group, root);
38
38
  }
39
39
  }
40
40
  // now visit all aggregate expressions
41
41
  for (auto &expr : statement.aggregates) {
42
- PlanSubqueries(&expr, &root);
42
+ PlanSubqueries(expr, root);
43
43
  }
44
44
  // finally create the aggregate node with the group_index and aggregate_index as obtained from the binder
45
45
  auto aggregate = make_uniq<LogicalAggregate>(statement.group_index, statement.aggregate_index,
@@ -59,7 +59,7 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundSelectNode &statement) {
59
59
  }
60
60
 
61
61
  if (statement.having) {
62
- PlanSubqueries(&statement.having, &root);
62
+ PlanSubqueries(statement.having, root);
63
63
  auto having = make_uniq<LogicalFilter>(std::move(statement.having));
64
64
 
65
65
  having->AddChild(std::move(root));
@@ -71,7 +71,7 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundSelectNode &statement) {
71
71
  win->expressions = std::move(statement.windows);
72
72
  // visit the window expressions
73
73
  for (auto &expr : win->expressions) {
74
- PlanSubqueries(&expr, &root);
74
+ PlanSubqueries(expr, root);
75
75
  }
76
76
  D_ASSERT(!win->expressions.empty());
77
77
  win->AddChild(std::move(root));
@@ -79,7 +79,7 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundSelectNode &statement) {
79
79
  }
80
80
 
81
81
  if (statement.qualify) {
82
- PlanSubqueries(&statement.qualify, &root);
82
+ PlanSubqueries(statement.qualify, root);
83
83
  auto qualify = make_uniq<LogicalFilter>(std::move(statement.qualify));
84
84
 
85
85
  qualify->AddChild(std::move(root));
@@ -97,7 +97,7 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundSelectNode &statement) {
97
97
  unnest->expressions = std::move(unnest_node.expressions);
98
98
  // visit the unnest expressions
99
99
  for (auto &expr : unnest->expressions) {
100
- PlanSubqueries(&expr, &root);
100
+ PlanSubqueries(expr, root);
101
101
  }
102
102
  D_ASSERT(!unnest->expressions.empty());
103
103
  unnest->AddChild(std::move(root));
@@ -105,7 +105,7 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundSelectNode &statement) {
105
105
  }
106
106
 
107
107
  for (auto &expr : statement.select_list) {
108
- PlanSubqueries(&expr, &root);
108
+ PlanSubqueries(expr, root);
109
109
  }
110
110
 
111
111
  auto proj = make_uniq<LogicalProjection>(statement.projection_index, std::move(statement.select_list));
@@ -378,14 +378,14 @@ unique_ptr<Expression> Binder::PlanSubquery(BoundSubqueryExpression &expr, uniqu
378
378
  return result_expression;
379
379
  }
380
380
 
381
- void Binder::PlanSubqueries(unique_ptr<Expression> *expr_ptr, unique_ptr<LogicalOperator> *root) {
382
- if (!*expr_ptr) {
381
+ void Binder::PlanSubqueries(unique_ptr<Expression> &expr_ptr, unique_ptr<LogicalOperator> &root) {
382
+ if (!expr_ptr) {
383
383
  return;
384
384
  }
385
- auto &expr = **expr_ptr;
385
+ auto &expr = *expr_ptr;
386
386
 
387
387
  // first visit the children of the node, if any
388
- ExpressionIterator::EnumerateChildren(expr, [&](unique_ptr<Expression> &expr) { PlanSubqueries(&expr, root); });
388
+ ExpressionIterator::EnumerateChildren(expr, [&](unique_ptr<Expression> &expr) { PlanSubqueries(expr, root); });
389
389
 
390
390
  // check if this is a subquery node
391
391
  if (expr.expression_class == ExpressionClass::BOUND_SUBQUERY) {
@@ -398,7 +398,7 @@ void Binder::PlanSubqueries(unique_ptr<Expression> *expr_ptr, unique_ptr<Logical
398
398
  has_unplanned_subqueries = true;
399
399
  return;
400
400
  }
401
- *expr_ptr = PlanSubquery(subquery, *root);
401
+ expr_ptr = PlanSubquery(subquery, root);
402
402
  }
403
403
  }
404
404
 
@@ -161,7 +161,7 @@ static void QualifyFunctionNames(ClientContext &context, unique_ptr<ParsedExpres
161
161
 
162
162
  SchemaCatalogEntry &Binder::BindCreateFunctionInfo(CreateInfo &info) {
163
163
  auto &base = (CreateMacroInfo &)info;
164
- auto &scalar_function = (ScalarMacroFunction &)*base.function;
164
+ auto &scalar_function = base.function->Cast<ScalarMacroFunction>();
165
165
 
166
166
  if (scalar_function.expression->HasParameter()) {
167
167
  throw BinderException("Parameter expressions within macro's are not supported!");
@@ -198,7 +198,7 @@ SchemaCatalogEntry &Binder::BindCreateFunctionInfo(CreateInfo &info) {
198
198
  auto sel_node = make_uniq<BoundSelectNode>();
199
199
  auto group_info = make_uniq<BoundGroupInformation>();
200
200
  SelectBinder binder(*this, context, *sel_node, *group_info);
201
- error = binder.Bind(&expression, 0, false);
201
+ error = binder.Bind(expression, 0, false);
202
202
 
203
203
  if (!error.empty()) {
204
204
  throw BinderException(error);
@@ -62,7 +62,7 @@ BoundStatement Binder::Bind(DeleteStatement &stmt) {
62
62
  WhereBinder binder(*this, context);
63
63
  condition = binder.Bind(stmt.condition);
64
64
 
65
- PlanSubqueries(&condition, &root);
65
+ PlanSubqueries(condition, root);
66
66
  auto filter = make_uniq<LogicalFilter>(std::move(condition));
67
67
  filter->AddChild(std::move(root));
68
68
  root = std::move(filter);
@@ -162,7 +162,7 @@ unique_ptr<LogicalOperator> Binder::BindUpdateSet(LogicalOperator &op, unique_pt
162
162
  UpdateBinder binder(*this, context);
163
163
  binder.target_type = column.Type();
164
164
  auto bound_expr = binder.Bind(expr);
165
- PlanSubqueries(&bound_expr, &root);
165
+ PlanSubqueries(bound_expr, root);
166
166
 
167
167
  op.expressions.push_back(make_uniq<BoundColumnRefExpression>(
168
168
  bound_expr->return_type, ColumnBinding(proj_index, projection_expressions.size())));
@@ -225,7 +225,7 @@ BoundStatement Binder::Bind(UpdateStatement &stmt) {
225
225
  WhereBinder binder(*this, context);
226
226
  auto condition = binder.Bind(stmt.set_info->condition);
227
227
 
228
- PlanSubqueries(&condition, &root);
228
+ PlanSubqueries(condition, root);
229
229
  auto filter = make_uniq<LogicalFilter>(std::move(condition));
230
230
  filter->AddChild(std::move(root));
231
231
  root = std::move(filter);
@@ -10,7 +10,7 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundExpressionListRef &ref) {
10
10
  // values list, first plan any subqueries in the list
11
11
  for (auto &expr_list : ref.values) {
12
12
  for (auto &expr : expr_list) {
13
- PlanSubqueries(&expr, &root);
13
+ PlanSubqueries(expr, root);
14
14
  }
15
15
  }
16
16
  // now create a LogicalExpressionGet from the set of expressions
@@ -268,7 +268,7 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundJoinRef &ref) {
268
268
  auto filter = make_uniq<LogicalFilter>(std::move(ref.condition));
269
269
  // visit the expressions in the filter
270
270
  for (auto &expression : filter->expressions) {
271
- PlanSubqueries(&expression, &root);
271
+ PlanSubqueries(expression, root);
272
272
  }
273
273
  filter->AddChild(std::move(root));
274
274
  return std::move(filter);
@@ -288,7 +288,7 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundJoinRef &ref) {
288
288
  if (child->type == LogicalOperatorType::LOGICAL_FILTER) {
289
289
  auto &filter = child->Cast<LogicalFilter>();
290
290
  for (auto &expr : filter.expressions) {
291
- PlanSubqueries(&expr, &filter.children[0]);
291
+ PlanSubqueries(expr, filter.children[0]);
292
292
  }
293
293
  }
294
294
  }
@@ -302,8 +302,8 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundJoinRef &ref) {
302
302
  // and the expressions on the RHS with the RHS as root node
303
303
  auto &comp_join = join->Cast<LogicalComparisonJoin>();
304
304
  for (idx_t i = 0; i < comp_join.conditions.size(); i++) {
305
- PlanSubqueries(&comp_join.conditions[i].left, &comp_join.children[0]);
306
- PlanSubqueries(&comp_join.conditions[i].right, &comp_join.children[1]);
305
+ PlanSubqueries(comp_join.conditions[i].left, comp_join.children[0]);
306
+ PlanSubqueries(comp_join.conditions[i].right, comp_join.children[1]);
307
307
  }
308
308
  break;
309
309
  }
@@ -51,7 +51,8 @@ bool Expression::HasSideEffects() const {
51
51
  bool Expression::PropagatesNullValues() const {
52
52
  if (type == ExpressionType::OPERATOR_IS_NULL || type == ExpressionType::OPERATOR_IS_NOT_NULL ||
53
53
  type == ExpressionType::COMPARE_NOT_DISTINCT_FROM || type == ExpressionType::COMPARE_DISTINCT_FROM ||
54
- type == ExpressionType::CONJUNCTION_OR || type == ExpressionType::CONJUNCTION_AND) {
54
+ type == ExpressionType::CONJUNCTION_OR || type == ExpressionType::CONJUNCTION_AND ||
55
+ type == ExpressionType::OPERATOR_COALESCE) {
55
56
  return false;
56
57
  }
57
58
  bool propagate_null_values = true;
@@ -7,8 +7,8 @@ namespace duckdb {
7
7
  AggregateBinder::AggregateBinder(Binder &binder, ClientContext &context) : ExpressionBinder(binder, context, true) {
8
8
  }
9
9
 
10
- BindResult AggregateBinder::BindExpression(unique_ptr<ParsedExpression> *expr_ptr, idx_t depth, bool root_expression) {
11
- auto &expr = **expr_ptr;
10
+ BindResult AggregateBinder::BindExpression(unique_ptr<ParsedExpression> &expr_ptr, idx_t depth, bool root_expression) {
11
+ auto &expr = *expr_ptr;
12
12
  switch (expr.expression_class) {
13
13
  case ExpressionClass::WINDOW:
14
14
  throw ParserException("aggregate function calls cannot contain window function calls");
@@ -12,8 +12,8 @@ AlterBinder::AlterBinder(Binder &binder, ClientContext &context, TableCatalogEnt
12
12
  this->target_type = std::move(target_type);
13
13
  }
14
14
 
15
- BindResult AlterBinder::BindExpression(unique_ptr<ParsedExpression> *expr_ptr, idx_t depth, bool root_expression) {
16
- auto &expr = **expr_ptr;
15
+ BindResult AlterBinder::BindExpression(unique_ptr<ParsedExpression> &expr_ptr, idx_t depth, bool root_expression) {
16
+ auto &expr = *expr_ptr;
17
17
  switch (expr.GetExpressionClass()) {
18
18
  case ExpressionClass::WINDOW:
19
19
  return BindResult("window functions are not allowed in alter statement");
@@ -23,8 +23,8 @@ BaseSelectBinder::BaseSelectBinder(Binder &binder, ClientContext &context, Bound
23
23
  : BaseSelectBinder(binder, context, node, info, case_insensitive_map_t<idx_t>()) {
24
24
  }
25
25
 
26
- BindResult BaseSelectBinder::BindExpression(unique_ptr<ParsedExpression> *expr_ptr, idx_t depth, bool root_expression) {
27
- auto &expr = **expr_ptr;
26
+ BindResult BaseSelectBinder::BindExpression(unique_ptr<ParsedExpression> &expr_ptr, idx_t depth, bool root_expression) {
27
+ auto &expr = *expr_ptr;
28
28
  // check if the expression binds to one of the groups
29
29
  auto group_index = TryBindGroup(expr, depth);
30
30
  if (group_index != DConstants::INVALID_INDEX) {
@@ -69,7 +69,7 @@ idx_t BaseSelectBinder::TryBindGroup(ParsedExpression &expr, idx_t depth) {
69
69
  return DConstants::INVALID_INDEX;
70
70
  }
71
71
 
72
- BindResult BaseSelectBinder::BindColumnRef(unique_ptr<ParsedExpression> *expr_ptr, idx_t depth) {
72
+ BindResult BaseSelectBinder::BindColumnRef(unique_ptr<ParsedExpression> &expr_ptr, idx_t depth) {
73
73
  // first try to bind the column reference regularly
74
74
  auto result = ExpressionBinder::BindExpression(expr_ptr, depth);
75
75
  if (!result.HasError()) {
@@ -77,7 +77,7 @@ BindResult BaseSelectBinder::BindColumnRef(unique_ptr<ParsedExpression> *expr_pt
77
77
  }
78
78
  // binding failed
79
79
  // check in the alias map
80
- auto &colref = (*expr_ptr)->Cast<ColumnRefExpression>();
80
+ auto &colref = (expr_ptr.get())->Cast<ColumnRefExpression>();
81
81
  if (!colref.IsQualified()) {
82
82
  auto alias_entry = alias_map.find(colref.column_names[0]);
83
83
  if (alias_entry != alias_map.end()) {
@@ -12,8 +12,8 @@ CheckBinder::CheckBinder(Binder &binder, ClientContext &context, string table_p,
12
12
  target_type = LogicalType::INTEGER;
13
13
  }
14
14
 
15
- BindResult CheckBinder::BindExpression(unique_ptr<ParsedExpression> *expr_ptr, idx_t depth, bool root_expression) {
16
- auto &expr = **expr_ptr;
15
+ BindResult CheckBinder::BindExpression(unique_ptr<ParsedExpression> &expr_ptr, idx_t depth, bool root_expression) {
16
+ auto &expr = *expr_ptr;
17
17
  switch (expr.GetExpressionClass()) {
18
18
  case ExpressionClass::WINDOW:
19
19
  return BindResult("window functions are not allowed in check constraints");
@@ -39,7 +39,7 @@ BindResult ExpressionBinder::BindQualifiedColumnName(ColumnRefExpression &colref
39
39
  for (idx_t i = struct_start; i + 1 < colref.column_names.size(); i++) {
40
40
  result = CreateStructExtract(std::move(result), colref.column_names[i]);
41
41
  }
42
- return BindExpression(&result, 0);
42
+ return BindExpression(result, 0);
43
43
  }
44
44
 
45
45
  BindResult CheckBinder::BindCheckColumn(ColumnRefExpression &colref) {
@@ -66,7 +66,7 @@ BindResult CheckBinder::BindCheckColumn(ColumnRefExpression &colref) {
66
66
  auto &col = columns.GetColumn(colref.column_names[0]);
67
67
  if (col.Generated()) {
68
68
  auto bound_expression = col.GeneratedExpression().Copy();
69
- return BindExpression(&bound_expression, 0, false);
69
+ return BindExpression(bound_expression, 0, false);
70
70
  }
71
71
  bound_columns.insert(col.Physical());
72
72
  D_ASSERT(col.StorageOid() != DConstants::INVALID_INDEX);
@@ -33,7 +33,7 @@ BindResult ColumnAliasBinder::BindAlias(ExpressionBinder &enclosing_binder, Colu
33
33
 
34
34
  // since the alias has been found, pass a depth of 0. See Issue 4978 (#16)
35
35
  // ColumnAliasBinders are only in Having, Qualify and Where Binders
36
- auto result = enclosing_binder.BindExpression(&expression, 0, root_expression);
36
+ auto result = enclosing_binder.BindExpression(expression, 0, root_expression);
37
37
  visited_select_indexes.erase(alias_entry->second);
38
38
  return result;
39
39
  }
@@ -7,15 +7,15 @@ ConstantBinder::ConstantBinder(Binder &binder, ClientContext &context, string cl
7
7
  : ExpressionBinder(binder, context), clause(std::move(clause)) {
8
8
  }
9
9
 
10
- BindResult ConstantBinder::BindExpression(unique_ptr<ParsedExpression> *expr_ptr, idx_t depth, bool root_expression) {
11
- auto &expr = **expr_ptr;
10
+ BindResult ConstantBinder::BindExpression(unique_ptr<ParsedExpression> &expr_ptr, idx_t depth, bool root_expression) {
11
+ auto &expr = *expr_ptr;
12
12
  switch (expr.GetExpressionClass()) {
13
13
  case ExpressionClass::COLUMN_REF: {
14
14
  auto &colref = expr.Cast<ColumnRefExpression>();
15
15
  if (!colref.IsQualified()) {
16
16
  auto value_function = GetSQLValueFunction(colref.GetColumnName());
17
17
  if (value_function) {
18
- *expr_ptr = std::move(value_function);
18
+ expr_ptr = std::move(value_function);
19
19
  return BindExpression(expr_ptr, depth, root_expression);
20
20
  }
21
21
  }
@@ -14,8 +14,8 @@ GroupBinder::GroupBinder(Binder &binder, ClientContext &context, SelectNode &nod
14
14
  group_index(group_index) {
15
15
  }
16
16
 
17
- BindResult GroupBinder::BindExpression(unique_ptr<ParsedExpression> *expr_ptr, idx_t depth, bool root_expression) {
18
- auto &expr = **expr_ptr;
17
+ BindResult GroupBinder::BindExpression(unique_ptr<ParsedExpression> &expr_ptr, idx_t depth, bool root_expression) {
18
+ auto &expr = *expr_ptr;
19
19
  if (root_expression && depth == 0) {
20
20
  switch (expr.expression_class) {
21
21
  case ExpressionClass::COLUMN_REF:
@@ -15,8 +15,8 @@ HavingBinder::HavingBinder(Binder &binder, ClientContext &context, BoundSelectNo
15
15
  target_type = LogicalType(LogicalTypeId::BOOLEAN);
16
16
  }
17
17
 
18
- BindResult HavingBinder::BindColumnRef(unique_ptr<ParsedExpression> *expr_ptr, idx_t depth, bool root_expression) {
19
- auto &expr = (ColumnRefExpression &)**expr_ptr;
18
+ BindResult HavingBinder::BindColumnRef(unique_ptr<ParsedExpression> &expr_ptr, idx_t depth, bool root_expression) {
19
+ auto &expr = expr_ptr->Cast<ColumnRefExpression>();
20
20
  auto alias_result = column_alias_binder.BindAlias(*this, expr, depth, root_expression);
21
21
  if (!alias_result.HasError()) {
22
22
  if (depth > 0) {
@@ -41,8 +41,8 @@ BindResult HavingBinder::BindColumnRef(unique_ptr<ParsedExpression> *expr_ptr, i
41
41
  "column %s must appear in the GROUP BY clause or be used in an aggregate function", expr.ToString()));
42
42
  }
43
43
 
44
- BindResult HavingBinder::BindExpression(unique_ptr<ParsedExpression> *expr_ptr, idx_t depth, bool root_expression) {
45
- auto &expr = **expr_ptr;
44
+ BindResult HavingBinder::BindExpression(unique_ptr<ParsedExpression> &expr_ptr, idx_t depth, bool root_expression) {
45
+ auto &expr = *expr_ptr;
46
46
  // check if the expression binds to one of the groups
47
47
  auto group_index = TryBindGroup(expr, depth);
48
48
  if (group_index != DConstants::INVALID_INDEX) {
@@ -12,8 +12,8 @@ IndexBinder::IndexBinder(Binder &binder, ClientContext &context, optional_ptr<Ta
12
12
  : ExpressionBinder(binder, context), table(table), info(info) {
13
13
  }
14
14
 
15
- BindResult IndexBinder::BindExpression(unique_ptr<ParsedExpression> *expr_ptr, idx_t depth, bool root_expression) {
16
- auto &expr = **expr_ptr;
15
+ BindResult IndexBinder::BindExpression(unique_ptr<ParsedExpression> &expr_ptr, idx_t depth, bool root_expression) {
16
+ auto &expr = *expr_ptr;
17
17
  switch (expr.expression_class) {
18
18
  case ExpressionClass::WINDOW:
19
19
  return BindResult("window functions are not allowed in index expressions");
@@ -7,8 +7,8 @@ namespace duckdb {
7
7
  InsertBinder::InsertBinder(Binder &binder, ClientContext &context) : ExpressionBinder(binder, context) {
8
8
  }
9
9
 
10
- BindResult InsertBinder::BindExpression(unique_ptr<ParsedExpression> *expr_ptr, idx_t depth, bool root_expression) {
11
- auto &expr = **expr_ptr;
10
+ BindResult InsertBinder::BindExpression(unique_ptr<ParsedExpression> &expr_ptr, idx_t depth, bool root_expression) {
11
+ auto &expr = *expr_ptr;
12
12
  switch (expr.GetExpressionClass()) {
13
13
  case ExpressionClass::DEFAULT:
14
14
  return BindResult("DEFAULT is not allowed here!");
@@ -23,7 +23,7 @@ void LateralBinder::ExtractCorrelatedColumns(Expression &expr) {
23
23
  ExpressionIterator::EnumerateChildren(expr, [&](Expression &child) { ExtractCorrelatedColumns(child); });
24
24
  }
25
25
 
26
- BindResult LateralBinder::BindColumnRef(unique_ptr<ParsedExpression> *expr_ptr, idx_t depth, bool root_expression) {
26
+ BindResult LateralBinder::BindColumnRef(unique_ptr<ParsedExpression> &expr_ptr, idx_t depth, bool root_expression) {
27
27
  if (depth == 0) {
28
28
  throw InternalException("Lateral binder can only bind correlated columns");
29
29
  }
@@ -66,8 +66,8 @@ vector<CorrelatedColumnInfo> LateralBinder::ExtractCorrelatedColumns(Binder &bin
66
66
  return all_correlated_columns;
67
67
  }
68
68
 
69
- BindResult LateralBinder::BindExpression(unique_ptr<ParsedExpression> *expr_ptr, idx_t depth, bool root_expression) {
70
- auto &expr = **expr_ptr;
69
+ BindResult LateralBinder::BindExpression(unique_ptr<ParsedExpression> &expr_ptr, idx_t depth, bool root_expression) {
70
+ auto &expr = *expr_ptr;
71
71
  switch (expr.GetExpressionClass()) {
72
72
  case ExpressionClass::DEFAULT:
73
73
  return BindResult("LATERAL join cannot contain DEFAULT clause");
@@ -15,8 +15,8 @@ QualifyBinder::QualifyBinder(Binder &binder, ClientContext &context, BoundSelect
15
15
  target_type = LogicalType(LogicalTypeId::BOOLEAN);
16
16
  }
17
17
 
18
- BindResult QualifyBinder::BindColumnRef(unique_ptr<ParsedExpression> *expr_ptr, idx_t depth, bool root_expression) {
19
- auto &expr = (ColumnRefExpression &)**expr_ptr;
18
+ BindResult QualifyBinder::BindColumnRef(unique_ptr<ParsedExpression> &expr_ptr, idx_t depth, bool root_expression) {
19
+ auto &expr = expr_ptr->Cast<ColumnRefExpression>();
20
20
  auto result = duckdb::BaseSelectBinder::BindExpression(expr_ptr, depth);
21
21
  if (!result.HasError()) {
22
22
  return result;
@@ -31,8 +31,8 @@ BindResult QualifyBinder::BindColumnRef(unique_ptr<ParsedExpression> *expr_ptr,
31
31
  expr.ToString()));
32
32
  }
33
33
 
34
- BindResult QualifyBinder::BindExpression(unique_ptr<ParsedExpression> *expr_ptr, idx_t depth, bool root_expression) {
35
- auto &expr = **expr_ptr;
34
+ BindResult QualifyBinder::BindExpression(unique_ptr<ParsedExpression> &expr_ptr, idx_t depth, bool root_expression) {
35
+ auto &expr = *expr_ptr;
36
36
  // check if the expression binds to one of the groups
37
37
  auto group_index = TryBindGroup(expr, depth);
38
38
  if (group_index != DConstants::INVALID_INDEX) {
@@ -6,8 +6,8 @@ RelationBinder::RelationBinder(Binder &binder, ClientContext &context, string op
6
6
  : ExpressionBinder(binder, context), op(std::move(op)) {
7
7
  }
8
8
 
9
- BindResult RelationBinder::BindExpression(unique_ptr<ParsedExpression> *expr_ptr, idx_t depth, bool root_expression) {
10
- auto &expr = **expr_ptr;
9
+ BindResult RelationBinder::BindExpression(unique_ptr<ParsedExpression> &expr_ptr, idx_t depth, bool root_expression) {
10
+ auto &expr = *expr_ptr;
11
11
  switch (expr.expression_class) {
12
12
  case ExpressionClass::AGGREGATE:
13
13
  return BindResult("aggregate functions are not allowed in " + op);
@@ -7,8 +7,8 @@ namespace duckdb {
7
7
  ReturningBinder::ReturningBinder(Binder &binder, ClientContext &context) : ExpressionBinder(binder, context) {
8
8
  }
9
9
 
10
- BindResult ReturningBinder::BindExpression(unique_ptr<ParsedExpression> *expr_ptr, idx_t depth, bool root_expression) {
11
- auto &expr = **expr_ptr;
10
+ BindResult ReturningBinder::BindExpression(unique_ptr<ParsedExpression> &expr_ptr, idx_t depth, bool root_expression) {
11
+ auto &expr = *expr_ptr;
12
12
  switch (expr.GetExpressionClass()) {
13
13
  case ExpressionClass::SUBQUERY:
14
14
  return BindResult("SUBQUERY is not supported in returning statements");
@@ -22,16 +22,16 @@ BindResult TableFunctionBinder::BindColumnReference(ColumnRefExpression &expr, i
22
22
  }
23
23
  auto value_function = ExpressionBinder::GetSQLValueFunction(expr.GetColumnName());
24
24
  if (value_function) {
25
- return BindExpression(&value_function, depth, root_expression);
25
+ return BindExpression(value_function, depth, root_expression);
26
26
  }
27
27
 
28
28
  auto result_name = StringUtil::Join(expr.column_names, ".");
29
29
  return BindResult(make_uniq<BoundConstantExpression>(Value(result_name)));
30
30
  }
31
31
 
32
- BindResult TableFunctionBinder::BindExpression(unique_ptr<ParsedExpression> *expr_ptr, idx_t depth,
32
+ BindResult TableFunctionBinder::BindExpression(unique_ptr<ParsedExpression> &expr_ptr, idx_t depth,
33
33
  bool root_expression) {
34
- auto &expr = **expr_ptr;
34
+ auto &expr = *expr_ptr;
35
35
  switch (expr.GetExpressionClass()) {
36
36
  case ExpressionClass::COLUMN_REF:
37
37
  return BindColumnReference(expr.Cast<ColumnRefExpression>(), depth, root_expression);
@@ -5,8 +5,8 @@ namespace duckdb {
5
5
  UpdateBinder::UpdateBinder(Binder &binder, ClientContext &context) : ExpressionBinder(binder, context) {
6
6
  }
7
7
 
8
- BindResult UpdateBinder::BindExpression(unique_ptr<ParsedExpression> *expr_ptr, idx_t depth, bool root_expression) {
9
- auto &expr = **expr_ptr;
8
+ BindResult UpdateBinder::BindExpression(unique_ptr<ParsedExpression> &expr_ptr, idx_t depth, bool root_expression) {
9
+ auto &expr = *expr_ptr;
10
10
  switch (expr.expression_class) {
11
11
  case ExpressionClass::WINDOW:
12
12
  return BindResult("window functions are not allowed in UPDATE");
@@ -9,8 +9,8 @@ WhereBinder::WhereBinder(Binder &binder, ClientContext &context, optional_ptr<Co
9
9
  target_type = LogicalType(LogicalTypeId::BOOLEAN);
10
10
  }
11
11
 
12
- BindResult WhereBinder::BindColumnRef(unique_ptr<ParsedExpression> *expr_ptr, idx_t depth, bool root_expression) {
13
- auto &expr = (*expr_ptr)->Cast<ColumnRefExpression>();
12
+ BindResult WhereBinder::BindColumnRef(unique_ptr<ParsedExpression> &expr_ptr, idx_t depth, bool root_expression) {
13
+ auto &expr = expr_ptr->Cast<ColumnRefExpression>();
14
14
  auto result = ExpressionBinder::BindExpression(expr_ptr, depth);
15
15
  if (!result.HasError() || !column_alias_binder) {
16
16
  return result;
@@ -25,8 +25,8 @@ BindResult WhereBinder::BindColumnRef(unique_ptr<ParsedExpression> *expr_ptr, id
25
25
  return result;
26
26
  }
27
27
 
28
- BindResult WhereBinder::BindExpression(unique_ptr<ParsedExpression> *expr_ptr, idx_t depth, bool root_expression) {
29
- auto &expr = **expr_ptr;
28
+ BindResult WhereBinder::BindExpression(unique_ptr<ParsedExpression> &expr_ptr, idx_t depth, bool root_expression) {
29
+ auto &expr = *expr_ptr;
30
30
  switch (expr.GetExpressionClass()) {
31
31
  case ExpressionClass::DEFAULT:
32
32
  return BindResult("WHERE clause cannot contain DEFAULT clause");
@@ -28,8 +28,8 @@ ExpressionBinder::~ExpressionBinder() {
28
28
  }
29
29
  }
30
30
 
31
- BindResult ExpressionBinder::BindExpression(unique_ptr<ParsedExpression> *expr, idx_t depth, bool root_expression) {
32
- auto &expr_ref = **expr;
31
+ BindResult ExpressionBinder::BindExpression(unique_ptr<ParsedExpression> &expr, idx_t depth, bool root_expression) {
32
+ auto &expr_ref = *expr;
33
33
  switch (expr_ref.expression_class) {
34
34
  case ExpressionClass::BETWEEN:
35
35
  return BindExpression(expr_ref.Cast<BetweenExpression>(), depth);
@@ -84,7 +84,7 @@ bool ExpressionBinder::BindCorrelatedColumns(unique_ptr<ParsedExpression> &expr)
84
84
  while (!active_binders.empty()) {
85
85
  auto &next_binder = active_binders.back().get();
86
86
  ExpressionBinder::QualifyColumnNames(next_binder.binder, expr);
87
- auto bind_result = next_binder.Bind(&expr, depth);
87
+ auto bind_result = next_binder.Bind(expr, depth);
88
88
  if (bind_result.empty()) {
89
89
  success = true;
90
90
  break;
@@ -98,7 +98,7 @@ bool ExpressionBinder::BindCorrelatedColumns(unique_ptr<ParsedExpression> &expr)
98
98
 
99
99
  void ExpressionBinder::BindChild(unique_ptr<ParsedExpression> &expr, idx_t depth, string &error) {
100
100
  if (expr) {
101
- string bind_error = Bind(&expr, depth);
101
+ string bind_error = Bind(expr, depth);
102
102
  if (error.empty()) {
103
103
  error = bind_error;
104
104
  }
@@ -184,10 +184,10 @@ LogicalType ExpressionBinder::ExchangeNullType(const LogicalType &type) {
184
184
  return ExchangeType(type, LogicalTypeId::SQLNULL, LogicalType::INTEGER);
185
185
  }
186
186
 
187
- unique_ptr<Expression> ExpressionBinder::Bind(unique_ptr<ParsedExpression> &expr, LogicalType *result_type,
187
+ unique_ptr<Expression> ExpressionBinder::Bind(unique_ptr<ParsedExpression> &expr, optional_ptr<LogicalType> result_type,
188
188
  bool root_expression) {
189
189
  // bind the main expression
190
- auto error_msg = Bind(&expr, 0, root_expression);
190
+ auto error_msg = Bind(expr, 0, root_expression);
191
191
  if (!error_msg.empty()) {
192
192
  // failed to bind: try to bind correlated columns in the expression (if any)
193
193
  bool success = BindCorrelatedColumns(expr);
@@ -207,8 +207,8 @@ unique_ptr<Expression> ExpressionBinder::Bind(unique_ptr<ParsedExpression> &expr
207
207
  // SQL NULL type is only used internally in the binder
208
208
  // cast to INTEGER if we encounter it outside of the binder
209
209
  if (ContainsNullType(result->return_type)) {
210
- auto result_type = ExchangeNullType(result->return_type);
211
- result = BoundCastExpression::AddCastToType(context, std::move(result), result_type);
210
+ auto exchanged_type = ExchangeNullType(result->return_type);
211
+ result = BoundCastExpression::AddCastToType(context, std::move(result), exchanged_type);
212
212
  }
213
213
  }
214
214
  if (result->return_type.id() == LogicalTypeId::UNKNOWN) {
@@ -221,9 +221,9 @@ unique_ptr<Expression> ExpressionBinder::Bind(unique_ptr<ParsedExpression> &expr
221
221
  return result;
222
222
  }
223
223
 
224
- string ExpressionBinder::Bind(unique_ptr<ParsedExpression> *expr, idx_t depth, bool root_expression) {
224
+ string ExpressionBinder::Bind(unique_ptr<ParsedExpression> &expr, idx_t depth, bool root_expression) {
225
225
  // bind the node, but only if it has not been bound yet
226
- auto &expression = **expr;
226
+ auto &expression = *expr;
227
227
  auto alias = expression.alias;
228
228
  if (expression.GetExpressionClass() == ExpressionClass::BOUND_EXPRESSION) {
229
229
  // already bound, don't bind it again
@@ -235,8 +235,8 @@ string ExpressionBinder::Bind(unique_ptr<ParsedExpression> *expr, idx_t depth, b
235
235
  return result.error;
236
236
  }
237
237
  // successfully bound: replace the node with a BoundExpression
238
- *expr = make_uniq<BoundExpression>(std::move(result.expression));
239
- auto &be = (*expr)->Cast<BoundExpression>();
238
+ expr = make_uniq<BoundExpression>(std::move(result.expression));
239
+ auto &be = expr->Cast<BoundExpression>();
240
240
  be.alias = alias;
241
241
  if (!alias.empty()) {
242
242
  be.expr->alias = alias;
@@ -33,7 +33,6 @@ void BlockManager::ClearMetaBlockHandles() {
33
33
  }
34
34
 
35
35
  shared_ptr<BlockHandle> BlockManager::ConvertToPersistent(block_id_t block_id, shared_ptr<BlockHandle> old_block) {
36
-
37
36
  // pin the old block to ensure we have it loaded in memory
38
37
  auto old_handle = buffer_manager.Pin(old_block);
39
38
  D_ASSERT(old_block->state == BlockState::BLOCK_LOADED);
@@ -50,7 +49,7 @@ shared_ptr<BlockHandle> BlockManager::ConvertToPersistent(block_id_t block_id, s
50
49
 
51
50
  // move the data from the old block into data for the new block
52
51
  new_block->state = BlockState::BLOCK_LOADED;
53
- new_block->buffer = CreateBlock(block_id, old_block->buffer.get());
52
+ new_block->buffer = ConvertBlock(block_id, *old_block->buffer);
54
53
  new_block->memory_usage = old_block->memory_usage;
55
54
  new_block->memory_charge = std::move(old_block->memory_charge);
56
55
 
@@ -33,7 +33,7 @@ void WriteOverflowStringsToDisk::WriteString(string_t string, block_id_t &result
33
33
  size_t compressed_size = 0;
34
34
  compressed_size = s.MaxCompressedLength(uncompressed_size);
35
35
  auto compressed_buf = unique_ptr<data_t[]>(new data_t[compressed_size]);
36
- s.Compress((const char *)string.GetDataUnsafe(), uncompressed_size, (char *)compressed_buf.get(), &compressed_size);
36
+ s.Compress((const char *)string.GetData(), uncompressed_size, (char *)compressed_buf.get(), &compressed_size);
37
37
  string_t compressed_string((const char *)compressed_buf.get(), compressed_size);
38
38
 
39
39
  // store sizes
@@ -43,7 +43,7 @@ void WriteOverflowStringsToDisk::WriteString(string_t string, block_id_t &result
43
43
 
44
44
  // now write the remainder of the string
45
45
  offset += 2 * sizeof(uint32_t);
46
- auto strptr = compressed_string.GetDataUnsafe();
46
+ auto strptr = compressed_string.GetData();
47
47
  uint32_t remaining = compressed_size;
48
48
  while (remaining > 0) {
49
49
  uint32_t to_write = MinValue<uint32_t>(remaining, STRING_SPACE - offset);