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
@@ -26,8 +26,13 @@ PreservedError ClientContext::VerifyQuery(ClientContextLock &lock, const string
26
26
  if (config.query_verification_enabled) {
27
27
  statement_verifiers.emplace_back(StatementVerifier::Create(VerificationType::COPIED, stmt));
28
28
  statement_verifiers.emplace_back(StatementVerifier::Create(VerificationType::DESERIALIZED, stmt));
29
+ statement_verifiers.emplace_back(StatementVerifier::Create(VerificationType::DESERIALIZED_V2, stmt));
29
30
  statement_verifiers.emplace_back(StatementVerifier::Create(VerificationType::UNOPTIMIZED, stmt));
30
31
  prepared_statement_verifier = StatementVerifier::Create(VerificationType::PREPARED, stmt);
32
+ #ifdef DUCKDB_DEBUG_ASYNC_SINK_SOURCE
33
+ // This verification is quite slow, so we only run it for the async sink/source debug mode
34
+ statement_verifiers.emplace_back(StatementVerifier::Create(VerificationType::NO_OPERATOR_CACHING, stmt));
35
+ #endif
31
36
  }
32
37
  if (config.verify_external) {
33
38
  statement_verifiers.emplace_back(StatementVerifier::Create(VerificationType::EXTERNAL, stmt));
@@ -14,6 +14,10 @@
14
14
 
15
15
  namespace duckdb {
16
16
 
17
+ #ifdef DEBUG
18
+ bool DBConfigOptions::debug_print_bindings = false;
19
+ #endif
20
+
17
21
  #define DUCKDB_GLOBAL(_PARAM) \
18
22
  { \
19
23
  _PARAM::Name, _PARAM::Description, _PARAM::InputType, _PARAM::SetGlobal, nullptr, _PARAM::ResetGlobal, \
@@ -1,24 +1,24 @@
1
1
  #include "duckdb/main/database.hpp"
2
2
 
3
3
  #include "duckdb/catalog/catalog.hpp"
4
- #include "duckdb/main/database_manager.hpp"
5
4
  #include "duckdb/common/virtual_file_system.hpp"
5
+ #include "duckdb/execution/operator/helper/physical_set.hpp"
6
+ #include "duckdb/function/cast/cast_function_set.hpp"
7
+ #include "duckdb/function/compression_function.hpp"
8
+ #include "duckdb/main/attached_database.hpp"
6
9
  #include "duckdb/main/client_context.hpp"
7
- #include "duckdb/parallel/task_scheduler.hpp"
8
- #include "duckdb/storage/storage_manager.hpp"
9
- #include "duckdb/storage/object_cache.hpp"
10
- #include "duckdb/transaction/transaction_manager.hpp"
11
10
  #include "duckdb/main/connection_manager.hpp"
12
- #include "duckdb/function/compression_function.hpp"
13
- #include "duckdb/main/extension_helper.hpp"
14
- #include "duckdb/function/cast/cast_function_set.hpp"
11
+ #include "duckdb/main/database_manager.hpp"
15
12
  #include "duckdb/main/error_manager.hpp"
16
- #include "duckdb/main/attached_database.hpp"
13
+ #include "duckdb/main/extension_helper.hpp"
14
+ #include "duckdb/parallel/task_scheduler.hpp"
17
15
  #include "duckdb/parser/parsed_data/attach_info.hpp"
18
- #include "duckdb/storage/magic_bytes.hpp"
19
- #include "duckdb/storage/storage_extension.hpp"
20
- #include "duckdb/execution/operator/helper/physical_set.hpp"
16
+ #include "duckdb/storage/object_cache.hpp"
21
17
  #include "duckdb/storage/standard_buffer_manager.hpp"
18
+ #include "duckdb/main/database_path_and_type.hpp"
19
+ #include "duckdb/storage/storage_extension.hpp"
20
+ #include "duckdb/storage/storage_manager.hpp"
21
+ #include "duckdb/transaction/transaction_manager.hpp"
22
22
 
23
23
  #ifndef DUCKDB_NO_THREADS
24
24
  #include "duckdb/common/thread.hpp"
@@ -129,22 +129,6 @@ ConnectionManager &ConnectionManager::Get(ClientContext &context) {
129
129
  return ConnectionManager::Get(DatabaseInstance::GetDatabase(context));
130
130
  }
131
131
 
132
- string DatabaseInstance::ExtractDatabaseType(string &path) {
133
- // first check if there is an existing prefix
134
- auto extension = ExtensionHelper::ExtractExtensionPrefixFromPath(path);
135
- if (!extension.empty()) {
136
- // path is prefixed with an extension - remove it
137
- path = StringUtil::Replace(path, extension + ":", "");
138
- return extension;
139
- }
140
- // if there isn't - check the magic bytes of the file (if any)
141
- auto file_type = MagicBytes::CheckMagicBytes(config.file_system.get(), path);
142
- if (file_type == DataFileType::SQLITE_FILE) {
143
- return "sqlite";
144
- }
145
- return string();
146
- }
147
-
148
132
  duckdb::unique_ptr<AttachedDatabase> DatabaseInstance::CreateAttachedDatabase(AttachInfo &info, const string &type,
149
133
  AccessMode access_mode) {
150
134
  duckdb::unique_ptr<AttachedDatabase> attached_database;
@@ -172,12 +156,12 @@ duckdb::unique_ptr<AttachedDatabase> DatabaseInstance::CreateAttachedDatabase(At
172
156
  return attached_database;
173
157
  }
174
158
 
175
- void DatabaseInstance::CreateDatabase(const string &database_type) {
159
+ void DatabaseInstance::CreateMainDatabase() {
176
160
  AttachInfo info;
177
161
  info.name = AttachedDatabase::ExtractDatabaseName(config.options.database_path);
178
162
  info.path = config.options.database_path;
179
163
 
180
- auto attached_database = CreateAttachedDatabase(info, database_type, config.options.access_mode);
164
+ auto attached_database = CreateAttachedDatabase(info, config.options.database_type, config.options.access_mode);
181
165
  auto initial_database = attached_database.get();
182
166
  {
183
167
  Connection con(*this);
@@ -235,14 +219,18 @@ void DatabaseInstance::Initialize(const char *database_path, DBConfig *user_conf
235
219
  connection_manager = make_uniq<ConnectionManager>();
236
220
 
237
221
  // check if we are opening a standard DuckDB database or an extension database
238
- auto database_type = ExtractDatabaseType(config.options.database_path);
222
+ if (config.options.database_type.empty()) {
223
+ auto path_and_type = DBPathAndType::Parse(config.options.database_path, config);
224
+ config.options.database_type = path_and_type.type;
225
+ config.options.database_path = path_and_type.path;
226
+ }
239
227
 
240
228
  // initialize the system catalog
241
229
  db_manager->InitializeSystemCatalog();
242
230
 
243
- if (!database_type.empty()) {
231
+ if (!config.options.database_type.empty()) {
244
232
  // if we are opening an extension database - load the extension
245
- ExtensionHelper::LoadExternalExtension(*this, nullptr, database_type);
233
+ ExtensionHelper::LoadExternalExtension(*this, nullptr, config.options.database_type);
246
234
  }
247
235
 
248
236
  if (!config.options.unrecognized_options.empty()) {
@@ -250,7 +238,7 @@ void DatabaseInstance::Initialize(const char *database_path, DBConfig *user_conf
250
238
  }
251
239
 
252
240
  if (!db_manager->HasDefaultDatabase()) {
253
- CreateDatabase(database_type);
241
+ CreateMainDatabase();
254
242
  }
255
243
 
256
244
  // only increase thread count after storage init because we get races on catalog otherwise
@@ -0,0 +1,23 @@
1
+ #include "duckdb/main/database_path_and_type.hpp"
2
+
3
+ #include "duckdb/main/extension_helper.hpp"
4
+ #include "duckdb/storage/magic_bytes.hpp"
5
+
6
+ namespace duckdb {
7
+
8
+ DBPathAndType DBPathAndType::Parse(const string &combined_path, const DBConfig &config) {
9
+ auto extension = ExtensionHelper::ExtractExtensionPrefixFromPath(combined_path);
10
+ if (!extension.empty()) {
11
+ // path is prefixed with an extension - remove it
12
+ auto path = StringUtil::Replace(combined_path, extension + ":", "");
13
+ auto type = ExtensionHelper::ApplyExtensionAlias(extension);
14
+ return {path, type};
15
+ }
16
+ // if there isn't - check the magic bytes of the file (if any)
17
+ auto file_type = MagicBytes::CheckMagicBytes(config.file_system.get(), combined_path);
18
+ if (file_type == DataFileType::SQLITE_FILE) {
19
+ return {combined_path, "sqlite"};
20
+ }
21
+ return {combined_path, string()};
22
+ }
23
+ } // namespace duckdb
@@ -30,14 +30,18 @@ static T LoadFunctionFromDLL(void *dll, const string &function_name, const strin
30
30
  return (T)function;
31
31
  }
32
32
 
33
- void ComputeSHA256(FileHandle *handle, const idx_t start, const idx_t end, std::string *res) {
33
+ static void ComputeSHA256String(const std::string &to_hash, std::string *res) {
34
+ // Invoke MbedTls function to actually compute sha256
35
+ *res = duckdb_mbedtls::MbedTlsWrapper::ComputeSha256Hash(to_hash);
36
+ }
37
+
38
+ static void ComputeSHA256FileSegment(FileHandle *handle, const idx_t start, const idx_t end, std::string *res) {
34
39
  const idx_t len = end - start;
35
40
  string file_content;
36
41
  file_content.resize(len);
37
42
  handle->Read((void *)file_content.data(), len, start);
38
43
 
39
- // Invoke MbedTls function to actually compute sha256
40
- *res = duckdb_mbedtls::MbedTlsWrapper::ComputeSha256Hash(file_content);
44
+ ComputeSHA256String(file_content, res);
41
45
  }
42
46
 
43
47
  bool ExtensionHelper::TryInitialLoad(DBConfig &config, FileOpener *opener, const string &extension,
@@ -86,19 +90,19 @@ bool ExtensionHelper::TryInitialLoad(DBConfig &config, FileOpener *opener, const
86
90
 
87
91
  const idx_t maxLenChunks = 1024 * 1024;
88
92
  const idx_t numChunks = (signature_offset + maxLenChunks - 1) / maxLenChunks;
89
- std::vector<std::string> chunks(numChunks);
93
+ std::vector<std::string> hash_chunks(numChunks);
90
94
  std::vector<idx_t> splits(numChunks + 1);
91
95
 
92
- splits.back() = signature_offset;
93
- for (idx_t i = 0; i < chunks.size(); i++) {
96
+ for (idx_t i = 0; i < numChunks; i++) {
94
97
  splits[i] = maxLenChunks * i;
95
98
  }
99
+ splits.back() = signature_offset;
96
100
 
97
101
  #ifndef DUCKDB_NO_THREADS
98
102
  std::vector<std::thread> threads;
99
103
  threads.reserve(numChunks);
100
104
  for (idx_t i = 0; i < numChunks; i++) {
101
- threads.emplace_back(ComputeSHA256, handle.get(), splits[i], splits[i + 1], &chunks[i]);
105
+ threads.emplace_back(ComputeSHA256FileSegment, handle.get(), splits[i], splits[i + 1], &hash_chunks[i]);
102
106
  }
103
107
 
104
108
  for (auto &thread : threads) {
@@ -106,26 +110,26 @@ bool ExtensionHelper::TryInitialLoad(DBConfig &config, FileOpener *opener, const
106
110
  }
107
111
  #else
108
112
  for (idx_t i = 0; i < numChunks; i++) {
109
- ComputeSHA256(handle.get(), splits[i], splits[i + 1], &chunks[i]);
113
+ ComputeSHA256FileSegment(handle.get(), splits[i], splits[i + 1], &hash_chunks[i]);
110
114
  }
111
115
  #endif // DUCKDB_NO_THREADS
112
116
 
113
- string file_content;
114
- file_content.reserve(256 * numChunks);
117
+ string hash_concatenation;
118
+ hash_concatenation.reserve(32 * numChunks); // 256 bits -> 32 bytes per chunk
115
119
 
116
- for (auto &chunk : chunks) {
117
- file_content += chunk;
120
+ for (auto &hash_chunk : hash_chunks) {
121
+ hash_concatenation += hash_chunk;
118
122
  }
119
123
 
120
- string hash;
121
- ComputeSHA256(handle.get(), 0, file_content.size(), &hash);
124
+ string two_level_hash;
125
+ ComputeSHA256String(hash_concatenation, &two_level_hash);
122
126
 
123
127
  // TODO maybe we should do a stream read / hash update here
124
128
  handle->Read((void *)signature.data(), signature.size(), signature_offset);
125
129
 
126
130
  bool any_valid = false;
127
131
  for (auto &key : ExtensionHelper::GetPublicKeys()) {
128
- if (duckdb_mbedtls::MbedTlsWrapper::IsValidSha256Signature(key, signature, hash)) {
132
+ if (duckdb_mbedtls::MbedTlsWrapper::IsValidSha256Signature(key, signature, two_level_hash)) {
129
133
  any_valid = true;
130
134
  break;
131
135
  }
@@ -3,6 +3,7 @@
3
3
  #include "duckdb/parser/query_node/select_node.hpp"
4
4
  #include "duckdb/parser/expression/star_expression.hpp"
5
5
  #include "duckdb/parser/tableref/joinref.hpp"
6
+ #include "duckdb/common/enum_util.hpp"
6
7
 
7
8
  namespace duckdb {
8
9
 
@@ -51,7 +52,7 @@ const vector<ColumnDefinition> &JoinRelation::Columns() {
51
52
 
52
53
  string JoinRelation::ToString(idx_t depth) {
53
54
  string str = RenderWhitespace(depth);
54
- str += "Join " + JoinTypeToString(join_type);
55
+ str += "Join " + EnumUtil::ToString(join_type);
55
56
  if (condition) {
56
57
  str += " " + condition->GetName();
57
58
  }
@@ -11,8 +11,7 @@ SetOpRelation::SetOpRelation(shared_ptr<Relation> left_p, shared_ptr<Relation> r
11
11
  if (left->context.GetContext() != right->context.GetContext()) {
12
12
  throw Exception("Cannot combine LEFT and RIGHT relations of different connections!");
13
13
  }
14
- vector<ColumnDefinition> dummy_columns;
15
- context.GetContext()->TryBindRelation(*this, dummy_columns);
14
+ context.GetContext()->TryBindRelation(*this, this->columns);
16
15
  }
17
16
 
18
17
  unique_ptr<QueryNode> SetOpRelation::GetQueryNode() {
@@ -31,7 +30,7 @@ string SetOpRelation::GetAlias() {
31
30
  }
32
31
 
33
32
  const vector<ColumnDefinition> &SetOpRelation::Columns() {
34
- return left->Columns();
33
+ return this->columns;
35
34
  }
36
35
 
37
36
  string SetOpRelation::ToString(idx_t depth) {
@@ -72,7 +72,7 @@ void Event::InsertEvent(shared_ptr<Event> replacement_event) {
72
72
  executor.AddEvent(std::move(replacement_event));
73
73
  }
74
74
 
75
- void Event::SetTasks(vector<unique_ptr<Task>> tasks) {
75
+ void Event::SetTasks(vector<shared_ptr<Task>> tasks) {
76
76
  auto &ts = TaskScheduler::GetScheduler(executor.context);
77
77
  D_ASSERT(total_tasks == 0);
78
78
  D_ASSERT(!tasks.empty());
@@ -359,6 +359,7 @@ void Executor::CancelTasks() {
359
359
  }
360
360
  pipelines.clear();
361
361
  root_pipelines.clear();
362
+ to_be_rescheduled_tasks.clear();
362
363
  events.clear();
363
364
  }
364
365
  WorkOnTasks();
@@ -375,13 +376,44 @@ void Executor::CancelTasks() {
375
376
  void Executor::WorkOnTasks() {
376
377
  auto &scheduler = TaskScheduler::GetScheduler(context);
377
378
 
378
- unique_ptr<Task> task;
379
+ shared_ptr<Task> task;
379
380
  while (scheduler.GetTaskFromProducer(*producer, task)) {
380
- task->Execute(TaskExecutionMode::PROCESS_ALL);
381
+ auto res = task->Execute(TaskExecutionMode::PROCESS_ALL);
382
+ if (res == TaskExecutionResult::TASK_BLOCKED) {
383
+ task->Deschedule();
384
+ }
381
385
  task.reset();
382
386
  }
383
387
  }
384
388
 
389
+ void Executor::RescheduleTask(shared_ptr<Task> &task) {
390
+ // This function will spin lock until the task provided is added to the to_be_rescheduled_tasks
391
+ while (true) {
392
+ lock_guard<mutex> l(executor_lock);
393
+ if (cancelled) {
394
+ return;
395
+ }
396
+ auto entry = to_be_rescheduled_tasks.find(task.get());
397
+ if (entry != to_be_rescheduled_tasks.end()) {
398
+ auto &scheduler = TaskScheduler::GetScheduler(context);
399
+ to_be_rescheduled_tasks.erase(task.get());
400
+ scheduler.ScheduleTask(GetToken(), task);
401
+ break;
402
+ }
403
+ }
404
+ }
405
+
406
+ void Executor::AddToBeRescheduled(shared_ptr<Task> &task) {
407
+ lock_guard<mutex> l(executor_lock);
408
+ if (cancelled) {
409
+ return;
410
+ }
411
+ if (to_be_rescheduled_tasks.find(task.get()) != to_be_rescheduled_tasks.end()) {
412
+ return;
413
+ }
414
+ to_be_rescheduled_tasks[task.get()] = std::move(task);
415
+ }
416
+
385
417
  bool Executor::ExecutionIsFinished() {
386
418
  return completed_pipelines >= total_pipelines || HasError();
387
419
  }
@@ -400,7 +432,10 @@ PendingExecutionResult Executor::ExecuteTask() {
400
432
  if (task) {
401
433
  // if we have a task, partially process it
402
434
  auto result = task->Execute(TaskExecutionMode::PROCESS_PARTIAL);
403
- if (result != TaskExecutionResult::TASK_NOT_FINISHED) {
435
+ if (result == TaskExecutionResult::TASK_BLOCKED) {
436
+ task->Deschedule();
437
+ task.reset();
438
+ } else if (result == TaskExecutionResult::TASK_FINISHED) {
404
439
  // if the task is finished, clean it up
405
440
  task.reset();
406
441
  }
@@ -444,6 +479,7 @@ void Executor::Reset() {
444
479
  exceptions.clear();
445
480
  pipelines.clear();
446
481
  events.clear();
482
+ to_be_rescheduled_tasks.clear();
447
483
  execution_result = PendingExecutionResult::RESULT_NOT_READY;
448
484
  }
449
485
 
@@ -1,5 +1,6 @@
1
1
  #include "duckdb/parallel/task.hpp"
2
2
  #include "duckdb/execution/executor.hpp"
3
+ #include "duckdb/main/client_context.hpp"
3
4
 
4
5
  namespace duckdb {
5
6
 
@@ -12,6 +13,16 @@ ExecutorTask::ExecutorTask(ClientContext &context) : ExecutorTask(Executor::Get(
12
13
  ExecutorTask::~ExecutorTask() {
13
14
  }
14
15
 
16
+ void ExecutorTask::Deschedule() {
17
+ auto this_ptr = shared_from_this();
18
+ executor.AddToBeRescheduled(this_ptr);
19
+ }
20
+
21
+ void ExecutorTask::Reschedule() {
22
+ auto this_ptr = shared_from_this();
23
+ executor.RescheduleTask(this_ptr);
24
+ }
25
+
15
26
  TaskExecutionResult ExecutorTask::Execute(TaskExecutionMode mode) {
16
27
  try {
17
28
  return ExecuteTask(mode);
@@ -0,0 +1,57 @@
1
+ #include "duckdb/parallel/interrupt.hpp"
2
+ #include "duckdb/execution/executor.hpp"
3
+ #include "duckdb/main/client_context.hpp"
4
+ #include "duckdb/common/atomic.hpp"
5
+ #include "duckdb/common/mutex.hpp"
6
+ #include <condition_variable>
7
+
8
+ namespace duckdb {
9
+
10
+ InterruptState::InterruptState() : mode(InterruptMode::NO_INTERRUPTS) {
11
+ }
12
+ InterruptState::InterruptState(weak_ptr<Task> task) : mode(InterruptMode::TASK), current_task(std::move(task)) {
13
+ }
14
+ InterruptState::InterruptState(weak_ptr<InterruptDoneSignalState> signal_state_p)
15
+ : mode(InterruptMode::BLOCKING), signal_state(std::move(signal_state_p)) {
16
+ }
17
+
18
+ void InterruptState::Callback() const {
19
+ if (mode == InterruptMode::TASK) {
20
+ auto task = current_task.lock();
21
+
22
+ if (!task) {
23
+ return;
24
+ }
25
+
26
+ task->Reschedule();
27
+ } else if (mode == InterruptMode::BLOCKING) {
28
+ auto signal_state_l = signal_state.lock();
29
+
30
+ if (!signal_state_l) {
31
+ return;
32
+ }
33
+
34
+ // Signal the caller, who is currently blocked
35
+ signal_state_l->Signal();
36
+ } else {
37
+ throw InternalException("Callback made on InterruptState without valid interrupt mode specified");
38
+ }
39
+ }
40
+
41
+ void InterruptDoneSignalState::Signal() {
42
+ {
43
+ unique_lock<mutex> lck {lock};
44
+ done = true;
45
+ }
46
+ cv.notify_all();
47
+ }
48
+
49
+ void InterruptDoneSignalState::Await() {
50
+ std::unique_lock<std::mutex> lck(lock);
51
+ cv.wait(lck, [&]() { return done; });
52
+
53
+ // Reset after signal received
54
+ done = false;
55
+ }
56
+
57
+ } // namespace duckdb
@@ -12,7 +12,6 @@
12
12
  #include "duckdb/parallel/pipeline_event.hpp"
13
13
  #include "duckdb/parallel/pipeline_executor.hpp"
14
14
  #include "duckdb/parallel/task_scheduler.hpp"
15
- #include "duckdb/parallel/thread_context.hpp"
16
15
 
17
16
  namespace duckdb {
18
17
 
@@ -33,14 +32,32 @@ public:
33
32
  if (!pipeline_executor) {
34
33
  pipeline_executor = make_uniq<PipelineExecutor>(pipeline.GetClientContext(), pipeline);
35
34
  }
35
+
36
+ pipeline_executor->SetTaskForInterrupts(shared_from_this());
37
+
36
38
  if (mode == TaskExecutionMode::PROCESS_PARTIAL) {
37
- bool finished = pipeline_executor->Execute(PARTIAL_CHUNK_COUNT);
38
- if (!finished) {
39
+ auto res = pipeline_executor->Execute(PARTIAL_CHUNK_COUNT);
40
+
41
+ switch (res) {
42
+ case PipelineExecuteResult::NOT_FINISHED:
39
43
  return TaskExecutionResult::TASK_NOT_FINISHED;
44
+ case PipelineExecuteResult::INTERRUPTED:
45
+ return TaskExecutionResult::TASK_BLOCKED;
46
+ case PipelineExecuteResult::FINISHED:
47
+ break;
40
48
  }
41
49
  } else {
42
- pipeline_executor->Execute();
50
+ auto res = pipeline_executor->Execute();
51
+ switch (res) {
52
+ case PipelineExecuteResult::NOT_FINISHED:
53
+ throw InternalException("Execute without limit should not return NOT_FINISHED");
54
+ case PipelineExecuteResult::INTERRUPTED:
55
+ return TaskExecutionResult::TASK_BLOCKED;
56
+ case PipelineExecuteResult::FINISHED:
57
+ break;
58
+ }
43
59
  }
60
+
44
61
  event->FinishTask();
45
62
  pipeline_executor.reset();
46
63
  return TaskExecutionResult::TASK_FINISHED;
@@ -68,7 +85,7 @@ bool Pipeline::GetProgress(double &current_percentage, idx_t &source_cardinality
68
85
  }
69
86
 
70
87
  void Pipeline::ScheduleSequentialTask(shared_ptr<Event> &event) {
71
- vector<unique_ptr<Task>> tasks;
88
+ vector<shared_ptr<Task>> tasks;
72
89
  tasks.push_back(make_uniq<PipelineTask>(*this, event));
73
90
  event->SetTasks(std::move(tasks));
74
91
  }
@@ -149,7 +166,7 @@ bool Pipeline::LaunchScanTasks(shared_ptr<Event> &event, idx_t max_threads) {
149
166
  }
150
167
 
151
168
  // launch a task for every thread
152
- vector<unique_ptr<Task>> tasks;
169
+ vector<shared_ptr<Task>> tasks;
153
170
  for (idx_t i = 0; i < max_threads; i++) {
154
171
  tasks.push_back(make_uniq<PipelineTask>(*this, event));
155
172
  }
@@ -265,6 +282,32 @@ vector<const_reference<PhysicalOperator>> Pipeline::GetOperators() const {
265
282
  return result;
266
283
  }
267
284
 
285
+ void Pipeline::ClearSource() {
286
+ source_state.reset();
287
+ batch_indexes.clear();
288
+ }
289
+
290
+ idx_t Pipeline::RegisterNewBatchIndex() {
291
+ lock_guard<mutex> l(batch_lock);
292
+ idx_t minimum = batch_indexes.empty() ? base_batch_index : *batch_indexes.begin();
293
+ batch_indexes.insert(minimum);
294
+ return minimum;
295
+ }
296
+
297
+ idx_t Pipeline::UpdateBatchIndex(idx_t old_index, idx_t new_index) {
298
+ lock_guard<mutex> l(batch_lock);
299
+ if (new_index < *batch_indexes.begin()) {
300
+ throw InternalException("Processing batch index %llu, but previous min batch index was %llu", new_index,
301
+ *batch_indexes.begin());
302
+ }
303
+ auto entry = batch_indexes.find(old_index);
304
+ if (entry == batch_indexes.end()) {
305
+ throw InternalException("Batch index %llu was not found in set of active batch indexes", old_index);
306
+ }
307
+ batch_indexes.erase(entry);
308
+ batch_indexes.insert(new_index);
309
+ return *batch_indexes.begin();
310
+ }
268
311
  //===--------------------------------------------------------------------===//
269
312
  // Pipeline Build State
270
313
  //===--------------------------------------------------------------------===//