duckdb 0.7.2-dev2867.0 → 0.7.2-dev3117.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 (319) hide show
  1. package/binding.gyp +2 -0
  2. package/package.json +1 -1
  3. package/src/duckdb/extension/icu/icu-datepart.cpp +5 -1
  4. package/src/duckdb/extension/json/include/json_deserializer.hpp +1 -0
  5. package/src/duckdb/extension/json/include/json_serializer.hpp +8 -1
  6. package/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp +1 -3
  7. package/src/duckdb/extension/json/json_functions/json_structure.cpp +3 -3
  8. package/src/duckdb/extension/json/json_functions/json_transform.cpp +3 -2
  9. package/src/duckdb/extension/parquet/parquet-extension.cpp +9 -7
  10. package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +18 -7
  11. package/src/duckdb/src/catalog/default/default_functions.cpp +2 -0
  12. package/src/duckdb/src/common/arrow/arrow_appender.cpp +3 -3
  13. package/src/duckdb/src/common/arrow/arrow_converter.cpp +2 -2
  14. package/src/duckdb/src/common/enum_util.cpp +5908 -0
  15. package/src/duckdb/src/common/enums/expression_type.cpp +216 -4
  16. package/src/duckdb/src/common/enums/join_type.cpp +6 -5
  17. package/src/duckdb/src/common/enums/physical_operator_type.cpp +2 -0
  18. package/src/duckdb/src/common/exception.cpp +1 -1
  19. package/src/duckdb/src/common/exception_format_value.cpp +2 -2
  20. package/src/duckdb/src/common/multi_file_reader.cpp +14 -0
  21. package/src/duckdb/src/common/serializer/binary_deserializer.cpp +143 -0
  22. package/src/duckdb/src/common/serializer/binary_serializer.cpp +160 -0
  23. package/src/duckdb/src/common/sort/partition_state.cpp +1 -1
  24. package/src/duckdb/src/common/string_util.cpp +6 -1
  25. package/src/duckdb/src/common/types/row/tuple_data_scatter_gather.cpp +3 -3
  26. package/src/duckdb/src/common/types.cpp +11 -10
  27. package/src/duckdb/src/common/vector_operations/is_distinct_from.cpp +4 -4
  28. package/src/duckdb/src/core_functions/function_list.cpp +2 -0
  29. package/src/duckdb/src/core_functions/scalar/date/date_part.cpp +2 -1
  30. package/src/duckdb/src/core_functions/scalar/list/list_sort.cpp +2 -3
  31. package/src/duckdb/src/core_functions/scalar/string/format_bytes.cpp +29 -0
  32. package/src/duckdb/src/execution/aggregate_hashtable.cpp +3 -3
  33. package/src/duckdb/src/execution/index/art/art.cpp +5 -1
  34. package/src/duckdb/src/execution/operator/aggregate/distinct_aggregate_data.cpp +1 -1
  35. package/src/duckdb/src/execution/operator/aggregate/grouped_aggregate_data.cpp +2 -2
  36. package/src/duckdb/src/execution/operator/aggregate/physical_hash_aggregate.cpp +65 -45
  37. package/src/duckdb/src/execution/operator/aggregate/physical_perfecthash_aggregate.cpp +17 -11
  38. package/src/duckdb/src/execution/operator/aggregate/physical_ungrouped_aggregate.cpp +32 -39
  39. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +10 -9
  40. package/src/duckdb/src/execution/operator/helper/physical_batch_collector.cpp +4 -4
  41. package/src/duckdb/src/execution/operator/helper/physical_explain_analyze.cpp +6 -21
  42. package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +13 -13
  43. package/src/duckdb/src/execution/operator/helper/physical_limit_percent.cpp +15 -14
  44. package/src/duckdb/src/execution/operator/helper/physical_load.cpp +3 -2
  45. package/src/duckdb/src/execution/operator/helper/physical_materialized_collector.cpp +4 -4
  46. package/src/duckdb/src/execution/operator/helper/physical_pragma.cpp +4 -2
  47. package/src/duckdb/src/execution/operator/helper/physical_prepare.cpp +4 -2
  48. package/src/duckdb/src/execution/operator/helper/physical_reservoir_sample.cpp +10 -8
  49. package/src/duckdb/src/execution/operator/helper/physical_reset.cpp +4 -3
  50. package/src/duckdb/src/execution/operator/helper/physical_set.cpp +7 -6
  51. package/src/duckdb/src/execution/operator/helper/physical_streaming_sample.cpp +2 -1
  52. package/src/duckdb/src/execution/operator/helper/physical_transaction.cpp +4 -2
  53. package/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp +8 -8
  54. package/src/duckdb/src/execution/operator/join/physical_asof_join.cpp +17 -16
  55. package/src/duckdb/src/execution/operator/join/physical_blockwise_nl_join.cpp +12 -9
  56. package/src/duckdb/src/execution/operator/join/physical_comparison_join.cpp +2 -1
  57. package/src/duckdb/src/execution/operator/join/physical_cross_product.cpp +3 -4
  58. package/src/duckdb/src/execution/operator/join/physical_delim_join.cpp +5 -5
  59. package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +16 -15
  60. package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +13 -12
  61. package/src/duckdb/src/execution/operator/join/physical_nested_loop_join.cpp +12 -10
  62. package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +13 -11
  63. package/src/duckdb/src/execution/operator/join/physical_positional_join.cpp +8 -6
  64. package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +1 -1
  65. package/src/duckdb/src/execution/operator/order/physical_order.cpp +13 -13
  66. package/src/duckdb/src/execution/operator/order/physical_top_n.cpp +8 -8
  67. package/src/duckdb/src/execution/operator/persistent/physical_batch_copy_to_file.cpp +165 -0
  68. package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +160 -145
  69. package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +11 -26
  70. package/src/duckdb/src/execution/operator/persistent/physical_delete.cpp +14 -19
  71. package/src/duckdb/src/execution/operator/persistent/physical_export.cpp +7 -6
  72. package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +18 -30
  73. package/src/duckdb/src/execution/operator/persistent/physical_update.cpp +14 -18
  74. package/src/duckdb/src/execution/operator/scan/physical_column_data_scan.cpp +6 -4
  75. package/src/duckdb/src/execution/operator/scan/physical_dummy_scan.cpp +4 -19
  76. package/src/duckdb/src/execution/operator/scan/physical_empty_result.cpp +3 -2
  77. package/src/duckdb/src/execution/operator/scan/physical_positional_scan.cpp +14 -5
  78. package/src/duckdb/src/execution/operator/scan/physical_table_scan.cpp +6 -4
  79. package/src/duckdb/src/execution/operator/schema/physical_alter.cpp +3 -19
  80. package/src/duckdb/src/execution/operator/schema/physical_attach.cpp +13 -25
  81. package/src/duckdb/src/execution/operator/schema/physical_create_function.cpp +4 -19
  82. package/src/duckdb/src/execution/operator/schema/physical_create_index.cpp +8 -9
  83. package/src/duckdb/src/execution/operator/schema/physical_create_schema.cpp +4 -19
  84. package/src/duckdb/src/execution/operator/schema/physical_create_sequence.cpp +4 -19
  85. package/src/duckdb/src/execution/operator/schema/physical_create_table.cpp +4 -19
  86. package/src/duckdb/src/execution/operator/schema/physical_create_type.cpp +9 -26
  87. package/src/duckdb/src/execution/operator/schema/physical_create_view.cpp +4 -19
  88. package/src/duckdb/src/execution/operator/schema/physical_detach.cpp +4 -19
  89. package/src/duckdb/src/execution/operator/schema/physical_drop.cpp +3 -19
  90. package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +9 -8
  91. package/src/duckdb/src/execution/operator/set/physical_union.cpp +1 -1
  92. package/src/duckdb/src/execution/partitionable_hashtable.cpp +2 -2
  93. package/src/duckdb/src/execution/physical_operator.cpp +11 -5
  94. package/src/duckdb/src/execution/physical_plan/plan_copy_to_file.cpp +25 -4
  95. package/src/duckdb/src/execution/physical_plan/plan_sample.cpp +2 -1
  96. package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +16 -16
  97. package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +5 -4
  98. package/src/duckdb/src/function/table/arrow_conversion.cpp +3 -3
  99. package/src/duckdb/src/function/table/copy_csv.cpp +85 -29
  100. package/src/duckdb/src/function/table/read_csv.cpp +17 -11
  101. package/src/duckdb/src/function/table/system/duckdb_settings.cpp +2 -1
  102. package/src/duckdb/src/function/table/system/duckdb_types.cpp +2 -1
  103. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  104. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_catalog_entry.hpp +7 -1
  105. package/src/duckdb/src/include/duckdb/common/enum_util.hpp +958 -0
  106. package/src/duckdb/src/include/duckdb/common/enums/join_type.hpp +3 -3
  107. package/src/duckdb/src/include/duckdb/common/enums/operator_result_type.hpp +16 -4
  108. package/src/duckdb/src/include/duckdb/common/enums/physical_operator_type.hpp +1 -0
  109. package/src/duckdb/src/include/duckdb/common/exception.hpp +4 -4
  110. package/src/duckdb/src/include/duckdb/common/exception_format_value.hpp +3 -2
  111. package/src/duckdb/src/include/duckdb/common/multi_file_reader_options.hpp +44 -0
  112. package/src/duckdb/src/include/duckdb/common/optional_idx.hpp +45 -0
  113. package/src/duckdb/src/include/duckdb/common/serializer/binary_deserializer.hpp +93 -0
  114. package/src/duckdb/src/include/duckdb/common/serializer/binary_serializer.hpp +92 -0
  115. package/src/duckdb/src/include/duckdb/common/serializer/format_deserializer.hpp +7 -3
  116. package/src/duckdb/src/include/duckdb/common/serializer/format_serializer.hpp +2 -2
  117. package/src/duckdb/src/include/duckdb/common/set.hpp +2 -1
  118. package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_collection.hpp +1 -1
  119. package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_segment.hpp +1 -1
  120. package/src/duckdb/src/include/duckdb/common/types.hpp +1 -0
  121. package/src/duckdb/src/include/duckdb/common/vector.hpp +61 -14
  122. package/src/duckdb/src/include/duckdb/core_functions/scalar/string_functions.hpp +15 -0
  123. package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +3 -2
  124. package/src/duckdb/src/include/duckdb/execution/executor.hpp +10 -1
  125. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/distinct_aggregate_data.hpp +2 -2
  126. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/grouped_aggregate_data.hpp +2 -2
  127. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_hash_aggregate.hpp +8 -11
  128. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_perfecthash_aggregate.hpp +2 -4
  129. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_ungrouped_aggregate.hpp +3 -7
  130. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_window.hpp +2 -4
  131. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_batch_collector.hpp +1 -2
  132. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_explain_analyze.hpp +2 -5
  133. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_limit.hpp +2 -4
  134. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_limit_percent.hpp +2 -4
  135. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_load.hpp +1 -2
  136. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_materialized_collector.hpp +1 -2
  137. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_pragma.hpp +1 -2
  138. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_prepare.hpp +1 -2
  139. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_reservoir_sample.hpp +2 -4
  140. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_reset.hpp +1 -2
  141. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_set.hpp +1 -2
  142. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_transaction.hpp +1 -2
  143. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_vacuum.hpp +2 -4
  144. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_asof_join.hpp +2 -4
  145. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_blockwise_nl_join.hpp +2 -4
  146. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_cross_product.hpp +1 -2
  147. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_delim_join.hpp +1 -2
  148. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_hash_join.hpp +2 -4
  149. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_iejoin.hpp +2 -4
  150. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_nested_loop_join.hpp +2 -4
  151. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_piecewise_merge_join.hpp +2 -4
  152. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_positional_join.hpp +2 -4
  153. package/src/duckdb/src/include/duckdb/execution/operator/order/physical_order.hpp +2 -4
  154. package/src/duckdb/src/include/duckdb/execution/operator/order/physical_top_n.hpp +2 -4
  155. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_batch_copy_to_file.hpp +68 -0
  156. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_batch_insert.hpp +3 -5
  157. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_copy_to_file.hpp +4 -5
  158. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_delete.hpp +2 -4
  159. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_export.hpp +2 -4
  160. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_insert.hpp +2 -4
  161. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_update.hpp +2 -4
  162. package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_column_data_scan.hpp +1 -2
  163. package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_dummy_scan.hpp +1 -3
  164. package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_empty_result.hpp +1 -2
  165. package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_positional_scan.hpp +1 -2
  166. package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_table_scan.hpp +1 -2
  167. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_alter.hpp +1 -3
  168. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_attach.hpp +1 -3
  169. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_function.hpp +1 -3
  170. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_index.hpp +2 -4
  171. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_schema.hpp +1 -3
  172. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_sequence.hpp +1 -3
  173. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_table.hpp +1 -3
  174. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_type.hpp +2 -5
  175. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_view.hpp +1 -3
  176. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_detach.hpp +1 -3
  177. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_drop.hpp +1 -3
  178. package/src/duckdb/src/include/duckdb/execution/operator/set/physical_recursive_cte.hpp +2 -4
  179. package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +3 -3
  180. package/src/duckdb/src/include/duckdb/execution/physical_operator.hpp +7 -4
  181. package/src/duckdb/src/include/duckdb/execution/physical_operator_states.hpp +26 -6
  182. package/src/duckdb/src/include/duckdb/execution/radix_partitioned_hashtable.hpp +6 -6
  183. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +2 -1
  184. package/src/duckdb/src/include/duckdb/function/copy_function.hpp +32 -4
  185. package/src/duckdb/src/include/duckdb/function/table/read_csv.hpp +4 -2
  186. package/src/duckdb/src/include/duckdb/function/table_function.hpp +0 -1
  187. package/src/duckdb/src/include/duckdb/main/client_config.hpp +2 -0
  188. package/src/duckdb/src/include/duckdb/main/config.hpp +4 -0
  189. package/src/duckdb/src/include/duckdb/main/database.hpp +1 -3
  190. package/src/duckdb/src/include/duckdb/main/database_path_and_type.hpp +24 -0
  191. package/src/duckdb/src/include/duckdb/main/relation/setop_relation.hpp +1 -0
  192. package/src/duckdb/src/include/duckdb/parallel/event.hpp +1 -1
  193. package/src/duckdb/src/include/duckdb/parallel/interrupt.hpp +63 -0
  194. package/src/duckdb/src/include/duckdb/parallel/pipeline.hpp +16 -3
  195. package/src/duckdb/src/include/duckdb/parallel/pipeline_executor.hpp +51 -7
  196. package/src/duckdb/src/include/duckdb/parallel/task.hpp +21 -2
  197. package/src/duckdb/src/include/duckdb/parallel/task_counter.hpp +2 -2
  198. package/src/duckdb/src/include/duckdb/parallel/task_scheduler.hpp +2 -2
  199. package/src/duckdb/src/include/duckdb/parser/parsed_data/sample_options.hpp +1 -0
  200. package/src/duckdb/src/include/duckdb/planner/column_binding.hpp +6 -0
  201. package/src/duckdb/src/include/duckdb/planner/expression/bound_columnref_expression.hpp +1 -0
  202. package/src/duckdb/src/include/duckdb/planner/expression_binder/base_select_binder.hpp +2 -0
  203. package/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +2 -0
  204. package/src/duckdb/src/include/duckdb/planner/operator/logical_aggregate.hpp +2 -1
  205. package/src/duckdb/src/include/duckdb/planner/operator/logical_column_data_get.hpp +1 -0
  206. package/src/duckdb/src/include/duckdb/planner/operator/logical_cteref.hpp +1 -0
  207. package/src/duckdb/src/include/duckdb/planner/operator/logical_delete.hpp +1 -0
  208. package/src/duckdb/src/include/duckdb/planner/operator/logical_delim_get.hpp +1 -0
  209. package/src/duckdb/src/include/duckdb/planner/operator/logical_dummy_scan.hpp +1 -0
  210. package/src/duckdb/src/include/duckdb/planner/operator/logical_expression_get.hpp +1 -0
  211. package/src/duckdb/src/include/duckdb/planner/operator/logical_insert.hpp +1 -0
  212. package/src/duckdb/src/include/duckdb/planner/operator/logical_pivot.hpp +1 -0
  213. package/src/duckdb/src/include/duckdb/planner/operator/logical_projection.hpp +1 -0
  214. package/src/duckdb/src/include/duckdb/planner/operator/logical_recursive_cte.hpp +1 -0
  215. package/src/duckdb/src/include/duckdb/planner/operator/logical_set_operation.hpp +1 -0
  216. package/src/duckdb/src/include/duckdb/planner/operator/logical_unnest.hpp +1 -0
  217. package/src/duckdb/src/include/duckdb/planner/operator/logical_update.hpp +1 -0
  218. package/src/duckdb/src/include/duckdb/planner/operator/logical_window.hpp +1 -0
  219. package/src/duckdb/src/include/duckdb/planner/query_node/bound_select_node.hpp +1 -1
  220. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +1 -0
  221. package/src/duckdb/src/include/duckdb/storage/optimistic_data_writer.hpp +46 -0
  222. package/src/duckdb/src/include/duckdb/storage/partial_block_manager.hpp +24 -3
  223. package/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp +46 -1
  224. package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +9 -10
  225. package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +1 -1
  226. package/src/duckdb/src/include/duckdb/storage/table/list_column_data.hpp +2 -2
  227. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +3 -3
  228. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +1 -0
  229. package/src/duckdb/src/include/duckdb/storage/table/segment_base.hpp +1 -1
  230. package/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +22 -0
  231. package/src/duckdb/src/include/duckdb/storage/table/standard_column_data.hpp +3 -3
  232. package/src/duckdb/src/include/duckdb/storage/table/struct_column_data.hpp +2 -2
  233. package/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +0 -2
  234. package/src/duckdb/src/include/duckdb/storage/table/validity_column_data.hpp +1 -2
  235. package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +9 -34
  236. package/src/duckdb/src/include/duckdb/verification/deserialized_statement_verifier_v2.hpp +26 -0
  237. package/src/duckdb/src/include/duckdb/verification/no_operator_caching_verifier.hpp +25 -0
  238. package/src/duckdb/src/include/duckdb/verification/statement_verifier.hpp +6 -0
  239. package/src/duckdb/src/main/client_context.cpp +1 -0
  240. package/src/duckdb/src/main/client_verify.cpp +5 -0
  241. package/src/duckdb/src/main/config.cpp +4 -0
  242. package/src/duckdb/src/main/database.cpp +22 -34
  243. package/src/duckdb/src/main/database_path_and_type.cpp +23 -0
  244. package/src/duckdb/src/main/extension/extension_load.cpp +19 -15
  245. package/src/duckdb/src/main/relation/join_relation.cpp +2 -1
  246. package/src/duckdb/src/main/relation/setop_relation.cpp +2 -3
  247. package/src/duckdb/src/parallel/event.cpp +1 -1
  248. package/src/duckdb/src/parallel/executor.cpp +39 -3
  249. package/src/duckdb/src/parallel/executor_task.cpp +11 -0
  250. package/src/duckdb/src/parallel/interrupt.cpp +57 -0
  251. package/src/duckdb/src/parallel/pipeline.cpp +49 -6
  252. package/src/duckdb/src/parallel/pipeline_executor.cpp +248 -69
  253. package/src/duckdb/src/parallel/pipeline_initialize_event.cpp +1 -1
  254. package/src/duckdb/src/parallel/task_scheduler.cpp +57 -22
  255. package/src/duckdb/src/parser/base_expression.cpp +6 -0
  256. package/src/duckdb/src/parser/expression/window_expression.cpp +1 -1
  257. package/src/duckdb/src/parser/parsed_data/sample_options.cpp +2 -2
  258. package/src/duckdb/src/parser/query_node/select_node.cpp +1 -1
  259. package/src/duckdb/src/parser/result_modifier.cpp +2 -2
  260. package/src/duckdb/src/parser/statement/select_statement.cpp +0 -44
  261. package/src/duckdb/src/parser/tableref/joinref.cpp +3 -3
  262. package/src/duckdb/src/parser/tableref.cpp +1 -1
  263. package/src/duckdb/src/parser/transform/expression/transform_function.cpp +3 -3
  264. package/src/duckdb/src/planner/binder/expression/bind_columnref_expression.cpp +6 -0
  265. package/src/duckdb/src/planner/binder/expression/bind_function_expression.cpp +4 -1
  266. package/src/duckdb/src/planner/expression/bound_columnref_expression.cpp +17 -3
  267. package/src/duckdb/src/planner/expression/bound_reference_expression.cpp +8 -2
  268. package/src/duckdb/src/planner/expression_binder/base_select_binder.cpp +7 -0
  269. package/src/duckdb/src/planner/operator/logical_aggregate.cpp +14 -2
  270. package/src/duckdb/src/planner/operator/logical_column_data_get.cpp +11 -0
  271. package/src/duckdb/src/planner/operator/logical_comparison_join.cpp +2 -2
  272. package/src/duckdb/src/planner/operator/logical_cteref.cpp +11 -0
  273. package/src/duckdb/src/planner/operator/logical_delete.cpp +10 -0
  274. package/src/duckdb/src/planner/operator/logical_delim_get.cpp +12 -1
  275. package/src/duckdb/src/planner/operator/logical_dummy_scan.cpp +12 -1
  276. package/src/duckdb/src/planner/operator/logical_expression_get.cpp +12 -1
  277. package/src/duckdb/src/planner/operator/logical_get.cpp +10 -4
  278. package/src/duckdb/src/planner/operator/logical_insert.cpp +12 -1
  279. package/src/duckdb/src/planner/operator/logical_pivot.cpp +11 -0
  280. package/src/duckdb/src/planner/operator/logical_projection.cpp +11 -0
  281. package/src/duckdb/src/planner/operator/logical_recursive_cte.cpp +11 -0
  282. package/src/duckdb/src/planner/operator/logical_set_operation.cpp +11 -0
  283. package/src/duckdb/src/planner/operator/logical_unnest.cpp +12 -1
  284. package/src/duckdb/src/planner/operator/logical_update.cpp +10 -0
  285. package/src/duckdb/src/planner/operator/logical_window.cpp +11 -0
  286. package/src/duckdb/src/storage/checkpoint_manager.cpp +1 -1
  287. package/src/duckdb/src/storage/data_table.cpp +5 -0
  288. package/src/duckdb/src/storage/local_storage.cpp +40 -110
  289. package/src/duckdb/src/storage/optimistic_data_writer.cpp +96 -0
  290. package/src/duckdb/src/storage/partial_block_manager.cpp +73 -9
  291. package/src/duckdb/src/storage/single_file_block_manager.cpp +3 -1
  292. package/src/duckdb/src/storage/standard_buffer_manager.cpp +17 -12
  293. package/src/duckdb/src/storage/statistics/base_statistics.cpp +3 -0
  294. package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +90 -82
  295. package/src/duckdb/src/storage/table/column_data.cpp +19 -45
  296. package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +7 -7
  297. package/src/duckdb/src/storage/table/column_segment.cpp +1 -1
  298. package/src/duckdb/src/storage/table/list_column_data.cpp +6 -11
  299. package/src/duckdb/src/storage/table/row_group.cpp +13 -14
  300. package/src/duckdb/src/storage/table/row_group_collection.cpp +10 -4
  301. package/src/duckdb/src/storage/table/standard_column_data.cpp +6 -10
  302. package/src/duckdb/src/storage/table/struct_column_data.cpp +7 -13
  303. package/src/duckdb/src/storage/table/update_segment.cpp +0 -25
  304. package/src/duckdb/src/storage/table/validity_column_data.cpp +2 -6
  305. package/src/duckdb/src/transaction/commit_state.cpp +4 -4
  306. package/src/duckdb/src/verification/deserialized_statement_verifier.cpp +2 -1
  307. package/src/duckdb/src/verification/deserialized_statement_verifier_v2.cpp +20 -0
  308. package/src/duckdb/src/verification/no_operator_caching_verifier.cpp +13 -0
  309. package/src/duckdb/src/verification/statement_verifier.cpp +7 -0
  310. package/src/duckdb/ub_src_common.cpp +2 -2
  311. package/src/duckdb/ub_src_common_serializer.cpp +4 -2
  312. package/src/duckdb/ub_src_core_functions_scalar_string.cpp +2 -0
  313. package/src/duckdb/ub_src_execution_operator_persistent.cpp +2 -0
  314. package/src/duckdb/ub_src_main.cpp +2 -0
  315. package/src/duckdb/ub_src_parallel.cpp +2 -0
  316. package/src/duckdb/ub_src_storage.cpp +2 -0
  317. package/src/duckdb/src/common/serializer/enum_serializer.cpp +0 -1180
  318. package/src/duckdb/src/common/vector.cpp +0 -12
  319. package/src/duckdb/src/include/duckdb/common/serializer/enum_serializer.hpp +0 -113
@@ -9,111 +9,14 @@
9
9
  #include "duckdb/storage/partial_block_manager.hpp"
10
10
 
11
11
  #include "duckdb/storage/table/column_checkpoint_state.hpp"
12
- #include "duckdb/storage/table/column_segment.hpp"
13
12
  #include "duckdb/storage/table_io_manager.hpp"
14
13
  #include "duckdb/storage/table/scan_state.hpp"
15
14
 
16
15
  namespace duckdb {
17
16
 
18
- //===--------------------------------------------------------------------===//
19
- // OptimisticDataWriter
20
- //===--------------------------------------------------------------------===//
21
- OptimisticDataWriter::OptimisticDataWriter(DataTable &table) : table(table) {
22
- }
23
-
24
- OptimisticDataWriter::OptimisticDataWriter(DataTable &table, OptimisticDataWriter &parent)
25
- : table(table), partial_manager(std::move(parent.partial_manager)),
26
- written_blocks(std::move(parent.written_blocks)) {
27
- if (partial_manager) {
28
- partial_manager->FlushPartialBlocks();
29
- }
30
- }
31
-
32
- OptimisticDataWriter::~OptimisticDataWriter() {
33
- }
34
-
35
- bool OptimisticDataWriter::PrepareWrite() {
36
- // check if we should pre-emptively write the table to disk
37
- if (table.info->IsTemporary() || StorageManager::Get(table.info->db).InMemory()) {
38
- return false;
39
- }
40
- // we should! write the second-to-last row group to disk
41
- // allocate the partial block-manager if none is allocated yet
42
- if (!partial_manager) {
43
- auto &block_manager = table.info->table_io_manager->GetBlockManagerForRowData();
44
- partial_manager = make_uniq<PartialBlockManager>(block_manager);
45
- }
46
- return true;
47
- }
48
-
49
- void OptimisticDataWriter::CheckFlushToDisk(RowGroupCollection &row_groups) {
50
- // we finished writing a complete row group
51
- if (!PrepareWrite()) {
52
- return;
53
- }
54
- // flush second-to-last row group
55
- auto row_group = row_groups.GetRowGroup(-2);
56
- FlushToDisk(row_group);
57
- }
58
-
59
- void OptimisticDataWriter::FlushToDisk(RowGroup *row_group) {
60
- // flush the specified row group
61
- D_ASSERT(row_group);
62
- //! The set of column compression types (if any)
63
- vector<CompressionType> compression_types;
64
- D_ASSERT(compression_types.empty());
65
- for (auto &column : table.column_definitions) {
66
- compression_types.push_back(column.CompressionType());
67
- }
68
- auto row_group_pointer = row_group->WriteToDisk(*partial_manager, compression_types);
69
-
70
- // update the set of written blocks
71
- for (idx_t col_idx = 0; col_idx < row_group_pointer.statistics.size(); col_idx++) {
72
- row_group_pointer.states[col_idx]->GetBlockIds(written_blocks);
73
- }
74
- }
75
-
76
- void OptimisticDataWriter::FlushToDisk(RowGroupCollection &row_groups, bool force) {
77
- if (!partial_manager) {
78
- if (!force) {
79
- // no partial manager - nothing to flush
80
- return;
81
- }
82
- if (!PrepareWrite()) {
83
- return;
84
- }
85
- }
86
- // flush the last row group
87
- FlushToDisk(row_groups.GetRowGroup(-1));
88
- }
89
-
90
- void OptimisticDataWriter::FinalFlush() {
91
- if (!partial_manager) {
92
- return;
93
- }
94
- // then flush the partial manager
95
- partial_manager->FlushPartialBlocks();
96
- partial_manager.reset();
97
- }
98
-
99
- void OptimisticDataWriter::Rollback() {
100
- if (partial_manager) {
101
- partial_manager->Clear();
102
- partial_manager.reset();
103
- }
104
- if (!written_blocks.empty()) {
105
- auto &block_manager = table.info->table_io_manager->GetBlockManagerForRowData();
106
- for (auto block_id : written_blocks) {
107
- block_manager.MarkBlockAsFree(block_id);
108
- }
109
- }
110
- }
111
-
112
- //===--------------------------------------------------------------------===//
113
- // Local Table Storage
114
- //===--------------------------------------------------------------------===//
115
17
  LocalTableStorage::LocalTableStorage(DataTable &table)
116
- : table_ref(table), allocator(Allocator::Get(table.db)), deleted_rows(0), optimistic_writer(table) {
18
+ : table_ref(table), allocator(Allocator::Get(table.db)), deleted_rows(0), optimistic_writer(table),
19
+ merged_storage(false) {
117
20
  auto types = table.GetTypes();
118
21
  row_groups = make_shared<RowGroupCollection>(table.info, TableIOManager::Get(table).GetBlockManagerForRowData(),
119
22
  types, MAX_ROW_ID, 0);
@@ -140,7 +43,8 @@ LocalTableStorage::LocalTableStorage(ClientContext &context, DataTable &new_dt,
140
43
  idx_t changed_idx, const LogicalType &target_type,
141
44
  const vector<column_t> &bound_columns, Expression &cast_expr)
142
45
  : table_ref(new_dt), allocator(Allocator::Get(new_dt.db)), deleted_rows(parent.deleted_rows),
143
- optimistic_writer(new_dt, parent.optimistic_writer), optimistic_writers(std::move(parent.optimistic_writers)) {
46
+ optimistic_writer(new_dt, parent.optimistic_writer), optimistic_writers(std::move(parent.optimistic_writers)),
47
+ merged_storage(parent.merged_storage) {
144
48
  row_groups = parent.row_groups->AlterType(context, changed_idx, target_type, bound_columns, cast_expr);
145
49
  parent.row_groups.reset();
146
50
  indexes.Move(parent.indexes);
@@ -148,7 +52,8 @@ LocalTableStorage::LocalTableStorage(ClientContext &context, DataTable &new_dt,
148
52
 
149
53
  LocalTableStorage::LocalTableStorage(DataTable &new_dt, LocalTableStorage &parent, idx_t drop_idx)
150
54
  : table_ref(new_dt), allocator(Allocator::Get(new_dt.db)), deleted_rows(parent.deleted_rows),
151
- optimistic_writer(new_dt, parent.optimistic_writer), optimistic_writers(std::move(parent.optimistic_writers)) {
55
+ optimistic_writer(new_dt, parent.optimistic_writer), optimistic_writers(std::move(parent.optimistic_writers)),
56
+ merged_storage(parent.merged_storage) {
152
57
  row_groups = parent.row_groups->RemoveColumn(drop_idx);
153
58
  parent.row_groups.reset();
154
59
  indexes.Move(parent.indexes);
@@ -157,7 +62,8 @@ LocalTableStorage::LocalTableStorage(DataTable &new_dt, LocalTableStorage &paren
157
62
  LocalTableStorage::LocalTableStorage(ClientContext &context, DataTable &new_dt, LocalTableStorage &parent,
158
63
  ColumnDefinition &new_column, optional_ptr<Expression> default_value)
159
64
  : table_ref(new_dt), allocator(Allocator::Get(new_dt.db)), deleted_rows(parent.deleted_rows),
160
- optimistic_writer(new_dt, parent.optimistic_writer), optimistic_writers(std::move(parent.optimistic_writers)) {
65
+ optimistic_writer(new_dt, parent.optimistic_writer), optimistic_writers(std::move(parent.optimistic_writers)),
66
+ merged_storage(parent.merged_storage) {
161
67
  row_groups = parent.row_groups->AddColumn(context, new_column, default_value.get());
162
68
  parent.row_groups.reset();
163
69
  indexes.Move(parent.indexes);
@@ -187,16 +93,18 @@ idx_t LocalTableStorage::EstimatedSize() {
187
93
  return appended_rows * row_size;
188
94
  }
189
95
 
190
- void LocalTableStorage::CheckFlushToDisk() {
96
+ void LocalTableStorage::WriteNewRowGroup() {
191
97
  if (deleted_rows != 0) {
192
98
  // we have deletes - we cannot merge row groups
193
99
  return;
194
100
  }
195
- optimistic_writer.CheckFlushToDisk(*row_groups);
101
+ optimistic_writer.WriteNewRowGroup(*row_groups);
196
102
  }
197
103
 
198
- void LocalTableStorage::FlushToDisk() {
199
- optimistic_writer.FlushToDisk(*row_groups);
104
+ void LocalTableStorage::FlushBlocks() {
105
+ if (!merged_storage && row_groups->GetTotalRows() > RowGroup::ROW_GROUP_SIZE) {
106
+ optimistic_writer.WriteLastRowGroup(*row_groups);
107
+ }
200
108
  optimistic_writer.FinalFlush();
201
109
  }
202
110
 
@@ -286,12 +194,28 @@ OptimisticDataWriter &LocalTableStorage::CreateOptimisticWriter() {
286
194
  return *optimistic_writers.back();
287
195
  }
288
196
 
197
+ void LocalTableStorage::FinalizeOptimisticWriter(OptimisticDataWriter &writer) {
198
+ // remove the writer from the set of optimistic writers
199
+ unique_ptr<OptimisticDataWriter> owned_writer;
200
+ for (idx_t i = 0; i < optimistic_writers.size(); i++) {
201
+ if (optimistic_writers[i].get() == &writer) {
202
+ owned_writer = std::move(optimistic_writers[i]);
203
+ optimistic_writers.erase(optimistic_writers.begin() + i);
204
+ break;
205
+ }
206
+ }
207
+ if (!owned_writer) {
208
+ throw InternalException("Error in FinalizeOptimisticWriter - could not find writer");
209
+ }
210
+ optimistic_writer.Merge(*owned_writer);
211
+ }
212
+
289
213
  void LocalTableStorage::Rollback() {
290
- optimistic_writer.Rollback();
291
214
  for (auto &writer : optimistic_writers) {
292
215
  writer->Rollback();
293
216
  }
294
217
  optimistic_writers.clear();
218
+ optimistic_writer.Rollback();
295
219
  }
296
220
 
297
221
  //===--------------------------------------------------------------------===//
@@ -429,7 +353,7 @@ void LocalStorage::Append(LocalAppendState &state, DataChunk &chunk) {
429
353
 
430
354
  //! Check if we should pre-emptively flush blocks to disk
431
355
  if (new_row_group) {
432
- storage->CheckFlushToDisk();
356
+ storage->WriteNewRowGroup();
433
357
  }
434
358
  }
435
359
 
@@ -448,6 +372,7 @@ void LocalStorage::LocalMerge(DataTable &table, RowGroupCollection &collection)
448
372
  }
449
373
  }
450
374
  storage.row_groups->MergeStorage(collection);
375
+ storage.merged_storage = true;
451
376
  }
452
377
 
453
378
  OptimisticDataWriter &LocalStorage::CreateOptimisticWriter(DataTable &table) {
@@ -455,6 +380,11 @@ OptimisticDataWriter &LocalStorage::CreateOptimisticWriter(DataTable &table) {
455
380
  return storage.CreateOptimisticWriter();
456
381
  }
457
382
 
383
+ void LocalStorage::FinalizeOptimisticWriter(DataTable &table, OptimisticDataWriter &writer) {
384
+ auto &storage = table_manager.GetOrCreateStorage(table);
385
+ storage.FinalizeOptimisticWriter(writer);
386
+ }
387
+
458
388
  bool LocalStorage::ChangesMade() noexcept {
459
389
  return !table_manager.IsEmpty();
460
390
  }
@@ -502,8 +432,8 @@ void LocalStorage::Flush(DataTable &table, LocalTableStorage &storage) {
502
432
  if ((append_state.row_start == 0 || storage.row_groups->GetTotalRows() >= MERGE_THRESHOLD) &&
503
433
  storage.deleted_rows == 0) {
504
434
  // table is currently empty OR we are bulk appending: move over the storage directly
505
- // first flush any out-standing storage nodes
506
- storage.FlushToDisk();
435
+ // first flush any outstanding blocks
436
+ storage.FlushBlocks();
507
437
  // now append to the indexes (if there are any)
508
438
  // FIXME: we should be able to merge the transaction-local index directly into the main table index
509
439
  // as long we just rewrite some row-ids
@@ -0,0 +1,96 @@
1
+ #include "duckdb/storage/optimistic_data_writer.hpp"
2
+ #include "duckdb/storage/table/column_segment.hpp"
3
+ #include "duckdb/storage/partial_block_manager.hpp"
4
+ #include "duckdb/storage/table/column_checkpoint_state.hpp"
5
+
6
+ namespace duckdb {
7
+
8
+ OptimisticDataWriter::OptimisticDataWriter(DataTable &table) : table(table) {
9
+ }
10
+
11
+ OptimisticDataWriter::OptimisticDataWriter(DataTable &table, OptimisticDataWriter &parent) : table(table) {
12
+ if (parent.partial_manager) {
13
+ parent.partial_manager->ClearBlocks();
14
+ }
15
+ }
16
+
17
+ OptimisticDataWriter::~OptimisticDataWriter() {
18
+ }
19
+
20
+ bool OptimisticDataWriter::PrepareWrite() {
21
+ // check if we should pre-emptively write the table to disk
22
+ if (table.info->IsTemporary() || StorageManager::Get(table.info->db).InMemory()) {
23
+ return false;
24
+ }
25
+ // we should! write the second-to-last row group to disk
26
+ // allocate the partial block-manager if none is allocated yet
27
+ if (!partial_manager) {
28
+ auto &block_manager = table.info->table_io_manager->GetBlockManagerForRowData();
29
+ partial_manager = make_uniq<PartialBlockManager>(block_manager, CheckpointType::APPEND_TO_TABLE);
30
+ }
31
+ return true;
32
+ }
33
+
34
+ void OptimisticDataWriter::WriteNewRowGroup(RowGroupCollection &row_groups) {
35
+ // we finished writing a complete row group
36
+ if (!PrepareWrite()) {
37
+ return;
38
+ }
39
+ // flush second-to-last row group
40
+ auto row_group = row_groups.GetRowGroup(-2);
41
+ FlushToDisk(row_group);
42
+ }
43
+
44
+ void OptimisticDataWriter::WriteLastRowGroup(RowGroupCollection &row_groups) {
45
+ // we finished writing a complete row group
46
+ if (!PrepareWrite()) {
47
+ return;
48
+ }
49
+ // flush second-to-last row group
50
+ auto row_group = row_groups.GetRowGroup(-1);
51
+ if (!row_group) {
52
+ return;
53
+ }
54
+ FlushToDisk(row_group);
55
+ }
56
+
57
+ void OptimisticDataWriter::FlushToDisk(RowGroup *row_group) {
58
+ if (!row_group) {
59
+ throw InternalException("FlushToDisk called without a RowGroup");
60
+ }
61
+ //! The set of column compression types (if any)
62
+ vector<CompressionType> compression_types;
63
+ D_ASSERT(compression_types.empty());
64
+ for (auto &column : table.column_definitions) {
65
+ compression_types.push_back(column.CompressionType());
66
+ }
67
+ row_group->WriteToDisk(*partial_manager, compression_types);
68
+ }
69
+
70
+ void OptimisticDataWriter::Merge(OptimisticDataWriter &other) {
71
+ if (!other.partial_manager) {
72
+ return;
73
+ }
74
+ if (!partial_manager) {
75
+ partial_manager = std::move(other.partial_manager);
76
+ return;
77
+ }
78
+ partial_manager->Merge(*other.partial_manager);
79
+ other.partial_manager.reset();
80
+ }
81
+
82
+ void OptimisticDataWriter::FinalFlush() {
83
+ if (partial_manager) {
84
+ partial_manager->FlushPartialBlocks();
85
+ partial_manager.reset();
86
+ }
87
+ }
88
+
89
+ void OptimisticDataWriter::Rollback() {
90
+ if (partial_manager) {
91
+ partial_manager->Rollback();
92
+ partial_manager.reset();
93
+ }
94
+ }
95
+
96
+ } // namespace duckdb
@@ -2,9 +2,10 @@
2
2
 
3
3
  namespace duckdb {
4
4
 
5
- PartialBlockManager::PartialBlockManager(BlockManager &block_manager, uint32_t max_partial_block_size,
6
- uint32_t max_use_count)
7
- : block_manager(block_manager), max_partial_block_size(max_partial_block_size), max_use_count(max_use_count) {
5
+ PartialBlockManager::PartialBlockManager(BlockManager &block_manager, CheckpointType checkpoint_type,
6
+ uint32_t max_partial_block_size, uint32_t max_use_count)
7
+ : block_manager(block_manager), checkpoint_type(checkpoint_type), max_partial_block_size(max_partial_block_size),
8
+ max_use_count(max_use_count) {
8
9
  }
9
10
  PartialBlockManager::~PartialBlockManager() {
10
11
  }
@@ -23,7 +24,9 @@ PartialBlockAllocation PartialBlockManager::GetBlockAllocation(uint32_t segment_
23
24
  //! there is! increase the reference count of this block
24
25
  allocation.partial_block->state.block_use_count += 1;
25
26
  allocation.state = allocation.partial_block->state;
26
- block_manager.IncreaseBlockReferenceCount(allocation.state.block_id);
27
+ if (checkpoint_type == CheckpointType::FULL_CHECKPOINT) {
28
+ block_manager.IncreaseBlockReferenceCount(allocation.state.block_id);
29
+ }
27
30
  } else {
28
31
  // full block: get a free block to write to
29
32
  AllocateBlock(allocation.state, segment_size);
@@ -31,9 +34,18 @@ PartialBlockAllocation PartialBlockManager::GetBlockAllocation(uint32_t segment_
31
34
  return allocation;
32
35
  }
33
36
 
37
+ bool PartialBlockManager::HasBlockAllocation(uint32_t segment_size) {
38
+ return segment_size <= max_partial_block_size &&
39
+ partially_filled_blocks.lower_bound(segment_size) != partially_filled_blocks.end();
40
+ }
41
+
34
42
  void PartialBlockManager::AllocateBlock(PartialBlockState &state, uint32_t segment_size) {
35
43
  D_ASSERT(segment_size <= Storage::BLOCK_SIZE);
36
- state.block_id = block_manager.GetFreeBlockId();
44
+ if (checkpoint_type == CheckpointType::FULL_CHECKPOINT) {
45
+ state.block_id = block_manager.GetFreeBlockId();
46
+ } else {
47
+ state.block_id = INVALID_BLOCK;
48
+ }
37
49
  state.block_size = Storage::BLOCK_SIZE;
38
50
  state.offset_in_block = 0;
39
51
  state.block_use_count = 1;
@@ -82,21 +94,73 @@ void PartialBlockManager::RegisterPartialBlock(PartialBlockAllocation &&allocati
82
94
  // Flush any block that we're not going to reuse.
83
95
  if (block_to_free) {
84
96
  block_to_free->Flush(free_space);
97
+ AddWrittenBlock(block_to_free->state.block_id);
85
98
  }
86
99
  }
87
100
 
88
- void PartialBlockManager::FlushPartialBlocks() {
101
+ void PartialBlock::Merge(PartialBlock &other, idx_t offset, idx_t other_size) {
102
+ throw InternalException("PartialBlock::Merge not implemented for this block type");
103
+ }
104
+
105
+ void PartialBlockManager::Merge(PartialBlockManager &other) {
106
+ if (&other == this) {
107
+ throw InternalException("Cannot merge into itself");
108
+ }
109
+ // for each partially filled block in the other manager, check if we can merge it into an existing block in this
110
+ // manager
111
+ for (auto &e : other.partially_filled_blocks) {
112
+ if (!e.second) {
113
+ throw InternalException("Empty partially filled block found");
114
+ }
115
+ auto used_space = Storage::BLOCK_SIZE - e.first;
116
+ if (HasBlockAllocation(used_space)) {
117
+ // we can merge this block into an existing block - merge them
118
+ // merge blocks
119
+ auto allocation = GetBlockAllocation(used_space);
120
+ allocation.partial_block->Merge(*e.second, allocation.state.offset_in_block, used_space);
121
+
122
+ // re-register the partial block
123
+ allocation.state.offset_in_block += used_space;
124
+ RegisterPartialBlock(std::move(allocation));
125
+ } else {
126
+ // we cannot merge this block - append it directly to the current block manager
127
+ partially_filled_blocks.insert(make_pair(e.first, std::move(e.second)));
128
+ }
129
+ }
130
+ // copy over the written blocks
131
+ for (auto &block_id : other.written_blocks) {
132
+ AddWrittenBlock(block_id);
133
+ }
134
+ other.written_blocks.clear();
135
+ other.partially_filled_blocks.clear();
136
+ }
137
+
138
+ void PartialBlockManager::AddWrittenBlock(block_id_t block) {
139
+ auto entry = written_blocks.insert(block);
140
+ if (!entry.second) {
141
+ throw InternalException("Written block already exists");
142
+ }
143
+ }
144
+
145
+ void PartialBlockManager::ClearBlocks() {
89
146
  for (auto &e : partially_filled_blocks) {
90
- e.second->Flush(e.first);
147
+ e.second->Clear();
91
148
  }
92
149
  partially_filled_blocks.clear();
93
150
  }
94
151
 
95
- void PartialBlockManager::Clear() {
152
+ void PartialBlockManager::FlushPartialBlocks() {
96
153
  for (auto &e : partially_filled_blocks) {
97
- e.second->Clear();
154
+ e.second->Flush(e.first);
98
155
  }
99
156
  partially_filled_blocks.clear();
100
157
  }
101
158
 
159
+ void PartialBlockManager::Rollback() {
160
+ ClearBlocks();
161
+ for (auto &block_id : written_blocks) {
162
+ block_manager.MarkBlockAsFree(block_id);
163
+ }
164
+ }
165
+
102
166
  } // namespace duckdb
@@ -287,7 +287,9 @@ void SingleFileBlockManager::MarkBlockAsFree(block_id_t block_id) {
287
287
  lock_guard<mutex> lock(block_lock);
288
288
  D_ASSERT(block_id >= 0);
289
289
  D_ASSERT(block_id < max_block);
290
- D_ASSERT(free_list.find(block_id) == free_list.end());
290
+ if (free_list.find(block_id) != free_list.end()) {
291
+ throw InternalException("MarkBlockAsFree called but block %llu was already freed!", block_id);
292
+ }
291
293
  multi_use_blocks.erase(block_id);
292
294
  free_list.insert(block_id);
293
295
  }
@@ -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
  }