duckdb 0.8.1-dev31.0 → 0.8.1-dev341.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 (636) hide show
  1. package/binding.gyp +8 -8
  2. package/package.json +1 -1
  3. package/src/duckdb/extension/icu/icu-datepart.cpp +1 -1
  4. package/src/duckdb/extension/icu/icu-makedate.cpp +5 -4
  5. package/src/duckdb/extension/json/buffered_json_reader.cpp +23 -14
  6. package/src/duckdb/extension/json/include/buffered_json_reader.hpp +6 -6
  7. package/src/duckdb/extension/json/include/json_common.hpp +13 -3
  8. package/src/duckdb/extension/json/include/json_executors.hpp +1 -1
  9. package/src/duckdb/extension/json/include/json_scan.hpp +3 -1
  10. package/src/duckdb/extension/json/json_functions/json_create.cpp +16 -16
  11. package/src/duckdb/extension/json/json_functions/json_merge_patch.cpp +3 -3
  12. package/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp +2 -2
  13. package/src/duckdb/extension/json/json_functions/json_structure.cpp +5 -3
  14. package/src/duckdb/extension/json/json_functions/json_transform.cpp +12 -12
  15. package/src/duckdb/extension/json/json_functions/read_json.cpp +2 -1
  16. package/src/duckdb/extension/json/json_functions.cpp +6 -3
  17. package/src/duckdb/extension/json/json_scan.cpp +40 -25
  18. package/src/duckdb/extension/parquet/column_reader.cpp +57 -52
  19. package/src/duckdb/extension/parquet/column_writer.cpp +57 -45
  20. package/src/duckdb/extension/parquet/include/cast_column_reader.hpp +1 -1
  21. package/src/duckdb/extension/parquet/include/column_reader.hpp +5 -4
  22. package/src/duckdb/extension/parquet/include/column_writer.hpp +24 -0
  23. package/src/duckdb/extension/parquet/include/decode_utils.hpp +6 -0
  24. package/src/duckdb/extension/parquet/include/list_column_reader.hpp +1 -1
  25. package/src/duckdb/extension/parquet/include/parquet_dbp_decoder.hpp +4 -4
  26. package/src/duckdb/extension/parquet/include/parquet_rle_bp_decoder.hpp +4 -5
  27. package/src/duckdb/extension/parquet/include/resizable_buffer.hpp +4 -4
  28. package/src/duckdb/extension/parquet/include/row_number_column_reader.hpp +1 -1
  29. package/src/duckdb/extension/parquet/include/struct_column_reader.hpp +1 -1
  30. package/src/duckdb/extension/parquet/parquet-extension.cpp +25 -1
  31. package/src/duckdb/extension/parquet/parquet_metadata.cpp +1 -1
  32. package/src/duckdb/extension/parquet/parquet_reader.cpp +18 -18
  33. package/src/duckdb/extension/parquet/parquet_statistics.cpp +23 -26
  34. package/src/duckdb/extension/parquet/parquet_timestamp.cpp +2 -2
  35. package/src/duckdb/extension/parquet/parquet_writer.cpp +3 -3
  36. package/src/duckdb/extension/parquet/zstd_file_system.cpp +3 -3
  37. package/src/duckdb/src/catalog/catalog.cpp +5 -17
  38. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +113 -0
  39. package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +7 -0
  40. package/src/duckdb/src/catalog/catalog_entry.cpp +4 -4
  41. package/src/duckdb/src/catalog/catalog_search_path.cpp +49 -12
  42. package/src/duckdb/src/catalog/catalog_set.cpp +1 -1
  43. package/src/duckdb/src/catalog/default/default_types.cpp +9 -84
  44. package/src/duckdb/src/catalog/dependency_manager.cpp +2 -2
  45. package/src/duckdb/src/catalog/duck_catalog.cpp +1 -0
  46. package/src/duckdb/src/common/adbc/adbc.cpp +301 -106
  47. package/src/duckdb/src/common/adbc/driver_manager.cpp +10 -22
  48. package/src/duckdb/src/common/arrow/arrow_appender.cpp +12 -12
  49. package/src/duckdb/src/common/arrow/arrow_wrapper.cpp +7 -7
  50. package/src/duckdb/src/common/checksum.cpp +1 -1
  51. package/src/duckdb/src/common/compressed_file_system.cpp +6 -6
  52. package/src/duckdb/src/common/crypto/md5.cpp +9 -9
  53. package/src/duckdb/src/common/exception.cpp +4 -1
  54. package/src/duckdb/src/common/exception_format_value.cpp +19 -14
  55. package/src/duckdb/src/common/field_writer.cpp +1 -1
  56. package/src/duckdb/src/common/file_system.cpp +15 -2
  57. package/src/duckdb/src/common/fsst.cpp +11 -6
  58. package/src/duckdb/src/common/gzip_file_system.cpp +8 -8
  59. package/src/duckdb/src/common/hive_partitioning.cpp +1 -1
  60. package/src/duckdb/src/common/local_file_system.cpp +11 -11
  61. package/src/duckdb/src/common/multi_file_reader.cpp +3 -0
  62. package/src/duckdb/src/common/operator/cast_operators.cpp +1 -1
  63. package/src/duckdb/src/common/pipe_file_system.cpp +2 -2
  64. package/src/duckdb/src/common/radix_partitioning.cpp +2 -2
  65. package/src/duckdb/src/common/row_operations/row_heap_gather.cpp +1 -1
  66. package/src/duckdb/src/common/row_operations/row_heap_scatter.cpp +5 -5
  67. package/src/duckdb/src/common/row_operations/row_match.cpp +1 -1
  68. package/src/duckdb/src/common/row_operations/row_radix_scatter.cpp +2 -2
  69. package/src/duckdb/src/common/row_operations/row_scatter.cpp +4 -4
  70. package/src/duckdb/src/common/serializer/binary_deserializer.cpp +1 -1
  71. package/src/duckdb/src/common/serializer/binary_serializer.cpp +3 -3
  72. package/src/duckdb/src/common/serializer.cpp +1 -1
  73. package/src/duckdb/src/common/sort/comparators.cpp +1 -1
  74. package/src/duckdb/src/common/sort/merge_sorter.cpp +7 -2
  75. package/src/duckdb/src/common/sort/partition_state.cpp +2 -2
  76. package/src/duckdb/src/common/types/bit.cpp +5 -5
  77. package/src/duckdb/src/common/types/blob.cpp +8 -8
  78. package/src/duckdb/src/common/types/column/column_data_allocator.cpp +4 -4
  79. package/src/duckdb/src/common/types/column/column_data_collection.cpp +3 -3
  80. package/src/duckdb/src/common/types/column/column_data_collection_segment.cpp +1 -1
  81. package/src/duckdb/src/common/types/column/partitioned_column_data.cpp +2 -2
  82. package/src/duckdb/src/common/types/hash.cpp +2 -2
  83. package/src/duckdb/src/common/types/hyperloglog.cpp +22 -21
  84. package/src/duckdb/src/common/types/list_segment.cpp +77 -49
  85. package/src/duckdb/src/common/types/row/partitioned_tuple_data.cpp +1 -1
  86. package/src/duckdb/src/common/types/row/row_data_collection_scanner.cpp +5 -4
  87. package/src/duckdb/src/common/types/row/tuple_data_allocator.cpp +5 -3
  88. package/src/duckdb/src/common/types/row/tuple_data_scatter_gather.cpp +61 -24
  89. package/src/duckdb/src/common/types/string_heap.cpp +1 -1
  90. package/src/duckdb/src/common/types/timestamp.cpp +37 -1
  91. package/src/duckdb/src/common/types/value.cpp +3 -2
  92. package/src/duckdb/src/common/types/vector.cpp +98 -101
  93. package/src/duckdb/src/common/types/vector_cache.cpp +6 -6
  94. package/src/duckdb/src/common/types/vector_constants.cpp +2 -1
  95. package/src/duckdb/src/common/types.cpp +44 -33
  96. package/src/duckdb/src/common/vector_operations/boolean_operators.cpp +2 -2
  97. package/src/duckdb/src/common/vector_operations/is_distinct_from.cpp +12 -12
  98. package/src/duckdb/src/common/vector_operations/vector_hash.cpp +13 -11
  99. package/src/duckdb/src/common/vector_operations/vector_storage.cpp +1 -1
  100. package/src/duckdb/src/core_functions/aggregate/algebraic/avg.cpp +30 -33
  101. package/src/duckdb/src/core_functions/aggregate/algebraic/covar.cpp +0 -4
  102. package/src/duckdb/src/core_functions/aggregate/distributive/approx_count.cpp +32 -36
  103. package/src/duckdb/src/core_functions/aggregate/distributive/arg_min_max.cpp +53 -66
  104. package/src/duckdb/src/core_functions/aggregate/distributive/bitagg.cpp +48 -48
  105. package/src/duckdb/src/core_functions/aggregate/distributive/bitstring_agg.cpp +44 -44
  106. package/src/duckdb/src/core_functions/aggregate/distributive/bool.cpp +32 -32
  107. package/src/duckdb/src/core_functions/aggregate/distributive/entropy.cpp +34 -34
  108. package/src/duckdb/src/core_functions/aggregate/distributive/kurtosis.cpp +30 -31
  109. package/src/duckdb/src/core_functions/aggregate/distributive/minmax.cpp +91 -103
  110. package/src/duckdb/src/core_functions/aggregate/distributive/product.cpp +17 -17
  111. package/src/duckdb/src/core_functions/aggregate/distributive/skew.cpp +25 -27
  112. package/src/duckdb/src/core_functions/aggregate/distributive/string_agg.cpp +36 -37
  113. package/src/duckdb/src/core_functions/aggregate/distributive/sum.cpp +22 -22
  114. package/src/duckdb/src/core_functions/aggregate/holistic/approximate_quantile.cpp +48 -84
  115. package/src/duckdb/src/core_functions/aggregate/holistic/mode.cpp +49 -51
  116. package/src/duckdb/src/core_functions/aggregate/holistic/quantile.cpp +115 -133
  117. package/src/duckdb/src/core_functions/aggregate/holistic/reservoir_quantile.cpp +62 -99
  118. package/src/duckdb/src/core_functions/aggregate/nested/histogram.cpp +24 -26
  119. package/src/duckdb/src/core_functions/aggregate/nested/list.cpp +22 -23
  120. package/src/duckdb/src/core_functions/aggregate/regression/regr_avg.cpp +16 -18
  121. package/src/duckdb/src/core_functions/aggregate/regression/regr_intercept.cpp +22 -25
  122. package/src/duckdb/src/core_functions/aggregate/regression/regr_r2.cpp +19 -24
  123. package/src/duckdb/src/core_functions/aggregate/regression/regr_sxx_syy.cpp +18 -23
  124. package/src/duckdb/src/core_functions/aggregate/regression/regr_sxy.cpp +14 -18
  125. package/src/duckdb/src/core_functions/function_list.cpp +1 -0
  126. package/src/duckdb/src/core_functions/scalar/blob/base64.cpp +1 -1
  127. package/src/duckdb/src/core_functions/scalar/date/date_part.cpp +45 -45
  128. package/src/duckdb/src/core_functions/scalar/date/strftime.cpp +2 -2
  129. package/src/duckdb/src/core_functions/scalar/generic/current_setting.cpp +1 -1
  130. package/src/duckdb/src/core_functions/scalar/generic/least.cpp +2 -2
  131. package/src/duckdb/src/core_functions/scalar/generic/stats.cpp +1 -1
  132. package/src/duckdb/src/core_functions/scalar/generic/system_functions.cpp +14 -0
  133. package/src/duckdb/src/core_functions/scalar/list/array_slice.cpp +3 -3
  134. package/src/duckdb/src/core_functions/scalar/list/flatten.cpp +2 -4
  135. package/src/duckdb/src/core_functions/scalar/list/list_aggregates.cpp +3 -3
  136. package/src/duckdb/src/core_functions/scalar/list/list_lambdas.cpp +6 -7
  137. package/src/duckdb/src/core_functions/scalar/list/list_sort.cpp +1 -1
  138. package/src/duckdb/src/core_functions/scalar/map/cardinality.cpp +1 -1
  139. package/src/duckdb/src/core_functions/scalar/map/map.cpp +2 -2
  140. package/src/duckdb/src/core_functions/scalar/map/map_concat.cpp +4 -1
  141. package/src/duckdb/src/core_functions/scalar/map/map_extract.cpp +5 -9
  142. package/src/duckdb/src/core_functions/scalar/math/numeric.cpp +3 -3
  143. package/src/duckdb/src/core_functions/scalar/string/starts_with.cpp +3 -2
  144. package/src/duckdb/src/core_functions/scalar/string/string_split.cpp +4 -4
  145. package/src/duckdb/src/core_functions/scalar/string/trim.cpp +1 -1
  146. package/src/duckdb/src/core_functions/scalar/union/union_extract.cpp +1 -1
  147. package/src/duckdb/src/execution/adaptive_filter.cpp +1 -1
  148. package/src/duckdb/src/execution/expression_executor/execute_case.cpp +10 -10
  149. package/src/duckdb/src/execution/expression_executor/execute_conjunction.cpp +7 -7
  150. package/src/duckdb/src/execution/expression_executor.cpp +28 -28
  151. package/src/duckdb/src/execution/index/art/art.cpp +110 -39
  152. package/src/duckdb/src/execution/index/art/fixed_size_allocator.cpp +23 -5
  153. package/src/duckdb/src/execution/index/art/leaf.cpp +10 -11
  154. package/src/duckdb/src/execution/index/art/leaf_segment.cpp +10 -0
  155. package/src/duckdb/src/execution/index/art/node.cpp +47 -35
  156. package/src/duckdb/src/execution/index/art/node16.cpp +3 -0
  157. package/src/duckdb/src/execution/index/art/node256.cpp +1 -0
  158. package/src/duckdb/src/execution/index/art/node4.cpp +3 -0
  159. package/src/duckdb/src/execution/index/art/node48.cpp +2 -0
  160. package/src/duckdb/src/execution/index/art/prefix.cpp +2 -0
  161. package/src/duckdb/src/execution/join_hashtable.cpp +4 -4
  162. package/src/duckdb/src/execution/nested_loop_join/nested_loop_join_inner.cpp +4 -4
  163. package/src/duckdb/src/execution/nested_loop_join/nested_loop_join_mark.cpp +2 -2
  164. package/src/duckdb/src/execution/operator/aggregate/distinct_aggregate_data.cpp +1 -1
  165. package/src/duckdb/src/execution/operator/aggregate/physical_perfecthash_aggregate.cpp +1 -1
  166. package/src/duckdb/src/execution/operator/aggregate/physical_streaming_window.cpp +2 -2
  167. package/src/duckdb/src/execution/operator/aggregate/physical_ungrouped_aggregate.cpp +4 -4
  168. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +26 -9
  169. package/src/duckdb/src/execution/operator/filter/physical_filter.cpp +1 -1
  170. package/src/duckdb/src/execution/operator/helper/physical_reset.cpp +5 -2
  171. package/src/duckdb/src/execution/operator/helper/physical_set.cpp +5 -1
  172. package/src/duckdb/src/execution/operator/join/outer_join_marker.cpp +1 -1
  173. package/src/duckdb/src/execution/operator/join/perfect_hash_join_executor.cpp +1 -1
  174. package/src/duckdb/src/execution/operator/join/physical_asof_join.cpp +2 -2
  175. package/src/duckdb/src/execution/operator/join/physical_blockwise_nl_join.cpp +4 -4
  176. package/src/duckdb/src/execution/operator/join/physical_index_join.cpp +3 -3
  177. package/src/duckdb/src/execution/operator/join/physical_nested_loop_join.cpp +3 -3
  178. package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +3 -3
  179. package/src/duckdb/src/execution/operator/order/physical_top_n.cpp +1 -1
  180. package/src/duckdb/src/execution/operator/persistent/buffered_csv_reader.cpp +2 -2
  181. package/src/duckdb/src/execution/operator/persistent/csv_file_handle.cpp +2 -2
  182. package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +2 -3
  183. package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +1 -1
  184. package/src/duckdb/src/execution/operator/projection/physical_pivot.cpp +2 -2
  185. package/src/duckdb/src/execution/operator/projection/physical_projection.cpp +1 -1
  186. package/src/duckdb/src/execution/operator/projection/physical_unnest.cpp +3 -3
  187. package/src/duckdb/src/execution/operator/scan/physical_column_data_scan.cpp +2 -1
  188. package/src/duckdb/src/execution/operator/scan/physical_expression_scan.cpp +1 -1
  189. package/src/duckdb/src/execution/operator/scan/physical_positional_scan.cpp +2 -2
  190. package/src/duckdb/src/execution/operator/schema/physical_create_index.cpp +29 -3
  191. package/src/duckdb/src/execution/operator/schema/physical_create_type.cpp +1 -1
  192. package/src/duckdb/src/execution/perfect_aggregate_hashtable.cpp +1 -1
  193. package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +1 -1
  194. package/src/duckdb/src/execution/physical_plan/plan_create_table.cpp +1 -1
  195. package/src/duckdb/src/execution/physical_plan_generator.cpp +2 -2
  196. package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +1 -1
  197. package/src/duckdb/src/execution/reservoir_sample.cpp +2 -2
  198. package/src/duckdb/src/execution/window_segment_tree.cpp +8 -6
  199. package/src/duckdb/src/function/aggregate/distributive/count.cpp +158 -20
  200. package/src/duckdb/src/function/aggregate/distributive/first.cpp +66 -74
  201. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +13 -13
  202. package/src/duckdb/src/function/cast/cast_function_set.cpp +1 -1
  203. package/src/duckdb/src/function/cast/decimal_cast.cpp +1 -1
  204. package/src/duckdb/src/function/cast/enum_casts.cpp +2 -2
  205. package/src/duckdb/src/function/cast/list_casts.cpp +2 -4
  206. package/src/duckdb/src/function/cast/string_cast.cpp +11 -11
  207. package/src/duckdb/src/function/cast/union_casts.cpp +2 -2
  208. package/src/duckdb/src/function/cast/vector_cast_helpers.cpp +3 -2
  209. package/src/duckdb/src/function/pragma/pragma_queries.cpp +33 -23
  210. package/src/duckdb/src/function/scalar/generic/constant_or_null.cpp +1 -1
  211. package/src/duckdb/src/function/scalar/list/list_concat.cpp +2 -2
  212. package/src/duckdb/src/function/scalar/list/list_extract.cpp +3 -3
  213. package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +2 -3
  214. package/src/duckdb/src/function/scalar/string/concat.cpp +8 -7
  215. package/src/duckdb/src/function/scalar/string/contains.cpp +4 -4
  216. package/src/duckdb/src/function/scalar/string/like.cpp +5 -5
  217. package/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp +4 -4
  218. package/src/duckdb/src/function/scalar/string/regexp/regexp_util.cpp +6 -2
  219. package/src/duckdb/src/function/scalar/string/regexp.cpp +3 -3
  220. package/src/duckdb/src/function/scalar/string/strip_accents.cpp +1 -1
  221. package/src/duckdb/src/function/scalar/struct/struct_extract.cpp +1 -1
  222. package/src/duckdb/src/function/scalar/system/aggregate_export.cpp +25 -23
  223. package/src/duckdb/src/function/scalar_function.cpp +3 -3
  224. package/src/duckdb/src/function/table/arrow.cpp +6 -6
  225. package/src/duckdb/src/function/table/arrow_conversion.cpp +67 -61
  226. package/src/duckdb/src/function/table/checkpoint.cpp +1 -1
  227. package/src/duckdb/src/function/table/copy_csv.cpp +11 -7
  228. package/src/duckdb/src/function/table/glob.cpp +1 -1
  229. package/src/duckdb/src/function/table/pragma_last_profiling_output.cpp +1 -1
  230. package/src/duckdb/src/function/table/range.cpp +4 -4
  231. package/src/duckdb/src/function/table/read_csv.cpp +17 -20
  232. package/src/duckdb/src/function/table/repeat.cpp +5 -2
  233. package/src/duckdb/src/function/table/repeat_row.cpp +10 -3
  234. package/src/duckdb/src/function/table/system/duckdb_functions.cpp +1 -1
  235. package/src/duckdb/src/function/table/system/test_vector_types.cpp +82 -26
  236. package/src/duckdb/src/function/table/table_scan.cpp +2 -2
  237. package/src/duckdb/src/function/table/unnest.cpp +1 -1
  238. package/src/duckdb/src/function/table/version/pragma_version.cpp +3 -3
  239. package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +2 -5
  240. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_table_entry.hpp +2 -0
  241. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_catalog_entry.hpp +6 -0
  242. package/src/duckdb/src/include/duckdb/catalog/catalog_entry.hpp +2 -2
  243. package/src/duckdb/src/include/duckdb/catalog/catalog_search_path.hpp +8 -2
  244. package/src/duckdb/src/include/duckdb/catalog/default/builtin_types/types.hpp +97 -0
  245. package/src/duckdb/src/include/duckdb/common/adbc/adbc.hpp +5 -0
  246. package/src/duckdb/src/include/duckdb/common/allocator.hpp +15 -4
  247. package/src/duckdb/src/include/duckdb/common/arrow/arrow_buffer.hpp +7 -2
  248. package/src/duckdb/src/include/duckdb/common/crypto/md5.hpp +2 -2
  249. package/src/duckdb/src/include/duckdb/common/exception.hpp +5 -2
  250. package/src/duckdb/src/include/duckdb/common/field_writer.hpp +3 -3
  251. package/src/duckdb/src/include/duckdb/common/file_system.hpp +11 -0
  252. package/src/duckdb/src/include/duckdb/common/fsst.hpp +2 -3
  253. package/src/duckdb/src/include/duckdb/common/radix.hpp +3 -3
  254. package/src/duckdb/src/include/duckdb/common/serializer/binary_deserializer.hpp +1 -1
  255. package/src/duckdb/src/include/duckdb/common/serializer/binary_serializer.hpp +4 -1
  256. package/src/duckdb/src/include/duckdb/common/serializer.hpp +4 -4
  257. package/src/duckdb/src/include/duckdb/common/typedefs.hpp +30 -0
  258. package/src/duckdb/src/include/duckdb/common/types/column/partitioned_column_data.hpp +12 -0
  259. package/src/duckdb/src/include/duckdb/common/types/hyperloglog.hpp +6 -2
  260. package/src/duckdb/src/include/duckdb/common/types/null_value.hpp +1 -1
  261. package/src/duckdb/src/include/duckdb/common/types/row/partitioned_tuple_data.hpp +12 -0
  262. package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +10 -10
  263. package/src/duckdb/src/include/duckdb/common/types/timestamp.hpp +4 -14
  264. package/src/duckdb/src/include/duckdb/common/types/value.hpp +1 -1
  265. package/src/duckdb/src/include/duckdb/common/types/vector.hpp +9 -0
  266. package/src/duckdb/src/include/duckdb/common/types/vector_buffer.hpp +18 -6
  267. package/src/duckdb/src/include/duckdb/common/vector_operations/aggregate_executor.hpp +112 -76
  268. package/src/duckdb/src/include/duckdb/common/vector_operations/binary_executor.hpp +16 -15
  269. package/src/duckdb/src/include/duckdb/common/vector_operations/generic_executor.hpp +11 -11
  270. package/src/duckdb/src/include/duckdb/common/vector_operations/ternary_executor.hpp +23 -19
  271. package/src/duckdb/src/include/duckdb/common/vector_operations/unary_executor.hpp +3 -3
  272. package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/corr.hpp +20 -24
  273. package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/covar.hpp +36 -39
  274. package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/stddev.hpp +57 -53
  275. package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_count.hpp +8 -9
  276. package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_slope.hpp +16 -18
  277. package/src/duckdb/src/include/duckdb/core_functions/aggregate/sum_helpers.hpp +7 -8
  278. package/src/duckdb/src/include/duckdb/core_functions/scalar/generic_functions.hpp +9 -0
  279. package/src/duckdb/src/include/duckdb/core_functions/scalar/map_functions.hpp +2 -6
  280. package/src/duckdb/src/include/duckdb/core_functions/scalar/string_functions.hpp +16 -36
  281. package/src/duckdb/src/include/duckdb/execution/expression_executor_state.hpp +14 -2
  282. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +13 -7
  283. package/src/duckdb/src/include/duckdb/execution/index/art/fixed_size_allocator.hpp +3 -0
  284. package/src/duckdb/src/include/duckdb/execution/index/art/leaf.hpp +1 -1
  285. package/src/duckdb/src/include/duckdb/execution/index/art/leaf_segment.hpp +2 -0
  286. package/src/duckdb/src/include/duckdb/execution/index/art/node.hpp +13 -3
  287. package/src/duckdb/src/include/duckdb/execution/index/art/node48.hpp +1 -0
  288. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_result_collector.hpp +3 -0
  289. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_buffer.hpp +1 -1
  290. package/src/duckdb/src/include/duckdb/execution/physical_operator.hpp +5 -2
  291. package/src/duckdb/src/include/duckdb/execution/physical_operator_states.hpp +12 -12
  292. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +8 -29
  293. package/src/duckdb/src/include/duckdb/function/aggregate_state.hpp +95 -0
  294. package/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp +13 -2
  295. package/src/duckdb/src/include/duckdb/function/cast/vector_cast_helpers.hpp +4 -4
  296. package/src/duckdb/src/include/duckdb/function/compression_function.hpp +44 -0
  297. package/src/duckdb/src/include/duckdb/function/copy_function.hpp +6 -6
  298. package/src/duckdb/src/include/duckdb/function/function.hpp +3 -3
  299. package/src/duckdb/src/include/duckdb/function/function_serialization.hpp +3 -1
  300. package/src/duckdb/src/include/duckdb/function/macro_function.hpp +2 -2
  301. package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +3 -3
  302. package/src/duckdb/src/include/duckdb/function/scalar_function.hpp +2 -2
  303. package/src/duckdb/src/include/duckdb/function/table_function.hpp +8 -7
  304. package/src/duckdb/src/include/duckdb/main/capi/cast/utils.hpp +1 -1
  305. package/src/duckdb/src/include/duckdb/main/config.hpp +2 -0
  306. package/src/duckdb/src/include/duckdb/main/materialized_query_result.hpp +3 -0
  307. package/src/duckdb/src/include/duckdb/main/pending_query_result.hpp +3 -0
  308. package/src/duckdb/src/include/duckdb/main/query_result.hpp +17 -0
  309. package/src/duckdb/src/include/duckdb/main/relation.hpp +12 -0
  310. package/src/duckdb/src/include/duckdb/main/settings.hpp +9 -0
  311. package/src/duckdb/src/include/duckdb/main/stream_query_result.hpp +3 -0
  312. package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +2 -2
  313. package/src/duckdb/src/include/duckdb/optimizer/unnest_rewriter.hpp +4 -0
  314. package/src/duckdb/src/include/duckdb/parser/base_expression.hpp +6 -12
  315. package/src/duckdb/src/include/duckdb/parser/constraint.hpp +2 -2
  316. package/src/duckdb/src/include/duckdb/parser/expression/between_expression.hpp +1 -1
  317. package/src/duckdb/src/include/duckdb/parser/expression/bound_expression.hpp +1 -1
  318. package/src/duckdb/src/include/duckdb/parser/expression/case_expression.hpp +1 -1
  319. package/src/duckdb/src/include/duckdb/parser/expression/cast_expression.hpp +1 -1
  320. package/src/duckdb/src/include/duckdb/parser/expression/collate_expression.hpp +1 -1
  321. package/src/duckdb/src/include/duckdb/parser/expression/columnref_expression.hpp +1 -1
  322. package/src/duckdb/src/include/duckdb/parser/expression/comparison_expression.hpp +1 -1
  323. package/src/duckdb/src/include/duckdb/parser/expression/conjunction_expression.hpp +1 -1
  324. package/src/duckdb/src/include/duckdb/parser/expression/constant_expression.hpp +1 -1
  325. package/src/duckdb/src/include/duckdb/parser/expression/function_expression.hpp +1 -1
  326. package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +1 -1
  327. package/src/duckdb/src/include/duckdb/parser/expression/operator_expression.hpp +1 -1
  328. package/src/duckdb/src/include/duckdb/parser/expression/parameter_expression.hpp +1 -1
  329. package/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +1 -1
  330. package/src/duckdb/src/include/duckdb/parser/expression/star_expression.hpp +1 -1
  331. package/src/duckdb/src/include/duckdb/parser/expression/subquery_expression.hpp +1 -1
  332. package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +1 -1
  333. package/src/duckdb/src/include/duckdb/parser/expression_map.hpp +1 -1
  334. package/src/duckdb/src/include/duckdb/parser/parsed_data/parse_info.hpp +2 -2
  335. package/src/duckdb/src/include/duckdb/parser/parsed_expression.hpp +5 -1
  336. package/src/duckdb/src/include/duckdb/parser/parser.hpp +2 -0
  337. package/src/duckdb/src/include/duckdb/parser/query_node.hpp +2 -2
  338. package/src/duckdb/src/include/duckdb/parser/result_modifier.hpp +36 -5
  339. package/src/duckdb/src/include/duckdb/parser/sql_statement.hpp +7 -4
  340. package/src/duckdb/src/include/duckdb/parser/statement/select_statement.hpp +1 -1
  341. package/src/duckdb/src/include/duckdb/parser/tableref/basetableref.hpp +1 -1
  342. package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +2 -2
  343. package/src/duckdb/src/include/duckdb/parser/tableref/expressionlistref.hpp +1 -1
  344. package/src/duckdb/src/include/duckdb/parser/tableref/joinref.hpp +1 -1
  345. package/src/duckdb/src/include/duckdb/parser/tableref/pivotref.hpp +1 -1
  346. package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +1 -1
  347. package/src/duckdb/src/include/duckdb/parser/tableref/table_function_ref.hpp +1 -1
  348. package/src/duckdb/src/include/duckdb/parser/tableref.hpp +4 -3
  349. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +106 -92
  350. package/src/duckdb/src/include/duckdb/planner/bind_context.hpp +2 -2
  351. package/src/duckdb/src/include/duckdb/planner/bound_constraint.hpp +2 -2
  352. package/src/duckdb/src/include/duckdb/planner/bound_query_node.hpp +2 -2
  353. package/src/duckdb/src/include/duckdb/planner/bound_result_modifier.hpp +34 -1
  354. package/src/duckdb/src/include/duckdb/planner/bound_tableref.hpp +2 -2
  355. package/src/duckdb/src/include/duckdb/planner/expression/bound_aggregate_expression.hpp +1 -1
  356. package/src/duckdb/src/include/duckdb/planner/expression/bound_between_expression.hpp +1 -1
  357. package/src/duckdb/src/include/duckdb/planner/expression/bound_case_expression.hpp +1 -1
  358. package/src/duckdb/src/include/duckdb/planner/expression/bound_cast_expression.hpp +1 -1
  359. package/src/duckdb/src/include/duckdb/planner/expression/bound_columnref_expression.hpp +1 -1
  360. package/src/duckdb/src/include/duckdb/planner/expression/bound_comparison_expression.hpp +1 -1
  361. package/src/duckdb/src/include/duckdb/planner/expression/bound_conjunction_expression.hpp +1 -1
  362. package/src/duckdb/src/include/duckdb/planner/expression/bound_constant_expression.hpp +1 -1
  363. package/src/duckdb/src/include/duckdb/planner/expression/bound_function_expression.hpp +1 -1
  364. package/src/duckdb/src/include/duckdb/planner/expression/bound_lambda_expression.hpp +1 -1
  365. package/src/duckdb/src/include/duckdb/planner/expression/bound_lambdaref_expression.hpp +1 -1
  366. package/src/duckdb/src/include/duckdb/planner/expression/bound_operator_expression.hpp +1 -1
  367. package/src/duckdb/src/include/duckdb/planner/expression/bound_parameter_expression.hpp +1 -1
  368. package/src/duckdb/src/include/duckdb/planner/expression/bound_reference_expression.hpp +1 -1
  369. package/src/duckdb/src/include/duckdb/planner/expression/bound_subquery_expression.hpp +1 -1
  370. package/src/duckdb/src/include/duckdb/planner/expression/bound_unnest_expression.hpp +1 -1
  371. package/src/duckdb/src/include/duckdb/planner/expression/bound_window_expression.hpp +1 -1
  372. package/src/duckdb/src/include/duckdb/planner/expression.hpp +5 -7
  373. package/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +1 -1
  374. package/src/duckdb/src/include/duckdb/planner/filter/conjunction_filter.hpp +6 -0
  375. package/src/duckdb/src/include/duckdb/planner/filter/constant_filter.hpp +3 -0
  376. package/src/duckdb/src/include/duckdb/planner/filter/null_filter.hpp +6 -0
  377. package/src/duckdb/src/include/duckdb/planner/logical_operator.hpp +7 -2
  378. package/src/duckdb/src/include/duckdb/planner/operator/logical_copy_to_file.hpp +6 -2
  379. package/src/duckdb/src/include/duckdb/planner/operator/logical_execute.hpp +4 -0
  380. package/src/duckdb/src/include/duckdb/planner/operator/logical_explain.hpp +5 -1
  381. package/src/duckdb/src/include/duckdb/planner/operator/logical_get.hpp +5 -1
  382. package/src/duckdb/src/include/duckdb/planner/operator/logical_pivot.hpp +3 -0
  383. package/src/duckdb/src/include/duckdb/planner/operator/logical_pragma.hpp +6 -2
  384. package/src/duckdb/src/include/duckdb/planner/operator/logical_prepare.hpp +4 -0
  385. package/src/duckdb/src/include/duckdb/planner/table_binding.hpp +26 -0
  386. package/src/duckdb/src/include/duckdb/planner/table_filter.hpp +17 -0
  387. package/src/duckdb/src/include/duckdb/planner/tableref/bound_pivotref.hpp +3 -0
  388. package/src/duckdb/src/include/duckdb/storage/compression/chimp/algorithm/byte_reader.hpp +4 -0
  389. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_analyze.hpp +1 -1
  390. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_compress.hpp +2 -2
  391. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_analyze.hpp +2 -2
  392. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_compress.hpp +2 -2
  393. package/src/duckdb/src/include/duckdb/storage/in_memory_block_manager.hpp +13 -13
  394. package/src/duckdb/src/include/duckdb/storage/index.hpp +6 -4
  395. package/src/duckdb/src/include/duckdb/storage/partial_block_manager.hpp +1 -1
  396. package/src/duckdb/src/include/duckdb/storage/storage_extension.hpp +0 -6
  397. package/src/duckdb/src/include/duckdb/storage/storage_manager.hpp +12 -0
  398. package/src/duckdb/src/include/duckdb/storage/string_uncompressed.hpp +1 -1
  399. package/src/duckdb/src/include/duckdb/storage/table/chunk_info.hpp +25 -2
  400. package/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp +12 -0
  401. package/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp +22 -0
  402. package/src/duckdb/src/include/duckdb/transaction/duck_transaction_manager.hpp +2 -2
  403. package/src/duckdb/src/include/duckdb/transaction/transaction.hpp +2 -2
  404. package/src/duckdb/src/main/capi/appender-c.cpp +5 -5
  405. package/src/duckdb/src/main/capi/arrow-c.cpp +10 -10
  406. package/src/duckdb/src/main/capi/cast/from_decimal-c.cpp +1 -1
  407. package/src/duckdb/src/main/capi/cast/utils-c.cpp +1 -1
  408. package/src/duckdb/src/main/capi/config-c.cpp +3 -6
  409. package/src/duckdb/src/main/capi/data_chunk-c.cpp +17 -17
  410. package/src/duckdb/src/main/capi/duckdb-c.cpp +4 -4
  411. package/src/duckdb/src/main/capi/duckdb_value-c.cpp +4 -4
  412. package/src/duckdb/src/main/capi/logical_types-c.cpp +22 -21
  413. package/src/duckdb/src/main/capi/pending-c.cpp +6 -6
  414. package/src/duckdb/src/main/capi/prepared-c.cpp +10 -10
  415. package/src/duckdb/src/main/capi/replacement_scan-c.cpp +6 -6
  416. package/src/duckdb/src/main/capi/result-c.cpp +23 -23
  417. package/src/duckdb/src/main/capi/table_function-c.cpp +1 -1
  418. package/src/duckdb/src/main/client_context.cpp +3 -3
  419. package/src/duckdb/src/main/config.cpp +1 -0
  420. package/src/duckdb/src/main/database_manager.cpp +1 -1
  421. package/src/duckdb/src/main/error_manager.cpp +1 -1
  422. package/src/duckdb/src/main/extension/extension_load.cpp +1 -1
  423. package/src/duckdb/src/main/relation/create_table_relation.cpp +1 -1
  424. package/src/duckdb/src/main/relation/create_view_relation.cpp +1 -1
  425. package/src/duckdb/src/main/relation/delete_relation.cpp +1 -1
  426. package/src/duckdb/src/main/relation/explain_relation.cpp +1 -1
  427. package/src/duckdb/src/main/relation/insert_relation.cpp +1 -1
  428. package/src/duckdb/src/main/relation/update_relation.cpp +1 -1
  429. package/src/duckdb/src/main/relation/write_csv_relation.cpp +1 -1
  430. package/src/duckdb/src/main/relation/write_parquet_relation.cpp +1 -1
  431. package/src/duckdb/src/main/relation.cpp +1 -1
  432. package/src/duckdb/src/main/settings/settings.cpp +22 -6
  433. package/src/duckdb/src/optimizer/deliminator.cpp +12 -12
  434. package/src/duckdb/src/optimizer/expression_heuristics.cpp +1 -0
  435. package/src/duckdb/src/optimizer/filter_combiner.cpp +3 -3
  436. package/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp +10 -10
  437. package/src/duckdb/src/optimizer/matcher/expression_matcher.cpp +1 -1
  438. package/src/duckdb/src/optimizer/pullup/pullup_projection.cpp +2 -2
  439. package/src/duckdb/src/optimizer/regex_range_filter.cpp +2 -4
  440. package/src/duckdb/src/optimizer/rule/distributivity.cpp +2 -2
  441. package/src/duckdb/src/optimizer/statistics/operator/propagate_filter.cpp +6 -6
  442. package/src/duckdb/src/optimizer/statistics/operator/propagate_get.cpp +2 -2
  443. package/src/duckdb/src/optimizer/unnest_rewriter.cpp +27 -16
  444. package/src/duckdb/src/parallel/executor.cpp +1 -1
  445. package/src/duckdb/src/parser/base_expression.cpp +2 -5
  446. package/src/duckdb/src/parser/column_definition.cpp +5 -8
  447. package/src/duckdb/src/parser/expression/between_expression.cpp +4 -4
  448. package/src/duckdb/src/parser/expression/case_expression.cpp +6 -6
  449. package/src/duckdb/src/parser/expression/cast_expression.cpp +4 -4
  450. package/src/duckdb/src/parser/expression/collate_expression.cpp +3 -3
  451. package/src/duckdb/src/parser/expression/columnref_expression.cpp +4 -4
  452. package/src/duckdb/src/parser/expression/comparison_expression.cpp +3 -3
  453. package/src/duckdb/src/parser/expression/conjunction_expression.cpp +2 -2
  454. package/src/duckdb/src/parser/expression/constant_expression.cpp +2 -2
  455. package/src/duckdb/src/parser/expression/function_expression.cpp +10 -14
  456. package/src/duckdb/src/parser/expression/lambda_expression.cpp +2 -2
  457. package/src/duckdb/src/parser/expression/operator_expression.cpp +4 -4
  458. package/src/duckdb/src/parser/expression/parameter_expression.cpp +2 -2
  459. package/src/duckdb/src/parser/expression/positional_reference_expression.cpp +3 -3
  460. package/src/duckdb/src/parser/expression/star_expression.cpp +9 -9
  461. package/src/duckdb/src/parser/expression/subquery_expression.cpp +5 -5
  462. package/src/duckdb/src/parser/expression/window_expression.cpp +13 -24
  463. package/src/duckdb/src/parser/parsed_data/create_info.cpp +0 -3
  464. package/src/duckdb/src/parser/parsed_expression.cpp +34 -18
  465. package/src/duckdb/src/parser/parsed_expression_iterator.cpp +4 -4
  466. package/src/duckdb/src/parser/parser.cpp +4 -4
  467. package/src/duckdb/src/parser/query_node/select_node.cpp +6 -13
  468. package/src/duckdb/src/parser/query_node.cpp +7 -6
  469. package/src/duckdb/src/parser/result_modifier.cpp +25 -18
  470. package/src/duckdb/src/parser/statement/select_statement.cpp +3 -3
  471. package/src/duckdb/src/parser/tableref/basetableref.cpp +4 -4
  472. package/src/duckdb/src/parser/tableref/emptytableref.cpp +1 -1
  473. package/src/duckdb/src/parser/tableref/expressionlistref.cpp +5 -5
  474. package/src/duckdb/src/parser/tableref/joinref.cpp +6 -6
  475. package/src/duckdb/src/parser/tableref/pivotref.cpp +10 -15
  476. package/src/duckdb/src/parser/tableref/subqueryref.cpp +3 -3
  477. package/src/duckdb/src/parser/tableref/table_function.cpp +3 -3
  478. package/src/duckdb/src/parser/tableref.cpp +12 -3
  479. package/src/duckdb/src/parser/transform/expression/transform_array_access.cpp +7 -7
  480. package/src/duckdb/src/parser/transform/expression/transform_bool_expr.cpp +4 -4
  481. package/src/duckdb/src/parser/transform/expression/transform_boolean_test.cpp +4 -4
  482. package/src/duckdb/src/parser/transform/expression/transform_case.cpp +8 -10
  483. package/src/duckdb/src/parser/transform/expression/transform_cast.cpp +7 -9
  484. package/src/duckdb/src/parser/transform/expression/transform_coalesce.cpp +3 -5
  485. package/src/duckdb/src/parser/transform/expression/transform_columnref.cpp +22 -22
  486. package/src/duckdb/src/parser/transform/expression/transform_constant.cpp +2 -2
  487. package/src/duckdb/src/parser/transform/expression/transform_expression.cpp +42 -44
  488. package/src/duckdb/src/parser/transform/expression/transform_function.cpp +70 -75
  489. package/src/duckdb/src/parser/transform/expression/transform_grouping_function.cpp +4 -4
  490. package/src/duckdb/src/parser/transform/expression/transform_interval.cpp +7 -7
  491. package/src/duckdb/src/parser/transform/expression/transform_is_null.cpp +4 -5
  492. package/src/duckdb/src/parser/transform/expression/transform_lambda.cpp +5 -6
  493. package/src/duckdb/src/parser/transform/expression/transform_operator.cpp +28 -29
  494. package/src/duckdb/src/parser/transform/expression/transform_param_ref.cpp +13 -14
  495. package/src/duckdb/src/parser/transform/expression/transform_positional_reference.cpp +4 -4
  496. package/src/duckdb/src/parser/transform/expression/transform_subquery.cpp +9 -10
  497. package/src/duckdb/src/parser/transform/helpers/nodetype_to_string.cpp +0 -2
  498. package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +28 -32
  499. package/src/duckdb/src/parser/transform/helpers/transform_groupby.cpp +18 -18
  500. package/src/duckdb/src/parser/transform/helpers/transform_sample.cpp +3 -3
  501. package/src/duckdb/src/parser/transform/helpers/transform_typename.cpp +27 -26
  502. package/src/duckdb/src/parser/transform/statement/transform_alter_sequence.cpp +11 -14
  503. package/src/duckdb/src/parser/transform/statement/transform_alter_table.cpp +14 -16
  504. package/src/duckdb/src/parser/transform/statement/transform_attach.cpp +8 -9
  505. package/src/duckdb/src/parser/transform/statement/transform_call.cpp +2 -5
  506. package/src/duckdb/src/parser/transform/statement/transform_checkpoint.cpp +4 -6
  507. package/src/duckdb/src/parser/transform/statement/transform_copy.cpp +22 -23
  508. package/src/duckdb/src/parser/transform/statement/transform_create_function.cpp +14 -18
  509. package/src/duckdb/src/parser/transform/statement/transform_create_index.cpp +13 -15
  510. package/src/duckdb/src/parser/transform/statement/transform_create_schema.cpp +8 -10
  511. package/src/duckdb/src/parser/transform/statement/transform_create_sequence.cpp +8 -10
  512. package/src/duckdb/src/parser/transform/statement/transform_create_table.cpp +26 -28
  513. package/src/duckdb/src/parser/transform/statement/transform_create_table_as.cpp +8 -10
  514. package/src/duckdb/src/parser/transform/statement/transform_create_type.cpp +12 -15
  515. package/src/duckdb/src/parser/transform/statement/transform_create_view.cpp +13 -18
  516. package/src/duckdb/src/parser/transform/statement/transform_delete.cpp +11 -13
  517. package/src/duckdb/src/parser/transform/statement/transform_detach.cpp +3 -4
  518. package/src/duckdb/src/parser/transform/statement/transform_drop.cpp +20 -25
  519. package/src/duckdb/src/parser/transform/statement/transform_explain.cpp +5 -7
  520. package/src/duckdb/src/parser/transform/statement/transform_export.cpp +5 -6
  521. package/src/duckdb/src/parser/transform/statement/transform_import.cpp +2 -3
  522. package/src/duckdb/src/parser/transform/statement/transform_insert.cpp +21 -24
  523. package/src/duckdb/src/parser/transform/statement/transform_load.cpp +4 -5
  524. package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +7 -7
  525. package/src/duckdb/src/parser/transform/statement/transform_pragma.cpp +7 -9
  526. package/src/duckdb/src/parser/transform/statement/transform_prepare.cpp +11 -19
  527. package/src/duckdb/src/parser/transform/statement/transform_rename.cpp +12 -14
  528. package/src/duckdb/src/parser/transform/statement/transform_select.cpp +12 -9
  529. package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +34 -34
  530. package/src/duckdb/src/parser/transform/statement/transform_set.cpp +18 -19
  531. package/src/duckdb/src/parser/transform/statement/transform_show.cpp +5 -7
  532. package/src/duckdb/src/parser/transform/statement/transform_show_select.cpp +4 -5
  533. package/src/duckdb/src/parser/transform/statement/transform_transaction.cpp +3 -5
  534. package/src/duckdb/src/parser/transform/statement/transform_update.cpp +10 -13
  535. package/src/duckdb/src/parser/transform/statement/transform_upsert.cpp +4 -4
  536. package/src/duckdb/src/parser/transform/statement/transform_use.cpp +2 -3
  537. package/src/duckdb/src/parser/transform/statement/transform_vacuum.cpp +6 -10
  538. package/src/duckdb/src/parser/transform/tableref/transform_base_tableref.cpp +18 -18
  539. package/src/duckdb/src/parser/transform/tableref/transform_from.cpp +5 -5
  540. package/src/duckdb/src/parser/transform/tableref/transform_join.cpp +11 -11
  541. package/src/duckdb/src/parser/transform/tableref/transform_pivot.cpp +30 -27
  542. package/src/duckdb/src/parser/transform/tableref/transform_subquery.cpp +5 -5
  543. package/src/duckdb/src/parser/transform/tableref/transform_table_function.cpp +13 -12
  544. package/src/duckdb/src/parser/transform/tableref/transform_tableref.cpp +8 -8
  545. package/src/duckdb/src/parser/transformer.cpp +45 -47
  546. package/src/duckdb/src/planner/bind_context.cpp +9 -10
  547. package/src/duckdb/src/planner/binder/expression/bind_function_expression.cpp +1 -1
  548. package/src/duckdb/src/planner/binder/expression/bind_lambda.cpp +1 -1
  549. package/src/duckdb/src/planner/binder/expression/bind_positional_reference_expression.cpp +8 -3
  550. package/src/duckdb/src/planner/binder/expression/bind_star_expression.cpp +1 -1
  551. package/src/duckdb/src/planner/binder/expression/bind_subquery_expression.cpp +6 -3
  552. package/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +8 -8
  553. package/src/duckdb/src/planner/binder/query_node/plan_query_node.cpp +4 -4
  554. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +1 -28
  555. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +18 -1
  556. package/src/duckdb/src/planner/binder/statement/bind_drop.cpp +0 -25
  557. package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +2 -2
  558. package/src/duckdb/src/planner/binder/statement/bind_update.cpp +2 -114
  559. package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +4 -2
  560. package/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp +5 -2
  561. package/src/duckdb/src/planner/binder.cpp +1 -1
  562. package/src/duckdb/src/planner/bound_result_modifier.cpp +16 -11
  563. package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +5 -5
  564. package/src/duckdb/src/planner/expression/bound_between_expression.cpp +5 -5
  565. package/src/duckdb/src/planner/expression/bound_case_expression.cpp +5 -5
  566. package/src/duckdb/src/planner/expression/bound_cast_expression.cpp +3 -3
  567. package/src/duckdb/src/planner/expression/bound_columnref_expression.cpp +2 -2
  568. package/src/duckdb/src/planner/expression/bound_comparison_expression.cpp +4 -4
  569. package/src/duckdb/src/planner/expression/bound_conjunction_expression.cpp +2 -2
  570. package/src/duckdb/src/planner/expression/bound_constant_expression.cpp +2 -2
  571. package/src/duckdb/src/planner/expression/bound_expression.cpp +1 -1
  572. package/src/duckdb/src/planner/expression/bound_function_expression.cpp +3 -4
  573. package/src/duckdb/src/planner/expression/bound_lambda_expression.cpp +4 -5
  574. package/src/duckdb/src/planner/expression/bound_lambdaref_expression.cpp +2 -2
  575. package/src/duckdb/src/planner/expression/bound_operator_expression.cpp +3 -4
  576. package/src/duckdb/src/planner/expression/bound_parameter_expression.cpp +2 -2
  577. package/src/duckdb/src/planner/expression/bound_reference_expression.cpp +2 -2
  578. package/src/duckdb/src/planner/expression/bound_subquery_expression.cpp +1 -1
  579. package/src/duckdb/src/planner/expression/bound_unnest_expression.cpp +3 -3
  580. package/src/duckdb/src/planner/expression/bound_window_expression.cpp +8 -21
  581. package/src/duckdb/src/planner/expression.cpp +15 -0
  582. package/src/duckdb/src/planner/expression_binder/base_select_binder.cpp +2 -2
  583. package/src/duckdb/src/planner/expression_binder.cpp +3 -2
  584. package/src/duckdb/src/planner/expression_iterator.cpp +2 -2
  585. package/src/duckdb/src/planner/filter/conjunction_filter.cpp +2 -2
  586. package/src/duckdb/src/planner/filter/constant_filter.cpp +1 -1
  587. package/src/duckdb/src/planner/logical_operator.cpp +3 -4
  588. package/src/duckdb/src/planner/logical_operator_visitor.cpp +1 -1
  589. package/src/duckdb/src/planner/operator/logical_pivot.cpp +14 -2
  590. package/src/duckdb/src/planner/planner.cpp +5 -15
  591. package/src/duckdb/src/planner/table_filter.cpp +1 -1
  592. package/src/duckdb/src/storage/arena_allocator.cpp +2 -2
  593. package/src/duckdb/src/storage/buffer/block_handle.cpp +1 -1
  594. package/src/duckdb/src/storage/checkpoint/write_overflow_strings_to_disk.cpp +2 -2
  595. package/src/duckdb/src/storage/checkpoint_manager.cpp +3 -3
  596. package/src/duckdb/src/storage/compression/bitpacking.cpp +8 -8
  597. package/src/duckdb/src/storage/compression/dictionary_compression.cpp +36 -36
  598. package/src/duckdb/src/storage/compression/fixed_size_uncompressed.cpp +11 -11
  599. package/src/duckdb/src/storage/compression/fsst.cpp +34 -34
  600. package/src/duckdb/src/storage/compression/rle.cpp +8 -8
  601. package/src/duckdb/src/storage/compression/string_uncompressed.cpp +13 -13
  602. package/src/duckdb/src/storage/compression/validity_uncompressed.cpp +11 -11
  603. package/src/duckdb/src/storage/data_table.cpp +8 -7
  604. package/src/duckdb/src/storage/index.cpp +14 -3
  605. package/src/duckdb/src/storage/local_storage.cpp +2 -1
  606. package/src/duckdb/src/storage/magic_bytes.cpp +1 -1
  607. package/src/duckdb/src/storage/single_file_block_manager.cpp +3 -3
  608. package/src/duckdb/src/storage/standard_buffer_manager.cpp +3 -3
  609. package/src/duckdb/src/storage/statistics/list_stats.cpp +1 -1
  610. package/src/duckdb/src/storage/statistics/numeric_stats.cpp +1 -1
  611. package/src/duckdb/src/storage/statistics/string_stats.cpp +15 -14
  612. package/src/duckdb/src/storage/table/chunk_info.cpp +2 -2
  613. package/src/duckdb/src/storage/table/column_segment.cpp +3 -3
  614. package/src/duckdb/src/storage/table/list_column_data.cpp +3 -3
  615. package/src/duckdb/src/storage/table/row_group.cpp +4 -4
  616. package/src/duckdb/src/storage/table/standard_column_data.cpp +1 -1
  617. package/src/duckdb/src/storage/table/update_segment.cpp +12 -12
  618. package/src/duckdb/src/storage/wal_replay.cpp +5 -6
  619. package/src/duckdb/src/transaction/cleanup_state.cpp +3 -3
  620. package/src/duckdb/src/transaction/commit_state.cpp +8 -8
  621. package/src/duckdb/src/transaction/duck_transaction.cpp +9 -7
  622. package/src/duckdb/src/transaction/duck_transaction_manager.cpp +16 -16
  623. package/src/duckdb/src/transaction/rollback_state.cpp +3 -3
  624. package/src/duckdb/src/verification/prepared_statement_verifier.cpp +1 -1
  625. package/src/duckdb/src/verification/statement_verifier.cpp +3 -4
  626. package/src/duckdb/third_party/hyperloglog/hyperloglog.hpp +2 -2
  627. package/src/duckdb/third_party/libpg_query/include/nodes/nodes.hpp +0 -1
  628. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +0 -14
  629. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +12828 -12956
  630. package/src/duckdb/third_party/pcg/pcg_extras.hpp +1 -1
  631. package/src/duckdb/third_party/zstd/compress/zstd_compress.cpp +3 -0
  632. package/src/duckdb/third_party/zstd/include/zstd/compress/zstd_cwksp.h +4 -0
  633. package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +5 -5
  634. package/src/duckdb/ub_src_parser_transform_statement.cpp +0 -2
  635. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_database_info.hpp +0 -46
  636. package/src/duckdb/src/parser/transform/statement/transform_create_database.cpp +0 -28
@@ -18,7 +18,6 @@
18
18
  #include "duckdb/storage/table/scan_state.hpp"
19
19
 
20
20
  #include <algorithm>
21
- #include <cstring>
22
21
 
23
22
  namespace duckdb {
24
23
 
@@ -125,7 +124,7 @@ static void TemplatedGenerateKeys(ArenaAllocator &allocator, Vector &input, idx_
125
124
  input.ToUnifiedFormat(count, idata);
126
125
 
127
126
  D_ASSERT(keys.size() >= count);
128
- auto input_data = (T *)idata.data;
127
+ auto input_data = UnifiedVectorFormat::GetData<T>(idata);
129
128
  for (idx_t i = 0; i < count; i++) {
130
129
  auto idx = idata.sel->get_index(i);
131
130
  if (idata.validity.RowIsValid(idx)) {
@@ -142,7 +141,7 @@ static void ConcatenateKeys(ArenaAllocator &allocator, Vector &input, idx_t coun
142
141
  UnifiedVectorFormat idata;
143
142
  input.ToUnifiedFormat(count, idata);
144
143
 
145
- auto input_data = (T *)idata.data;
144
+ auto input_data = UnifiedVectorFormat::GetData<T>(idata);
146
145
  for (idx_t i = 0; i < count; i++) {
147
146
  auto idx = idata.sel->get_index(i);
148
147
 
@@ -347,7 +346,31 @@ bool ART::ConstructFromSorted(idx_t count, vector<ARTKey> &keys, Vector &row_ide
347
346
 
348
347
  auto key_section = KeySection(0, count - 1, 0, 0);
349
348
  auto has_constraint = IsUnique();
350
- return Construct(*this, keys, row_ids, *this->tree, key_section, has_constraint);
349
+ if (!Construct(*this, keys, row_ids, *this->tree, key_section, has_constraint)) {
350
+ return false;
351
+ }
352
+
353
+ #ifdef DEBUG
354
+ D_ASSERT(!VerifyAndToStringInternal(true).empty());
355
+ for (idx_t i = 0; i < count; i++) {
356
+ D_ASSERT(!keys[i].Empty());
357
+ auto leaf_node = Lookup(*tree, keys[i], 0);
358
+ D_ASSERT(leaf_node.IsSet());
359
+ auto &leaf = Leaf::Get(*this, leaf_node);
360
+
361
+ if (leaf.IsInlined()) {
362
+ D_ASSERT(row_ids[i] == leaf.row_ids.inlined);
363
+ continue;
364
+ }
365
+
366
+ D_ASSERT(leaf.row_ids.ptr.IsSet());
367
+ Node leaf_segment = leaf.row_ids.ptr;
368
+ auto position = leaf.FindRowId(*this, leaf_segment, row_ids[i]);
369
+ D_ASSERT(position != (uint32_t)DConstants::INVALID_INDEX);
370
+ }
371
+ #endif
372
+
373
+ return true;
351
374
  }
352
375
 
353
376
  //===--------------------------------------------------------------------===//
@@ -397,6 +420,29 @@ PreservedError ART::Insert(IndexLock &lock, DataChunk &input, Vector &row_ids) {
397
420
  return PreservedError(ConstraintException("PRIMARY KEY or UNIQUE constraint violated: duplicate key \"%s\"",
398
421
  AppendRowError(input, failed_index)));
399
422
  }
423
+
424
+ #ifdef DEBUG
425
+ for (idx_t i = 0; i < input.size(); i++) {
426
+ if (keys[i].Empty()) {
427
+ continue;
428
+ }
429
+
430
+ auto leaf_node = Lookup(*tree, keys[i], 0);
431
+ D_ASSERT(leaf_node.IsSet());
432
+ auto &leaf = Leaf::Get(*this, leaf_node);
433
+
434
+ if (leaf.IsInlined()) {
435
+ D_ASSERT(row_identifiers[i] == leaf.row_ids.inlined);
436
+ continue;
437
+ }
438
+
439
+ D_ASSERT(leaf.row_ids.ptr.IsSet());
440
+ Node leaf_segment = leaf.row_ids.ptr;
441
+ auto position = leaf.FindRowId(*this, leaf_segment, row_identifiers[i]);
442
+ D_ASSERT(position != (uint32_t)DConstants::INVALID_INDEX);
443
+ }
444
+ #endif
445
+
400
446
  return PreservedError();
401
447
  }
402
448
 
@@ -535,16 +581,31 @@ void ART::Delete(IndexLock &state, DataChunk &input, Vector &row_ids) {
535
581
  continue;
536
582
  }
537
583
  Erase(*tree, keys[i], 0, row_identifiers[i]);
584
+ }
585
+
538
586
  #ifdef DEBUG
587
+ // verify that we removed all row IDs
588
+ for (idx_t i = 0; i < input.size(); i++) {
589
+ if (keys[i].Empty()) {
590
+ continue;
591
+ }
592
+
539
593
  auto node = Lookup(*tree, keys[i], 0);
540
594
  if (node.IsSet()) {
541
595
  auto &leaf = Leaf::Get(*this, node);
542
- for (idx_t k = 0; k < leaf.count; k++) {
543
- D_ASSERT(leaf.GetRowId(*this, k) != row_identifiers[i]);
596
+
597
+ if (leaf.IsInlined()) {
598
+ D_ASSERT(row_identifiers[i] != leaf.row_ids.inlined);
599
+ continue;
544
600
  }
601
+
602
+ D_ASSERT(leaf.row_ids.ptr.IsSet());
603
+ Node leaf_segment = leaf.row_ids.ptr;
604
+ auto position = leaf.FindRowId(*this, leaf_segment, row_identifiers[i]);
605
+ D_ASSERT(position == (uint32_t)DConstants::INVALID_INDEX);
545
606
  }
546
- #endif
547
607
  }
608
+ #endif
548
609
  }
549
610
 
550
611
  void ART::Erase(Node &node, const ARTKey &key, idx_t depth, const row_t &row_id) {
@@ -715,16 +776,16 @@ Node ART::Lookup(Node node, const ARTKey &key, idx_t depth) {
715
776
  // False (Otherwise)
716
777
  //===--------------------------------------------------------------------===//
717
778
 
718
- bool ART::SearchGreater(ARTIndexScanState *state, ARTKey &key, bool inclusive, idx_t max_count,
779
+ bool ART::SearchGreater(ARTIndexScanState &state, ARTKey &key, bool inclusive, idx_t max_count,
719
780
  vector<row_t> &result_ids) {
720
781
 
721
- Iterator *it = &state->iterator;
782
+ auto &it = state.iterator;
722
783
 
723
784
  // greater than scan: first set the iterator to the node at which we will start our scan by finding the lowest node
724
785
  // that satisfies our requirement
725
- if (!it->art) {
726
- it->art = this;
727
- if (!it->LowerBound(*tree, key, inclusive)) {
786
+ if (!it.art) {
787
+ it.art = this;
788
+ if (!it.LowerBound(*tree, key, inclusive)) {
728
789
  return true;
729
790
  }
730
791
  }
@@ -732,74 +793,72 @@ bool ART::SearchGreater(ARTIndexScanState *state, ARTKey &key, bool inclusive, i
732
793
  // after that we continue the scan; we don't need to check the bounds as any value following this value is
733
794
  // automatically bigger and hence satisfies our predicate
734
795
  ARTKey empty_key = ARTKey();
735
- return it->Scan(empty_key, max_count, result_ids, false);
796
+ return it.Scan(empty_key, max_count, result_ids, false);
736
797
  }
737
798
 
738
799
  //===--------------------------------------------------------------------===//
739
800
  // Less Than
740
801
  //===--------------------------------------------------------------------===//
741
802
 
742
- bool ART::SearchLess(ARTIndexScanState *state, ARTKey &upper_bound, bool inclusive, idx_t max_count,
803
+ bool ART::SearchLess(ARTIndexScanState &state, ARTKey &upper_bound, bool inclusive, idx_t max_count,
743
804
  vector<row_t> &result_ids) {
744
805
 
745
806
  if (!tree->IsSet()) {
746
807
  return true;
747
808
  }
748
809
 
749
- Iterator *it = &state->iterator;
810
+ auto &it = state.iterator;
750
811
 
751
- if (!it->art) {
752
- it->art = this;
812
+ if (!it.art) {
813
+ it.art = this;
753
814
  // first find the minimum value in the ART: we start scanning from this value
754
- it->FindMinimum(*tree);
815
+ it.FindMinimum(*tree);
755
816
  // early out min value higher than upper bound query
756
- if (it->cur_key > upper_bound) {
817
+ if (it.cur_key > upper_bound) {
757
818
  return true;
758
819
  }
759
820
  }
760
821
 
761
822
  // now continue the scan until we reach the upper bound
762
- return it->Scan(upper_bound, max_count, result_ids, inclusive);
823
+ return it.Scan(upper_bound, max_count, result_ids, inclusive);
763
824
  }
764
825
 
765
826
  //===--------------------------------------------------------------------===//
766
827
  // Closed Range Query
767
828
  //===--------------------------------------------------------------------===//
768
829
 
769
- bool ART::SearchCloseRange(ARTIndexScanState *state, ARTKey &lower_bound, ARTKey &upper_bound, bool left_inclusive,
830
+ bool ART::SearchCloseRange(ARTIndexScanState &state, ARTKey &lower_bound, ARTKey &upper_bound, bool left_inclusive,
770
831
  bool right_inclusive, idx_t max_count, vector<row_t> &result_ids) {
771
-
772
- Iterator *it = &state->iterator;
832
+ auto &it = state.iterator;
773
833
 
774
834
  // first find the first node that satisfies the left predicate
775
- if (!it->art) {
776
- it->art = this;
777
- if (!it->LowerBound(*tree, lower_bound, left_inclusive)) {
835
+ if (!it.art) {
836
+ it.art = this;
837
+ if (!it.LowerBound(*tree, lower_bound, left_inclusive)) {
778
838
  return true;
779
839
  }
780
840
  }
781
841
 
782
842
  // now continue the scan until we reach the upper bound
783
- return it->Scan(upper_bound, max_count, result_ids, right_inclusive);
843
+ return it.Scan(upper_bound, max_count, result_ids, right_inclusive);
784
844
  }
785
845
 
786
846
  bool ART::Scan(const Transaction &transaction, const DataTable &table, IndexScanState &table_state,
787
847
  const idx_t max_count, vector<row_t> &result_ids) {
788
-
789
- auto state = (ARTIndexScanState *)&table_state;
848
+ auto &state = table_state.Cast<ARTIndexScanState>();
790
849
  vector<row_t> row_ids;
791
850
  bool success;
792
851
 
793
852
  // FIXME: the key directly owning the data for a single key might be more efficient
794
- D_ASSERT(state->values[0].type().InternalType() == types[0]);
853
+ D_ASSERT(state.values[0].type().InternalType() == types[0]);
795
854
  ArenaAllocator arena_allocator(Allocator::Get(db));
796
- auto key = CreateKey(arena_allocator, types[0], state->values[0]);
855
+ auto key = CreateKey(arena_allocator, types[0], state.values[0]);
797
856
 
798
- if (state->values[1].IsNull()) {
857
+ if (state.values[1].IsNull()) {
799
858
 
800
859
  // single predicate
801
860
  lock_guard<mutex> l(lock);
802
- switch (state->expressions[0]) {
861
+ switch (state.expressions[0]) {
803
862
  case ExpressionType::COMPARE_EQUAL:
804
863
  success = SearchEqual(key, max_count, row_ids);
805
864
  break;
@@ -824,11 +883,11 @@ bool ART::Scan(const Transaction &transaction, const DataTable &table, IndexScan
824
883
  // two predicates
825
884
  lock_guard<mutex> l(lock);
826
885
 
827
- D_ASSERT(state->values[1].type().InternalType() == types[0]);
828
- auto upper_bound = CreateKey(arena_allocator, types[0], state->values[1]);
886
+ D_ASSERT(state.values[1].type().InternalType() == types[0]);
887
+ auto upper_bound = CreateKey(arena_allocator, types[0], state.values[1]);
829
888
 
830
- bool left_inclusive = state->expressions[0] == ExpressionType ::COMPARE_GREATERTHANOREQUALTO;
831
- bool right_inclusive = state->expressions[1] == ExpressionType ::COMPARE_LESSTHANOREQUALTO;
889
+ bool left_inclusive = state.expressions[0] == ExpressionType ::COMPARE_GREATERTHANOREQUALTO;
890
+ bool right_inclusive = state.expressions[1] == ExpressionType ::COMPARE_LESSTHANOREQUALTO;
832
891
  success = SearchCloseRange(state, key, upper_bound, left_inclusive, right_inclusive, max_count, row_ids);
833
892
  }
834
893
 
@@ -1024,6 +1083,10 @@ void ART::Vacuum(IndexLock &state) {
1024
1083
 
1025
1084
  // finalize the vacuum operation
1026
1085
  FinalizeVacuum(flags);
1086
+
1087
+ for (auto &allocator : allocators) {
1088
+ allocator->Verify();
1089
+ }
1027
1090
  }
1028
1091
 
1029
1092
  //===--------------------------------------------------------------------===//
@@ -1061,6 +1124,10 @@ bool ART::MergeIndexes(IndexLock &state, Index &other_index) {
1061
1124
  if (!tree->Merge(*this, *other_art.tree)) {
1062
1125
  return false;
1063
1126
  }
1127
+
1128
+ for (auto &allocator : allocators) {
1129
+ allocator->Verify();
1130
+ }
1064
1131
  return true;
1065
1132
  }
1066
1133
 
@@ -1068,9 +1135,13 @@ bool ART::MergeIndexes(IndexLock &state, Index &other_index) {
1068
1135
  // Utility
1069
1136
  //===--------------------------------------------------------------------===//
1070
1137
 
1071
- string ART::ToString() {
1138
+ string ART::VerifyAndToString(IndexLock &state, const bool only_verify) {
1139
+ return VerifyAndToStringInternal(only_verify);
1140
+ }
1141
+
1142
+ string ART::VerifyAndToStringInternal(const bool only_verify) {
1072
1143
  if (tree->IsSet()) {
1073
- return tree->ToString(*this);
1144
+ return "ART: " + tree->VerifyAndToString(*this, only_verify);
1074
1145
  }
1075
1146
  return "[empty]";
1076
1147
  }
@@ -59,7 +59,7 @@ SwizzleablePointer FixedSizeAllocator::New() {
59
59
  buffers_with_free_space.insert(buffer_id);
60
60
 
61
61
  // set the bitmask
62
- ValidityMask mask((validity_t *)buffer);
62
+ ValidityMask mask(reinterpret_cast<validity_t *>(buffer));
63
63
  mask.SetAllValid(allocations_per_buffer);
64
64
  }
65
65
 
@@ -67,7 +67,7 @@ SwizzleablePointer FixedSizeAllocator::New() {
67
67
  D_ASSERT(!buffers_with_free_space.empty());
68
68
  auto buffer_id = (uint32_t)*buffers_with_free_space.begin();
69
69
 
70
- auto bitmask_ptr = (validity_t *)buffers[buffer_id].ptr;
70
+ auto bitmask_ptr = reinterpret_cast<validity_t *>(buffers[buffer_id].ptr);
71
71
  ValidityMask mask(bitmask_ptr);
72
72
  auto offset = GetOffset(mask, buffers[buffer_id].allocation_count);
73
73
 
@@ -81,8 +81,7 @@ SwizzleablePointer FixedSizeAllocator::New() {
81
81
  }
82
82
 
83
83
  void FixedSizeAllocator::Free(const SwizzleablePointer ptr) {
84
-
85
- auto bitmask_ptr = (validity_t *)buffers[ptr.buffer_id].ptr;
84
+ auto bitmask_ptr = reinterpret_cast<validity_t *>(buffers[ptr.buffer_id].ptr);
86
85
  ValidityMask mask(bitmask_ptr);
87
86
  D_ASSERT(!mask.RowIsValid(ptr.offset));
88
87
  mask.SetValid(ptr.offset);
@@ -127,13 +126,20 @@ void FixedSizeAllocator::Merge(FixedSizeAllocator &other) {
127
126
 
128
127
  bool FixedSizeAllocator::InitializeVacuum() {
129
128
 
129
+ if (total_allocations == 0) {
130
+ Reset();
131
+ return false;
132
+ }
133
+
130
134
  auto total_available_allocations = allocations_per_buffer * buffers.size();
135
+ D_ASSERT(total_available_allocations >= total_allocations);
131
136
  auto total_free_positions = total_available_allocations - total_allocations;
132
137
 
133
138
  // vacuum_count buffers can be freed
134
- auto vacuum_count = total_free_positions / allocations_per_buffer / 2;
139
+ auto vacuum_count = total_free_positions / allocations_per_buffer;
135
140
 
136
141
  // calculate the vacuum threshold adaptively
142
+ D_ASSERT(vacuum_count < buffers.size());
137
143
  idx_t memory_usage = GetMemoryUsage();
138
144
  idx_t excess_memory_usage = vacuum_count * BUFFER_ALLOC_SIZE;
139
145
  auto excess_percentage = (double)excess_memory_usage / (double)memory_usage;
@@ -172,10 +178,22 @@ SwizzleablePointer FixedSizeAllocator::VacuumPointer(const SwizzleablePointer pt
172
178
  // buffer after the vacuum operation
173
179
 
174
180
  auto new_ptr = New();
181
+
182
+ // new increases the allocation count
183
+ total_allocations--;
184
+
175
185
  memcpy(Get(new_ptr), Get(ptr), allocation_size);
176
186
  return new_ptr;
177
187
  }
178
188
 
189
+ void FixedSizeAllocator::Verify() const {
190
+ #ifdef DEBUG
191
+ auto total_available_allocations = allocations_per_buffer * buffers.size();
192
+ D_ASSERT(total_available_allocations >= total_allocations);
193
+ D_ASSERT(buffers.size() >= buffers_with_free_space.size());
194
+ #endif
195
+ }
196
+
179
197
  uint32_t FixedSizeAllocator::GetOffset(ValidityMask &mask, const idx_t allocation_count) {
180
198
 
181
199
  auto data = mask.GetData();
@@ -60,16 +60,10 @@ void Leaf::Free(ART &art, Node &node) {
60
60
  D_ASSERT(node.IsSet());
61
61
  D_ASSERT(!node.IsSwizzled());
62
62
 
63
+ // free leaf segments
63
64
  auto &leaf = Leaf::Get(art, node);
64
-
65
- // delete all leaf segments
66
65
  if (!leaf.IsInlined()) {
67
- auto ptr = leaf.row_ids.ptr;
68
- while (ptr.IsSet()) {
69
- auto next_ptr = LeafSegment::Get(art, ptr).next;
70
- Node::Free(art, ptr);
71
- ptr = next_ptr;
72
- }
66
+ Node::Free(art, leaf.row_ids.ptr);
73
67
  }
74
68
  }
75
69
 
@@ -275,10 +269,10 @@ uint32_t Leaf::FindRowId(const ART &art, Node &ptr, const row_t row_id) const {
275
269
  return (uint32_t)DConstants::INVALID_INDEX;
276
270
  }
277
271
 
278
- string Leaf::ToString(const ART &art) const {
272
+ string Leaf::VerifyAndToString(const ART &art, const bool only_verify) const {
279
273
 
280
274
  if (IsInlined()) {
281
- return "Leaf (" + to_string(count) + "): [" + to_string(row_ids.inlined) + "]";
275
+ return only_verify ? "" : "Leaf [count: 1, row ID: " + to_string(row_ids.inlined) + "]";
282
276
  }
283
277
 
284
278
  auto ptr = row_ids.ptr;
@@ -296,7 +290,10 @@ string Leaf::ToString(const ART &art) const {
296
290
  remaining -= to_string_count;
297
291
  ptr = segment.next;
298
292
  }
299
- return "Leaf (" + to_string(this_count) + ", " + to_string(count) + "): [" + str + "] \n";
293
+
294
+ D_ASSERT(remaining == 0);
295
+ D_ASSERT(this_count == count);
296
+ return only_verify ? "" : "Leaf [count: " + to_string(count) + ", row IDs: " + str + "] \n";
300
297
  }
301
298
 
302
299
  BlockPointer Leaf::Serialize(const ART &art, MetaBlockWriter &writer) const {
@@ -366,6 +363,7 @@ void Leaf::Vacuum(ART &art) {
366
363
  auto &allocator = Node::GetAllocator(art, NType::LEAF_SEGMENT);
367
364
  if (allocator.NeedsVacuum(row_ids.ptr)) {
368
365
  row_ids.ptr.SetPtr(allocator.VacuumPointer(row_ids.ptr));
366
+ row_ids.ptr.type = (uint8_t)NType::LEAF_SEGMENT;
369
367
  }
370
368
 
371
369
  auto ptr = row_ids.ptr;
@@ -374,6 +372,7 @@ void Leaf::Vacuum(ART &art) {
374
372
  ptr = segment.next;
375
373
  if (ptr.IsSet() && allocator.NeedsVacuum(ptr)) {
376
374
  segment.next.SetPtr(allocator.VacuumPointer(ptr));
375
+ segment.next.type = (uint8_t)NType::LEAF_SEGMENT;
377
376
  ptr = segment.next;
378
377
  }
379
378
  }
@@ -15,6 +15,16 @@ LeafSegment &LeafSegment::New(ART &art, Node &node) {
15
15
  return segment;
16
16
  }
17
17
 
18
+ void LeafSegment::Free(ART &art, Node &node) {
19
+
20
+ D_ASSERT(node.IsSet());
21
+ D_ASSERT(!node.IsSwizzled());
22
+
23
+ // free next segment
24
+ auto next_segment = LeafSegment::Get(art, node).next;
25
+ Node::Free(art, next_segment);
26
+ }
27
+
18
28
  LeafSegment &LeafSegment::Append(ART &art, uint32_t &count, const row_t row_id) {
19
29
 
20
30
  reference<LeafSegment> segment(*this);
@@ -69,6 +69,9 @@ void Node::Free(ART &art, Node &node) {
69
69
 
70
70
  // free the prefixes and children of the nodes
71
71
  switch (type) {
72
+ case NType::LEAF_SEGMENT:
73
+ LeafSegment::Free(art, node);
74
+ break;
72
75
  case NType::LEAF:
73
76
  Leaf::Free(art, node);
74
77
  break;
@@ -159,65 +162,57 @@ void Node::DeleteChild(ART &art, Node &node, const uint8_t byte) {
159
162
 
160
163
  optional_ptr<Node> Node::GetChild(ART &art, const uint8_t byte) const {
161
164
 
162
- D_ASSERT(!IsSwizzled());
165
+ D_ASSERT(IsSet() && !IsSwizzled());
163
166
 
164
167
  optional_ptr<Node> child;
165
168
  switch (DecodeARTNodeType()) {
166
- case NType::NODE_4: {
169
+ case NType::NODE_4:
167
170
  child = Node4::Get(art, *this).GetChild(byte);
168
171
  break;
169
- }
170
- case NType::NODE_16: {
172
+ case NType::NODE_16:
171
173
  child = Node16::Get(art, *this).GetChild(byte);
172
174
  break;
173
- }
174
- case NType::NODE_48: {
175
+ case NType::NODE_48:
175
176
  child = Node48::Get(art, *this).GetChild(byte);
176
177
  break;
177
- }
178
- case NType::NODE_256: {
178
+ case NType::NODE_256:
179
179
  child = Node256::Get(art, *this).GetChild(byte);
180
180
  break;
181
- }
182
181
  default:
183
182
  throw InternalException("Invalid node type for GetChild.");
184
183
  }
185
184
 
186
- // unswizzle the ART node before returning it
185
+ // deserialize the ART node before returning it
187
186
  if (child && child->IsSwizzled()) {
188
187
  child->Deserialize(art);
189
188
  }
190
189
  return child;
191
190
  }
192
191
 
193
- optional_ptr<Node> Node::GetNextChild(ART &art, uint8_t &byte) const {
192
+ optional_ptr<Node> Node::GetNextChild(ART &art, uint8_t &byte, const bool deserialize) const {
194
193
 
195
- D_ASSERT(!IsSwizzled());
194
+ D_ASSERT(IsSet() && !IsSwizzled());
196
195
 
197
196
  optional_ptr<Node> child;
198
197
  switch (DecodeARTNodeType()) {
199
- case NType::NODE_4: {
198
+ case NType::NODE_4:
200
199
  child = Node4::Get(art, *this).GetNextChild(byte);
201
200
  break;
202
- }
203
- case NType::NODE_16: {
201
+ case NType::NODE_16:
204
202
  child = Node16::Get(art, *this).GetNextChild(byte);
205
203
  break;
206
- }
207
- case NType::NODE_48: {
204
+ case NType::NODE_48:
208
205
  child = Node48::Get(art, *this).GetNextChild(byte);
209
206
  break;
210
- }
211
- case NType::NODE_256: {
207
+ case NType::NODE_256:
212
208
  child = Node256::Get(art, *this).GetNextChild(byte);
213
209
  break;
214
- }
215
210
  default:
216
211
  throw InternalException("Invalid node type for GetNextChild.");
217
212
  }
218
213
 
219
- // unswizzle the ART node before returning it
220
- if (child && child->IsSwizzled()) {
214
+ // deserialize the ART node before returning it
215
+ if (child && deserialize && child->IsSwizzled()) {
221
216
  child->Deserialize(art);
222
217
  }
223
218
  return child;
@@ -260,10 +255,11 @@ void Node::Deserialize(ART &art) {
260
255
  type = reader.Read<uint8_t>();
261
256
  swizzle_flag = 0;
262
257
 
263
- auto type = DecodeARTNodeType();
264
- SetPtr(Node::GetAllocator(art, type).New());
258
+ auto decoded_type = DecodeARTNodeType();
259
+ SetPtr(Node::GetAllocator(art, decoded_type).New());
260
+ type = (uint8_t)decoded_type;
265
261
 
266
- switch (type) {
262
+ switch (decoded_type) {
267
263
  case NType::LEAF:
268
264
  return Leaf::Get(art, *this).Deserialize(art, reader);
269
265
  case NType::NODE_4:
@@ -283,28 +279,43 @@ void Node::Deserialize(ART &art) {
283
279
  // Utility
284
280
  //===--------------------------------------------------------------------===//
285
281
 
286
- string Node::ToString(ART &art) const {
282
+ string Node::VerifyAndToString(ART &art, const bool only_verify) {
287
283
 
288
- D_ASSERT(!IsSwizzled());
284
+ D_ASSERT(IsSet());
285
+ if (IsSwizzled()) {
286
+ return only_verify ? "" : "swizzled";
287
+ }
289
288
 
290
- if (DecodeARTNodeType() == NType::LEAF) {
291
- return Leaf::Get(art, *this).ToString(art);
289
+ auto type = DecodeARTNodeType();
290
+ if (type == NType::LEAF) {
291
+ auto str = Leaf::Get(art, *this).VerifyAndToString(art, only_verify);
292
+ return only_verify ? "" : "\n" + str;
292
293
  }
293
294
 
294
295
  string str = "Node" + to_string(GetCapacity()) + ": [";
295
296
 
297
+ idx_t child_count = 0;
296
298
  uint8_t byte = 0;
297
- auto child = GetNextChild(art, byte);
299
+ auto child = GetNextChild(art, byte, false);
298
300
  while (child) {
299
- str += "(" + to_string(byte) + ", " + child->ToString(art) + ")";
300
- if (byte == NumericLimits<uint8_t>::Maximum()) {
301
- break;
301
+ child_count++;
302
+ if (child->IsSwizzled()) {
303
+ if (!only_verify) {
304
+ str += "(swizzled)";
305
+ }
306
+ } else {
307
+ str += "(" + to_string(byte) + ", " + child->VerifyAndToString(art, only_verify) + ")";
308
+ if (byte == NumericLimits<uint8_t>::Maximum()) {
309
+ break;
310
+ }
302
311
  }
303
312
  byte++;
304
- child = GetNextChild(art, byte);
313
+ child = GetNextChild(art, byte, false);
305
314
  }
306
315
 
307
- return str + "]";
316
+ // ensure that the child count is at least two
317
+ D_ASSERT(child_count > 1);
318
+ return only_verify ? "" : "\n" + str + "]";
308
319
  }
309
320
 
310
321
  idx_t Node::GetCapacity() const {
@@ -567,6 +578,7 @@ void Node::Vacuum(ART &art, Node &node, const ARTFlags &flags) {
567
578
  needs_vacuum = flags.vacuum_flags[node.type - 1] && allocator.NeedsVacuum(node);
568
579
  if (needs_vacuum) {
569
580
  node.SetPtr(allocator.VacuumPointer(node));
581
+ node.type = (uint8_t)type;
570
582
  }
571
583
 
572
584
  switch (type) {
@@ -60,6 +60,7 @@ Node16 &Node16::ShrinkNode48(ART &art, Node &node16, Node &node48) {
60
60
  n16.prefix.Move(n48.prefix);
61
61
 
62
62
  for (idx_t i = 0; i < Node::NODE_256_CAPACITY; i++) {
63
+ D_ASSERT(n16.count <= Node::NODE_16_CAPACITY);
63
64
  if (n48.child_index[i] != Node::EMPTY_MARKER) {
64
65
  n16.key[n16.count] = i;
65
66
  n16.children[n16.count] = n48.children[n48.child_index[i]];
@@ -160,6 +161,7 @@ optional_ptr<Node> Node16::GetChild(const uint8_t byte) {
160
161
 
161
162
  for (idx_t i = 0; i < count; i++) {
162
163
  if (key[i] == byte) {
164
+ D_ASSERT(children[i].IsSet());
163
165
  return &children[i];
164
166
  }
165
167
  }
@@ -171,6 +173,7 @@ optional_ptr<Node> Node16::GetNextChild(uint8_t &byte) {
171
173
  for (idx_t i = 0; i < count; i++) {
172
174
  if (key[i] >= byte) {
173
175
  byte = key[i];
176
+ D_ASSERT(children[i].IsSet());
174
177
  return &children[i];
175
178
  }
176
179
  }
@@ -83,6 +83,7 @@ void Node256::InsertChild(ART &art, Node &node, const uint8_t byte, const Node c
83
83
  D_ASSERT(!n256.children[byte].IsSet());
84
84
 
85
85
  n256.count++;
86
+ D_ASSERT(n256.count <= Node::NODE_256_CAPACITY);
86
87
  n256.children[byte] = child;
87
88
  }
88
89
 
@@ -37,6 +37,7 @@ Node4 &Node4::ShrinkNode16(ART &art, Node &node4, Node &node16) {
37
37
  auto &n4 = Node4::New(art, node4);
38
38
  auto &n16 = Node16::Get(art, node16);
39
39
 
40
+ D_ASSERT(n16.count <= Node::NODE_4_CAPACITY);
40
41
  n4.count = n16.count;
41
42
  n4.prefix.Move(n16.prefix);
42
43
 
@@ -145,6 +146,7 @@ optional_ptr<Node> Node4::GetChild(const uint8_t byte) {
145
146
 
146
147
  for (idx_t i = 0; i < count; i++) {
147
148
  if (key[i] == byte) {
149
+ D_ASSERT(children[i].IsSet());
148
150
  return &children[i];
149
151
  }
150
152
  }
@@ -156,6 +158,7 @@ optional_ptr<Node> Node4::GetNextChild(uint8_t &byte) {
156
158
  for (idx_t i = 0; i < count; i++) {
157
159
  if (key[i] >= byte) {
158
160
  byte = key[i];
161
+ D_ASSERT(children[i].IsSet());
159
162
  return &children[i];
160
163
  }
161
164
  }
@@ -85,6 +85,7 @@ Node48 &Node48::ShrinkNode256(ART &art, Node &node48, Node &node256) {
85
85
  n48.prefix.Move(n256.prefix);
86
86
 
87
87
  for (idx_t i = 0; i < Node::NODE_256_CAPACITY; i++) {
88
+ D_ASSERT(n48.count <= Node::NODE_48_CAPACITY);
88
89
  if (n256.children[i].IsSet()) {
89
90
  n48.child_index[i] = n48.count;
90
91
  n48.children[n48.count] = n256.children[i];
@@ -168,6 +169,7 @@ optional_ptr<Node> Node48::GetNextChild(uint8_t &byte) {
168
169
  for (idx_t i = byte; i < Node::NODE_256_CAPACITY; i++) {
169
170
  if (child_index[i] != Node::EMPTY_MARKER) {
170
171
  byte = i;
172
+ D_ASSERT(children[child_index[i]].IsSet());
171
173
  return &children[child_index[i]];
172
174
  }
173
175
  }