duckdb 0.7.2-dev2507.0 → 0.7.2-dev2675.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. package/binding.gyp +7 -7
  2. package/package.json +2 -2
  3. package/src/connection.cpp +1 -1
  4. package/src/duckdb/extension/icu/icu-dateadd.cpp +3 -3
  5. package/src/duckdb/extension/icu/icu-datepart.cpp +3 -3
  6. package/src/duckdb/extension/icu/icu-datesub.cpp +2 -2
  7. package/src/duckdb/extension/icu/icu-datetrunc.cpp +1 -1
  8. package/src/duckdb/extension/icu/icu-extension.cpp +3 -3
  9. package/src/duckdb/extension/icu/icu-list-range.cpp +2 -2
  10. package/src/duckdb/extension/icu/icu-makedate.cpp +1 -1
  11. package/src/duckdb/extension/icu/icu-strptime.cpp +4 -4
  12. package/src/duckdb/extension/icu/icu-table-range.cpp +2 -2
  13. package/src/duckdb/extension/icu/icu-timebucket.cpp +1 -1
  14. package/src/duckdb/extension/icu/icu-timezone.cpp +4 -4
  15. package/src/duckdb/extension/json/json-extension.cpp +6 -6
  16. package/src/duckdb/extension/parquet/parquet-extension.cpp +9 -8
  17. package/src/duckdb/extension/parquet/parquet_statistics.cpp +3 -0
  18. package/src/duckdb/src/catalog/catalog.cpp +166 -127
  19. package/src/duckdb/src/catalog/catalog_entry/copy_function_catalog_entry.cpp +3 -3
  20. package/src/duckdb/src/catalog/catalog_entry/duck_index_entry.cpp +1 -1
  21. package/src/duckdb/src/catalog/catalog_entry/duck_schema_entry.cpp +90 -82
  22. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +65 -67
  23. package/src/duckdb/src/catalog/catalog_entry/index_catalog_entry.cpp +3 -3
  24. package/src/duckdb/src/catalog/catalog_entry/pragma_function_catalog_entry.cpp +4 -4
  25. package/src/duckdb/src/catalog/catalog_entry/scalar_function_catalog_entry.cpp +8 -8
  26. package/src/duckdb/src/catalog/catalog_entry/scalar_macro_catalog_entry.cpp +10 -10
  27. package/src/duckdb/src/catalog/catalog_entry/schema_catalog_entry.cpp +6 -6
  28. package/src/duckdb/src/catalog/catalog_entry/sequence_catalog_entry.cpp +6 -6
  29. package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +4 -4
  30. package/src/duckdb/src/catalog/catalog_entry/table_function_catalog_entry.cpp +9 -9
  31. package/src/duckdb/src/catalog/catalog_entry/type_catalog_entry.cpp +5 -5
  32. package/src/duckdb/src/catalog/catalog_entry/view_catalog_entry.cpp +23 -23
  33. package/src/duckdb/src/catalog/catalog_entry.cpp +27 -6
  34. package/src/duckdb/src/catalog/catalog_search_path.cpp +2 -2
  35. package/src/duckdb/src/catalog/catalog_set.cpp +84 -87
  36. package/src/duckdb/src/catalog/catalog_transaction.cpp +1 -1
  37. package/src/duckdb/src/catalog/default/default_functions.cpp +1 -1
  38. package/src/duckdb/src/catalog/default/default_schemas.cpp +1 -1
  39. package/src/duckdb/src/catalog/default/default_types.cpp +1 -1
  40. package/src/duckdb/src/catalog/default/default_views.cpp +1 -1
  41. package/src/duckdb/src/catalog/dependency_list.cpp +2 -2
  42. package/src/duckdb/src/catalog/dependency_manager.cpp +9 -10
  43. package/src/duckdb/src/catalog/duck_catalog.cpp +30 -26
  44. package/src/duckdb/src/catalog/similar_catalog_entry.cpp +1 -1
  45. package/src/duckdb/src/common/radix_partitioning.cpp +1 -1
  46. package/src/duckdb/src/common/types.cpp +15 -27
  47. package/src/duckdb/src/execution/index/art/art.cpp +286 -269
  48. package/src/duckdb/src/execution/index/art/art_key.cpp +22 -32
  49. package/src/duckdb/src/execution/index/art/fixed_size_allocator.cpp +224 -0
  50. package/src/duckdb/src/execution/index/art/iterator.cpp +142 -123
  51. package/src/duckdb/src/execution/index/art/leaf.cpp +319 -170
  52. package/src/duckdb/src/execution/index/art/leaf_segment.cpp +42 -0
  53. package/src/duckdb/src/execution/index/art/node.cpp +444 -379
  54. package/src/duckdb/src/execution/index/art/node16.cpp +178 -114
  55. package/src/duckdb/src/execution/index/art/node256.cpp +117 -79
  56. package/src/duckdb/src/execution/index/art/node4.cpp +169 -114
  57. package/src/duckdb/src/execution/index/art/node48.cpp +175 -105
  58. package/src/duckdb/src/execution/index/art/prefix.cpp +405 -127
  59. package/src/duckdb/src/execution/index/art/prefix_segment.cpp +42 -0
  60. package/src/duckdb/src/execution/index/art/swizzleable_pointer.cpp +10 -85
  61. package/src/duckdb/src/execution/operator/join/physical_index_join.cpp +4 -3
  62. package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +2 -2
  63. package/src/duckdb/src/execution/operator/persistent/csv_reader_options.cpp +2 -0
  64. package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +4 -3
  65. package/src/duckdb/src/execution/operator/persistent/physical_export.cpp +19 -18
  66. package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +5 -5
  67. package/src/duckdb/src/execution/operator/schema/physical_alter.cpp +1 -1
  68. package/src/duckdb/src/execution/operator/schema/physical_create_function.cpp +1 -1
  69. package/src/duckdb/src/execution/operator/schema/physical_create_index.cpp +17 -17
  70. package/src/duckdb/src/execution/operator/schema/physical_create_schema.cpp +1 -1
  71. package/src/duckdb/src/execution/operator/schema/physical_create_sequence.cpp +1 -1
  72. package/src/duckdb/src/execution/operator/schema/physical_create_table.cpp +2 -2
  73. package/src/duckdb/src/execution/operator/schema/physical_create_type.cpp +4 -3
  74. package/src/duckdb/src/execution/operator/schema/physical_create_view.cpp +1 -1
  75. package/src/duckdb/src/execution/operator/schema/physical_detach.cpp +1 -1
  76. package/src/duckdb/src/execution/operator/schema/physical_drop.cpp +2 -2
  77. package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +1 -1
  78. package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +4 -4
  79. package/src/duckdb/src/execution/physical_plan/plan_create_table.cpp +4 -3
  80. package/src/duckdb/src/execution/physical_plan/plan_delete.cpp +1 -1
  81. package/src/duckdb/src/execution/physical_plan/plan_insert.cpp +1 -1
  82. package/src/duckdb/src/execution/physical_plan/plan_update.cpp +1 -1
  83. package/src/duckdb/src/function/built_in_functions.cpp +10 -10
  84. package/src/duckdb/src/function/function_binder.cpp +3 -3
  85. package/src/duckdb/src/function/scalar/list/list_aggregates.cpp +5 -6
  86. package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +2 -2
  87. package/src/duckdb/src/function/scalar/sequence/nextval.cpp +9 -8
  88. package/src/duckdb/src/function/scalar/system/aggregate_export.cpp +6 -6
  89. package/src/duckdb/src/function/table/arrow.cpp +5 -5
  90. package/src/duckdb/src/function/table/read_csv.cpp +5 -1
  91. package/src/duckdb/src/function/table/system/duckdb_columns.cpp +8 -7
  92. package/src/duckdb/src/function/table/system/duckdb_constraints.cpp +14 -14
  93. package/src/duckdb/src/function/table/system/duckdb_databases.cpp +2 -2
  94. package/src/duckdb/src/function/table/system/duckdb_functions.cpp +26 -25
  95. package/src/duckdb/src/function/table/system/duckdb_indexes.cpp +13 -12
  96. package/src/duckdb/src/function/table/system/duckdb_schemas.cpp +7 -7
  97. package/src/duckdb/src/function/table/system/duckdb_sequences.cpp +8 -9
  98. package/src/duckdb/src/function/table/system/duckdb_tables.cpp +10 -9
  99. package/src/duckdb/src/function/table/system/duckdb_types.cpp +13 -13
  100. package/src/duckdb/src/function/table/system/duckdb_views.cpp +11 -10
  101. package/src/duckdb/src/function/table/system/pragma_collations.cpp +2 -2
  102. package/src/duckdb/src/function/table/system/pragma_database_size.cpp +5 -5
  103. package/src/duckdb/src/function/table/system/pragma_storage_info.cpp +3 -3
  104. package/src/duckdb/src/function/table/system/pragma_table_info.cpp +2 -2
  105. package/src/duckdb/src/function/table/table_scan.cpp +39 -37
  106. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  107. package/src/duckdb/src/function/udf_function.cpp +2 -2
  108. package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +122 -81
  109. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/aggregate_function_catalog_entry.hpp +2 -3
  110. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/collate_catalog_entry.hpp +3 -3
  111. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/copy_function_catalog_entry.hpp +1 -1
  112. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_index_entry.hpp +1 -1
  113. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_schema_entry.hpp +24 -20
  114. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_table_entry.hpp +3 -3
  115. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/index_catalog_entry.hpp +1 -1
  116. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/macro_catalog_entry.hpp +2 -2
  117. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/pragma_function_catalog_entry.hpp +1 -1
  118. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/scalar_function_catalog_entry.hpp +2 -2
  119. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/scalar_macro_catalog_entry.hpp +1 -1
  120. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/schema_catalog_entry.hpp +22 -17
  121. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/sequence_catalog_entry.hpp +1 -1
  122. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_catalog_entry.hpp +1 -1
  123. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_function_catalog_entry.hpp +2 -2
  124. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_macro_catalog_entry.hpp +1 -1
  125. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/type_catalog_entry.hpp +1 -1
  126. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/view_catalog_entry.hpp +3 -3
  127. package/src/duckdb/src/include/duckdb/catalog/catalog_entry.hpp +28 -7
  128. package/src/duckdb/src/include/duckdb/catalog/catalog_set.hpp +20 -19
  129. package/src/duckdb/src/include/duckdb/catalog/duck_catalog.hpp +9 -9
  130. package/src/duckdb/src/include/duckdb/catalog/similar_catalog_entry.hpp +2 -1
  131. package/src/duckdb/src/include/duckdb/catalog/standard_entry.hpp +10 -4
  132. package/src/duckdb/src/include/duckdb/common/enums/on_entry_not_found.hpp +17 -0
  133. package/src/duckdb/src/include/duckdb/common/queue.hpp +1 -1
  134. package/src/duckdb/src/include/duckdb/common/types.hpp +3 -4
  135. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +53 -45
  136. package/src/duckdb/src/include/duckdb/execution/index/art/art_key.hpp +29 -24
  137. package/src/duckdb/src/include/duckdb/execution/index/art/fixed_size_allocator.hpp +114 -0
  138. package/src/duckdb/src/include/duckdb/execution/index/art/iterator.hpp +26 -20
  139. package/src/duckdb/src/include/duckdb/execution/index/art/leaf.hpp +63 -39
  140. package/src/duckdb/src/include/duckdb/execution/index/art/leaf_segment.hpp +36 -0
  141. package/src/duckdb/src/include/duckdb/execution/index/art/node.hpp +98 -116
  142. package/src/duckdb/src/include/duckdb/execution/index/art/node16.hpp +48 -36
  143. package/src/duckdb/src/include/duckdb/execution/index/art/node256.hpp +52 -35
  144. package/src/duckdb/src/include/duckdb/execution/index/art/node4.hpp +46 -36
  145. package/src/duckdb/src/include/duckdb/execution/index/art/node48.hpp +57 -35
  146. package/src/duckdb/src/include/duckdb/execution/index/art/prefix.hpp +57 -50
  147. package/src/duckdb/src/include/duckdb/execution/index/art/prefix_segment.hpp +40 -0
  148. package/src/duckdb/src/include/duckdb/execution/index/art/swizzleable_pointer.hpp +38 -31
  149. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_file_handle.hpp +2 -1
  150. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +2 -0
  151. package/src/duckdb/src/include/duckdb/function/function_serialization.hpp +4 -4
  152. package/src/duckdb/src/include/duckdb/function/scalar_function.hpp +3 -2
  153. package/src/duckdb/src/include/duckdb/function/table/table_scan.hpp +5 -4
  154. package/src/duckdb/src/include/duckdb/function/table_function.hpp +28 -15
  155. package/src/duckdb/src/include/duckdb/main/attached_database.hpp +2 -0
  156. package/src/duckdb/src/include/duckdb/main/client_context.hpp +1 -1
  157. package/src/duckdb/src/include/duckdb/main/database_manager.hpp +3 -2
  158. package/src/duckdb/src/include/duckdb/parser/expression/bound_expression.hpp +2 -0
  159. package/src/duckdb/src/include/duckdb/parser/keyword_helper.hpp +2 -2
  160. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_info.hpp +7 -5
  161. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp +1 -1
  162. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_table_info.hpp +1 -1
  163. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_view_info.hpp +1 -1
  164. package/src/duckdb/src/include/duckdb/parser/parsed_data/detach_info.hpp +3 -2
  165. package/src/duckdb/src/include/duckdb/parser/parsed_data/drop_info.hpp +5 -5
  166. package/src/duckdb/src/include/duckdb/parser/parsed_data/parse_info.hpp +13 -0
  167. package/src/duckdb/src/include/duckdb/parser/statement/insert_statement.hpp +4 -1
  168. package/src/duckdb/src/include/duckdb/parser/tableref.hpp +5 -2
  169. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +4 -1
  170. package/src/duckdb/src/include/duckdb/planner/binder.hpp +2 -2
  171. package/src/duckdb/src/include/duckdb/planner/expression_binder/base_select_binder.hpp +1 -2
  172. package/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +4 -7
  173. package/src/duckdb/src/include/duckdb/planner/operator/logical_get.hpp +1 -1
  174. package/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp +0 -5
  175. package/src/duckdb/src/include/duckdb/storage/index.hpp +13 -28
  176. package/src/duckdb/src/include/duckdb/storage/standard_buffer_manager.hpp +0 -2
  177. package/src/duckdb/src/include/duckdb/transaction/cleanup_state.hpp +5 -0
  178. package/src/duckdb/src/include/duckdb/transaction/transaction.hpp +12 -0
  179. package/src/duckdb/src/include/duckdb.h +26 -0
  180. package/src/duckdb/src/main/attached_database.cpp +12 -6
  181. package/src/duckdb/src/main/capi/helper-c.cpp +7 -0
  182. package/src/duckdb/src/main/capi/table_function-c.cpp +17 -16
  183. package/src/duckdb/src/main/client_context.cpp +12 -11
  184. package/src/duckdb/src/main/database_manager.cpp +13 -12
  185. package/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp +1 -2
  186. package/src/duckdb/src/parser/parsed_data/alter_info.cpp +3 -3
  187. package/src/duckdb/src/parser/parsed_data/alter_scalar_function_info.cpp +2 -2
  188. package/src/duckdb/src/parser/parsed_data/alter_table_function_info.cpp +2 -2
  189. package/src/duckdb/src/parser/parsed_data/alter_table_info.cpp +9 -9
  190. package/src/duckdb/src/parser/parsed_data/create_scalar_function_info.cpp +2 -2
  191. package/src/duckdb/src/parser/parsed_data/create_table_function_info.cpp +2 -2
  192. package/src/duckdb/src/parser/parsed_data/create_table_info.cpp +2 -2
  193. package/src/duckdb/src/parser/parsed_data/create_view_info.cpp +2 -2
  194. package/src/duckdb/src/parser/statement/insert_statement.cpp +15 -6
  195. package/src/duckdb/src/parser/transform/constraint/transform_constraint.cpp +1 -1
  196. package/src/duckdb/src/parser/transform/expression/transform_function.cpp +18 -5
  197. package/src/duckdb/src/parser/transform/statement/transform_alter_sequence.cpp +3 -2
  198. package/src/duckdb/src/parser/transform/statement/transform_alter_table.cpp +5 -1
  199. package/src/duckdb/src/parser/transform/statement/transform_detach.cpp +1 -1
  200. package/src/duckdb/src/parser/transform/statement/transform_drop.cpp +1 -1
  201. package/src/duckdb/src/parser/transform/statement/transform_insert.cpp +5 -7
  202. package/src/duckdb/src/parser/transform/statement/transform_rename.cpp +1 -1
  203. package/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp +26 -27
  204. package/src/duckdb/src/planner/binder/expression/bind_between_expression.cpp +17 -17
  205. package/src/duckdb/src/planner/binder/expression/bind_case_expression.cpp +9 -9
  206. package/src/duckdb/src/planner/binder/expression/bind_cast_expression.cpp +6 -6
  207. package/src/duckdb/src/planner/binder/expression/bind_collate_expression.cpp +6 -6
  208. package/src/duckdb/src/planner/binder/expression/bind_columnref_expression.cpp +2 -2
  209. package/src/duckdb/src/planner/binder/expression/bind_comparison_expression.cpp +21 -21
  210. package/src/duckdb/src/planner/binder/expression/bind_conjunction_expression.cpp +2 -3
  211. package/src/duckdb/src/planner/binder/expression/bind_function_expression.cpp +33 -36
  212. package/src/duckdb/src/planner/binder/expression/bind_macro_expression.cpp +5 -5
  213. package/src/duckdb/src/planner/binder/expression/bind_operator_expression.cpp +23 -23
  214. package/src/duckdb/src/planner/binder/expression/bind_subquery_expression.cpp +4 -4
  215. package/src/duckdb/src/planner/binder/expression/bind_unnest_expression.cpp +7 -7
  216. package/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp +23 -23
  217. package/src/duckdb/src/planner/binder/query_node/bind_table_macro_node.cpp +4 -4
  218. package/src/duckdb/src/planner/binder/statement/bind_copy.cpp +14 -13
  219. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +56 -42
  220. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +3 -3
  221. package/src/duckdb/src/planner/binder/statement/bind_delete.cpp +1 -1
  222. package/src/duckdb/src/planner/binder/statement/bind_drop.cpp +4 -4
  223. package/src/duckdb/src/planner/binder/statement/bind_export.cpp +10 -10
  224. package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +16 -11
  225. package/src/duckdb/src/planner/binder/statement/bind_pragma.cpp +4 -4
  226. package/src/duckdb/src/planner/binder/statement/bind_simple.cpp +5 -4
  227. package/src/duckdb/src/planner/binder/statement/bind_update.cpp +1 -1
  228. package/src/duckdb/src/planner/binder/tableref/bind_basetableref.cpp +3 -3
  229. package/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp +10 -12
  230. package/src/duckdb/src/planner/binder.cpp +2 -2
  231. package/src/duckdb/src/planner/expression/bound_expression.cpp +11 -2
  232. package/src/duckdb/src/planner/operator/logical_copy_to_file.cpp +2 -5
  233. package/src/duckdb/src/planner/operator/logical_create.cpp +2 -1
  234. package/src/duckdb/src/planner/operator/logical_create_index.cpp +2 -2
  235. package/src/duckdb/src/planner/operator/logical_delete.cpp +2 -2
  236. package/src/duckdb/src/planner/operator/logical_get.cpp +1 -1
  237. package/src/duckdb/src/planner/operator/logical_insert.cpp +2 -7
  238. package/src/duckdb/src/planner/operator/logical_update.cpp +2 -6
  239. package/src/duckdb/src/planner/parsed_data/bound_create_table_info.cpp +2 -2
  240. package/src/duckdb/src/planner/pragma_handler.cpp +3 -4
  241. package/src/duckdb/src/storage/checkpoint_manager.cpp +57 -55
  242. package/src/duckdb/src/storage/data_table.cpp +9 -9
  243. package/src/duckdb/src/storage/index.cpp +18 -6
  244. package/src/duckdb/src/storage/local_storage.cpp +8 -2
  245. package/src/duckdb/src/storage/standard_buffer_manager.cpp +0 -9
  246. package/src/duckdb/src/storage/table/update_segment.cpp +1 -1
  247. package/src/duckdb/src/storage/wal_replay.cpp +29 -31
  248. package/src/duckdb/src/storage/write_ahead_log.cpp +8 -8
  249. package/src/duckdb/src/transaction/cleanup_state.cpp +7 -1
  250. package/src/duckdb/src/transaction/commit_state.cpp +3 -4
  251. package/src/duckdb/src/transaction/transaction_context.cpp +1 -1
  252. package/src/duckdb/src/transaction/undo_buffer.cpp +8 -0
  253. package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +4 -4
  254. package/src/duckdb/ub_src_execution_index_art.cpp +7 -1
@@ -1,191 +1,469 @@
1
1
  #include "duckdb/execution/index/art/prefix.hpp"
2
2
 
3
3
  #include "duckdb/execution/index/art/art.hpp"
4
+ #include "duckdb/execution/index/art/art_key.hpp"
5
+ #include "duckdb/execution/index/art/node.hpp"
6
+ #include "duckdb/execution/index/art/prefix_segment.hpp"
7
+ #include "duckdb/storage/meta_block_reader.hpp"
8
+ #include "duckdb/storage/meta_block_writer.hpp"
4
9
 
5
10
  namespace duckdb {
6
11
 
7
- bool Prefix::IsInlined() const {
8
- return size <= PREFIX_INLINE_BYTES;
12
+ void Prefix::Free(ART &art) {
13
+
14
+ if (IsInlined()) {
15
+ return Initialize();
16
+ }
17
+
18
+ // delete all prefix segments
19
+ auto ptr = data.ptr;
20
+ while (ptr.IsSet()) {
21
+ auto next_ptr = PrefixSegment::Get(art, ptr).next;
22
+ Node::Free(art, ptr);
23
+ ptr = next_ptr;
24
+ }
25
+
26
+ Initialize();
9
27
  }
10
28
 
11
- uint8_t *Prefix::GetPrefixData() {
12
- return IsInlined() ? &value.inlined[0] : value.ptr;
29
+ void Prefix::Initialize(ART &art, const ARTKey &key, const uint32_t depth, const uint32_t count_p) {
30
+
31
+ // prefix can be inlined
32
+ if (count_p <= Node::PREFIX_INLINE_BYTES) {
33
+ memcpy(data.inlined, key.data + depth, count_p);
34
+ count = count_p;
35
+ return;
36
+ }
37
+
38
+ // prefix cannot be inlined, copy to segment(s)
39
+ count = 0;
40
+ reference<PrefixSegment> segment(PrefixSegment::New(art, data.ptr));
41
+ for (idx_t i = 0; i < count_p; i++) {
42
+ segment = segment.get().Append(art, count, key.data[depth + i]);
43
+ }
44
+ D_ASSERT(count == count_p);
13
45
  }
14
46
 
15
- const uint8_t *Prefix::GetPrefixData() const {
16
- return IsInlined() ? &value.inlined[0] : value.ptr;
47
+ void Prefix::Initialize(ART &art, const Prefix &other, const uint32_t count_p) {
48
+
49
+ D_ASSERT(count_p <= other.count);
50
+
51
+ // copy inlined data
52
+ if (other.IsInlined()) {
53
+ memcpy(data.inlined, other.data.inlined, count_p);
54
+ count = count_p;
55
+ return;
56
+ }
57
+
58
+ // initialize the count and get the first segment
59
+ count = 0;
60
+ reference<PrefixSegment> segment(PrefixSegment::New(art, data.ptr));
61
+
62
+ // iterate the segments of the other prefix and copy their data
63
+ auto other_ptr = other.data.ptr;
64
+ auto remaining = count_p;
65
+
66
+ while (remaining != 0) {
67
+ D_ASSERT(other_ptr.IsSet());
68
+ auto &other_segment = PrefixSegment::Get(art, other_ptr);
69
+ auto copy_count = MinValue(Node::PREFIX_SEGMENT_SIZE, remaining);
70
+
71
+ // copy the data
72
+ for (idx_t i = 0; i < copy_count; i++) {
73
+ segment = segment.get().Append(art, count, other_segment.bytes[i]);
74
+ }
75
+
76
+ // adjust the loop variables
77
+ other_ptr = other_segment.next;
78
+ remaining -= copy_count;
79
+ }
80
+ D_ASSERT(count == count_p);
17
81
  }
18
82
 
19
- uint8_t *Prefix::AllocatePrefix(uint32_t size) {
20
- Destroy();
83
+ void Prefix::InitializeMerge(ART &art, const idx_t buffer_count) {
21
84
 
22
- this->size = size;
23
- uint8_t *prefix;
24
85
  if (IsInlined()) {
25
- prefix = &value.inlined[0];
26
- } else {
27
- // allocate new prefix
28
- value.ptr = AllocateArray<uint8_t>(size);
29
- prefix = value.ptr;
86
+ return;
30
87
  }
31
- return prefix;
32
- }
33
88
 
34
- Prefix::Prefix() : size(0) {
89
+ reference<PrefixSegment> segment(PrefixSegment::Get(art, data.ptr));
90
+ data.ptr.buffer_id += buffer_count;
91
+
92
+ auto ptr = segment.get().next;
93
+ while (ptr.IsSet()) {
94
+ segment.get().next.buffer_id += buffer_count;
95
+ segment = PrefixSegment::Get(art, ptr);
96
+ ptr = segment.get().next;
97
+ }
35
98
  }
36
99
 
37
- Prefix::Prefix(Key &key, uint32_t depth, uint32_t size) : size(0) {
38
- auto prefix = AllocatePrefix(size);
100
+ void Prefix::Append(ART &art, const Prefix &other) {
39
101
 
40
- // copy key to prefix
41
- idx_t prefix_idx = 0;
42
- for (idx_t i = depth; i < size + depth; i++) {
43
- prefix[prefix_idx++] = key.data[i];
102
+ // result fits into inlined data, i.e., both prefixes are also inlined
103
+ if (count + other.count <= Node::PREFIX_INLINE_BYTES) {
104
+ memcpy(data.inlined + count, other.data.inlined, other.count);
105
+ count += other.count;
106
+ return;
44
107
  }
45
- }
46
108
 
47
- Prefix::Prefix(Prefix &other_prefix, uint32_t size) : size(0) {
48
- auto prefix = AllocatePrefix(size);
109
+ // this prefix is inlined, but will no longer be after appending the other prefix,
110
+ // move the inlined bytes to the first prefix segment
111
+ if (IsInlined()) {
112
+ MoveInlinedToSegment(art);
113
+ }
49
114
 
50
- // copy key to Prefix
51
- auto other_data = other_prefix.GetPrefixData();
52
- for (idx_t i = 0; i < size; i++) {
53
- prefix[i] = other_data[i];
115
+ // get the tail of the segments of this prefix
116
+ reference<PrefixSegment> segment(PrefixSegment::Get(art, data.ptr).GetTail(art));
117
+
118
+ // the other prefix is inlined
119
+ if (other.IsInlined()) {
120
+ for (idx_t i = 0; i < other.count; i++) {
121
+ segment = segment.get().Append(art, count, other.data.inlined[i]);
122
+ }
123
+ return;
54
124
  }
55
- }
56
125
 
57
- Prefix::~Prefix() {
58
- Destroy();
59
- }
126
+ // iterate all segments of the other prefix and copy their data
127
+ auto other_ptr = other.data.ptr;
128
+ auto remaining = other.count;
60
129
 
61
- idx_t Prefix::MemorySize() {
62
- return sizeof(*this) + sizeof(uint8_t) * size;
63
- }
130
+ while (other_ptr.IsSet()) {
131
+ auto &other_segment = PrefixSegment::Get(art, other_ptr);
132
+ auto copy_count = MinValue(Node::PREFIX_SEGMENT_SIZE, remaining);
133
+
134
+ // copy the data
135
+ for (idx_t i = 0; i < copy_count; i++) {
136
+ segment = segment.get().Append(art, count, other_segment.bytes[i]);
137
+ }
64
138
 
65
- void Prefix::Destroy() {
66
- if (!IsInlined()) {
67
- DeleteArray<uint8_t>(value.ptr, size);
68
- size = 0;
139
+ // adjust the loop variables
140
+ other_ptr = other_segment.next;
141
+ remaining -= copy_count;
69
142
  }
143
+ D_ASSERT(remaining == 0);
70
144
  }
71
145
 
72
- uint8_t &Prefix::operator[](idx_t idx) {
73
- D_ASSERT(idx < Size());
74
- return GetPrefixData()[idx];
146
+ void Prefix::Concatenate(ART &art, const uint8_t byte, const Prefix &other) {
147
+
148
+ auto new_size = count + 1 + other.count;
149
+
150
+ // overwrite into this prefix (both are inlined)
151
+ if (new_size <= Node::PREFIX_INLINE_BYTES) {
152
+ // move this prefix backwards
153
+ memmove(data.inlined + other.count + 1, data.inlined, count);
154
+ // copy byte
155
+ data.inlined[other.count] = byte;
156
+ // copy the other prefix into this prefix
157
+ memcpy(data.inlined, other.data.inlined, other.count);
158
+ count = new_size;
159
+ return;
160
+ }
161
+
162
+ auto this_count = count;
163
+ auto this_data = data;
164
+ Initialize();
165
+
166
+ // append the other prefix
167
+ Append(art, other);
168
+
169
+ if (IsInlined()) {
170
+ // move to a segment
171
+ reference<PrefixSegment> segment(MoveInlinedToSegment(art));
172
+ // append the byte
173
+ segment = segment.get().Append(art, count, byte);
174
+ // append this prefix
175
+ for (idx_t i = 0; i < this_count; i++) {
176
+ segment = segment.get().Append(art, count, this_data.inlined[i]);
177
+ }
178
+ return;
179
+ }
180
+
181
+ // get the tail
182
+ reference<PrefixSegment> segment(PrefixSegment::Get(art, data.ptr).GetTail(art));
183
+ // append the byte
184
+ segment = segment.get().Append(art, count, byte);
185
+
186
+ // iterate all segments of this prefix, copy their data, and free them
187
+ auto this_ptr = this_data.ptr;
188
+ auto remaining = this_count;
189
+
190
+ while (this_ptr.IsSet()) {
191
+ auto &this_segment = PrefixSegment::Get(art, this_ptr);
192
+ auto copy_count = MinValue(Node::PREFIX_SEGMENT_SIZE, remaining);
193
+
194
+ // copy the data
195
+ for (idx_t i = 0; i < copy_count; i++) {
196
+ segment = segment.get().Append(art, count, this_segment.bytes[i]);
197
+ }
198
+
199
+ // adjust the loop variables
200
+ Node::Free(art, this_ptr);
201
+ this_ptr = this_segment.next;
202
+ remaining -= copy_count;
203
+ }
204
+ D_ASSERT(remaining == 0);
75
205
  }
76
206
 
77
- Prefix &Prefix::operator=(const Prefix &src) {
78
- auto prefix = AllocatePrefix(src.size);
207
+ uint8_t Prefix::Reduce(ART &art, const idx_t reduce_count) {
208
+
209
+ auto new_count = count - reduce_count - 1;
210
+ auto new_first_byte = GetByte(art, reduce_count);
211
+
212
+ // prefix is now empty
213
+ if (new_count == 0) {
214
+ Free(art);
215
+ return new_first_byte;
216
+ }
217
+
218
+ // was inlined, just move bytes
219
+ if (IsInlined()) {
220
+ memmove(data.inlined, data.inlined + reduce_count + 1, new_count);
221
+ count = new_count;
222
+ return new_first_byte;
223
+ }
224
+
225
+ count = 0;
226
+ auto start = reduce_count + 1;
227
+ auto offset = start % Node::PREFIX_SEGMENT_SIZE;
228
+ auto remaining = new_count;
229
+
230
+ // get the source segment, i.e., the segment that contains the byte at start
231
+ reference<PrefixSegment> src_segment(PrefixSegment::Get(art, data.ptr));
232
+ for (idx_t i = 0; i < start / Node::PREFIX_SEGMENT_SIZE; i++) {
233
+ D_ASSERT(src_segment.get().next.IsSet());
234
+ src_segment = PrefixSegment::Get(art, src_segment.get().next);
235
+ }
236
+
237
+ // iterate all segments starting at the source segment and shift their data
238
+ reference<PrefixSegment> dst_segment(PrefixSegment::Get(art, data.ptr));
239
+ while (true) {
240
+ auto copy_count = MinValue(Node::PREFIX_SEGMENT_SIZE - offset, remaining);
241
+
242
+ // copy the data
243
+ for (idx_t i = offset; i < offset + copy_count; i++) {
244
+ dst_segment = dst_segment.get().Append(art, count, src_segment.get().bytes[i]);
245
+ }
79
246
 
80
- // copy prefix
81
- auto src_prefix = src.GetPrefixData();
82
- for (idx_t i = 0; i < src.size; i++) {
83
- prefix[i] = src_prefix[i];
247
+ // adjust the loop variables
248
+ offset = 0;
249
+ remaining -= copy_count;
250
+ if (remaining == 0) {
251
+ break;
252
+ }
253
+ D_ASSERT(src_segment.get().next.IsSet());
254
+ src_segment = PrefixSegment::Get(art, src_segment.get().next);
255
+ }
256
+
257
+ // possibly inline the data
258
+ if (IsInlined()) {
259
+ MoveSegmentToInlined(art);
84
260
  }
85
- size = src.size;
86
- return *this;
261
+
262
+ return new_first_byte;
87
263
  }
88
264
 
89
- Prefix &Prefix::operator=(Prefix &&other) noexcept {
90
- std::swap(size, other.size);
91
- std::swap(value, other.value);
92
- return *this;
265
+ uint8_t Prefix::GetByte(const ART &art, const idx_t position) const {
266
+
267
+ D_ASSERT(position < count);
268
+ if (IsInlined()) {
269
+ return data.inlined[position];
270
+ }
271
+
272
+ // get the correct segment
273
+ reference<PrefixSegment> segment(PrefixSegment::Get(art, data.ptr));
274
+ for (idx_t i = 0; i < position / Node::PREFIX_SEGMENT_SIZE; i++) {
275
+ D_ASSERT(segment.get().next.IsSet());
276
+ segment = PrefixSegment::Get(art, segment.get().next);
277
+ }
278
+
279
+ return segment.get().bytes[position % Node::PREFIX_SEGMENT_SIZE];
93
280
  }
94
281
 
95
- void Prefix::Overwrite(uint32_t new_size, uint8_t *data) {
96
- if (new_size <= PREFIX_INLINE_BYTES) {
97
- // new entry would be inlined
98
- // inline the data and destroy the pointer
99
- auto prefix = AllocatePrefix(new_size);
100
- for (idx_t i = 0; i < new_size; i++) {
101
- prefix[i] = data[i];
282
+ uint32_t Prefix::KeyMismatchPosition(const ART &art, const ARTKey &key, const uint32_t depth) const {
283
+
284
+ if (IsInlined()) {
285
+ for (idx_t mismatch_position = 0; mismatch_position < count; mismatch_position++) {
286
+ D_ASSERT(depth + mismatch_position < key.len);
287
+ if (key[depth + mismatch_position] != data.inlined[mismatch_position]) {
288
+ return mismatch_position;
289
+ }
290
+ }
291
+ return count;
292
+ }
293
+
294
+ uint32_t mismatch_position = 0;
295
+ auto ptr = data.ptr;
296
+
297
+ while (mismatch_position != count) {
298
+ D_ASSERT(depth + mismatch_position < key.len);
299
+ D_ASSERT(ptr.IsSet());
300
+
301
+ auto &segment = PrefixSegment::Get(art, ptr);
302
+ auto compare_count = MinValue(Node::PREFIX_SEGMENT_SIZE, count - mismatch_position);
303
+
304
+ // compare bytes
305
+ for (uint32_t i = 0; i < compare_count; i++) {
306
+ if (key[depth + mismatch_position] != segment.bytes[i]) {
307
+ return mismatch_position;
308
+ }
309
+ mismatch_position++;
102
310
  }
103
- DeleteArray<uint8_t>(data, new_size);
104
311
 
105
- } else {
106
- // new entry would not be inlined
107
- // take over the data directly
108
- Destroy();
109
- size = new_size;
110
- value.ptr = data;
312
+ // adjust loop variables
313
+ ptr = segment.next;
111
314
  }
315
+ return count;
112
316
  }
113
317
 
114
- void Prefix::Concatenate(ART &art, uint8_t key, Prefix &other) {
115
- auto new_size = size + 1 + other.size;
116
- art.IncreaseMemorySize((new_size - size) * sizeof(uint8_t));
117
- // have to allocate space in our prefix array
118
- auto new_prefix = AllocateArray<uint8_t>(new_size);
119
- idx_t new_prefix_idx = 0;
318
+ uint32_t Prefix::MismatchPosition(const ART &art, const Prefix &other) const {
319
+
320
+ D_ASSERT(count <= other.count);
120
321
 
121
- // 1) add the to-be deleted node's prefix
122
- for (uint32_t i = 0; i < other.size; i++) {
123
- new_prefix[new_prefix_idx++] = other[i];
322
+ // case 1: both prefixes are inlined
323
+ if (IsInlined() && other.IsInlined()) {
324
+ for (uint32_t i = 0; i < count; i++) {
325
+ if (data.inlined[i] != other.data.inlined[i]) {
326
+ return i;
327
+ }
328
+ }
329
+ return count;
124
330
  }
125
331
 
126
- // 2) now move the current partial key byte as part of the prefix
127
- new_prefix[new_prefix_idx++] = key;
332
+ // case 2: only this prefix is inlined
333
+ if (IsInlined()) {
334
+ // we only need the first segment of the other prefix
335
+ auto &segment = PrefixSegment::Get(art, other.data.ptr);
336
+ for (uint32_t i = 0; i < count; i++) {
337
+ if (data.inlined[i] != segment.bytes[i]) {
338
+ return i;
339
+ }
340
+ }
341
+ return count;
342
+ }
128
343
 
129
- // 3) move the existing prefix (if any)
130
- auto prefix = GetPrefixData();
131
- for (uint32_t i = 0; i < size; i++) {
132
- new_prefix[new_prefix_idx++] = prefix[i];
344
+ // case 3: both prefixes are not inlined
345
+ auto ptr = data.ptr;
346
+ auto other_ptr = other.data.ptr;
347
+
348
+ // iterate segments and compare bytes
349
+ uint32_t mismatch_position = 0;
350
+ while (ptr.IsSet()) {
351
+ D_ASSERT(other_ptr.IsSet());
352
+ auto &segment = PrefixSegment::Get(art, ptr);
353
+ auto &other_segment = PrefixSegment::Get(art, other_ptr);
354
+
355
+ // compare bytes
356
+ auto compare_count = MinValue(Node::PREFIX_SEGMENT_SIZE, count - mismatch_position);
357
+ for (uint32_t i = 0; i < compare_count; i++) {
358
+ if (segment.bytes[i] != other_segment.bytes[i]) {
359
+ return mismatch_position;
360
+ }
361
+ mismatch_position++;
362
+ }
363
+
364
+ // adjust loop variables
365
+ ptr = segment.next;
366
+ other_ptr = other_segment.next;
133
367
  }
134
- Overwrite(new_size, new_prefix);
368
+ return count;
135
369
  }
136
370
 
137
- uint8_t Prefix::Reduce(ART &art, uint32_t n) {
138
- auto new_size = size - n - 1;
139
- art.DecreaseMemorySize((size - new_size) * sizeof(uint8_t));
140
- auto prefix = GetPrefixData();
141
- auto partial_key = prefix[n];
371
+ void Prefix::Serialize(const ART &art, MetaBlockWriter &writer) const {
372
+
373
+ writer.Write(count);
142
374
 
143
- if (new_size == 0) {
144
- Destroy();
145
- size = 0;
146
- return partial_key;
375
+ // write inlined data
376
+ if (IsInlined()) {
377
+ writer.WriteData(data.inlined, count);
378
+ return;
147
379
  }
148
- auto new_prefix = AllocateArray<uint8_t>(new_size);
149
- for (idx_t i = 0; i < new_size; i++) {
150
- new_prefix[i] = prefix[i + n + 1];
380
+
381
+ D_ASSERT(data.ptr.IsSet());
382
+ auto ptr = data.ptr;
383
+ auto remaining = count;
384
+
385
+ // iterate all prefix segments and write their bytes
386
+ while (ptr.IsSet()) {
387
+ auto &segment = PrefixSegment::Get(art, ptr);
388
+ auto copy_count = MinValue(Node::PREFIX_SEGMENT_SIZE, remaining);
389
+
390
+ // write the bytes
391
+ writer.WriteData(segment.bytes, copy_count);
392
+
393
+ // adjust loop variables
394
+ remaining -= copy_count;
395
+ ptr = segment.next;
151
396
  }
152
- Overwrite(new_size, new_prefix);
153
- return partial_key;
397
+ D_ASSERT(remaining == 0);
154
398
  }
155
399
 
156
- void Prefix::Serialize(duckdb::MetaBlockWriter &writer) {
157
- writer.Write(size);
158
- auto prefix = GetPrefixData();
159
- writer.WriteData(prefix, size);
160
- }
400
+ void Prefix::Deserialize(ART &art, MetaBlockReader &reader) {
161
401
 
162
- void Prefix::Deserialize(duckdb::MetaBlockReader &reader) {
163
- auto prefix_size = reader.Read<uint32_t>();
164
- auto prefix = AllocatePrefix(prefix_size);
165
- this->size = prefix_size;
166
- reader.ReadData(prefix, size);
167
- }
402
+ auto count_p = reader.Read<uint32_t>();
168
403
 
169
- uint32_t Prefix::KeyMismatchPosition(Key &key, uint32_t depth) {
170
- uint64_t pos;
171
- auto prefix = GetPrefixData();
172
- for (pos = 0; pos < size; pos++) {
173
- if (key[depth + pos] != prefix[pos]) {
174
- return pos;
175
- }
404
+ // copy into inlined data
405
+ if (count_p <= Node::PREFIX_INLINE_BYTES) {
406
+ reader.ReadData(data.inlined, count_p);
407
+ count = count_p;
408
+ return;
176
409
  }
177
- return pos;
410
+
411
+ // copy into segments
412
+ count = 0;
413
+ reference<PrefixSegment> segment(PrefixSegment::New(art, data.ptr));
414
+ for (idx_t i = 0; i < count_p; i++) {
415
+ segment = segment.get().Append(art, count, reader.Read<uint8_t>());
416
+ }
417
+ D_ASSERT(count_p == count);
178
418
  }
179
419
 
180
- uint32_t Prefix::MismatchPosition(Prefix &other) {
181
- auto prefix = GetPrefixData();
182
- auto other_data = other.GetPrefixData();
183
- for (idx_t i = 0; i < size; i++) {
184
- if (prefix[i] != other_data[i]) {
185
- return i;
420
+ void Prefix::Vacuum(ART &art) {
421
+
422
+ if (IsInlined()) {
423
+ return;
424
+ }
425
+
426
+ // first pointer has special treatment because we don't obtain it from a prefix segment
427
+ auto &allocator = Node::GetAllocator(art, NType::PREFIX_SEGMENT);
428
+ if (allocator.NeedsVacuum(data.ptr)) {
429
+ data.ptr.SetPtr(allocator.VacuumPointer(data.ptr));
430
+ }
431
+
432
+ auto ptr = data.ptr;
433
+ while (ptr.IsSet()) {
434
+ auto &segment = PrefixSegment::Get(art, ptr);
435
+ ptr = segment.next;
436
+ if (ptr.IsSet() && allocator.NeedsVacuum(ptr)) {
437
+ segment.next.SetPtr(allocator.VacuumPointer(ptr));
438
+ ptr = segment.next;
186
439
  }
187
440
  }
188
- return size;
441
+ }
442
+
443
+ PrefixSegment &Prefix::MoveInlinedToSegment(ART &art) {
444
+
445
+ D_ASSERT(IsInlined());
446
+
447
+ Node ptr;
448
+ auto &segment = PrefixSegment::New(art, ptr);
449
+
450
+ // move data
451
+ D_ASSERT(Node::PREFIX_SEGMENT_SIZE >= Node::PREFIX_INLINE_BYTES);
452
+ memcpy(segment.bytes, data.inlined, count);
453
+ data.ptr = ptr;
454
+ return segment;
455
+ }
456
+
457
+ void Prefix::MoveSegmentToInlined(ART &art) {
458
+
459
+ D_ASSERT(IsInlined());
460
+ D_ASSERT(data.ptr.IsSet());
461
+
462
+ auto ptr = data.ptr;
463
+ auto &segment = PrefixSegment::Get(art, data.ptr);
464
+
465
+ memcpy(data.inlined, segment.bytes, count);
466
+ Node::Free(art, ptr);
189
467
  }
190
468
 
191
469
  } // namespace duckdb
@@ -0,0 +1,42 @@
1
+ #include "duckdb/execution/index/art/prefix_segment.hpp"
2
+
3
+ #include "duckdb/execution/index/art/art.hpp"
4
+ #include "duckdb/execution/index/art/node.hpp"
5
+
6
+ namespace duckdb {
7
+
8
+ PrefixSegment &PrefixSegment::New(ART &art, Node &node) {
9
+
10
+ node.SetPtr(Node::GetAllocator(art, NType::PREFIX_SEGMENT).New());
11
+ node.type = (uint8_t)NType::PREFIX_SEGMENT;
12
+
13
+ auto &segment = PrefixSegment::Get(art, node);
14
+ segment.next.Reset();
15
+ return segment;
16
+ }
17
+
18
+ PrefixSegment &PrefixSegment::Append(ART &art, uint32_t &count, const uint8_t byte) {
19
+
20
+ reference<PrefixSegment> segment(*this);
21
+ auto position = count % Node::PREFIX_SEGMENT_SIZE;
22
+
23
+ // we need a new segment
24
+ if (position == 0 && count != 0) {
25
+ segment = PrefixSegment::New(art, next);
26
+ }
27
+
28
+ segment.get().bytes[position] = byte;
29
+ count++;
30
+ return segment.get();
31
+ }
32
+
33
+ PrefixSegment &PrefixSegment::GetTail(const ART &art) {
34
+
35
+ reference<PrefixSegment> segment(*this);
36
+ while (segment.get().next.IsSet()) {
37
+ segment = PrefixSegment::Get(art, segment.get().next);
38
+ }
39
+ return segment.get();
40
+ }
41
+
42
+ } // namespace duckdb