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,170 +1,234 @@
1
1
  #include "duckdb/execution/index/art/node16.hpp"
2
2
 
3
3
  #include "duckdb/execution/index/art/art.hpp"
4
+ #include "duckdb/execution/index/art/node.hpp"
4
5
  #include "duckdb/execution/index/art/node4.hpp"
5
6
  #include "duckdb/execution/index/art/node48.hpp"
6
-
7
- #include <cstring>
7
+ #include "duckdb/storage/meta_block_reader.hpp"
8
+ #include "duckdb/storage/meta_block_writer.hpp"
8
9
 
9
10
  namespace duckdb {
10
11
 
11
- Node16::Node16() : Node(NodeType::N16) {
12
- memset(key, 16, sizeof(key));
12
+ Node16 &Node16::New(ART &art, Node &node) {
13
+
14
+ node.SetPtr(Node::GetAllocator(art, NType::NODE_16).New());
15
+ node.type = (uint8_t)NType::NODE_16;
16
+ auto &n16 = Node16::Get(art, node);
17
+
18
+ n16.count = 0;
19
+ n16.prefix.Initialize();
20
+ return n16;
13
21
  }
14
22
 
15
- idx_t Node16::MemorySize(ART &art, const bool &recurse) {
16
- if (recurse) {
17
- return prefix.MemorySize() + sizeof(*this) + RecursiveMemorySize(art);
23
+ void Node16::Free(ART &art, Node &node) {
24
+
25
+ D_ASSERT(node.IsSet());
26
+ D_ASSERT(!node.IsSwizzled());
27
+
28
+ auto &n16 = Node16::Get(art, node);
29
+
30
+ // free all children
31
+ for (idx_t i = 0; i < n16.count; i++) {
32
+ Node::Free(art, n16.children[i]);
18
33
  }
19
- return prefix.MemorySize() + sizeof(*this);
20
34
  }
21
35
 
22
- idx_t Node16::GetChildPos(uint8_t k) {
23
- for (idx_t pos = 0; pos < count; pos++) {
24
- if (key[pos] == k) {
25
- return pos;
26
- }
36
+ Node16 &Node16::GrowNode4(ART &art, Node &node16, Node &node4) {
37
+
38
+ auto &n4 = Node4::Get(art, node4);
39
+ auto &n16 = Node16::New(art, node16);
40
+
41
+ n16.count = n4.count;
42
+ n16.prefix.Move(n4.prefix);
43
+
44
+ for (idx_t i = 0; i < n4.count; i++) {
45
+ n16.key[i] = n4.key[i];
46
+ n16.children[i] = n4.children[i];
27
47
  }
28
- return Node::GetChildPos(k);
48
+
49
+ n4.count = 0;
50
+ Node::Free(art, node4);
51
+ return n16;
29
52
  }
30
53
 
31
- idx_t Node16::GetChildGreaterEqual(uint8_t k, bool &equal) {
32
- for (idx_t pos = 0; pos < count; pos++) {
33
- if (key[pos] >= k) {
34
- if (key[pos] == k) {
35
- equal = true;
36
- } else {
37
- equal = false;
38
- }
54
+ Node16 &Node16::ShrinkNode48(ART &art, Node &node16, Node &node48) {
55
+
56
+ auto &n16 = Node16::New(art, node16);
57
+ auto &n48 = Node48::Get(art, node48);
39
58
 
40
- return pos;
59
+ n16.count = 0;
60
+ n16.prefix.Move(n48.prefix);
61
+
62
+ for (idx_t i = 0; i < Node::NODE_256_CAPACITY; i++) {
63
+ if (n48.child_index[i] != Node::EMPTY_MARKER) {
64
+ n16.key[n16.count] = i;
65
+ n16.children[n16.count] = n48.children[n48.child_index[i]];
66
+ n16.count++;
41
67
  }
42
68
  }
43
- return DConstants::INVALID_INDEX;
44
- }
45
69
 
46
- idx_t Node16::GetMin() {
47
- return 0;
70
+ n48.count = 0;
71
+ Node::Free(art, node48);
72
+ return n16;
48
73
  }
49
74
 
50
- idx_t Node16::GetNextPos(idx_t pos) {
51
- if (pos == DConstants::INVALID_INDEX) {
52
- return 0;
53
- }
54
- pos++;
55
- return pos < count ? pos : DConstants::INVALID_INDEX;
56
- }
75
+ void Node16::InitializeMerge(ART &art, const ARTFlags &flags) {
57
76
 
58
- idx_t Node16::GetNextPosAndByte(idx_t pos, uint8_t &byte) {
59
- if (pos == DConstants::INVALID_INDEX) {
60
- byte = key[0];
61
- return 0;
77
+ for (idx_t i = 0; i < count; i++) {
78
+ children[i].InitializeMerge(art, flags);
62
79
  }
63
- pos++;
64
- if (pos < count) {
65
- byte = key[pos];
66
- return pos;
67
- }
68
- return DConstants::INVALID_INDEX;
69
- }
70
-
71
- Node *Node16::GetChild(ART &art, idx_t pos) {
72
- D_ASSERT(pos < count);
73
- return children[pos].Unswizzle(art);
74
80
  }
75
81
 
76
- void Node16::ReplaceChildPointer(idx_t pos, Node *node) {
77
- children[pos] = node;
78
- }
82
+ void Node16::InsertChild(ART &art, Node &node, const uint8_t byte, const Node child) {
79
83
 
80
- bool Node16::ChildIsInMemory(idx_t pos) {
81
- return children[pos] && !children[pos].IsSwizzled();
82
- }
84
+ D_ASSERT(node.IsSet());
85
+ D_ASSERT(!node.IsSwizzled());
86
+ auto &n16 = Node16::Get(art, node);
83
87
 
84
- void Node16::InsertChild(ART &art, Node *&node, uint8_t key_byte, Node *new_child) {
85
- Node16 *n = (Node16 *)node;
88
+ // ensure that there is no other child at the same byte
89
+ for (idx_t i = 0; i < n16.count; i++) {
90
+ D_ASSERT(n16.key[i] != byte);
91
+ }
86
92
 
87
93
  // insert new child node into node
88
- if (n->count < Node16::GetSize()) {
94
+ if (n16.count < Node::NODE_16_CAPACITY) {
89
95
  // still space, just insert the child
90
- idx_t pos = 0;
91
- while (pos < node->count && n->key[pos] < key_byte) {
92
- pos++;
96
+ idx_t child_pos = 0;
97
+ while (child_pos < n16.count && n16.key[child_pos] < byte) {
98
+ child_pos++;
93
99
  }
94
- if (n->children[pos]) {
95
- for (idx_t i = n->count; i > pos; i--) {
96
- n->key[i] = n->key[i - 1];
97
- n->children[i] = n->children[i - 1];
98
- }
100
+ // move children backwards to make space
101
+ for (idx_t i = n16.count; i > child_pos; i--) {
102
+ n16.key[i] = n16.key[i - 1];
103
+ n16.children[i] = n16.children[i - 1];
99
104
  }
100
- n->key[pos] = key_byte;
101
- n->children[pos] = new_child;
102
- n->count++;
105
+
106
+ n16.key[child_pos] = byte;
107
+ n16.children[child_pos] = child;
108
+ n16.count++;
103
109
 
104
110
  } else {
105
111
  // node is full, grow to Node48
106
- auto new_node = Node48::New();
107
- art.IncreaseMemorySize(new_node->MemorySize(art, false));
108
- new_node->count = node->count;
109
- new_node->prefix = std::move(n->prefix);
110
-
111
- for (idx_t i = 0; i < node->count; i++) {
112
- new_node->child_index[n->key[i]] = i;
113
- new_node->children[i] = n->children[i];
114
- n->children[i] = nullptr;
115
- }
116
-
117
- art.DecreaseMemorySize(node->MemorySize(art, false));
118
- Node::Delete(node);
119
- node = new_node;
120
- Node48::InsertChild(art, node, key_byte, new_child);
112
+ auto node16 = node;
113
+ Node48::GrowNode16(art, node, node16);
114
+ Node48::InsertChild(art, node, byte, child);
121
115
  }
122
116
  }
123
117
 
124
- void Node16::EraseChild(ART &art, Node *&node, idx_t pos) {
118
+ void Node16::DeleteChild(ART &art, Node &node, const uint8_t byte) {
125
119
 
126
- auto n = (Node16 *)node;
127
- D_ASSERT(pos < n->count);
120
+ D_ASSERT(node.IsSet());
121
+ D_ASSERT(!node.IsSwizzled());
122
+ auto &n16 = Node16::Get(art, node);
128
123
 
129
- // adjust the ART size
130
- if (n->ChildIsInMemory(pos)) {
131
- auto child = n->GetChild(art, pos);
132
- art.DecreaseMemorySize(child->MemorySize(art, true));
124
+ idx_t child_pos = 0;
125
+ for (; child_pos < n16.count; child_pos++) {
126
+ if (n16.key[child_pos] == byte) {
127
+ break;
128
+ }
133
129
  }
134
130
 
135
- // erase the child and decrease the count
136
- n->children[pos].Reset();
137
- n->count--;
131
+ D_ASSERT(child_pos < n16.count);
132
+
133
+ // free the child and decrease the count
134
+ Node::Free(art, n16.children[child_pos]);
135
+ n16.count--;
138
136
 
139
137
  // potentially move any children backwards
140
- for (; pos < n->count; pos++) {
141
- n->key[pos] = n->key[pos + 1];
142
- n->children[pos] = n->children[pos + 1];
138
+ for (idx_t i = child_pos; i < n16.count; i++) {
139
+ n16.key[i] = n16.key[i + 1];
140
+ n16.children[i] = n16.children[i + 1];
143
141
  }
144
- // set any remaining nodes as nullptr
145
- for (; pos < Node16::GetSize(); pos++) {
146
- if (!n->children[pos]) {
147
- break;
142
+
143
+ // shrink node to Node4
144
+ if (n16.count < Node::NODE_4_CAPACITY) {
145
+ auto node16 = node;
146
+ Node4::ShrinkNode16(art, node, node16);
147
+ }
148
+ }
149
+
150
+ void Node16::ReplaceChild(const uint8_t byte, const Node child) {
151
+ for (idx_t i = 0; i < count; i++) {
152
+ if (key[i] == byte) {
153
+ children[i] = child;
154
+ return;
148
155
  }
149
- n->children[pos] = nullptr;
150
156
  }
157
+ }
151
158
 
152
- // shrink node to Node4
153
- if (node->count < Node4::GetSize()) {
159
+ optional_ptr<Node> Node16::GetChild(const uint8_t byte) {
160
+
161
+ for (idx_t i = 0; i < count; i++) {
162
+ if (key[i] == byte) {
163
+ return &children[i];
164
+ }
165
+ }
166
+ return nullptr;
167
+ }
154
168
 
155
- auto new_node = Node4::New();
156
- art.IncreaseMemorySize(new_node->MemorySize(art, false));
157
- new_node->prefix = std::move(n->prefix);
169
+ optional_ptr<Node> Node16::GetNextChild(uint8_t &byte) {
158
170
 
159
- for (idx_t i = 0; i < n->count; i++) {
160
- new_node->key[new_node->count] = n->key[i];
161
- new_node->children[new_node->count++] = n->children[i];
162
- n->children[i] = nullptr;
171
+ for (idx_t i = 0; i < count; i++) {
172
+ if (key[i] >= byte) {
173
+ byte = key[i];
174
+ return &children[i];
163
175
  }
176
+ }
177
+ return nullptr;
178
+ }
179
+
180
+ BlockPointer Node16::Serialize(ART &art, MetaBlockWriter &writer) {
181
+
182
+ // recurse into children and retrieve child block pointers
183
+ vector<BlockPointer> child_block_pointers;
184
+ for (idx_t i = 0; i < count; i++) {
185
+ child_block_pointers.push_back(children[i].Serialize(art, writer));
186
+ }
187
+ for (idx_t i = count; i < Node::NODE_16_CAPACITY; i++) {
188
+ child_block_pointers.emplace_back((block_id_t)DConstants::INVALID_INDEX, 0);
189
+ }
190
+
191
+ // get pointer and write fields
192
+ auto block_pointer = writer.GetBlockPointer();
193
+ writer.Write(NType::NODE_16);
194
+ writer.Write<uint8_t>(count);
195
+ prefix.Serialize(art, writer);
164
196
 
165
- art.DecreaseMemorySize(node->MemorySize(art, false));
166
- Node::Delete(node);
167
- node = new_node;
197
+ // write key values
198
+ for (idx_t i = 0; i < Node::NODE_16_CAPACITY; i++) {
199
+ writer.Write(key[i]);
168
200
  }
201
+
202
+ // write child block pointers
203
+ for (auto &child_block_pointer : child_block_pointers) {
204
+ writer.Write(child_block_pointer.block_id);
205
+ writer.Write(child_block_pointer.offset);
206
+ }
207
+
208
+ return block_pointer;
169
209
  }
210
+
211
+ void Node16::Deserialize(ART &art, MetaBlockReader &reader) {
212
+
213
+ count = reader.Read<uint8_t>();
214
+ prefix.Deserialize(art, reader);
215
+
216
+ // read key values
217
+ for (idx_t i = 0; i < Node::NODE_16_CAPACITY; i++) {
218
+ key[i] = reader.Read<uint8_t>();
219
+ }
220
+
221
+ // read child block pointers
222
+ for (idx_t i = 0; i < Node::NODE_16_CAPACITY; i++) {
223
+ children[i] = Node(reader);
224
+ }
225
+ }
226
+
227
+ void Node16::Vacuum(ART &art, const ARTFlags &flags) {
228
+
229
+ for (idx_t i = 0; i < count; i++) {
230
+ Node::Vacuum(art, children[i], flags);
231
+ }
232
+ }
233
+
170
234
  } // namespace duckdb
@@ -1,122 +1,160 @@
1
1
  #include "duckdb/execution/index/art/node256.hpp"
2
2
 
3
3
  #include "duckdb/execution/index/art/art.hpp"
4
+ #include "duckdb/execution/index/art/node.hpp"
4
5
  #include "duckdb/execution/index/art/node48.hpp"
6
+ #include "duckdb/storage/meta_block_reader.hpp"
7
+ #include "duckdb/storage/meta_block_writer.hpp"
5
8
 
6
9
  namespace duckdb {
7
10
 
8
- Node256::Node256() : Node(NodeType::N256) {
9
- }
11
+ Node256 &Node256::New(ART &art, Node &node) {
10
12
 
11
- idx_t Node256::MemorySize(ART &art, const bool &recurse) {
12
- if (recurse) {
13
- return prefix.MemorySize() + sizeof(*this) + RecursiveMemorySize(art);
14
- }
15
- return prefix.MemorySize() + sizeof(*this);
16
- }
13
+ node.SetPtr(Node::GetAllocator(art, NType::NODE_256).New());
14
+ node.type = (uint8_t)NType::NODE_256;
15
+ auto &n256 = Node256::Get(art, node);
17
16
 
18
- idx_t Node256::GetChildPos(uint8_t k) {
19
- if (children[k]) {
20
- return k;
21
- } else {
22
- return DConstants::INVALID_INDEX;
17
+ n256.count = 0;
18
+ n256.prefix.Initialize();
19
+
20
+ for (idx_t i = 0; i < Node::NODE_256_CAPACITY; i++) {
21
+ n256.children[i].Reset();
23
22
  }
23
+
24
+ return n256;
24
25
  }
25
26
 
26
- idx_t Node256::GetChildGreaterEqual(uint8_t k, bool &equal) {
27
- for (idx_t pos = k; pos < Node256::GetSize(); pos++) {
28
- if (children[pos]) {
29
- if (pos == k) {
30
- equal = true;
31
- } else {
32
- equal = false;
33
- }
34
- return pos;
35
- }
27
+ void Node256::Free(ART &art, Node &node) {
28
+
29
+ D_ASSERT(node.IsSet());
30
+ D_ASSERT(!node.IsSwizzled());
31
+
32
+ auto &n256 = Node256::Get(art, node);
33
+
34
+ if (!n256.count) {
35
+ return;
36
36
  }
37
- return DConstants::INVALID_INDEX;
38
- }
39
37
 
40
- idx_t Node256::GetMin() {
41
- for (idx_t i = 0; i < Node256::GetSize(); i++) {
42
- if (children[i]) {
43
- return i;
38
+ // free all children
39
+ for (idx_t i = 0; i < Node::NODE_256_CAPACITY; i++) {
40
+ if (n256.children[i].IsSet()) {
41
+ Node::Free(art, n256.children[i]);
44
42
  }
45
43
  }
46
- return DConstants::INVALID_INDEX;
47
44
  }
48
45
 
49
- idx_t Node256::GetNextPos(idx_t pos) {
50
- pos == DConstants::INVALID_INDEX ? pos = 0 : pos++;
51
- for (; pos < Node256::GetSize(); pos++) {
52
- if (children[pos]) {
53
- return pos;
46
+ Node256 &Node256::GrowNode48(ART &art, Node &node256, Node &node48) {
47
+
48
+ auto &n48 = Node48::Get(art, node48);
49
+ auto &n256 = Node256::New(art, node256);
50
+
51
+ n256.count = n48.count;
52
+ n256.prefix.Move(n48.prefix);
53
+
54
+ for (idx_t i = 0; i < Node::NODE_256_CAPACITY; i++) {
55
+ if (n48.child_index[i] != Node::EMPTY_MARKER) {
56
+ n256.children[i] = n48.children[n48.child_index[i]];
57
+ } else {
58
+ n256.children[i].Reset();
54
59
  }
55
60
  }
56
- return Node::GetNextPos(pos);
61
+
62
+ n48.count = 0;
63
+ Node::Free(art, node48);
64
+ return n256;
57
65
  }
58
66
 
59
- idx_t Node256::GetNextPosAndByte(idx_t pos, uint8_t &byte) {
60
- pos == DConstants::INVALID_INDEX ? pos = 0 : pos++;
61
- for (; pos < Node256::GetSize(); pos++) {
62
- if (children[pos]) {
63
- byte = uint8_t(pos);
64
- return pos;
67
+ void Node256::InitializeMerge(ART &art, const ARTFlags &flags) {
68
+
69
+ for (idx_t i = 0; i < Node::NODE_256_CAPACITY; i++) {
70
+ if (children[i].IsSet()) {
71
+ children[i].InitializeMerge(art, flags);
65
72
  }
66
73
  }
67
- return Node::GetNextPos(pos);
68
74
  }
69
75
 
70
- Node *Node256::GetChild(ART &art, idx_t pos) {
71
- return children[pos].Unswizzle(art);
76
+ void Node256::InsertChild(ART &art, Node &node, const uint8_t byte, const Node child) {
77
+
78
+ D_ASSERT(node.IsSet());
79
+ D_ASSERT(!node.IsSwizzled());
80
+ auto &n256 = Node256::Get(art, node);
81
+
82
+ // ensure that there is no other child at the same byte
83
+ D_ASSERT(!n256.children[byte].IsSet());
84
+
85
+ n256.count++;
86
+ n256.children[byte] = child;
72
87
  }
73
88
 
74
- void Node256::ReplaceChildPointer(idx_t pos, Node *node) {
75
- children[pos] = node;
89
+ void Node256::DeleteChild(ART &art, Node &node, const uint8_t byte) {
90
+
91
+ D_ASSERT(node.IsSet());
92
+ D_ASSERT(!node.IsSwizzled());
93
+ auto &n256 = Node256::Get(art, node);
94
+
95
+ // free the child and decrease the count
96
+ Node::Free(art, n256.children[byte]);
97
+ n256.count--;
98
+
99
+ // shrink node to Node48
100
+ if (n256.count <= Node::NODE_256_SHRINK_THRESHOLD) {
101
+ auto node256 = node;
102
+ Node48::ShrinkNode256(art, node, node256);
103
+ }
76
104
  }
77
105
 
78
- bool Node256::ChildIsInMemory(idx_t pos) {
79
- return children[pos] && !children[pos].IsSwizzled();
106
+ optional_ptr<Node> Node256::GetNextChild(uint8_t &byte) {
107
+
108
+ for (idx_t i = byte; i < Node::NODE_256_CAPACITY; i++) {
109
+ if (children[i].IsSet()) {
110
+ byte = i;
111
+ return &children[i];
112
+ }
113
+ }
114
+ return nullptr;
80
115
  }
81
116
 
82
- void Node256::InsertChild(ART &, Node *&node, uint8_t key_byte, Node *new_child) {
83
- auto n = (Node256 *)(node);
117
+ BlockPointer Node256::Serialize(ART &art, MetaBlockWriter &writer) {
118
+
119
+ // recurse into children and retrieve child block pointers
120
+ vector<BlockPointer> child_block_pointers;
121
+ for (idx_t i = 0; i < Node::NODE_256_CAPACITY; i++) {
122
+ child_block_pointers.push_back(children[i].Serialize(art, writer));
123
+ }
124
+
125
+ // get pointer and write fields
126
+ auto block_pointer = writer.GetBlockPointer();
127
+ writer.Write(NType::NODE_256);
128
+ writer.Write<uint16_t>(count);
129
+ prefix.Serialize(art, writer);
84
130
 
85
- n->count++;
86
- n->children[key_byte] = new_child;
131
+ // write child block pointers
132
+ for (auto &child_block_pointer : child_block_pointers) {
133
+ writer.Write(child_block_pointer.block_id);
134
+ writer.Write(child_block_pointer.offset);
135
+ }
136
+
137
+ return block_pointer;
87
138
  }
88
139
 
89
- void Node256::EraseChild(ART &art, Node *&node, idx_t pos) {
90
- auto n = (Node256 *)(node);
140
+ void Node256::Deserialize(ART &art, MetaBlockReader &reader) {
141
+
142
+ count = reader.Read<uint16_t>();
143
+ prefix.Deserialize(art, reader);
91
144
 
92
- // adjust the ART size
93
- if (n->ChildIsInMemory(pos)) {
94
- auto child = n->GetChild(art, pos);
95
- art.DecreaseMemorySize(child->MemorySize(art, true));
145
+ // read child block pointers
146
+ for (idx_t i = 0; i < Node::NODE_256_CAPACITY; i++) {
147
+ children[i] = Node(reader);
96
148
  }
149
+ }
97
150
 
98
- // erase the child and decrease the count
99
- n->children[pos].Reset();
100
- n->count--;
151
+ void Node256::Vacuum(ART &art, const ARTFlags &flags) {
101
152
 
102
- // shrink node to Node48
103
- if (node->count <= NODE_256_SHRINK_THRESHOLD) {
104
-
105
- auto new_node = Node48::New();
106
- art.IncreaseMemorySize(new_node->MemorySize(art, false));
107
- new_node->prefix = std::move(n->prefix);
108
-
109
- for (idx_t i = 0; i < Node256::GetSize(); i++) {
110
- if (n->children[i]) {
111
- new_node->child_index[i] = new_node->count;
112
- new_node->children[new_node->count++] = n->children[i];
113
- n->children[i] = nullptr;
114
- }
153
+ for (idx_t i = 0; i < Node::NODE_256_CAPACITY; i++) {
154
+ if (children[i].IsSet()) {
155
+ Node::Vacuum(art, children[i], flags);
115
156
  }
116
-
117
- art.DecreaseMemorySize(node->MemorySize(art, false));
118
- Node::Delete(node);
119
- node = new_node;
120
157
  }
121
158
  }
159
+
122
160
  } // namespace duckdb