duckdb 0.7.2-dev2820.0 → 0.7.2-dev2995.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 (254) hide show
  1. package/binding.gyp +1 -0
  2. package/package.json +1 -1
  3. package/src/duckdb/extension/icu/icu-datepart.cpp +55 -1
  4. package/src/duckdb/extension/parquet/parquet-extension.cpp +5 -4
  5. package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +18 -7
  6. package/src/duckdb/src/catalog/default/default_functions.cpp +2 -0
  7. package/src/duckdb/src/common/arrow/arrow_appender.cpp +3 -3
  8. package/src/duckdb/src/common/arrow/arrow_converter.cpp +2 -2
  9. package/src/duckdb/src/common/local_file_system.cpp +1 -3
  10. package/src/duckdb/src/common/multi_file_reader.cpp +11 -8
  11. package/src/duckdb/src/common/sort/partition_state.cpp +1 -1
  12. package/src/duckdb/src/common/string_util.cpp +6 -1
  13. package/src/duckdb/src/core_functions/function_list.cpp +2 -0
  14. package/src/duckdb/src/core_functions/scalar/string/format_bytes.cpp +29 -0
  15. package/src/duckdb/src/execution/index/art/art.cpp +5 -1
  16. package/src/duckdb/src/execution/operator/aggregate/physical_hash_aggregate.cpp +62 -43
  17. package/src/duckdb/src/execution/operator/aggregate/physical_perfecthash_aggregate.cpp +17 -11
  18. package/src/duckdb/src/execution/operator/aggregate/physical_ungrouped_aggregate.cpp +32 -39
  19. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +10 -9
  20. package/src/duckdb/src/execution/operator/helper/physical_batch_collector.cpp +4 -4
  21. package/src/duckdb/src/execution/operator/helper/physical_explain_analyze.cpp +6 -21
  22. package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +13 -13
  23. package/src/duckdb/src/execution/operator/helper/physical_limit_percent.cpp +15 -14
  24. package/src/duckdb/src/execution/operator/helper/physical_load.cpp +3 -2
  25. package/src/duckdb/src/execution/operator/helper/physical_materialized_collector.cpp +4 -4
  26. package/src/duckdb/src/execution/operator/helper/physical_pragma.cpp +4 -2
  27. package/src/duckdb/src/execution/operator/helper/physical_prepare.cpp +4 -2
  28. package/src/duckdb/src/execution/operator/helper/physical_reservoir_sample.cpp +10 -8
  29. package/src/duckdb/src/execution/operator/helper/physical_reset.cpp +4 -3
  30. package/src/duckdb/src/execution/operator/helper/physical_set.cpp +7 -6
  31. package/src/duckdb/src/execution/operator/helper/physical_transaction.cpp +4 -2
  32. package/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp +8 -8
  33. package/src/duckdb/src/execution/operator/join/physical_asof_join.cpp +17 -16
  34. package/src/duckdb/src/execution/operator/join/physical_blockwise_nl_join.cpp +10 -8
  35. package/src/duckdb/src/execution/operator/join/physical_cross_product.cpp +3 -4
  36. package/src/duckdb/src/execution/operator/join/physical_delim_join.cpp +5 -5
  37. package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +16 -15
  38. package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +13 -12
  39. package/src/duckdb/src/execution/operator/join/physical_nested_loop_join.cpp +12 -10
  40. package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +13 -11
  41. package/src/duckdb/src/execution/operator/join/physical_positional_join.cpp +8 -6
  42. package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +1 -1
  43. package/src/duckdb/src/execution/operator/order/physical_order.cpp +13 -13
  44. package/src/duckdb/src/execution/operator/order/physical_top_n.cpp +8 -8
  45. package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +160 -145
  46. package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +10 -25
  47. package/src/duckdb/src/execution/operator/persistent/physical_delete.cpp +14 -19
  48. package/src/duckdb/src/execution/operator/persistent/physical_export.cpp +7 -6
  49. package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +18 -30
  50. package/src/duckdb/src/execution/operator/persistent/physical_update.cpp +14 -18
  51. package/src/duckdb/src/execution/operator/scan/physical_column_data_scan.cpp +6 -4
  52. package/src/duckdb/src/execution/operator/scan/physical_dummy_scan.cpp +4 -19
  53. package/src/duckdb/src/execution/operator/scan/physical_empty_result.cpp +3 -2
  54. package/src/duckdb/src/execution/operator/scan/physical_positional_scan.cpp +14 -5
  55. package/src/duckdb/src/execution/operator/scan/physical_table_scan.cpp +6 -4
  56. package/src/duckdb/src/execution/operator/schema/physical_alter.cpp +3 -19
  57. package/src/duckdb/src/execution/operator/schema/physical_attach.cpp +4 -18
  58. package/src/duckdb/src/execution/operator/schema/physical_create_function.cpp +4 -19
  59. package/src/duckdb/src/execution/operator/schema/physical_create_index.cpp +8 -9
  60. package/src/duckdb/src/execution/operator/schema/physical_create_schema.cpp +4 -19
  61. package/src/duckdb/src/execution/operator/schema/physical_create_sequence.cpp +4 -19
  62. package/src/duckdb/src/execution/operator/schema/physical_create_table.cpp +4 -19
  63. package/src/duckdb/src/execution/operator/schema/physical_create_type.cpp +20 -28
  64. package/src/duckdb/src/execution/operator/schema/physical_create_view.cpp +4 -19
  65. package/src/duckdb/src/execution/operator/schema/physical_detach.cpp +4 -19
  66. package/src/duckdb/src/execution/operator/schema/physical_drop.cpp +3 -19
  67. package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +9 -8
  68. package/src/duckdb/src/execution/operator/set/physical_union.cpp +1 -1
  69. package/src/duckdb/src/execution/physical_operator.cpp +11 -5
  70. package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +16 -16
  71. package/src/duckdb/src/function/table/arrow_conversion.cpp +3 -3
  72. package/src/duckdb/src/function/table/read_csv.cpp +7 -4
  73. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  74. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_catalog_entry.hpp +7 -1
  75. package/src/duckdb/src/include/duckdb/common/enums/operator_result_type.hpp +16 -4
  76. package/src/duckdb/src/include/duckdb/common/multi_file_reader.hpp +5 -4
  77. package/src/duckdb/src/include/duckdb/common/optional_idx.hpp +45 -0
  78. package/src/duckdb/src/include/duckdb/common/set.hpp +2 -1
  79. package/src/duckdb/src/include/duckdb/core_functions/scalar/string_functions.hpp +15 -0
  80. package/src/duckdb/src/include/duckdb/execution/executor.hpp +10 -1
  81. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_hash_aggregate.hpp +5 -8
  82. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_perfecthash_aggregate.hpp +2 -4
  83. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_ungrouped_aggregate.hpp +3 -7
  84. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_window.hpp +2 -4
  85. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_batch_collector.hpp +1 -2
  86. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_explain_analyze.hpp +2 -5
  87. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_limit.hpp +2 -4
  88. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_limit_percent.hpp +2 -4
  89. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_load.hpp +1 -2
  90. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_materialized_collector.hpp +1 -2
  91. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_pragma.hpp +1 -2
  92. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_prepare.hpp +1 -2
  93. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_reservoir_sample.hpp +2 -4
  94. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_reset.hpp +1 -2
  95. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_set.hpp +1 -2
  96. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_transaction.hpp +1 -2
  97. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_vacuum.hpp +2 -4
  98. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_asof_join.hpp +2 -4
  99. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_blockwise_nl_join.hpp +2 -4
  100. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_cross_product.hpp +1 -2
  101. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_delim_join.hpp +1 -2
  102. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_hash_join.hpp +2 -4
  103. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_iejoin.hpp +2 -4
  104. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_nested_loop_join.hpp +2 -4
  105. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_piecewise_merge_join.hpp +2 -4
  106. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_positional_join.hpp +2 -4
  107. package/src/duckdb/src/include/duckdb/execution/operator/order/physical_order.hpp +2 -4
  108. package/src/duckdb/src/include/duckdb/execution/operator/order/physical_top_n.hpp +2 -4
  109. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_batch_insert.hpp +3 -5
  110. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_copy_to_file.hpp +2 -5
  111. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_delete.hpp +2 -4
  112. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_export.hpp +2 -4
  113. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_insert.hpp +2 -4
  114. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_update.hpp +2 -4
  115. package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_column_data_scan.hpp +1 -2
  116. package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_dummy_scan.hpp +1 -3
  117. package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_empty_result.hpp +1 -2
  118. package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_positional_scan.hpp +1 -2
  119. package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_table_scan.hpp +1 -2
  120. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_alter.hpp +1 -3
  121. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_attach.hpp +1 -3
  122. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_function.hpp +1 -3
  123. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_index.hpp +2 -4
  124. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_schema.hpp +1 -3
  125. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_sequence.hpp +1 -3
  126. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_table.hpp +1 -3
  127. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_type.hpp +6 -5
  128. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_view.hpp +1 -3
  129. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_detach.hpp +1 -3
  130. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_drop.hpp +1 -3
  131. package/src/duckdb/src/include/duckdb/execution/operator/set/physical_recursive_cte.hpp +2 -4
  132. package/src/duckdb/src/include/duckdb/execution/physical_operator.hpp +7 -4
  133. package/src/duckdb/src/include/duckdb/execution/physical_operator_states.hpp +26 -6
  134. package/src/duckdb/src/include/duckdb/execution/radix_partitioned_hashtable.hpp +5 -5
  135. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +2 -1
  136. package/src/duckdb/src/include/duckdb/function/table_function.hpp +0 -1
  137. package/src/duckdb/src/include/duckdb/main/client_config.hpp +2 -0
  138. package/src/duckdb/src/include/duckdb/main/config.hpp +2 -0
  139. package/src/duckdb/src/include/duckdb/main/database.hpp +1 -0
  140. package/src/duckdb/src/include/duckdb/main/database_manager.hpp +3 -0
  141. package/src/duckdb/src/include/duckdb/main/extension_helper.hpp +0 -2
  142. package/src/duckdb/src/include/duckdb/parallel/event.hpp +1 -1
  143. package/src/duckdb/src/include/duckdb/parallel/interrupt.hpp +63 -0
  144. package/src/duckdb/src/include/duckdb/parallel/pipeline.hpp +16 -3
  145. package/src/duckdb/src/include/duckdb/parallel/pipeline_executor.hpp +51 -7
  146. package/src/duckdb/src/include/duckdb/parallel/task.hpp +21 -2
  147. package/src/duckdb/src/include/duckdb/parallel/task_counter.hpp +2 -2
  148. package/src/duckdb/src/include/duckdb/parallel/task_scheduler.hpp +2 -2
  149. package/src/duckdb/src/include/duckdb/parser/tableref/pivotref.hpp +3 -0
  150. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +5 -1
  151. package/src/duckdb/src/include/duckdb/planner/column_binding.hpp +6 -0
  152. package/src/duckdb/src/include/duckdb/planner/expression/bound_columnref_expression.hpp +1 -0
  153. package/src/duckdb/src/include/duckdb/planner/operator/logical_aggregate.hpp +1 -0
  154. package/src/duckdb/src/include/duckdb/planner/operator/logical_column_data_get.hpp +1 -0
  155. package/src/duckdb/src/include/duckdb/planner/operator/logical_cteref.hpp +1 -0
  156. package/src/duckdb/src/include/duckdb/planner/operator/logical_delete.hpp +1 -0
  157. package/src/duckdb/src/include/duckdb/planner/operator/logical_delim_get.hpp +1 -0
  158. package/src/duckdb/src/include/duckdb/planner/operator/logical_dummy_scan.hpp +1 -0
  159. package/src/duckdb/src/include/duckdb/planner/operator/logical_expression_get.hpp +1 -0
  160. package/src/duckdb/src/include/duckdb/planner/operator/logical_insert.hpp +1 -0
  161. package/src/duckdb/src/include/duckdb/planner/operator/logical_pivot.hpp +1 -0
  162. package/src/duckdb/src/include/duckdb/planner/operator/logical_projection.hpp +1 -0
  163. package/src/duckdb/src/include/duckdb/planner/operator/logical_recursive_cte.hpp +1 -0
  164. package/src/duckdb/src/include/duckdb/planner/operator/logical_set_operation.hpp +1 -0
  165. package/src/duckdb/src/include/duckdb/planner/operator/logical_unnest.hpp +1 -0
  166. package/src/duckdb/src/include/duckdb/planner/operator/logical_update.hpp +1 -0
  167. package/src/duckdb/src/include/duckdb/planner/operator/logical_window.hpp +1 -0
  168. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +1 -0
  169. package/src/duckdb/src/include/duckdb/storage/optimistic_data_writer.hpp +46 -0
  170. package/src/duckdb/src/include/duckdb/storage/partial_block_manager.hpp +24 -3
  171. package/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp +46 -1
  172. package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +9 -10
  173. package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +1 -1
  174. package/src/duckdb/src/include/duckdb/storage/table/list_column_data.hpp +2 -2
  175. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +3 -3
  176. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +1 -0
  177. package/src/duckdb/src/include/duckdb/storage/table/segment_base.hpp +1 -1
  178. package/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +22 -0
  179. package/src/duckdb/src/include/duckdb/storage/table/standard_column_data.hpp +3 -3
  180. package/src/duckdb/src/include/duckdb/storage/table/struct_column_data.hpp +2 -2
  181. package/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +0 -2
  182. package/src/duckdb/src/include/duckdb/storage/table/validity_column_data.hpp +1 -2
  183. package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +9 -34
  184. package/src/duckdb/src/include/duckdb/verification/no_operator_caching_verifier.hpp +25 -0
  185. package/src/duckdb/src/include/duckdb/verification/statement_verifier.hpp +5 -0
  186. package/src/duckdb/src/main/attached_database.cpp +5 -3
  187. package/src/duckdb/src/main/client_verify.cpp +4 -0
  188. package/src/duckdb/src/main/config.cpp +4 -0
  189. package/src/duckdb/src/main/database.cpp +45 -48
  190. package/src/duckdb/src/main/extension/extension_load.cpp +32 -49
  191. package/src/duckdb/src/parallel/event.cpp +1 -1
  192. package/src/duckdb/src/parallel/executor.cpp +39 -3
  193. package/src/duckdb/src/parallel/executor_task.cpp +11 -0
  194. package/src/duckdb/src/parallel/interrupt.cpp +57 -0
  195. package/src/duckdb/src/parallel/pipeline.cpp +49 -6
  196. package/src/duckdb/src/parallel/pipeline_executor.cpp +248 -69
  197. package/src/duckdb/src/parallel/pipeline_initialize_event.cpp +1 -1
  198. package/src/duckdb/src/parallel/task_scheduler.cpp +57 -22
  199. package/src/duckdb/src/parser/base_expression.cpp +6 -0
  200. package/src/duckdb/src/parser/transform/statement/transform_create_function.cpp +1 -4
  201. package/src/duckdb/src/parser/transform/statement/transform_create_view.cpp +2 -4
  202. package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +43 -24
  203. package/src/duckdb/src/parser/transform/tableref/transform_pivot.cpp +3 -0
  204. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +17 -28
  205. package/src/duckdb/src/planner/expression/bound_columnref_expression.cpp +17 -3
  206. package/src/duckdb/src/planner/expression/bound_reference_expression.cpp +8 -2
  207. package/src/duckdb/src/planner/operator/logical_aggregate.cpp +13 -1
  208. package/src/duckdb/src/planner/operator/logical_column_data_get.cpp +11 -0
  209. package/src/duckdb/src/planner/operator/logical_cteref.cpp +11 -0
  210. package/src/duckdb/src/planner/operator/logical_delete.cpp +10 -0
  211. package/src/duckdb/src/planner/operator/logical_delim_get.cpp +12 -1
  212. package/src/duckdb/src/planner/operator/logical_dummy_scan.cpp +12 -1
  213. package/src/duckdb/src/planner/operator/logical_expression_get.cpp +12 -1
  214. package/src/duckdb/src/planner/operator/logical_get.cpp +10 -4
  215. package/src/duckdb/src/planner/operator/logical_insert.cpp +12 -1
  216. package/src/duckdb/src/planner/operator/logical_pivot.cpp +11 -0
  217. package/src/duckdb/src/planner/operator/logical_projection.cpp +11 -0
  218. package/src/duckdb/src/planner/operator/logical_recursive_cte.cpp +11 -0
  219. package/src/duckdb/src/planner/operator/logical_set_operation.cpp +11 -0
  220. package/src/duckdb/src/planner/operator/logical_unnest.cpp +12 -1
  221. package/src/duckdb/src/planner/operator/logical_update.cpp +10 -0
  222. package/src/duckdb/src/planner/operator/logical_window.cpp +11 -0
  223. package/src/duckdb/src/storage/checkpoint_manager.cpp +1 -1
  224. package/src/duckdb/src/storage/data_table.cpp +5 -0
  225. package/src/duckdb/src/storage/local_storage.cpp +40 -110
  226. package/src/duckdb/src/storage/optimistic_data_writer.cpp +96 -0
  227. package/src/duckdb/src/storage/partial_block_manager.cpp +73 -9
  228. package/src/duckdb/src/storage/single_file_block_manager.cpp +3 -1
  229. package/src/duckdb/src/storage/standard_buffer_manager.cpp +17 -12
  230. package/src/duckdb/src/storage/statistics/base_statistics.cpp +3 -0
  231. package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +90 -82
  232. package/src/duckdb/src/storage/table/column_data.cpp +19 -45
  233. package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +7 -7
  234. package/src/duckdb/src/storage/table/column_segment.cpp +1 -1
  235. package/src/duckdb/src/storage/table/list_column_data.cpp +6 -11
  236. package/src/duckdb/src/storage/table/row_group.cpp +13 -14
  237. package/src/duckdb/src/storage/table/row_group_collection.cpp +10 -4
  238. package/src/duckdb/src/storage/table/standard_column_data.cpp +6 -10
  239. package/src/duckdb/src/storage/table/struct_column_data.cpp +7 -13
  240. package/src/duckdb/src/storage/table/update_segment.cpp +0 -25
  241. package/src/duckdb/src/storage/table/validity_column_data.cpp +2 -6
  242. package/src/duckdb/src/transaction/commit_state.cpp +4 -4
  243. package/src/duckdb/src/verification/no_operator_caching_verifier.cpp +13 -0
  244. package/src/duckdb/src/verification/statement_verifier.cpp +4 -0
  245. package/src/duckdb/third_party/fmt/format.cc +0 -5
  246. package/src/duckdb/third_party/fmt/include/fmt/core.h +10 -12
  247. package/src/duckdb/third_party/fmt/include/fmt/format-inl.h +2 -33
  248. package/src/duckdb/third_party/fmt/include/fmt/format.h +61 -24
  249. package/src/duckdb/third_party/fmt/include/fmt/printf.h +15 -1
  250. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +1 -0
  251. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +10735 -10674
  252. package/src/duckdb/ub_src_core_functions_scalar_string.cpp +2 -0
  253. package/src/duckdb/ub_src_parallel.cpp +2 -0
  254. package/src/duckdb/ub_src_storage.cpp +2 -0
@@ -90,15 +90,18 @@ TempBufferPoolReservation StandardBufferManager::EvictBlocksOrThrow(idx_t memory
90
90
  ARGS... args) {
91
91
  auto r = buffer_pool.EvictBlocks(memory_delta, buffer_pool.maximum_memory, buffer);
92
92
  if (!r.success) {
93
- throw OutOfMemoryException(args..., InMemoryWarning());
93
+ string extra_text = StringUtil::Format(" (%s/%s used)", StringUtil::BytesToHumanReadableString(GetUsedMemory()),
94
+ StringUtil::BytesToHumanReadableString(GetMaxMemory()));
95
+ extra_text += InMemoryWarning();
96
+ throw OutOfMemoryException(args..., extra_text);
94
97
  }
95
98
  return std::move(r.reservation);
96
99
  }
97
100
 
98
101
  shared_ptr<BlockHandle> StandardBufferManager::RegisterSmallMemory(idx_t block_size) {
99
102
  D_ASSERT(block_size < Storage::BLOCK_SIZE);
100
- auto res = EvictBlocksOrThrow(block_size, nullptr, "could not allocate block of %lld bytes (%lld/%lld used) %s",
101
- block_size, GetUsedMemory(), GetMaxMemory());
103
+ auto res = EvictBlocksOrThrow(block_size, nullptr, "could not allocate block of size %s%s",
104
+ StringUtil::BytesToHumanReadableString(block_size));
102
105
 
103
106
  auto buffer = ConstructManagedBuffer(block_size, nullptr, FileBufferType::TINY_BUFFER);
104
107
 
@@ -112,9 +115,8 @@ shared_ptr<BlockHandle> StandardBufferManager::RegisterMemory(idx_t block_size,
112
115
  auto alloc_size = GetAllocSize(block_size);
113
116
  // first evict blocks until we have enough memory to store this buffer
114
117
  unique_ptr<FileBuffer> reusable_buffer;
115
- auto res =
116
- EvictBlocksOrThrow(alloc_size, &reusable_buffer, "could not allocate block of %lld bytes (%lld/%lld used) %s",
117
- alloc_size, GetUsedMemory(), GetMaxMemory());
118
+ auto res = EvictBlocksOrThrow(alloc_size, &reusable_buffer, "could not allocate block of size %s%s",
119
+ StringUtil::BytesToHumanReadableString(alloc_size));
118
120
 
119
121
  auto buffer = ConstructManagedBuffer(block_size, std::move(reusable_buffer));
120
122
 
@@ -144,8 +146,9 @@ void StandardBufferManager::ReAllocate(shared_ptr<BlockHandle> &handle, idx_t bl
144
146
  return;
145
147
  } else if (memory_delta > 0) {
146
148
  // evict blocks until we have space to resize this block
147
- auto reservation = EvictBlocksOrThrow(memory_delta, nullptr, "failed to resize block from %lld to %lld%s",
148
- handle->memory_usage, req.alloc_size);
149
+ auto reservation = EvictBlocksOrThrow(memory_delta, nullptr, "failed to resize block from %s to %s%s",
150
+ StringUtil::BytesToHumanReadableString(handle->memory_usage),
151
+ StringUtil::BytesToHumanReadableString(req.alloc_size));
149
152
  // EvictBlocks decrements 'current_memory' for us.
150
153
  handle->memory_charge.Merge(std::move(reservation));
151
154
  } else {
@@ -171,8 +174,8 @@ BufferHandle StandardBufferManager::Pin(shared_ptr<BlockHandle> &handle) {
171
174
  }
172
175
  // evict blocks until we have space for the current block
173
176
  unique_ptr<FileBuffer> reusable_buffer;
174
- auto reservation =
175
- EvictBlocksOrThrow(required_memory, &reusable_buffer, "failed to pin block of size %lld%s", required_memory);
177
+ auto reservation = EvictBlocksOrThrow(required_memory, &reusable_buffer, "failed to pin block of size %s%s",
178
+ StringUtil::BytesToHumanReadableString(required_memory));
176
179
  // lock the handle again and repeat the check (in case anybody loaded in the mean time)
177
180
  lock_guard<mutex> lock(handle->lock);
178
181
  // check if the block is already loaded
@@ -732,7 +735,8 @@ void StandardBufferManager::ReserveMemory(idx_t size) {
732
735
  if (size == 0) {
733
736
  return;
734
737
  }
735
- auto reservation = EvictBlocksOrThrow(size, nullptr, "failed to reserve memory data of size %lld%s", size);
738
+ auto reservation = EvictBlocksOrThrow(size, nullptr, "failed to reserve memory data of size %s%s",
739
+ StringUtil::BytesToHumanReadableString(size));
736
740
  reservation.size = 0;
737
741
  }
738
742
 
@@ -748,7 +752,8 @@ void StandardBufferManager::FreeReservedMemory(idx_t size) {
748
752
  //===--------------------------------------------------------------------===//
749
753
  data_ptr_t StandardBufferManager::BufferAllocatorAllocate(PrivateAllocatorData *private_data, idx_t size) {
750
754
  auto &data = (BufferAllocatorData &)*private_data;
751
- auto reservation = data.manager.EvictBlocksOrThrow(size, nullptr, "failed to allocate data of size %lld%s", size);
755
+ auto reservation = data.manager.EvictBlocksOrThrow(size, nullptr, "failed to allocate data of size %s%s",
756
+ StringUtil::BytesToHumanReadableString(size));
752
757
  // We rely on manual tracking of this one. :(
753
758
  reservation.size = 0;
754
759
  return Allocator::Get(data.manager.db).AllocateData(size);
@@ -271,6 +271,7 @@ void BaseStatistics::Serialize(Serializer &serializer) const {
271
271
  FieldWriter writer(serializer);
272
272
  writer.WriteField<bool>(has_null);
273
273
  writer.WriteField<bool>(has_no_null);
274
+ writer.WriteField<idx_t>(distinct_count);
274
275
  Serialize(writer);
275
276
  writer.Finalize();
276
277
  }
@@ -316,9 +317,11 @@ BaseStatistics BaseStatistics::Deserialize(Deserializer &source, LogicalType typ
316
317
  FieldReader reader(source);
317
318
  bool has_null = reader.ReadRequired<bool>();
318
319
  bool has_no_null = reader.ReadRequired<bool>();
320
+ idx_t distinct_count = reader.ReadRequired<idx_t>();
319
321
  auto result = DeserializeType(reader, std::move(type));
320
322
  result.has_null = has_null;
321
323
  result.has_no_null = has_no_null;
324
+ result.distinct_count = distinct_count;
322
325
  reader.Finalize();
323
326
  return result;
324
327
  }
@@ -22,86 +22,103 @@ unique_ptr<BaseStatistics> ColumnCheckpointState::GetStatistics() {
22
22
  return std::move(global_stats);
23
23
  }
24
24
 
25
- struct PartialBlockForCheckpoint : PartialBlock {
26
- struct PartialColumnSegment {
27
- ColumnData *data;
28
- ColumnSegment *segment;
29
- uint32_t offset_in_block;
30
- };
31
-
32
- public:
33
- PartialBlockForCheckpoint(ColumnData *first_data, ColumnSegment *first_segment, BlockManager &block_manager,
34
- PartialBlockState state)
35
- : PartialBlock(state), first_data(first_data), first_segment(first_segment), block_manager(block_manager) {
36
- }
25
+ PartialBlockForCheckpoint::PartialBlockForCheckpoint(ColumnData &data, ColumnSegment &segment,
26
+ BlockManager &block_manager, PartialBlockState state)
27
+ : PartialBlock(state), block_manager(block_manager), block(segment.block) {
28
+ AddSegmentToTail(data, segment, 0);
29
+ }
37
30
 
38
- ~PartialBlockForCheckpoint() override {
39
- D_ASSERT(IsFlushed() || Exception::UncaughtException());
40
- }
31
+ PartialBlockForCheckpoint::~PartialBlockForCheckpoint() {
32
+ D_ASSERT(IsFlushed() || Exception::UncaughtException());
33
+ }
41
34
 
42
- // We will copy all subsequent segment data into the memory corresponding
43
- // to the first segment. Once the block is full (or checkpoint is complete)
44
- // we'll invoke Flush(), which will cause
45
- // the block to get written to storage (via BlockManger::ConvertToPersistent),
46
- // and all segments to have their references updated
47
- // (via ColumnSegment::ConvertToPersistent)
48
- ColumnData *first_data;
49
- ColumnSegment *first_segment;
50
- BlockManager &block_manager;
51
- vector<PartialColumnSegment> tail_segments;
52
-
53
- private:
54
- struct UninitializedRegion {
55
- idx_t start;
56
- idx_t end;
57
- };
58
- vector<UninitializedRegion> uninitialized_regions;
59
-
60
- public:
61
- bool IsFlushed() {
62
- // first_segment is zeroed on Flush
63
- return !first_segment;
64
- }
35
+ bool PartialBlockForCheckpoint::IsFlushed() {
36
+ // segments are cleared on Flush
37
+ return segments.empty();
38
+ }
65
39
 
66
- void AddUninitializedRegion(idx_t start, idx_t end) override {
67
- uninitialized_regions.push_back({start, end});
68
- }
40
+ void PartialBlockForCheckpoint::AddUninitializedRegion(idx_t start, idx_t end) {
41
+ uninitialized_regions.push_back({start, end});
42
+ }
69
43
 
70
- void Flush(idx_t free_space_left) override {
71
- // At this point, we've already copied all data from tail_segments
72
- // into the page owned by first_segment. We flush all segment data to
73
- // disk with the following call.
74
- if (free_space_left > 0 || !uninitialized_regions.empty()) {
75
- auto handle = block_manager.buffer_manager.Pin(first_segment->block);
76
- // memset any uninitialized regions
77
- for (auto &uninitialized : uninitialized_regions) {
78
- memset(handle.Ptr() + uninitialized.start, 0, uninitialized.end - uninitialized.start);
79
- }
80
- // memset any free space at the end of the block to 0 prior to writing to disk
81
- memset(handle.Ptr() + Storage::BLOCK_SIZE - free_space_left, 0, free_space_left);
44
+ void PartialBlockForCheckpoint::Flush(idx_t free_space_left) {
45
+ if (IsFlushed()) {
46
+ throw InternalException("Flush called on partial block that was already flushed");
47
+ }
48
+ // if we have any free space or uninitialized regions we need to zero-initialize them
49
+ if (free_space_left > 0 || !uninitialized_regions.empty()) {
50
+ auto handle = block_manager.buffer_manager.Pin(block);
51
+ // memset any uninitialized regions
52
+ for (auto &uninitialized : uninitialized_regions) {
53
+ memset(handle.Ptr() + uninitialized.start, 0, uninitialized.end - uninitialized.start);
82
54
  }
83
- first_data->IncrementVersion();
84
- first_segment->ConvertToPersistent(&block_manager, state.block_id);
85
- // Now that the page is persistent, update tail_segments to point to the
86
- // newly persistent block.
87
- for (auto e : tail_segments) {
88
- e.data->IncrementVersion();
89
- e.segment->MarkAsPersistent(first_segment->block, e.offset_in_block);
55
+ // memset any free space at the end of the block to 0 prior to writing to disk
56
+ memset(handle.Ptr() + Storage::BLOCK_SIZE - free_space_left, 0, free_space_left);
57
+ }
58
+ // At this point, we've already copied all data from tail_segments
59
+ // into the page owned by first_segment. We flush all segment data to
60
+ // disk with the following call.
61
+ // persist the first segment to disk and point the remaining segments to the same block
62
+ bool fetch_new_block = state.block_id == INVALID_BLOCK;
63
+ if (fetch_new_block) {
64
+ state.block_id = block_manager.GetFreeBlockId();
65
+ }
66
+ for (idx_t i = 0; i < segments.size(); i++) {
67
+ auto &segment = segments[i];
68
+ segment.data.IncrementVersion();
69
+ if (i == 0) {
70
+ // the first segment is converted to persistent - this writes the data for ALL segments to disk
71
+ D_ASSERT(segment.offset_in_block == 0);
72
+ segment.segment.ConvertToPersistent(&block_manager, state.block_id);
73
+ // update the block after it has been converted to a persistent segment
74
+ block = segment.segment.block;
75
+ } else {
76
+ // subsequent segments are MARKED as persistent - they don't need to be rewritten
77
+ segment.segment.MarkAsPersistent(block, segment.offset_in_block);
78
+ if (fetch_new_block) {
79
+ // if we fetched a new block we need to increase the reference count to the block
80
+ block_manager.IncreaseBlockReferenceCount(state.block_id);
81
+ }
90
82
  }
91
- first_segment = nullptr;
92
- tail_segments.clear();
93
83
  }
84
+ Clear();
85
+ }
94
86
 
95
- void Clear() override {
96
- first_data = nullptr;
97
- first_segment = nullptr;
98
- tail_segments.clear();
87
+ void PartialBlockForCheckpoint::Clear() {
88
+ uninitialized_regions.clear();
89
+ block.reset();
90
+ segments.clear();
91
+ }
92
+
93
+ void PartialBlockForCheckpoint::Merge(PartialBlock &other_p, idx_t offset, idx_t other_size) {
94
+ auto &other = other_p.Cast<PartialBlockForCheckpoint>();
95
+
96
+ auto &buffer_manager = block_manager.buffer_manager;
97
+ // pin the source block
98
+ auto old_handle = buffer_manager.Pin(other.block);
99
+ // pin the target block
100
+ auto new_handle = buffer_manager.Pin(block);
101
+ // memcpy the contents of the old block to the new block
102
+ memcpy(new_handle.Ptr() + offset, old_handle.Ptr(), other_size);
103
+
104
+ // now copy over all of the segments to the new block
105
+ // move over the uninitialized regions
106
+ for (auto &region : other.uninitialized_regions) {
107
+ region.start += offset;
108
+ region.end += offset;
109
+ uninitialized_regions.push_back(region);
99
110
  }
100
111
 
101
- void AddSegmentToTail(ColumnData *data, ColumnSegment *segment, uint32_t offset_in_block) {
102
- tail_segments.push_back({data, segment, offset_in_block});
112
+ // move over the segments
113
+ for (auto &segment : other.segments) {
114
+ AddSegmentToTail(segment.data, segment.segment, segment.offset_in_block + offset);
103
115
  }
104
- };
116
+ other.Clear();
117
+ }
118
+
119
+ void PartialBlockForCheckpoint::AddSegmentToTail(ColumnData &data, ColumnSegment &segment, uint32_t offset_in_block) {
120
+ segments.emplace_back(data, segment, offset_in_block);
121
+ }
105
122
 
106
123
  void ColumnCheckpointState::FlushSegment(unique_ptr<ColumnSegment> segment, idx_t segment_size) {
107
124
  D_ASSERT(segment_size <= Storage::BLOCK_SIZE);
@@ -128,14 +145,14 @@ void ColumnCheckpointState::FlushSegment(unique_ptr<ColumnSegment> segment, idx_
128
145
  if (allocation.partial_block) {
129
146
  // Use an existing block.
130
147
  D_ASSERT(offset_in_block > 0);
131
- auto pstate = (PartialBlockForCheckpoint *)allocation.partial_block.get();
148
+ auto &pstate = allocation.partial_block->Cast<PartialBlockForCheckpoint>();
132
149
  // pin the source block
133
150
  auto old_handle = buffer_manager.Pin(segment->block);
134
151
  // pin the target block
135
- auto new_handle = buffer_manager.Pin(pstate->first_segment->block);
152
+ auto new_handle = buffer_manager.Pin(pstate.block);
136
153
  // memcpy the contents of the old block to the new block
137
154
  memcpy(new_handle.Ptr() + offset_in_block, old_handle.Ptr(), segment_size);
138
- pstate->AddSegmentToTail(&column_data, segment.get(), offset_in_block);
155
+ pstate.AddSegmentToTail(column_data, *segment, offset_in_block);
139
156
  } else {
140
157
  // Create a new block for future reuse.
141
158
  if (segment->SegmentSize() != Storage::BLOCK_SIZE) {
@@ -146,7 +163,7 @@ void ColumnCheckpointState::FlushSegment(unique_ptr<ColumnSegment> segment, idx_
146
163
  }
147
164
  D_ASSERT(offset_in_block == 0);
148
165
  allocation.partial_block = make_uniq<PartialBlockForCheckpoint>(
149
- &column_data, segment.get(), *allocation.block_manager, allocation.state);
166
+ column_data, *segment, *allocation.block_manager, allocation.state);
150
167
  }
151
168
  // Writer will decide whether to reuse this block.
152
169
  partial_block_manager.RegisterPartialBlock(std::move(allocation));
@@ -180,13 +197,4 @@ void ColumnCheckpointState::WriteDataPointers(RowGroupWriter &writer) {
180
197
  writer.WriteColumnDataPointers(*this);
181
198
  }
182
199
 
183
- void ColumnCheckpointState::GetBlockIds(unordered_set<block_id_t> &result) {
184
- for (auto &pointer : data_pointers) {
185
- if (pointer.block_pointer.block_id == INVALID_BLOCK) {
186
- continue;
187
- }
188
- result.insert(pointer.block_pointer.block_id);
189
- }
190
- }
191
-
192
200
  } // namespace duckdb
@@ -21,7 +21,7 @@
21
21
  namespace duckdb {
22
22
 
23
23
  ColumnData::ColumnData(BlockManager &block_manager, DataTableInfo &info, idx_t column_index, idx_t start_row,
24
- LogicalType type_p, ColumnData *parent)
24
+ LogicalType type_p, optional_ptr<ColumnData> parent)
25
25
  : start(start_row), count(0), block_manager(block_manager), info(info), column_index(column_index),
26
26
  type(std::move(type_p)), parent(parent), version(0) {
27
27
  if (!parent) {
@@ -29,24 +29,17 @@ ColumnData::ColumnData(BlockManager &block_manager, DataTableInfo &info, idx_t c
29
29
  }
30
30
  }
31
31
 
32
- ColumnData::ColumnData(ColumnData &other, idx_t start, ColumnData *parent)
33
- : start(start), count(other.count), block_manager(other.block_manager), info(other.info),
34
- column_index(other.column_index), type(std::move(other.type)), parent(parent),
35
- version(parent ? parent->version + 1 : 0) {
36
- if (other.updates) {
37
- updates = make_uniq<UpdateSegment>(*other.updates, *this);
38
- }
39
- if (other.stats) {
40
- stats = make_uniq<SegmentStatistics>(other.stats->statistics.Copy());
41
- }
32
+ ColumnData::~ColumnData() {
33
+ }
34
+
35
+ void ColumnData::SetStart(idx_t new_start) {
36
+ this->start = new_start;
42
37
  idx_t offset = 0;
43
- for (auto &segment : other.data.Segments()) {
44
- this->data.AppendSegment(ColumnSegment::CreateSegment(segment, start + offset));
38
+ for (auto &segment : data.Segments()) {
39
+ segment.start = start + offset;
45
40
  offset += segment.count;
46
41
  }
47
- }
48
-
49
- ColumnData::~ColumnData() {
42
+ data.Reinitialize();
50
43
  }
51
44
 
52
45
  DatabaseInstance &ColumnData::GetDatabase() const {
@@ -278,8 +271,8 @@ void ColumnData::InitializeAppend(ColumnAppendState &state) {
278
271
  AppendTransientSegment(l, start);
279
272
  }
280
273
  auto segment = data.GetLastSegment(l);
281
- if (segment->segment_type == ColumnSegmentType::PERSISTENT) {
282
- // no transient segments yet
274
+ if (segment->segment_type == ColumnSegmentType::PERSISTENT || !segment->function.get().init_append) {
275
+ // we cannot append to this segment - append a new segment
283
276
  auto total_rows = segment->start + segment->count;
284
277
  AppendTransientSegment(l, total_rows);
285
278
  state.current = data.GetLastSegment(l);
@@ -418,9 +411,9 @@ unique_ptr<ColumnCheckpointState> ColumnData::CreateCheckpointState(RowGroup &ro
418
411
  return make_uniq<ColumnCheckpointState>(row_group, *this, partial_block_manager);
419
412
  }
420
413
 
421
- void ColumnData::CheckpointScan(ColumnSegment *segment, ColumnScanState &state, idx_t row_group_start, idx_t count,
414
+ void ColumnData::CheckpointScan(ColumnSegment &segment, ColumnScanState &state, idx_t row_group_start, idx_t count,
422
415
  Vector &scan_vector) {
423
- segment->Scan(state, count, scan_vector, 0, true);
416
+ segment.Scan(state, count, scan_vector, 0, true);
424
417
  if (updates) {
425
418
  scan_vector.Flatten(count);
426
419
  updates->FetchCommittedRange(state.row_index - row_group_start, count, scan_vector);
@@ -489,7 +482,7 @@ void ColumnData::DeserializeColumn(Deserializer &source) {
489
482
 
490
483
  shared_ptr<ColumnData> ColumnData::Deserialize(BlockManager &block_manager, DataTableInfo &info, idx_t column_index,
491
484
  idx_t start_row, Deserializer &source, const LogicalType &type,
492
- ColumnData *parent) {
485
+ optional_ptr<ColumnData> parent) {
493
486
  auto entry = ColumnData::CreateColumn(block_manager, info, column_index, start_row, type, parent);
494
487
  entry->DeserializeColumn(source);
495
488
  return entry;
@@ -565,48 +558,29 @@ void ColumnData::Verify(RowGroup &parent) {
565
558
 
566
559
  template <class RET, class OP>
567
560
  static RET CreateColumnInternal(BlockManager &block_manager, DataTableInfo &info, idx_t column_index, idx_t start_row,
568
- const LogicalType &type, ColumnData *parent) {
561
+ const LogicalType &type, optional_ptr<ColumnData> parent) {
569
562
  if (type.InternalType() == PhysicalType::STRUCT) {
570
563
  return OP::template Create<StructColumnData>(block_manager, info, column_index, start_row, type, parent);
571
564
  } else if (type.InternalType() == PhysicalType::LIST) {
572
565
  return OP::template Create<ListColumnData>(block_manager, info, column_index, start_row, type, parent);
573
566
  } else if (type.id() == LogicalTypeId::VALIDITY) {
574
- return OP::template Create<ValidityColumnData>(block_manager, info, column_index, start_row, parent);
567
+ return OP::template Create<ValidityColumnData>(block_manager, info, column_index, start_row, *parent);
575
568
  }
576
569
  return OP::template Create<StandardColumnData>(block_manager, info, column_index, start_row, type, parent);
577
570
  }
578
571
 
579
- template <class RET, class OP>
580
- static RET CreateColumnInternal(ColumnData &other, idx_t start_row, ColumnData *parent) {
581
- if (other.type.InternalType() == PhysicalType::STRUCT) {
582
- return OP::template Create<StructColumnData>(other, start_row, parent);
583
- } else if (other.type.InternalType() == PhysicalType::LIST) {
584
- return OP::template Create<ListColumnData>(other, start_row, parent);
585
- } else if (other.type.id() == LogicalTypeId::VALIDITY) {
586
- return OP::template Create<ValidityColumnData>(other, start_row, parent);
587
- }
588
- return OP::template Create<StandardColumnData>(other, start_row, parent);
589
- }
590
-
591
572
  shared_ptr<ColumnData> ColumnData::CreateColumn(BlockManager &block_manager, DataTableInfo &info, idx_t column_index,
592
- idx_t start_row, const LogicalType &type, ColumnData *parent) {
573
+ idx_t start_row, const LogicalType &type,
574
+ optional_ptr<ColumnData> parent) {
593
575
  return CreateColumnInternal<shared_ptr<ColumnData>, SharedConstructor>(block_manager, info, column_index, start_row,
594
576
  type, parent);
595
577
  }
596
578
 
597
- shared_ptr<ColumnData> ColumnData::CreateColumn(ColumnData &other, idx_t start_row, ColumnData *parent) {
598
- return CreateColumnInternal<shared_ptr<ColumnData>, SharedConstructor>(other, start_row, parent);
599
- }
600
-
601
579
  unique_ptr<ColumnData> ColumnData::CreateColumnUnique(BlockManager &block_manager, DataTableInfo &info,
602
580
  idx_t column_index, idx_t start_row, const LogicalType &type,
603
- ColumnData *parent) {
581
+ optional_ptr<ColumnData> parent) {
604
582
  return CreateColumnInternal<unique_ptr<ColumnData>, UniqueConstructor>(block_manager, info, column_index, start_row,
605
583
  type, parent);
606
584
  }
607
585
 
608
- unique_ptr<ColumnData> ColumnData::CreateColumnUnique(ColumnData &other, idx_t start_row, ColumnData *parent) {
609
- return CreateColumnInternal<unique_ptr<ColumnData>, UniqueConstructor>(other, start_row, parent);
610
- }
611
-
612
586
  } // namespace duckdb
@@ -43,16 +43,16 @@ ColumnCheckpointState &ColumnDataCheckpointer::GetCheckpointState() {
43
43
  void ColumnDataCheckpointer::ScanSegments(const std::function<void(Vector &, idx_t)> &callback) {
44
44
  Vector scan_vector(intermediate.GetType(), nullptr);
45
45
  for (idx_t segment_idx = 0; segment_idx < nodes.size(); segment_idx++) {
46
- auto segment = nodes[segment_idx].node.get();
46
+ auto &segment = *nodes[segment_idx].node;
47
47
  ColumnScanState scan_state;
48
- scan_state.current = segment;
49
- segment->InitializeScan(scan_state);
48
+ scan_state.current = &segment;
49
+ segment.InitializeScan(scan_state);
50
50
 
51
- for (idx_t base_row_index = 0; base_row_index < segment->count; base_row_index += STANDARD_VECTOR_SIZE) {
51
+ for (idx_t base_row_index = 0; base_row_index < segment.count; base_row_index += STANDARD_VECTOR_SIZE) {
52
52
  scan_vector.Reference(intermediate);
53
53
 
54
- idx_t count = MinValue<idx_t>(segment->count - base_row_index, STANDARD_VECTOR_SIZE);
55
- scan_state.row_index = segment->start + base_row_index;
54
+ idx_t count = MinValue<idx_t>(segment.count - base_row_index, STANDARD_VECTOR_SIZE);
55
+ scan_state.row_index = segment.start + base_row_index;
56
56
 
57
57
  col_data.CheckpointScan(segment, scan_state, row_group.start, count, scan_vector);
58
58
 
@@ -250,7 +250,7 @@ void ColumnDataCheckpointer::Checkpoint(vector<SegmentNode<ColumnSegment>> nodes
250
250
  // no changes: only need to write the metadata for this column
251
251
  WritePersistentSegments();
252
252
  } else {
253
- // there are changes: rewrite the set of columns
253
+ // there are changes: rewrite the set of columns);
254
254
  WriteToDisk();
255
255
  }
256
256
  }
@@ -172,7 +172,7 @@ void ColumnSegment::RevertAppend(idx_t start_row) {
172
172
  //===--------------------------------------------------------------------===//
173
173
  // Convert To Persistent
174
174
  //===--------------------------------------------------------------------===//
175
- void ColumnSegment::ConvertToPersistent(BlockManager *block_manager, block_id_t block_id_p) {
175
+ void ColumnSegment::ConvertToPersistent(optional_ptr<BlockManager> block_manager, block_id_t block_id_p) {
176
176
  D_ASSERT(segment_type == ColumnSegmentType::TRANSIENT);
177
177
  segment_type = ColumnSegmentType::PERSISTENT;
178
178
 
@@ -8,19 +8,19 @@
8
8
  namespace duckdb {
9
9
 
10
10
  ListColumnData::ListColumnData(BlockManager &block_manager, DataTableInfo &info, idx_t column_index, idx_t start_row,
11
- LogicalType type_p, ColumnData *parent)
11
+ LogicalType type_p, optional_ptr<ColumnData> parent)
12
12
  : ColumnData(block_manager, info, column_index, start_row, std::move(type_p), parent),
13
- validity(block_manager, info, 0, start_row, this) {
13
+ validity(block_manager, info, 0, start_row, *this) {
14
14
  D_ASSERT(type.InternalType() == PhysicalType::LIST);
15
15
  auto &child_type = ListType::GetChildType(type);
16
16
  // the child column, with column index 1 (0 is the validity mask)
17
17
  child_column = ColumnData::CreateColumnUnique(block_manager, info, 1, start_row, child_type, this);
18
18
  }
19
19
 
20
- ListColumnData::ListColumnData(ColumnData &original, idx_t start_row, ColumnData *parent)
21
- : ColumnData(original, start_row, parent), validity(((ListColumnData &)original).validity, start_row, this) {
22
- auto &list_data = (ListColumnData &)original;
23
- child_column = ColumnData::CreateColumnUnique(*list_data.child_column, start_row, this);
20
+ void ListColumnData::SetStart(idx_t new_start) {
21
+ ColumnData::SetStart(new_start);
22
+ child_column->SetStart(new_start);
23
+ validity.SetStart(new_start);
24
24
  }
25
25
 
26
26
  bool ListColumnData::CheckZonemap(ColumnScanState &state, TableFilter &filter) {
@@ -322,11 +322,6 @@ public:
322
322
  validity_state->WriteDataPointers(writer);
323
323
  child_state->WriteDataPointers(writer);
324
324
  }
325
- void GetBlockIds(unordered_set<block_id_t> &result) override {
326
- ColumnCheckpointState::GetBlockIds(result);
327
- validity_state->GetBlockIds(result);
328
- child_state->GetBlockIds(result);
329
- }
330
325
  };
331
326
 
332
327
  unique_ptr<ColumnCheckpointState> ListColumnData::CreateCheckpointState(RowGroup &row_group,
@@ -45,16 +45,15 @@ RowGroup::RowGroup(RowGroupCollection &collection, RowGroupPointer &&pointer)
45
45
  Verify();
46
46
  }
47
47
 
48
- RowGroup::RowGroup(RowGroup &row_group, RowGroupCollection &collection, idx_t start)
49
- : SegmentBase<RowGroup>(start, row_group.count.load()), collection(collection),
50
- version_info(std::move(row_group.version_info)) {
51
- for (auto &column : row_group.GetColumns()) {
52
- this->columns.push_back(ColumnData::CreateColumn(*column, start));
48
+ void RowGroup::MoveToCollection(RowGroupCollection &collection, idx_t new_start) {
49
+ this->collection = collection;
50
+ this->start = new_start;
51
+ for (auto &column : GetColumns()) {
52
+ column->SetStart(new_start);
53
53
  }
54
54
  if (version_info) {
55
- version_info->SetStart(start);
55
+ version_info->SetStart(new_start);
56
56
  }
57
- Verify();
58
57
  }
59
58
 
60
59
  void VersionNode::SetStart(idx_t start) {
@@ -101,8 +100,8 @@ ColumnData &RowGroup::GetColumn(idx_t c) {
101
100
  if (column_pointers.size() != columns.size()) {
102
101
  throw InternalException("Lazy loading a column but the pointer was not set");
103
102
  }
104
- auto &block_manager = collection.GetBlockManager();
105
- auto &types = collection.GetTypes();
103
+ auto &block_manager = GetCollection().GetBlockManager();
104
+ auto &types = GetCollection().GetTypes();
106
105
  auto &block_pointer = column_pointers[c];
107
106
  MetaBlockReader column_data_reader(block_manager, block_pointer.block_id);
108
107
  column_data_reader.offset = block_pointer.offset;
@@ -113,14 +112,14 @@ ColumnData &RowGroup::GetColumn(idx_t c) {
113
112
  }
114
113
 
115
114
  DatabaseInstance &RowGroup::GetDatabase() {
116
- return collection.GetDatabase();
115
+ return GetCollection().GetDatabase();
117
116
  }
118
117
 
119
118
  BlockManager &RowGroup::GetBlockManager() {
120
- return collection.GetBlockManager();
119
+ return GetCollection().GetBlockManager();
121
120
  }
122
121
  DataTableInfo &RowGroup::GetTableInfo() {
123
- return collection.GetTableInfo();
122
+ return GetCollection().GetTableInfo();
124
123
  }
125
124
 
126
125
  void RowGroup::InitializeEmpty(const vector<LogicalType> &types) {
@@ -231,7 +230,7 @@ unique_ptr<RowGroup> RowGroup::AlterType(RowGroupCollection &new_collection, con
231
230
  column_data->InitializeAppend(append_state);
232
231
 
233
232
  // scan the original table, and fill the new column with the transformed value
234
- scan_state.Initialize(collection.GetTypes());
233
+ scan_state.Initialize(GetCollection().GetTypes());
235
234
  InitializeScan(scan_state);
236
235
 
237
236
  DataChunk append_chunk;
@@ -537,7 +536,7 @@ void RowGroup::Scan(TransactionData transaction, CollectionScanState &state, Dat
537
536
  }
538
537
 
539
538
  void RowGroup::ScanCommitted(CollectionScanState &state, DataChunk &result, TableScanType type) {
540
- auto &transaction_manager = DuckTransactionManager::Get(collection.GetAttached());
539
+ auto &transaction_manager = DuckTransactionManager::Get(GetCollection().GetAttached());
541
540
 
542
541
  auto lowest_active_start = transaction_manager.LowestActiveStart();
543
542
  auto lowest_active_id = transaction_manager.LowestActiveId();
@@ -96,6 +96,10 @@ RowGroup *RowGroupCollection::GetRowGroup(int64_t index) {
96
96
  return (RowGroup *)row_groups->GetSegmentByIndex(index);
97
97
  }
98
98
 
99
+ idx_t RowGroupCollection::RowGroupCount() {
100
+ return row_groups->GetSegmentCount();
101
+ }
102
+
99
103
  void RowGroupCollection::Verify() {
100
104
  #ifdef DEBUG
101
105
  idx_t current_total_rows = 0;
@@ -444,10 +448,12 @@ void RowGroupCollection::RevertAppendInternal(idx_t start_row, idx_t count) {
444
448
  void RowGroupCollection::MergeStorage(RowGroupCollection &data) {
445
449
  D_ASSERT(data.types == types);
446
450
  auto index = row_start + total_rows.load();
447
- for (auto &row_group : data.row_groups->Segments()) {
448
- auto new_group = make_uniq<RowGroup>(row_group, *this, index);
449
- index += new_group->count;
450
- row_groups->AppendSegment(std::move(new_group));
451
+ auto segments = data.row_groups->MoveSegments();
452
+ for (auto &entry : segments) {
453
+ auto &row_group = entry.node;
454
+ row_group->MoveToCollection(*this, index);
455
+ index += row_group->count;
456
+ row_groups->AppendSegment(std::move(row_group));
451
457
  }
452
458
  stats.MergeStats(data.stats);
453
459
  total_rows += data.total_rows.load();