duckdb 0.8.2-dev145.0 → 0.8.2-dev1493.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 (476) hide show
  1. package/binding.gyp +15 -12
  2. package/binding.gyp.in +1 -1
  3. package/configure.py +1 -1
  4. package/duckdb_extension_config.cmake +10 -0
  5. package/package.json +1 -1
  6. package/src/duckdb/extension/icu/icu-dateadd.cpp +2 -2
  7. package/src/duckdb/extension/icu/icu-datefunc.cpp +1 -1
  8. package/src/duckdb/extension/icu/icu-datepart.cpp +2 -2
  9. package/src/duckdb/extension/icu/icu-datesub.cpp +2 -2
  10. package/src/duckdb/extension/icu/icu-datetrunc.cpp +1 -1
  11. package/src/duckdb/extension/icu/icu-list-range.cpp +1 -1
  12. package/src/duckdb/extension/icu/icu-makedate.cpp +7 -0
  13. package/src/duckdb/extension/icu/icu-strptime.cpp +4 -4
  14. package/src/duckdb/extension/icu/icu-table-range.cpp +5 -5
  15. package/src/duckdb/extension/icu/icu-timebucket.cpp +16 -16
  16. package/src/duckdb/extension/icu/icu-timezone.cpp +8 -8
  17. package/src/duckdb/extension/icu/icu_extension.cpp +3 -3
  18. package/src/duckdb/extension/json/include/json_common.hpp +47 -231
  19. package/src/duckdb/extension/json/include/json_executors.hpp +49 -13
  20. package/src/duckdb/extension/json/include/json_functions.hpp +2 -1
  21. package/src/duckdb/extension/json/json_common.cpp +272 -40
  22. package/src/duckdb/extension/json/json_functions/json_structure.cpp +1 -1
  23. package/src/duckdb/extension/json/json_functions/json_transform.cpp +17 -37
  24. package/src/duckdb/extension/json/json_functions/json_type.cpp +1 -1
  25. package/src/duckdb/extension/json/json_functions.cpp +24 -24
  26. package/src/duckdb/extension/json/json_scan.cpp +3 -6
  27. package/src/duckdb/extension/parquet/column_reader.cpp +19 -21
  28. package/src/duckdb/extension/parquet/column_writer.cpp +77 -61
  29. package/src/duckdb/extension/parquet/include/cast_column_reader.hpp +2 -2
  30. package/src/duckdb/extension/parquet/include/column_reader.hpp +14 -16
  31. package/src/duckdb/extension/parquet/include/column_writer.hpp +9 -7
  32. package/src/duckdb/extension/parquet/include/list_column_reader.hpp +2 -2
  33. package/src/duckdb/extension/parquet/include/parquet_dbp_decoder.hpp +3 -3
  34. package/src/duckdb/extension/parquet/include/parquet_decimal_utils.hpp +3 -3
  35. package/src/duckdb/extension/parquet/include/parquet_file_metadata_cache.hpp +2 -2
  36. package/src/duckdb/extension/parquet/include/parquet_statistics.hpp +2 -2
  37. package/src/duckdb/extension/parquet/include/parquet_support.hpp +9 -11
  38. package/src/duckdb/extension/parquet/include/parquet_writer.hpp +24 -5
  39. package/src/duckdb/extension/parquet/include/string_column_reader.hpp +1 -1
  40. package/src/duckdb/extension/parquet/include/struct_column_reader.hpp +2 -3
  41. package/src/duckdb/extension/parquet/include/zstd_file_system.hpp +2 -2
  42. package/src/duckdb/extension/parquet/parquet_extension.cpp +192 -20
  43. package/src/duckdb/extension/parquet/parquet_reader.cpp +6 -6
  44. package/src/duckdb/extension/parquet/parquet_statistics.cpp +7 -6
  45. package/src/duckdb/extension/parquet/parquet_writer.cpp +79 -16
  46. package/src/duckdb/extension/parquet/zstd_file_system.cpp +2 -2
  47. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +1 -1
  48. package/src/duckdb/src/catalog/catalog_search_path.cpp +5 -4
  49. package/src/duckdb/src/catalog/default/default_functions.cpp +16 -0
  50. package/src/duckdb/src/common/adbc/adbc.cpp +75 -10
  51. package/src/duckdb/src/common/adbc/driver_manager.cpp +6 -11
  52. package/src/duckdb/src/common/allocator.cpp +14 -2
  53. package/src/duckdb/src/common/arrow/arrow_appender.cpp +5 -11
  54. package/src/duckdb/src/common/assert.cpp +3 -0
  55. package/src/duckdb/src/common/enum_util.cpp +42 -5
  56. package/src/duckdb/src/common/enums/logical_operator_type.cpp +4 -0
  57. package/src/duckdb/src/common/enums/optimizer_type.cpp +2 -0
  58. package/src/duckdb/src/common/enums/physical_operator_type.cpp +4 -0
  59. package/src/duckdb/src/common/exception.cpp +2 -2
  60. package/src/duckdb/src/common/file_system.cpp +19 -0
  61. package/src/duckdb/src/common/hive_partitioning.cpp +10 -6
  62. package/src/duckdb/src/common/local_file_system.cpp +2 -2
  63. package/src/duckdb/src/common/multi_file_reader.cpp +184 -20
  64. package/src/duckdb/src/common/operator/cast_operators.cpp +35 -1
  65. package/src/duckdb/src/common/radix_partitioning.cpp +26 -8
  66. package/src/duckdb/src/common/re2_regex.cpp +1 -1
  67. package/src/duckdb/src/common/row_operations/row_external.cpp +1 -1
  68. package/src/duckdb/src/common/sort/merge_sorter.cpp +9 -16
  69. package/src/duckdb/src/common/sort/partition_state.cpp +44 -11
  70. package/src/duckdb/src/common/types/batched_data_collection.cpp +7 -2
  71. package/src/duckdb/src/common/types/bit.cpp +51 -0
  72. package/src/duckdb/src/common/types/column/column_data_allocator.cpp +9 -6
  73. package/src/duckdb/src/common/types/column/column_data_collection.cpp +17 -2
  74. package/src/duckdb/src/common/types/column/column_data_collection_segment.cpp +15 -6
  75. package/src/duckdb/src/common/types/column/partitioned_column_data.cpp +2 -2
  76. package/src/duckdb/src/common/types/data_chunk.cpp +2 -2
  77. package/src/duckdb/src/common/types/date.cpp +9 -0
  78. package/src/duckdb/src/common/types/list_segment.cpp +24 -74
  79. package/src/duckdb/src/common/types/row/partitioned_tuple_data.cpp +3 -9
  80. package/src/duckdb/src/common/types/row/tuple_data_collection.cpp +2 -0
  81. package/src/duckdb/src/common/types/row/tuple_data_scatter_gather.cpp +2 -2
  82. package/src/duckdb/src/common/types/uuid.cpp +2 -2
  83. package/src/duckdb/src/common/types/validity_mask.cpp +33 -0
  84. package/src/duckdb/src/common/virtual_file_system.cpp +138 -1
  85. package/src/duckdb/src/core_functions/aggregate/holistic/reservoir_quantile.cpp +2 -0
  86. package/src/duckdb/src/core_functions/aggregate/nested/list.cpp +2 -2
  87. package/src/duckdb/src/core_functions/aggregate/regression/regr_avg.cpp +4 -4
  88. package/src/duckdb/src/core_functions/aggregate/regression/regr_intercept.cpp +4 -4
  89. package/src/duckdb/src/core_functions/aggregate/regression/regr_r2.cpp +5 -4
  90. package/src/duckdb/src/core_functions/aggregate/regression/regr_sxx_syy.cpp +8 -8
  91. package/src/duckdb/src/core_functions/aggregate/regression/regr_sxy.cpp +4 -3
  92. package/src/duckdb/src/core_functions/function_list.cpp +4 -2
  93. package/src/duckdb/src/core_functions/scalar/date/date_part.cpp +208 -42
  94. package/src/duckdb/src/core_functions/scalar/date/epoch.cpp +10 -24
  95. package/src/duckdb/src/core_functions/scalar/date/make_date.cpp +19 -4
  96. package/src/duckdb/src/core_functions/scalar/list/list_aggregates.cpp +4 -2
  97. package/src/duckdb/src/execution/aggregate_hashtable.cpp +34 -18
  98. package/src/duckdb/src/execution/expression_executor.cpp +1 -1
  99. package/src/duckdb/src/execution/index/art/art.cpp +149 -139
  100. package/src/duckdb/src/execution/index/art/fixed_size_allocator.cpp +1 -1
  101. package/src/duckdb/src/execution/index/art/iterator.cpp +129 -207
  102. package/src/duckdb/src/execution/index/art/leaf.cpp +8 -37
  103. package/src/duckdb/src/execution/index/art/node.cpp +113 -120
  104. package/src/duckdb/src/execution/index/art/node16.cpp +1 -10
  105. package/src/duckdb/src/execution/index/art/node256.cpp +1 -9
  106. package/src/duckdb/src/execution/index/art/node4.cpp +12 -13
  107. package/src/duckdb/src/execution/index/art/node48.cpp +1 -11
  108. package/src/duckdb/src/execution/index/art/prefix.cpp +228 -350
  109. package/src/duckdb/src/execution/join_hashtable.cpp +4 -4
  110. package/src/duckdb/src/execution/operator/aggregate/aggregate_object.cpp +1 -0
  111. package/src/duckdb/src/execution/operator/aggregate/physical_streaming_window.cpp +8 -3
  112. package/src/duckdb/src/execution/operator/aggregate/physical_ungrouped_aggregate.cpp +32 -22
  113. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +512 -300
  114. package/src/duckdb/src/execution/operator/helper/physical_batch_collector.cpp +4 -3
  115. package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +5 -5
  116. package/src/duckdb/src/execution/operator/join/physical_asof_join.cpp +414 -283
  117. package/src/duckdb/src/execution/operator/join/physical_comparison_join.cpp +1 -1
  118. package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +21 -10
  119. package/src/duckdb/src/execution/operator/join/physical_join.cpp +1 -1
  120. package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +22 -3
  121. package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +2 -2
  122. package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +100 -13
  123. package/src/duckdb/src/execution/operator/persistent/csv_file_handle.cpp +1 -1
  124. package/src/duckdb/src/execution/operator/persistent/csv_reader_options.cpp +20 -0
  125. package/src/duckdb/src/execution/operator/persistent/csv_rejects_table.cpp +48 -0
  126. package/src/duckdb/src/execution/operator/persistent/parallel_csv_reader.cpp +2 -3
  127. package/src/duckdb/src/execution/operator/persistent/physical_batch_copy_to_file.cpp +6 -4
  128. package/src/duckdb/src/execution/operator/persistent/physical_fixed_batch_copy.cpp +3 -3
  129. package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +1 -1
  130. package/src/duckdb/src/execution/operator/projection/physical_pivot.cpp +2 -1
  131. package/src/duckdb/src/execution/operator/scan/physical_column_data_scan.cpp +19 -0
  132. package/src/duckdb/src/execution/operator/scan/physical_table_scan.cpp +7 -2
  133. package/src/duckdb/src/execution/operator/set/physical_cte.cpp +160 -0
  134. package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +15 -5
  135. package/src/duckdb/src/execution/partitionable_hashtable.cpp +41 -6
  136. package/src/duckdb/src/execution/perfect_aggregate_hashtable.cpp +30 -5
  137. package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +43 -10
  138. package/src/duckdb/src/execution/physical_plan/plan_cte.cpp +33 -0
  139. package/src/duckdb/src/execution/physical_plan/plan_get.cpp +2 -2
  140. package/src/duckdb/src/execution/physical_plan/plan_recursive_cte.cpp +25 -4
  141. package/src/duckdb/src/execution/physical_plan_generator.cpp +4 -0
  142. package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +290 -43
  143. package/src/duckdb/src/execution/window_segment_tree.cpp +286 -129
  144. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +2 -1
  145. package/src/duckdb/src/function/cast/bit_cast.cpp +34 -2
  146. package/src/duckdb/src/function/cast/blob_cast.cpp +3 -0
  147. package/src/duckdb/src/function/cast/numeric_casts.cpp +2 -0
  148. package/src/duckdb/src/function/function.cpp +3 -1
  149. package/src/duckdb/src/function/scalar/compressed_materialization/compress_integral.cpp +212 -0
  150. package/src/duckdb/src/function/scalar/compressed_materialization/compress_string.cpp +249 -0
  151. package/src/duckdb/src/function/scalar/compressed_materialization_functions.cpp +29 -0
  152. package/src/duckdb/src/function/scalar/list/list_resize.cpp +162 -0
  153. package/src/duckdb/src/function/scalar/nested_functions.cpp +1 -0
  154. package/src/duckdb/src/function/scalar/string/like.cpp +12 -4
  155. package/src/duckdb/src/function/scalar/system/aggregate_export.cpp +12 -5
  156. package/src/duckdb/src/function/table/copy_csv.cpp +8 -1
  157. package/src/duckdb/src/function/table/read_csv.cpp +100 -17
  158. package/src/duckdb/src/function/table/table_scan.cpp +9 -0
  159. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  160. package/src/duckdb/src/include/duckdb/common/adbc/adbc.hpp +1 -0
  161. package/src/duckdb/src/include/duckdb/common/allocator.hpp +2 -0
  162. package/src/duckdb/src/include/duckdb/common/bswap.hpp +42 -0
  163. package/src/duckdb/src/include/duckdb/common/enum_util.hpp +8 -0
  164. package/src/duckdb/src/include/duckdb/common/enums/cte_materialize.hpp +21 -0
  165. package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +2 -1
  166. package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +2 -0
  167. package/src/duckdb/src/include/duckdb/common/enums/optimizer_type.hpp +2 -0
  168. package/src/duckdb/src/include/duckdb/common/enums/physical_operator_type.hpp +2 -0
  169. package/src/duckdb/src/include/duckdb/common/extra_operator_info.hpp +27 -0
  170. package/src/duckdb/src/include/duckdb/common/file_system.hpp +2 -0
  171. package/src/duckdb/src/include/duckdb/common/hive_partitioning.hpp +1 -1
  172. package/src/duckdb/src/include/duckdb/common/multi_file_reader.hpp +6 -4
  173. package/src/duckdb/src/include/duckdb/common/multi_file_reader_options.hpp +10 -42
  174. package/src/duckdb/src/include/duckdb/common/mutex.hpp +3 -0
  175. package/src/duckdb/src/include/duckdb/common/operator/cast_operators.hpp +43 -3
  176. package/src/duckdb/src/include/duckdb/common/operator/numeric_cast.hpp +10 -0
  177. package/src/duckdb/src/include/duckdb/common/radix.hpp +9 -20
  178. package/src/duckdb/src/include/duckdb/common/radix_partitioning.hpp +6 -21
  179. package/src/duckdb/src/include/duckdb/common/row_operations/row_operations.hpp +3 -3
  180. package/src/duckdb/src/include/duckdb/common/sort/partition_state.hpp +13 -0
  181. package/src/duckdb/src/include/duckdb/common/types/batched_data_collection.hpp +3 -1
  182. package/src/duckdb/src/include/duckdb/common/types/bit.hpp +81 -0
  183. package/src/duckdb/src/include/duckdb/common/types/column/column_data_allocator.hpp +1 -1
  184. package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection.hpp +6 -1
  185. package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection_segment.hpp +1 -1
  186. package/src/duckdb/src/include/duckdb/common/types/column/column_data_scan_states.hpp +3 -1
  187. package/src/duckdb/src/include/duckdb/common/types/data_chunk.hpp +1 -1
  188. package/src/duckdb/src/include/duckdb/common/types/date.hpp +7 -5
  189. package/src/duckdb/src/include/duckdb/common/types/list_segment.hpp +6 -8
  190. package/src/duckdb/src/include/duckdb/common/types/row/partitioned_tuple_data.hpp +0 -1
  191. package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_collection.hpp +1 -0
  192. package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_states.hpp +3 -0
  193. package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +9 -0
  194. package/src/duckdb/src/include/duckdb/common/virtual_file_system.hpp +38 -97
  195. package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/corr.hpp +4 -4
  196. package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/covar.hpp +3 -1
  197. package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic_functions.hpp +3 -1
  198. package/src/duckdb/src/include/duckdb/core_functions/aggregate/distributive_functions.hpp +3 -1
  199. package/src/duckdb/src/include/duckdb/core_functions/aggregate/holistic_functions.hpp +3 -1
  200. package/src/duckdb/src/include/duckdb/core_functions/aggregate/nested_functions.hpp +3 -1
  201. package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_count.hpp +1 -0
  202. package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_slope.hpp +3 -3
  203. package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression_functions.hpp +3 -1
  204. package/src/duckdb/src/include/duckdb/core_functions/scalar/bit_functions.hpp +3 -1
  205. package/src/duckdb/src/include/duckdb/core_functions/scalar/blob_functions.hpp +3 -1
  206. package/src/duckdb/src/include/duckdb/core_functions/scalar/date_functions.hpp +31 -11
  207. package/src/duckdb/src/include/duckdb/core_functions/scalar/enum_functions.hpp +3 -1
  208. package/src/duckdb/src/include/duckdb/core_functions/scalar/generic_functions.hpp +3 -1
  209. package/src/duckdb/src/include/duckdb/core_functions/scalar/list_functions.hpp +3 -1
  210. package/src/duckdb/src/include/duckdb/core_functions/scalar/map_functions.hpp +3 -1
  211. package/src/duckdb/src/include/duckdb/core_functions/scalar/math_functions.hpp +3 -1
  212. package/src/duckdb/src/include/duckdb/core_functions/scalar/operators_functions.hpp +3 -1
  213. package/src/duckdb/src/include/duckdb/core_functions/scalar/random_functions.hpp +3 -1
  214. package/src/duckdb/src/include/duckdb/core_functions/scalar/string_functions.hpp +3 -1
  215. package/src/duckdb/src/include/duckdb/core_functions/scalar/struct_functions.hpp +3 -1
  216. package/src/duckdb/src/include/duckdb/core_functions/scalar/union_functions.hpp +3 -1
  217. package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +21 -3
  218. package/src/duckdb/src/include/duckdb/execution/executor.hpp +3 -0
  219. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +4 -5
  220. package/src/duckdb/src/include/duckdb/execution/index/art/iterator.hpp +31 -27
  221. package/src/duckdb/src/include/duckdb/execution/index/art/leaf.hpp +6 -14
  222. package/src/duckdb/src/include/duckdb/execution/index/art/node.hpp +4 -10
  223. package/src/duckdb/src/include/duckdb/execution/index/art/node16.hpp +3 -6
  224. package/src/duckdb/src/include/duckdb/execution/index/art/node256.hpp +3 -6
  225. package/src/duckdb/src/include/duckdb/execution/index/art/node4.hpp +5 -8
  226. package/src/duckdb/src/include/duckdb/execution/index/art/node48.hpp +3 -6
  227. package/src/duckdb/src/include/duckdb/execution/index/art/prefix.hpp +63 -52
  228. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_asof_join.hpp +2 -10
  229. package/src/duckdb/src/include/duckdb/execution/operator/persistent/base_csv_reader.hpp +2 -2
  230. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_line_info.hpp +4 -3
  231. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +8 -1
  232. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_rejects_table.hpp +36 -0
  233. package/src/duckdb/src/include/duckdb/execution/operator/persistent/parallel_csv_reader.hpp +1 -1
  234. package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_column_data_scan.hpp +10 -0
  235. package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_table_scan.hpp +5 -1
  236. package/src/duckdb/src/include/duckdb/execution/operator/set/physical_cte.hpp +62 -0
  237. package/src/duckdb/src/include/duckdb/execution/operator/set/physical_recursive_cte.hpp +8 -2
  238. package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +5 -1
  239. package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +3 -0
  240. package/src/duckdb/src/include/duckdb/execution/radix_partitioned_hashtable.hpp +10 -3
  241. package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +51 -40
  242. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +1 -1
  243. package/src/duckdb/src/include/duckdb/function/aggregate_state.hpp +2 -2
  244. package/src/duckdb/src/include/duckdb/function/built_in_functions.hpp +1 -0
  245. package/src/duckdb/src/include/duckdb/function/scalar/compressed_materialization_functions.hpp +49 -0
  246. package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +1 -1
  247. package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +5 -0
  248. package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +2 -0
  249. package/src/duckdb/src/include/duckdb/main/client_config.hpp +3 -0
  250. package/src/duckdb/src/include/duckdb/main/config.hpp +2 -0
  251. package/src/duckdb/src/include/duckdb/main/connection.hpp +1 -2
  252. package/src/duckdb/src/include/duckdb/main/relation/cross_product_relation.hpp +4 -1
  253. package/src/duckdb/src/include/duckdb/main/relation/join_relation.hpp +5 -2
  254. package/src/duckdb/src/include/duckdb/main/relation.hpp +4 -2
  255. package/src/duckdb/src/include/duckdb/main/settings.hpp +30 -1
  256. package/src/duckdb/src/include/duckdb/optimizer/column_binding_replacer.hpp +47 -0
  257. package/src/duckdb/src/include/duckdb/optimizer/compressed_materialization.hpp +132 -0
  258. package/src/duckdb/src/include/duckdb/optimizer/deliminator.hpp +13 -16
  259. package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +3 -0
  260. package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +1 -1
  261. package/src/duckdb/src/include/duckdb/optimizer/join_order/estimated_properties.hpp +10 -1
  262. package/src/duckdb/src/include/duckdb/optimizer/join_order/join_order_optimizer.hpp +1 -1
  263. package/src/duckdb/src/include/duckdb/optimizer/join_order/join_relation.hpp +1 -1
  264. package/src/duckdb/src/include/duckdb/optimizer/join_order/query_graph.hpp +3 -0
  265. package/src/duckdb/src/include/duckdb/optimizer/matcher/set_matcher.hpp +13 -0
  266. package/src/duckdb/src/include/duckdb/optimizer/optimizer.hpp +3 -0
  267. package/src/duckdb/src/include/duckdb/optimizer/remove_duplicate_groups.hpp +40 -0
  268. package/src/duckdb/src/include/duckdb/optimizer/statistics_propagator.hpp +11 -3
  269. package/src/duckdb/src/include/duckdb/optimizer/topn_optimizer.hpp +2 -0
  270. package/src/duckdb/src/include/duckdb/parallel/pipeline.hpp +2 -0
  271. package/src/duckdb/src/include/duckdb/parallel/task_scheduler.hpp +5 -0
  272. package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +2 -0
  273. package/src/duckdb/src/include/duckdb/parser/expression/between_expression.hpp +3 -0
  274. package/src/duckdb/src/include/duckdb/parser/expression/cast_expression.hpp +3 -0
  275. package/src/duckdb/src/include/duckdb/parser/expression/collate_expression.hpp +3 -0
  276. package/src/duckdb/src/include/duckdb/parser/expression/columnref_expression.hpp +3 -0
  277. package/src/duckdb/src/include/duckdb/parser/expression/comparison_expression.hpp +3 -0
  278. package/src/duckdb/src/include/duckdb/parser/expression/constant_expression.hpp +3 -0
  279. package/src/duckdb/src/include/duckdb/parser/expression/default_expression.hpp +1 -0
  280. package/src/duckdb/src/include/duckdb/parser/expression/function_expression.hpp +3 -0
  281. package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +3 -0
  282. package/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +3 -0
  283. package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +3 -0
  284. package/src/duckdb/src/include/duckdb/parser/query_node/cte_node.hpp +54 -0
  285. package/src/duckdb/src/include/duckdb/parser/query_node/list.hpp +1 -0
  286. package/src/duckdb/src/include/duckdb/parser/query_node.hpp +2 -1
  287. package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +1 -0
  288. package/src/duckdb/src/include/duckdb/parser/tableref/joinref.hpp +1 -1
  289. package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +3 -0
  290. package/src/duckdb/src/include/duckdb/parser/tokens.hpp +1 -0
  291. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +15 -8
  292. package/src/duckdb/src/include/duckdb/planner/binder.hpp +8 -5
  293. package/src/duckdb/src/include/duckdb/planner/bound_tokens.hpp +1 -0
  294. package/src/duckdb/src/include/duckdb/planner/column_binding.hpp +4 -0
  295. package/src/duckdb/src/include/duckdb/planner/constraints/bound_unique_constraint.hpp +3 -3
  296. package/src/duckdb/src/include/duckdb/planner/expression_binder/lateral_binder.hpp +0 -2
  297. package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +1 -0
  298. package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +2 -1
  299. package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +5 -5
  300. package/src/duckdb/src/include/duckdb/planner/operator/logical_cteref.hpp +7 -2
  301. package/src/duckdb/src/include/duckdb/planner/operator/logical_dependent_join.hpp +43 -0
  302. package/src/duckdb/src/include/duckdb/planner/operator/logical_get.hpp +4 -0
  303. package/src/duckdb/src/include/duckdb/planner/operator/logical_materialized_cte.hpp +49 -0
  304. package/src/duckdb/src/include/duckdb/planner/operator/logical_recursive_cte.hpp +5 -4
  305. package/src/duckdb/src/include/duckdb/planner/query_node/bound_cte_node.hpp +44 -0
  306. package/src/duckdb/src/include/duckdb/planner/query_node/list.hpp +1 -0
  307. package/src/duckdb/src/include/duckdb/planner/subquery/flatten_dependent_join.hpp +2 -2
  308. package/src/duckdb/src/include/duckdb/planner/subquery/has_correlated_expressions.hpp +4 -1
  309. package/src/duckdb/src/include/duckdb/planner/subquery/recursive_dependent_join_planner.hpp +31 -0
  310. package/src/duckdb/src/include/duckdb/planner/subquery/rewrite_correlated_expressions.hpp +8 -2
  311. package/src/duckdb/src/include/duckdb/planner/tableref/bound_cteref.hpp +5 -2
  312. package/src/duckdb/src/include/duckdb/storage/arena_allocator.hpp +1 -1
  313. package/src/duckdb/src/include/duckdb/storage/block_manager.hpp +3 -3
  314. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +1 -1
  315. package/src/duckdb/src/include/duckdb/storage/object_cache.hpp +22 -0
  316. package/src/duckdb/src/include/duckdb/storage/single_file_block_manager.hpp +2 -0
  317. package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +4 -0
  318. package/src/duckdb/src/include/duckdb/storage/table/chunk_info.hpp +3 -0
  319. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +3 -2
  320. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +1 -3
  321. package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +2 -3
  322. package/src/duckdb/src/include/duckdb.h +28 -0
  323. package/src/duckdb/src/main/capi/arrow-c.cpp +155 -1
  324. package/src/duckdb/src/main/capi/duckdb_value-c.cpp +1 -1
  325. package/src/duckdb/src/main/config.cpp +3 -0
  326. package/src/duckdb/src/main/database.cpp +1 -1
  327. package/src/duckdb/src/main/extension/extension_helper.cpp +96 -89
  328. package/src/duckdb/src/main/extension/extension_install.cpp +6 -0
  329. package/src/duckdb/src/main/extension/extension_load.cpp +10 -1
  330. package/src/duckdb/src/main/relation/cross_product_relation.cpp +4 -3
  331. package/src/duckdb/src/main/relation/join_relation.cpp +5 -5
  332. package/src/duckdb/src/main/relation.cpp +6 -5
  333. package/src/duckdb/src/main/settings/settings.cpp +64 -18
  334. package/src/duckdb/src/optimizer/column_binding_replacer.cpp +43 -0
  335. package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +1 -2
  336. package/src/duckdb/src/optimizer/compressed_materialization/compress_aggregate.cpp +140 -0
  337. package/src/duckdb/src/optimizer/compressed_materialization/compress_distinct.cpp +42 -0
  338. package/src/duckdb/src/optimizer/compressed_materialization/compress_order.cpp +65 -0
  339. package/src/duckdb/src/optimizer/compressed_materialization.cpp +478 -0
  340. package/src/duckdb/src/optimizer/deliminator.cpp +176 -321
  341. package/src/duckdb/src/optimizer/filter_pushdown.cpp +9 -0
  342. package/src/duckdb/src/optimizer/join_order/estimated_properties.cpp +7 -0
  343. package/src/duckdb/src/optimizer/join_order/join_node.cpp +2 -2
  344. package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +113 -82
  345. package/src/duckdb/src/optimizer/join_order/join_relation_set.cpp +2 -6
  346. package/src/duckdb/src/optimizer/join_order/query_graph.cpp +22 -14
  347. package/src/duckdb/src/optimizer/optimizer.cpp +51 -14
  348. package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +5 -5
  349. package/src/duckdb/src/optimizer/pushdown/pushdown_get.cpp +0 -1
  350. package/src/duckdb/src/optimizer/remove_duplicate_groups.cpp +127 -0
  351. package/src/duckdb/src/optimizer/remove_unused_columns.cpp +4 -0
  352. package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +154 -15
  353. package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +65 -8
  354. package/src/duckdb/src/optimizer/statistics/operator/propagate_order.cpp +1 -1
  355. package/src/duckdb/src/optimizer/statistics_propagator.cpp +7 -5
  356. package/src/duckdb/src/optimizer/topn_optimizer.cpp +20 -10
  357. package/src/duckdb/src/parallel/executor.cpp +15 -0
  358. package/src/duckdb/src/parallel/task_scheduler.cpp +11 -2
  359. package/src/duckdb/src/parser/common_table_expression_info.cpp +2 -0
  360. package/src/duckdb/src/parser/expression/between_expression.cpp +3 -15
  361. package/src/duckdb/src/parser/expression/case_expression.cpp +0 -13
  362. package/src/duckdb/src/parser/expression/cast_expression.cpp +3 -14
  363. package/src/duckdb/src/parser/expression/collate_expression.cpp +3 -13
  364. package/src/duckdb/src/parser/expression/columnref_expression.cpp +3 -12
  365. package/src/duckdb/src/parser/expression/comparison_expression.cpp +3 -13
  366. package/src/duckdb/src/parser/expression/conjunction_expression.cpp +0 -12
  367. package/src/duckdb/src/parser/expression/constant_expression.cpp +3 -11
  368. package/src/duckdb/src/parser/expression/default_expression.cpp +0 -4
  369. package/src/duckdb/src/parser/expression/function_expression.cpp +3 -32
  370. package/src/duckdb/src/parser/expression/lambda_expression.cpp +4 -14
  371. package/src/duckdb/src/parser/expression/operator_expression.cpp +0 -12
  372. package/src/duckdb/src/parser/expression/parameter_expression.cpp +0 -12
  373. package/src/duckdb/src/parser/expression/positional_reference_expression.cpp +4 -11
  374. package/src/duckdb/src/parser/expression/star_expression.cpp +0 -19
  375. package/src/duckdb/src/parser/expression/subquery_expression.cpp +0 -18
  376. package/src/duckdb/src/parser/expression/window_expression.cpp +3 -39
  377. package/src/duckdb/src/parser/parsed_expression.cpp +0 -70
  378. package/src/duckdb/src/parser/parsed_expression_iterator.cpp +7 -0
  379. package/src/duckdb/src/parser/parser.cpp +8 -2
  380. package/src/duckdb/src/parser/query_node/cte_node.cpp +58 -0
  381. package/src/duckdb/src/parser/query_node/recursive_cte_node.cpp +0 -19
  382. package/src/duckdb/src/parser/query_node/select_node.cpp +0 -29
  383. package/src/duckdb/src/parser/query_node/set_operation_node.cpp +0 -15
  384. package/src/duckdb/src/parser/query_node.cpp +15 -37
  385. package/src/duckdb/src/parser/result_modifier.cpp +0 -74
  386. package/src/duckdb/src/parser/tableref/basetableref.cpp +0 -19
  387. package/src/duckdb/src/parser/tableref/emptytableref.cpp +0 -4
  388. package/src/duckdb/src/parser/tableref/expressionlistref.cpp +0 -15
  389. package/src/duckdb/src/parser/tableref/joinref.cpp +3 -23
  390. package/src/duckdb/src/parser/tableref/pivotref.cpp +0 -23
  391. package/src/duckdb/src/parser/tableref/subqueryref.cpp +3 -13
  392. package/src/duckdb/src/parser/tableref/table_function.cpp +0 -15
  393. package/src/duckdb/src/parser/tableref.cpp +0 -44
  394. package/src/duckdb/src/parser/transform/expression/transform_constant.cpp +55 -3
  395. package/src/duckdb/src/parser/transform/expression/transform_expression.cpp +2 -0
  396. package/src/duckdb/src/parser/transform/expression/transform_multi_assign_reference.cpp +44 -0
  397. package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +19 -1
  398. package/src/duckdb/src/parser/transform/statement/transform_copy.cpp +13 -0
  399. package/src/duckdb/src/parser/transform/statement/transform_delete.cpp +6 -1
  400. package/src/duckdb/src/parser/transform/statement/transform_insert.cpp +6 -1
  401. package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +7 -2
  402. package/src/duckdb/src/parser/transform/statement/transform_pragma.cpp +14 -11
  403. package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +11 -2
  404. package/src/duckdb/src/parser/transform/statement/transform_update.cpp +6 -1
  405. package/src/duckdb/src/parser/transformer.cpp +15 -0
  406. package/src/duckdb/src/planner/binder/query_node/bind_cte_node.cpp +64 -0
  407. package/src/duckdb/src/planner/binder/query_node/plan_cte_node.cpp +26 -0
  408. package/src/duckdb/src/planner/binder/query_node/plan_recursive_cte_node.cpp +5 -5
  409. package/src/duckdb/src/planner/binder/query_node/plan_setop.cpp +4 -4
  410. package/src/duckdb/src/planner/binder/query_node/plan_subquery.cpp +32 -29
  411. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +5 -4
  412. package/src/duckdb/src/planner/binder/tableref/bind_basetableref.cpp +11 -2
  413. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +32 -5
  414. package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +116 -49
  415. package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -1
  416. package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +61 -26
  417. package/src/duckdb/src/planner/binder/tableref/plan_subqueryref.cpp +3 -3
  418. package/src/duckdb/src/planner/binder.cpp +5 -0
  419. package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +1 -1
  420. package/src/duckdb/src/planner/expression_binder/lateral_binder.cpp +4 -31
  421. package/src/duckdb/src/planner/expression_binder.cpp +3 -0
  422. package/src/duckdb/src/planner/expression_iterator.cpp +6 -0
  423. package/src/duckdb/src/planner/logical_operator.cpp +5 -0
  424. package/src/duckdb/src/planner/logical_operator_visitor.cpp +2 -0
  425. package/src/duckdb/src/planner/operator/logical_cteref.cpp +3 -1
  426. package/src/duckdb/src/planner/operator/logical_dependent_join.cpp +26 -0
  427. package/src/duckdb/src/planner/operator/logical_get.cpp +9 -4
  428. package/src/duckdb/src/planner/operator/logical_materialized_cte.cpp +21 -0
  429. package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +90 -38
  430. package/src/duckdb/src/planner/subquery/has_correlated_expressions.cpp +22 -7
  431. package/src/duckdb/src/planner/subquery/rewrite_correlated_expressions.cpp +65 -7
  432. package/src/duckdb/src/storage/arena_allocator.cpp +1 -2
  433. package/src/duckdb/src/storage/buffer/block_manager.cpp +3 -0
  434. package/src/duckdb/src/storage/checkpoint_manager.cpp +3 -0
  435. package/src/duckdb/src/storage/compression/rle.cpp +0 -1
  436. package/src/duckdb/src/storage/data_table.cpp +1 -1
  437. package/src/duckdb/src/storage/local_storage.cpp +3 -3
  438. package/src/duckdb/src/storage/serialization/serialize_parsed_expression.cpp +340 -0
  439. package/src/duckdb/src/storage/serialization/serialize_query_node.cpp +122 -0
  440. package/src/duckdb/src/storage/serialization/serialize_result_modifier.cpp +86 -0
  441. package/src/duckdb/src/storage/serialization/serialize_tableref.cpp +166 -0
  442. package/src/duckdb/src/storage/single_file_block_manager.cpp +23 -0
  443. package/src/duckdb/src/storage/statistics/string_stats.cpp +21 -2
  444. package/src/duckdb/src/storage/storage_info.cpp +1 -1
  445. package/src/duckdb/src/storage/table/chunk_info.cpp +17 -0
  446. package/src/duckdb/src/storage/table/row_group.cpp +25 -9
  447. package/src/duckdb/src/storage/table/row_group_collection.cpp +19 -18
  448. package/src/duckdb/third_party/concurrentqueue/concurrentqueue.h +2 -2
  449. package/src/duckdb/third_party/concurrentqueue/lightweightsemaphore.h +76 -0
  450. package/src/duckdb/third_party/fast_float/fast_float/fast_float.h +2 -0
  451. package/src/duckdb/third_party/httplib/httplib.hpp +10 -1
  452. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +9 -0
  453. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +2 -1
  454. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +12487 -12331
  455. package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +6 -6
  456. package/src/duckdb/ub_src_execution_index_art.cpp +0 -2
  457. package/src/duckdb/ub_src_execution_operator_persistent.cpp +2 -0
  458. package/src/duckdb/ub_src_execution_operator_set.cpp +2 -0
  459. package/src/duckdb/ub_src_execution_physical_plan.cpp +2 -0
  460. package/src/duckdb/ub_src_function_scalar.cpp +2 -0
  461. package/src/duckdb/ub_src_function_scalar_compressed_materialization.cpp +4 -0
  462. package/src/duckdb/ub_src_function_scalar_list.cpp +2 -0
  463. package/src/duckdb/ub_src_optimizer.cpp +6 -0
  464. package/src/duckdb/ub_src_optimizer_compressed_materialization.cpp +6 -0
  465. package/src/duckdb/ub_src_optimizer_statistics_expression.cpp +0 -2
  466. package/src/duckdb/ub_src_parser_query_node.cpp +2 -0
  467. package/src/duckdb/ub_src_parser_transform_expression.cpp +2 -0
  468. package/src/duckdb/ub_src_planner_binder_query_node.cpp +4 -0
  469. package/src/duckdb/ub_src_planner_operator.cpp +4 -0
  470. package/src/duckdb/ub_src_storage_serialization.cpp +8 -0
  471. package/src/statement.cpp +10 -3
  472. package/test/test_all_types.test.ts +233 -0
  473. package/tsconfig.json +1 -0
  474. package/src/duckdb/src/execution/index/art/prefix_segment.cpp +0 -42
  475. package/src/duckdb/src/include/duckdb/execution/index/art/prefix_segment.hpp +0 -40
  476. package/src/duckdb/src/optimizer/statistics/expression/propagate_and_compress.cpp +0 -118
@@ -3,469 +3,347 @@
3
3
  #include "duckdb/execution/index/art/art.hpp"
4
4
  #include "duckdb/execution/index/art/art_key.hpp"
5
5
  #include "duckdb/execution/index/art/node.hpp"
6
- #include "duckdb/execution/index/art/prefix_segment.hpp"
7
6
  #include "duckdb/storage/meta_block_reader.hpp"
8
7
  #include "duckdb/storage/meta_block_writer.hpp"
8
+ #include "duckdb/common/swap.hpp"
9
9
 
10
10
  namespace duckdb {
11
11
 
12
- void Prefix::Free(ART &art) {
12
+ Prefix &Prefix::New(ART &art, Node &node) {
13
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
- }
14
+ node.SetPtr(Node::GetAllocator(art, NType::PREFIX).New());
15
+ node.type = (uint8_t)NType::PREFIX;
25
16
 
26
- Initialize();
17
+ auto &prefix = Prefix::Get(art, node);
18
+ prefix.data[Node::PREFIX_SIZE] = 0;
19
+ return prefix;
27
20
  }
28
21
 
29
- void Prefix::Initialize(ART &art, const ARTKey &key, const uint32_t depth, const uint32_t count_p) {
22
+ Prefix &Prefix::New(ART &art, Node &node, uint8_t byte, Node next) {
30
23
 
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
- }
24
+ node.SetPtr(Node::GetAllocator(art, NType::PREFIX).New());
25
+ node.type = (uint8_t)NType::PREFIX;
37
26
 
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);
27
+ auto &prefix = Prefix::Get(art, node);
28
+ prefix.data[Node::PREFIX_SIZE] = 1;
29
+ prefix.data[0] = byte;
30
+ prefix.ptr = next;
31
+ return prefix;
45
32
  }
46
33
 
47
- void Prefix::Initialize(ART &art, const Prefix &other, const uint32_t count_p) {
34
+ void Prefix::New(ART &art, reference<Node> &node, const ARTKey &key, const uint32_t depth, uint32_t count) {
48
35
 
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;
36
+ if (count == 0) {
55
37
  return;
56
38
  }
39
+ idx_t copy_count = 0;
57
40
 
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;
41
+ while (count) {
42
+ node.get().SetPtr(Node::GetAllocator(art, NType::PREFIX).New());
43
+ node.get().type = (uint8_t)NType::PREFIX;
44
+ auto &prefix = Prefix::Get(art, node);
65
45
 
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);
46
+ auto this_count = MinValue((uint32_t)Node::PREFIX_SIZE, count);
47
+ prefix.data[Node::PREFIX_SIZE] = (uint8_t)this_count;
48
+ memcpy(prefix.data, key.data + depth + copy_count, this_count);
70
49
 
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;
50
+ node = prefix.ptr;
51
+ copy_count += this_count;
52
+ count -= this_count;
79
53
  }
80
- D_ASSERT(count == count_p);
81
54
  }
82
55
 
83
- void Prefix::InitializeMerge(ART &art, const idx_t buffer_count) {
84
-
85
- if (IsInlined()) {
86
- return;
87
- }
56
+ void Prefix::Free(ART &art, Node &node) {
88
57
 
89
- reference<PrefixSegment> segment(PrefixSegment::Get(art, data.ptr));
90
- data.ptr.buffer_id += buffer_count;
58
+ D_ASSERT(node.IsSet());
59
+ D_ASSERT(!node.IsSwizzled());
91
60
 
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
- }
61
+ auto &child = Prefix::Get(art, node).ptr;
62
+ Node::Free(art, child);
98
63
  }
99
64
 
100
- void Prefix::Append(ART &art, const Prefix &other) {
65
+ void Prefix::Concatenate(ART &art, Node &prefix_node, const uint8_t byte, Node &child_prefix_node) {
101
66
 
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;
107
- }
67
+ D_ASSERT(prefix_node.IsSet() && !prefix_node.IsSwizzled());
68
+ D_ASSERT(child_prefix_node.IsSet());
108
69
 
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);
70
+ if (child_prefix_node.IsSwizzled()) {
71
+ child_prefix_node.Deserialize(art);
113
72
  }
114
73
 
115
- // get the tail of the segments of this prefix
116
- reference<PrefixSegment> segment(PrefixSegment::Get(art, data.ptr).GetTail(art));
74
+ // append a byte and a child_prefix to prefix
75
+ if (prefix_node.DecodeARTNodeType() == NType::PREFIX) {
117
76
 
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;
124
- }
77
+ // get the tail
78
+ reference<Prefix> prefix = Prefix::Get(art, prefix_node);
79
+ D_ASSERT(prefix.get().ptr.IsSet() && !prefix.get().ptr.IsSwizzled());
125
80
 
126
- // iterate all segments of the other prefix and copy their data
127
- auto other_ptr = other.data.ptr;
128
- auto remaining = other.count;
81
+ while (prefix.get().ptr.DecodeARTNodeType() == NType::PREFIX) {
82
+ prefix = Prefix::Get(art, prefix.get().ptr);
83
+ D_ASSERT(prefix.get().ptr.IsSet() && !prefix.get().ptr.IsSwizzled());
84
+ }
129
85
 
130
- while (other_ptr.IsSet()) {
131
- auto &other_segment = PrefixSegment::Get(art, other_ptr);
132
- auto copy_count = MinValue(Node::PREFIX_SEGMENT_SIZE, remaining);
86
+ // append the byte
87
+ prefix = prefix.get().Append(art, byte);
133
88
 
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]);
89
+ if (child_prefix_node.DecodeARTNodeType() == NType::PREFIX) {
90
+ // append the child prefix
91
+ prefix.get().Append(art, child_prefix_node);
92
+ } else {
93
+ // set child_prefix_node to succeed prefix
94
+ prefix.get().ptr = child_prefix_node;
137
95
  }
138
-
139
- // adjust the loop variables
140
- other_ptr = other_segment.next;
141
- remaining -= copy_count;
96
+ return;
142
97
  }
143
- D_ASSERT(remaining == 0);
144
- }
145
-
146
- void Prefix::Concatenate(ART &art, const uint8_t byte, const Prefix &other) {
147
98
 
148
- auto new_size = count + 1 + other.count;
99
+ // create a new prefix node containing the byte, then append the child_prefix to it
100
+ if (prefix_node.DecodeARTNodeType() != NType::PREFIX && child_prefix_node.DecodeARTNodeType() == NType::PREFIX) {
149
101
 
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;
102
+ auto child_prefix = child_prefix_node;
103
+ auto &prefix = Prefix::New(art, prefix_node, byte, Node());
104
+ prefix.Append(art, child_prefix);
159
105
  return;
160
106
  }
161
107
 
162
- auto this_inlined = IsInlined();
163
- auto this_count = count;
164
- auto this_data = data;
165
- Initialize();
108
+ // neither prefix nor child_prefix are prefix nodes
109
+ // create a new prefix containing the byte
110
+ Prefix::New(art, prefix_node, byte, child_prefix_node);
111
+ }
166
112
 
167
- // append the other prefix and possibly move the data to a segment
168
- Append(art, other);
169
- if (IsInlined()) {
170
- MoveInlinedToSegment(art);
171
- }
113
+ idx_t Prefix::Traverse(ART &art, reference<Node> &prefix_node, const ARTKey &key, idx_t &depth) {
172
114
 
173
- // get the tail
174
- reference<PrefixSegment> segment(PrefixSegment::Get(art, data.ptr).GetTail(art));
175
- // append the byte
176
- segment = segment.get().Append(art, count, byte);
115
+ D_ASSERT(prefix_node.get().IsSet() && !prefix_node.get().IsSwizzled());
116
+ D_ASSERT(prefix_node.get().DecodeARTNodeType() == NType::PREFIX);
177
117
 
178
- if (this_inlined) {
179
- // append this prefix
180
- for (idx_t i = 0; i < this_count; i++) {
181
- segment = segment.get().Append(art, count, this_data.inlined[i]);
118
+ // compare prefix nodes to key bytes
119
+ while (prefix_node.get().DecodeARTNodeType() == NType::PREFIX) {
120
+ auto &prefix = Prefix::Get(art, prefix_node);
121
+ for (idx_t i = 0; i < prefix.data[Node::PREFIX_SIZE]; i++) {
122
+ if (prefix.data[i] != key[depth]) {
123
+ return i;
124
+ }
125
+ depth++;
182
126
  }
183
- return;
184
- }
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]);
127
+ prefix_node = prefix.ptr;
128
+ D_ASSERT(prefix_node.get().IsSet());
129
+ if (prefix_node.get().IsSwizzled()) {
130
+ prefix_node.get().Deserialize(art);
197
131
  }
198
-
199
- // adjust the loop variables
200
- Node::Free(art, this_ptr);
201
- this_ptr = this_segment.next;
202
- remaining -= copy_count;
203
132
  }
204
- D_ASSERT(remaining == 0);
133
+
134
+ return DConstants::INVALID_INDEX;
205
135
  }
206
136
 
207
- uint8_t Prefix::Reduce(ART &art, const idx_t reduce_count) {
137
+ bool Prefix::Traverse(ART &art, reference<Node> &l_node, reference<Node> &r_node, idx_t &mismatch_position) {
208
138
 
209
- auto new_count = count - reduce_count - 1;
210
- auto new_first_byte = GetByte(art, reduce_count);
139
+ auto &l_prefix = Prefix::Get(art, l_node.get());
140
+ auto &r_prefix = Prefix::Get(art, r_node.get());
211
141
 
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;
142
+ // compare prefix bytes
143
+ idx_t max_count = MinValue(l_prefix.data[Node::PREFIX_SIZE], r_prefix.data[Node::PREFIX_SIZE]);
144
+ for (idx_t i = 0; i < max_count; i++) {
145
+ if (l_prefix.data[i] != r_prefix.data[i]) {
146
+ mismatch_position = i;
147
+ break;
148
+ }
223
149
  }
224
150
 
225
- count = 0;
226
- auto start = reduce_count + 1;
227
- auto offset = start % Node::PREFIX_SEGMENT_SIZE;
228
- auto remaining = new_count;
151
+ if (mismatch_position == DConstants::INVALID_INDEX) {
229
152
 
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
- }
153
+ // prefixes match (so far)
154
+ if (l_prefix.data[Node::PREFIX_SIZE] == r_prefix.data[Node::PREFIX_SIZE]) {
155
+ return l_prefix.ptr.ResolvePrefixes(art, r_prefix.ptr);
156
+ }
236
157
 
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);
158
+ mismatch_position = max_count;
241
159
 
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
- }
160
+ // l_prefix contains r_prefix
161
+ if (r_prefix.ptr.DecodeARTNodeType() != NType::PREFIX && r_prefix.data[Node::PREFIX_SIZE] == max_count) {
162
+ swap(l_node.get(), r_node.get());
163
+ l_node = r_prefix.ptr;
246
164
 
247
- // adjust the loop variables
248
- offset = 0;
249
- remaining -= copy_count;
250
- if (remaining == 0) {
251
- break;
165
+ } else {
166
+ // r_prefix contains l_prefix
167
+ l_node = l_prefix.ptr;
252
168
  }
253
- D_ASSERT(src_segment.get().next.IsSet());
254
- src_segment = PrefixSegment::Get(art, src_segment.get().next);
255
169
  }
256
170
 
257
- // possibly inline the data
258
- if (IsInlined()) {
259
- MoveSegmentToInlined(art);
260
- }
261
-
262
- return new_first_byte;
171
+ return true;
263
172
  }
264
173
 
265
- uint8_t Prefix::GetByte(const ART &art, const idx_t position) const {
174
+ void Prefix::Reduce(ART &art, Node &prefix_node, const idx_t n) {
175
+
176
+ D_ASSERT(prefix_node.IsSet() && !prefix_node.IsSwizzled());
177
+ D_ASSERT(n < Node::PREFIX_SIZE);
266
178
 
267
- D_ASSERT(position < count);
268
- if (IsInlined()) {
269
- return data.inlined[position];
179
+ reference<Prefix> prefix = Prefix::Get(art, prefix_node);
180
+
181
+ // free this prefix node
182
+ if (n == (idx_t)(prefix.get().data[Node::PREFIX_SIZE] - 1)) {
183
+ auto next_ptr = prefix.get().ptr;
184
+ D_ASSERT(next_ptr.IsSet());
185
+ prefix.get().ptr.Reset();
186
+ Node::Free(art, prefix_node);
187
+ prefix_node = next_ptr;
188
+ return;
270
189
  }
271
190
 
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);
191
+ // shift by n bytes in the current prefix
192
+ for (idx_t i = 0; i < Node::PREFIX_SIZE - n - 1; i++) {
193
+ prefix.get().data[i] = prefix.get().data[n + i + 1];
277
194
  }
195
+ D_ASSERT(n < (idx_t)(prefix.get().data[Node::PREFIX_SIZE] - 1));
196
+ prefix.get().data[Node::PREFIX_SIZE] -= n + 1;
278
197
 
279
- return segment.get().bytes[position % Node::PREFIX_SEGMENT_SIZE];
198
+ // append the remaining prefix bytes
199
+ prefix.get().Append(art, prefix.get().ptr);
280
200
  }
281
201
 
282
- uint32_t Prefix::KeyMismatchPosition(const ART &art, const ARTKey &key, const uint32_t depth) const {
202
+ void Prefix::Split(ART &art, reference<Node> &prefix_node, Node &child_node, idx_t position) {
283
203
 
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;
204
+ D_ASSERT(prefix_node.get().IsSet() && !prefix_node.get().IsSwizzled());
296
205
 
297
- while (mismatch_position != count) {
298
- D_ASSERT(depth + mismatch_position < key.len);
299
- D_ASSERT(ptr.IsSet());
206
+ auto &prefix = Prefix::Get(art, prefix_node);
300
207
 
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++;
310
- }
311
-
312
- // adjust loop variables
313
- ptr = segment.next;
208
+ // the split is at the last byte of this prefix, so the child_node contains all subsequent
209
+ // prefix nodes (prefix.ptr) (if any), and the count of this prefix decreases by one,
210
+ // then, we reference prefix.ptr, to overwrite it with a new node later
211
+ if (position + 1 == Node::PREFIX_SIZE) {
212
+ prefix.data[Node::PREFIX_SIZE]--;
213
+ prefix_node = prefix.ptr;
214
+ child_node = prefix.ptr;
215
+ return;
314
216
  }
315
- return count;
316
- }
317
217
 
318
- uint32_t Prefix::MismatchPosition(const ART &art, const Prefix &other) const {
218
+ // append the remaining bytes after the split
219
+ if (position + 1 < prefix.data[Node::PREFIX_SIZE]) {
220
+ reference<Prefix> child_prefix = Prefix::New(art, child_node);
221
+ for (idx_t i = position + 1; i < prefix.data[Node::PREFIX_SIZE]; i++) {
222
+ child_prefix = child_prefix.get().Append(art, prefix.data[i]);
223
+ }
319
224
 
320
- D_ASSERT(count <= other.count);
225
+ D_ASSERT(prefix.ptr.IsSet());
226
+ if (prefix.ptr.IsSwizzled()) {
227
+ prefix.ptr.Deserialize(art);
228
+ }
321
229
 
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
- }
230
+ if (prefix.ptr.DecodeARTNodeType() == NType::PREFIX) {
231
+ child_prefix.get().Append(art, prefix.ptr);
232
+ } else {
233
+ // this is the last prefix node of the prefix
234
+ child_prefix.get().ptr = prefix.ptr;
328
235
  }
329
- return count;
330
236
  }
331
237
 
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;
238
+ // this is the last prefix node of the prefix
239
+ if (position + 1 == prefix.data[Node::PREFIX_SIZE]) {
240
+ child_node = prefix.ptr;
342
241
  }
343
242
 
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
- }
243
+ // set the new size of this node
244
+ prefix.data[Node::PREFIX_SIZE] = position;
363
245
 
364
- // adjust loop variables
365
- ptr = segment.next;
366
- other_ptr = other_segment.next;
246
+ // no bytes left before the split, free this node
247
+ if (position == 0) {
248
+ prefix.ptr.Reset();
249
+ Node::Free(art, prefix_node.get());
250
+ return;
367
251
  }
368
- return count;
252
+
253
+ // bytes left before the split, reference subsequent node
254
+ prefix_node = prefix.ptr;
255
+ return;
369
256
  }
370
257
 
371
- void Prefix::Serialize(const ART &art, MetaBlockWriter &writer) const {
258
+ string Prefix::VerifyAndToString(ART &art, const bool only_verify) {
372
259
 
373
- writer.Write(count);
260
+ D_ASSERT(data[Node::PREFIX_SIZE] != 0);
261
+ D_ASSERT(data[Node::PREFIX_SIZE] <= Node::PREFIX_SIZE);
374
262
 
375
- // write inlined data
376
- if (IsInlined()) {
377
- writer.WriteData(data.inlined, count);
378
- return;
263
+ string str = " prefix_bytes:[";
264
+ for (idx_t i = 0; i < data[Node::PREFIX_SIZE]; i++) {
265
+ str += to_string(data[i]) + "-";
379
266
  }
267
+ str += "] ";
380
268
 
381
- D_ASSERT(data.ptr.IsSet());
382
- auto ptr = data.ptr;
383
- auto remaining = count;
269
+ str = only_verify ? ptr.VerifyAndToString(art, only_verify) : str + ptr.VerifyAndToString(art, only_verify);
270
+ return str;
271
+ }
272
+
273
+ BlockPointer Prefix::Serialize(ART &art, MetaBlockWriter &writer) {
384
274
 
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);
275
+ // recurse into the child and retrieve its block pointer
276
+ auto child_block_pointer = ptr.Serialize(art, writer);
389
277
 
390
- // write the bytes
391
- writer.WriteData(segment.bytes, copy_count);
278
+ // get pointer and write fields
279
+ auto block_pointer = writer.GetBlockPointer();
280
+ writer.Write(NType::PREFIX);
281
+ writer.Write<uint8_t>(data[Node::PREFIX_SIZE]);
392
282
 
393
- // adjust loop variables
394
- remaining -= copy_count;
395
- ptr = segment.next;
283
+ // write prefix bytes
284
+ for (idx_t i = 0; i < data[Node::PREFIX_SIZE]; i++) {
285
+ writer.Write(data[i]);
396
286
  }
397
- D_ASSERT(remaining == 0);
287
+
288
+ // write child block pointer
289
+ writer.Write(child_block_pointer.block_id);
290
+ writer.Write(child_block_pointer.offset);
291
+
292
+ return block_pointer;
398
293
  }
399
294
 
400
- void Prefix::Deserialize(ART &art, MetaBlockReader &reader) {
295
+ void Prefix::Deserialize(MetaBlockReader &reader) {
401
296
 
402
- auto count_p = reader.Read<uint32_t>();
297
+ data[Node::PREFIX_SIZE] = reader.Read<uint8_t>();
403
298
 
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;
299
+ // read bytes
300
+ for (idx_t i = 0; i < data[Node::PREFIX_SIZE]; i++) {
301
+ data[i] = reader.Read<uint8_t>();
409
302
  }
410
303
 
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);
304
+ // read child block pointer
305
+ ptr = Node(reader);
418
306
  }
419
307
 
420
- void Prefix::Vacuum(ART &art) {
308
+ Prefix &Prefix::Append(ART &art, const uint8_t byte) {
421
309
 
422
- if (IsInlined()) {
423
- return;
424
- }
310
+ reference<Prefix> prefix(*this);
425
311
 
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
- data.ptr.type = (uint8_t)NType::PREFIX_SEGMENT;
312
+ // we need a new prefix node
313
+ if (prefix.get().data[Node::PREFIX_SIZE] == Node::PREFIX_SIZE) {
314
+ prefix = Prefix::New(art, prefix.get().ptr);
431
315
  }
432
316
 
433
- auto ptr = data.ptr;
434
- while (ptr.IsSet()) {
435
- auto &segment = PrefixSegment::Get(art, ptr);
436
- ptr = segment.next;
437
- if (ptr.IsSet() && allocator.NeedsVacuum(ptr)) {
438
- segment.next.SetPtr(allocator.VacuumPointer(ptr));
439
- segment.next.type = (uint8_t)NType::PREFIX_SEGMENT;
440
- ptr = segment.next;
441
- }
442
- }
317
+ prefix.get().data[prefix.get().data[Node::PREFIX_SIZE]] = byte;
318
+ prefix.get().data[Node::PREFIX_SIZE]++;
319
+ return prefix.get();
443
320
  }
444
321
 
445
- PrefixSegment &Prefix::MoveInlinedToSegment(ART &art) {
322
+ void Prefix::Append(ART &art, Node other_prefix) {
446
323
 
447
- D_ASSERT(IsInlined());
324
+ // NOTE: all usages of this function already deserialize the other prefix
325
+ D_ASSERT(other_prefix.IsSet() && !other_prefix.IsSwizzled());
448
326
 
449
- Node ptr;
450
- auto &segment = PrefixSegment::New(art, ptr);
327
+ reference<Prefix> prefix(*this);
328
+ while (other_prefix.DecodeARTNodeType() == NType::PREFIX) {
451
329
 
452
- // move data
453
- D_ASSERT(Node::PREFIX_SEGMENT_SIZE >= Node::PREFIX_INLINE_BYTES);
454
- memcpy(segment.bytes, data.inlined, count);
455
- data.ptr = ptr;
456
- return segment;
457
- }
458
-
459
- void Prefix::MoveSegmentToInlined(ART &art) {
330
+ // copy prefix bytes
331
+ auto &other = Prefix::Get(art, other_prefix);
332
+ for (idx_t i = 0; i < other.data[Node::PREFIX_SIZE]; i++) {
333
+ prefix = prefix.get().Append(art, other.data[i]);
334
+ }
460
335
 
461
- D_ASSERT(IsInlined());
462
- D_ASSERT(data.ptr.IsSet());
336
+ D_ASSERT(other.ptr.IsSet());
337
+ if (other.ptr.IsSwizzled()) {
338
+ other.ptr.Deserialize(art);
339
+ }
463
340
 
464
- auto ptr = data.ptr;
465
- auto &segment = PrefixSegment::Get(art, data.ptr);
341
+ prefix.get().ptr = other.ptr;
342
+ Node::GetAllocator(art, NType::PREFIX).Free(other_prefix);
343
+ other_prefix = prefix.get().ptr;
344
+ }
466
345
 
467
- memcpy(data.inlined, segment.bytes, count);
468
- Node::Free(art, ptr);
346
+ D_ASSERT(prefix.get().ptr.DecodeARTNodeType() != NType::PREFIX);
469
347
  }
470
348
 
471
349
  } // namespace duckdb