duckdb 0.9.3-dev0.0 → 0.9.3-dev14.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 (1215) hide show
  1. package/LICENSE +1 -1
  2. package/binding.gyp +32 -7
  3. package/package.json +1 -1
  4. package/src/connection.cpp +6 -6
  5. package/src/database.cpp +12 -10
  6. package/src/duckdb/extension/icu/icu-datefunc.cpp +22 -10
  7. package/src/duckdb/extension/icu/icu-datepart.cpp +42 -22
  8. package/src/duckdb/extension/icu/icu-datetrunc.cpp +40 -7
  9. package/src/duckdb/extension/icu/icu-strptime.cpp +14 -8
  10. package/src/duckdb/extension/icu/icu-table-range.cpp +1 -1
  11. package/src/duckdb/extension/icu/icu-timezone.cpp +43 -16
  12. package/src/duckdb/extension/icu/icu_extension.cpp +1 -1
  13. package/src/duckdb/extension/icu/include/icu-datefunc.hpp +3 -0
  14. package/src/duckdb/extension/icu/third_party/icu/stubdata/stubdata.cpp +1 -1
  15. package/src/duckdb/extension/json/buffered_json_reader.cpp +78 -62
  16. package/src/duckdb/extension/json/include/buffered_json_reader.hpp +11 -7
  17. package/src/duckdb/extension/json/include/json_common.hpp +0 -14
  18. package/src/duckdb/extension/json/include/json_deserializer.hpp +1 -0
  19. package/src/duckdb/extension/json/include/json_functions.hpp +1 -0
  20. package/src/duckdb/extension/json/include/json_scan.hpp +19 -5
  21. package/src/duckdb/extension/json/include/json_serializer.hpp +2 -1
  22. package/src/duckdb/extension/json/include/json_structure.hpp +12 -10
  23. package/src/duckdb/extension/json/json_common.cpp +1 -0
  24. package/src/duckdb/extension/json/json_deserializer.cpp +13 -0
  25. package/src/duckdb/extension/json/json_extension.cpp +3 -3
  26. package/src/duckdb/extension/json/json_functions/copy_json.cpp +8 -4
  27. package/src/duckdb/extension/json/json_functions/json_array_length.cpp +1 -1
  28. package/src/duckdb/extension/json/json_functions/json_contains.cpp +3 -3
  29. package/src/duckdb/extension/json/json_functions/json_create.cpp +53 -8
  30. package/src/duckdb/extension/json/json_functions/json_extract.cpp +10 -6
  31. package/src/duckdb/extension/json/json_functions/json_keys.cpp +1 -1
  32. package/src/duckdb/extension/json/json_functions/json_merge_patch.cpp +2 -3
  33. package/src/duckdb/extension/json/json_functions/json_serialize_plan.cpp +210 -0
  34. package/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp +22 -19
  35. package/src/duckdb/extension/json/json_functions/json_structure.cpp +71 -43
  36. package/src/duckdb/extension/json/json_functions/json_transform.cpp +105 -8
  37. package/src/duckdb/extension/json/json_functions/json_type.cpp +1 -1
  38. package/src/duckdb/extension/json/json_functions/json_valid.cpp +1 -1
  39. package/src/duckdb/extension/json/json_functions/read_json.cpp +43 -18
  40. package/src/duckdb/extension/json/json_functions/read_json_objects.cpp +1 -1
  41. package/src/duckdb/extension/json/json_functions.cpp +9 -5
  42. package/src/duckdb/extension/json/json_scan.cpp +147 -125
  43. package/src/duckdb/extension/json/json_serializer.cpp +9 -0
  44. package/src/duckdb/extension/json/serialize_json.cpp +6 -0
  45. package/src/duckdb/extension/parquet/column_reader.cpp +53 -18
  46. package/src/duckdb/extension/parquet/column_writer.cpp +29 -6
  47. package/src/duckdb/extension/parquet/include/column_reader.hpp +0 -1
  48. package/src/duckdb/extension/parquet/include/decode_utils.hpp +2 -2
  49. package/src/duckdb/extension/parquet/include/parquet_crypto.hpp +87 -0
  50. package/src/duckdb/extension/parquet/include/parquet_dbp_decoder.hpp +4 -3
  51. package/src/duckdb/extension/parquet/include/parquet_decimal_utils.hpp +16 -3
  52. package/src/duckdb/extension/parquet/include/parquet_metadata.hpp +10 -0
  53. package/src/duckdb/extension/parquet/include/parquet_reader.hpp +34 -6
  54. package/src/duckdb/extension/parquet/include/parquet_statistics.hpp +3 -2
  55. package/src/duckdb/extension/parquet/include/parquet_timestamp.hpp +2 -0
  56. package/src/duckdb/extension/parquet/include/parquet_writer.hpp +21 -1
  57. package/src/duckdb/extension/parquet/parquet_crypto.cpp +370 -0
  58. package/src/duckdb/extension/parquet/parquet_extension.cpp +254 -24
  59. package/src/duckdb/extension/parquet/parquet_metadata.cpp +204 -16
  60. package/src/duckdb/extension/parquet/parquet_reader.cpp +108 -34
  61. package/src/duckdb/extension/parquet/parquet_statistics.cpp +75 -30
  62. package/src/duckdb/extension/parquet/parquet_timestamp.cpp +15 -8
  63. package/src/duckdb/extension/parquet/parquet_writer.cpp +62 -10
  64. package/src/duckdb/extension/parquet/serialize_parquet.cpp +60 -0
  65. package/src/duckdb/src/catalog/catalog.cpp +23 -25
  66. package/src/duckdb/src/catalog/catalog_entry/column_dependency_manager.cpp +1 -0
  67. package/src/duckdb/src/catalog/catalog_entry/dependency/dependency_dependent_entry.cpp +31 -0
  68. package/src/duckdb/src/catalog/catalog_entry/dependency/dependency_entry.cpp +44 -0
  69. package/src/duckdb/src/catalog/catalog_entry/dependency/dependency_subject_entry.cpp +31 -0
  70. package/src/duckdb/src/catalog/catalog_entry/duck_index_entry.cpp +35 -10
  71. package/src/duckdb/src/catalog/catalog_entry/duck_schema_entry.cpp +22 -6
  72. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +110 -33
  73. package/src/duckdb/src/catalog/catalog_entry/index_catalog_entry.cpp +33 -17
  74. package/src/duckdb/src/catalog/catalog_entry/macro_catalog_entry.cpp +16 -0
  75. package/src/duckdb/src/catalog/catalog_entry/schema_catalog_entry.cpp +7 -6
  76. package/src/duckdb/src/catalog/catalog_entry/sequence_catalog_entry.cpp +88 -14
  77. package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +6 -15
  78. package/src/duckdb/src/catalog/catalog_entry/type_catalog_entry.cpp +20 -20
  79. package/src/duckdb/src/catalog/catalog_entry/view_catalog_entry.cpp +4 -0
  80. package/src/duckdb/src/catalog/catalog_entry.cpp +29 -0
  81. package/src/duckdb/src/catalog/catalog_set.cpp +358 -343
  82. package/src/duckdb/src/catalog/catalog_transaction.cpp +4 -0
  83. package/src/duckdb/src/catalog/default/default_functions.cpp +13 -4
  84. package/src/duckdb/src/catalog/default/default_schemas.cpp +5 -1
  85. package/src/duckdb/src/catalog/default/default_views.cpp +6 -2
  86. package/src/duckdb/src/catalog/dependency_catalog_set.cpp +51 -0
  87. package/src/duckdb/src/catalog/dependency_manager.cpp +510 -114
  88. package/src/duckdb/src/catalog/duck_catalog.cpp +4 -4
  89. package/src/duckdb/src/common/adbc/adbc.cpp +73 -53
  90. package/src/duckdb/src/common/adbc/driver_manager.cpp +1101 -268
  91. package/src/duckdb/src/common/arrow/arrow_wrapper.cpp +20 -9
  92. package/src/duckdb/src/common/bind_helpers.cpp +1 -0
  93. package/src/duckdb/src/common/box_renderer.cpp +52 -1
  94. package/src/duckdb/src/common/compressed_file_system.cpp +1 -0
  95. package/src/duckdb/src/common/constants.cpp +0 -1
  96. package/src/duckdb/src/common/enum_util.cpp +522 -107
  97. package/src/duckdb/src/common/enums/catalog_type.cpp +64 -1
  98. package/src/duckdb/src/common/enums/compression_type.cpp +14 -0
  99. package/src/duckdb/src/common/enums/date_part_specifier.cpp +1 -0
  100. package/src/duckdb/src/common/enums/expression_type.cpp +4 -0
  101. package/src/duckdb/src/common/enums/file_compression_type.cpp +1 -0
  102. package/src/duckdb/src/common/enums/join_type.cpp +33 -0
  103. package/src/duckdb/src/common/enums/logical_operator_type.cpp +5 -3
  104. package/src/duckdb/src/common/enums/optimizer_type.cpp +9 -1
  105. package/src/duckdb/src/common/enums/physical_operator_type.cpp +8 -4
  106. package/src/duckdb/src/common/enums/statement_type.cpp +2 -2
  107. package/src/duckdb/src/common/error_data.cpp +113 -0
  108. package/src/duckdb/src/common/exception/binder_exception.cpp +47 -0
  109. package/src/duckdb/src/common/exception/catalog_exception.cpp +55 -0
  110. package/src/duckdb/src/common/exception/parser_exception.cpp +19 -0
  111. package/src/duckdb/src/common/exception.cpp +110 -121
  112. package/src/duckdb/src/common/exception_format_value.cpp +9 -1
  113. package/src/duckdb/src/common/extra_type_info.cpp +48 -0
  114. package/src/duckdb/src/common/file_system.cpp +12 -7
  115. package/src/duckdb/src/common/gzip_file_system.cpp +18 -18
  116. package/src/duckdb/src/common/hive_partitioning.cpp +5 -1
  117. package/src/duckdb/src/common/http_state.cpp +20 -3
  118. package/src/duckdb/src/common/local_file_system.cpp +214 -15
  119. package/src/duckdb/src/common/multi_file_reader.cpp +20 -7
  120. package/src/duckdb/src/common/operator/cast_operators.cpp +397 -414
  121. package/src/duckdb/src/common/operator/convert_to_string.cpp +4 -0
  122. package/src/duckdb/src/common/operator/string_cast.cpp +5 -0
  123. package/src/duckdb/src/common/progress_bar/progress_bar.cpp +61 -12
  124. package/src/duckdb/src/common/progress_bar/terminal_progress_bar_display.cpp +13 -4
  125. package/src/duckdb/src/common/radix_partitioning.cpp +1 -1
  126. package/src/duckdb/src/common/row_operations/row_aggregate.cpp +2 -1
  127. package/src/duckdb/src/common/row_operations/row_gather.cpp +7 -1
  128. package/src/duckdb/src/common/row_operations/row_heap_gather.cpp +78 -12
  129. package/src/duckdb/src/common/row_operations/row_heap_scatter.cpp +222 -61
  130. package/src/duckdb/src/common/row_operations/row_matcher.cpp +6 -1
  131. package/src/duckdb/src/common/row_operations/row_radix_scatter.cpp +51 -0
  132. package/src/duckdb/src/common/row_operations/row_scatter.cpp +8 -1
  133. package/src/duckdb/src/common/serializer/binary_deserializer.cpp +6 -0
  134. package/src/duckdb/src/common/serializer/binary_serializer.cpp +5 -0
  135. package/src/duckdb/src/common/serializer/serializer.cpp +19 -0
  136. package/src/duckdb/src/common/sort/comparators.cpp +126 -0
  137. package/src/duckdb/src/common/sort/partition_state.cpp +17 -17
  138. package/src/duckdb/src/common/sort/radix_sort.cpp +2 -1
  139. package/src/duckdb/src/common/sort/sort_state.cpp +10 -5
  140. package/src/duckdb/src/common/sort/sorted_block.cpp +7 -6
  141. package/src/duckdb/src/common/string_util.cpp +302 -24
  142. package/src/duckdb/src/common/tree_renderer.cpp +8 -6
  143. package/src/duckdb/src/common/types/cast_helpers.cpp +6 -0
  144. package/src/duckdb/src/common/types/column/column_data_allocator.cpp +1 -1
  145. package/src/duckdb/src/common/types/column/column_data_collection.cpp +58 -0
  146. package/src/duckdb/src/common/types/column/column_data_collection_segment.cpp +8 -1
  147. package/src/duckdb/src/common/types/data_chunk.cpp +9 -0
  148. package/src/duckdb/src/common/types/date.cpp +2 -2
  149. package/src/duckdb/src/common/types/hash.cpp +9 -1
  150. package/src/duckdb/src/common/types/hugeint.cpp +229 -51
  151. package/src/duckdb/src/common/types/hyperloglog.cpp +10 -3
  152. package/src/duckdb/src/common/types/interval.cpp +67 -12
  153. package/src/duckdb/src/common/types/list_segment.cpp +98 -4
  154. package/src/duckdb/src/common/types/row/partitioned_tuple_data.cpp +11 -1
  155. package/src/duckdb/src/common/types/row/row_data_collection.cpp +1 -1
  156. package/src/duckdb/src/common/types/row/row_data_collection_scanner.cpp +2 -2
  157. package/src/duckdb/src/common/types/row/tuple_data_allocator.cpp +3 -2
  158. package/src/duckdb/src/common/types/row/tuple_data_collection.cpp +63 -3
  159. package/src/duckdb/src/common/types/row/tuple_data_scatter_gather.cpp +331 -127
  160. package/src/duckdb/src/common/types/time.cpp +47 -75
  161. package/src/duckdb/src/common/types/timestamp.cpp +16 -3
  162. package/src/duckdb/src/common/types/uhugeint.cpp +746 -0
  163. package/src/duckdb/src/common/types/validity_mask.cpp +6 -2
  164. package/src/duckdb/src/common/types/value.cpp +183 -27
  165. package/src/duckdb/src/common/types/vector.cpp +331 -30
  166. package/src/duckdb/src/common/types/vector_buffer.cpp +29 -1
  167. package/src/duckdb/src/common/types/vector_cache.cpp +22 -1
  168. package/src/duckdb/src/common/types.cpp +606 -90
  169. package/src/duckdb/src/common/value_operations/comparison_operations.cpp +21 -1
  170. package/src/duckdb/src/common/vector_operations/comparison_operators.cpp +5 -0
  171. package/src/duckdb/src/common/vector_operations/generators.cpp +2 -2
  172. package/src/duckdb/src/common/vector_operations/is_distinct_from.cpp +131 -2
  173. package/src/duckdb/src/common/vector_operations/vector_copy.cpp +26 -4
  174. package/src/duckdb/src/common/vector_operations/vector_hash.cpp +41 -0
  175. package/src/duckdb/src/common/vector_operations/vector_storage.cpp +7 -0
  176. package/src/duckdb/src/common/virtual_file_system.cpp +0 -1
  177. package/src/duckdb/src/core_functions/aggregate/distributive/approx_count.cpp +2 -1
  178. package/src/duckdb/src/core_functions/aggregate/distributive/arg_min_max.cpp +144 -56
  179. package/src/duckdb/src/core_functions/aggregate/distributive/bitagg.cpp +2 -0
  180. package/src/duckdb/src/core_functions/aggregate/distributive/bitstring_agg.cpp +27 -0
  181. package/src/duckdb/src/core_functions/aggregate/distributive/entropy.cpp +4 -3
  182. package/src/duckdb/src/core_functions/aggregate/distributive/kurtosis.cpp +25 -5
  183. package/src/duckdb/src/core_functions/aggregate/distributive/minmax.cpp +100 -3
  184. package/src/duckdb/src/core_functions/aggregate/distributive/string_agg.cpp +2 -1
  185. package/src/duckdb/src/core_functions/aggregate/holistic/approximate_quantile.cpp +9 -1
  186. package/src/duckdb/src/core_functions/aggregate/holistic/mode.cpp +83 -52
  187. package/src/duckdb/src/core_functions/aggregate/holistic/quantile.cpp +485 -289
  188. package/src/duckdb/src/core_functions/aggregate/holistic/reservoir_quantile.cpp +3 -3
  189. package/src/duckdb/src/core_functions/aggregate/nested/histogram.cpp +24 -26
  190. package/src/duckdb/src/core_functions/aggregate/nested/list.cpp +34 -37
  191. package/src/duckdb/src/core_functions/function_list.cpp +30 -1
  192. package/src/duckdb/src/core_functions/lambda_functions.cpp +416 -0
  193. package/src/duckdb/src/core_functions/scalar/array/array_functions.cpp +294 -0
  194. package/src/duckdb/src/core_functions/scalar/array/array_value.cpp +87 -0
  195. package/src/duckdb/src/core_functions/scalar/blob/create_sort_key.cpp +686 -0
  196. package/src/duckdb/src/core_functions/scalar/blob/encode.cpp +1 -0
  197. package/src/duckdb/src/core_functions/scalar/date/current.cpp +3 -3
  198. package/src/duckdb/src/core_functions/scalar/date/date_part.cpp +295 -20
  199. package/src/duckdb/src/core_functions/scalar/date/make_date.cpp +1 -0
  200. package/src/duckdb/src/core_functions/scalar/date/strftime.cpp +8 -7
  201. package/src/duckdb/src/core_functions/scalar/date/to_interval.cpp +84 -23
  202. package/src/duckdb/src/core_functions/scalar/generic/error.cpp +4 -4
  203. package/src/duckdb/src/core_functions/scalar/generic/least.cpp +7 -8
  204. package/src/duckdb/src/core_functions/scalar/generic/stats.cpp +1 -1
  205. package/src/duckdb/src/core_functions/scalar/generic/system_functions.cpp +17 -6
  206. package/src/duckdb/src/core_functions/scalar/list/array_slice.cpp +8 -0
  207. package/src/duckdb/src/core_functions/scalar/list/list_aggregates.cpp +28 -14
  208. package/src/duckdb/src/core_functions/scalar/list/list_filter.cpp +49 -0
  209. package/src/duckdb/src/core_functions/scalar/list/list_reduce.cpp +230 -0
  210. package/src/duckdb/src/core_functions/scalar/list/list_sort.cpp +85 -16
  211. package/src/duckdb/src/core_functions/scalar/list/list_transform.cpp +41 -0
  212. package/src/duckdb/src/core_functions/scalar/list/list_value.cpp +21 -2
  213. package/src/duckdb/src/core_functions/scalar/map/map.cpp +6 -5
  214. package/src/duckdb/src/core_functions/scalar/map/map_entries.cpp +2 -2
  215. package/src/duckdb/src/core_functions/scalar/map/map_from_entries.cpp +1 -2
  216. package/src/duckdb/src/core_functions/scalar/math/numeric.cpp +24 -4
  217. package/src/duckdb/src/core_functions/scalar/operators/bitwise.cpp +6 -0
  218. package/src/duckdb/src/core_functions/scalar/random/random.cpp +2 -2
  219. package/src/duckdb/src/core_functions/scalar/random/setseed.cpp +2 -2
  220. package/src/duckdb/src/core_functions/scalar/secret/which_secret.cpp +28 -0
  221. package/src/duckdb/src/core_functions/scalar/string/bar.cpp +9 -4
  222. package/src/duckdb/src/core_functions/scalar/string/format_bytes.cpp +7 -2
  223. package/src/duckdb/src/core_functions/scalar/string/hex.cpp +63 -4
  224. package/src/duckdb/src/core_functions/scalar/string/pad.cpp +2 -2
  225. package/src/duckdb/src/core_functions/scalar/string/parse_path.cpp +348 -0
  226. package/src/duckdb/src/core_functions/scalar/string/regexp_escape.cpp +22 -0
  227. package/src/duckdb/src/core_functions/scalar/string/string_split.cpp +6 -5
  228. package/src/duckdb/src/core_functions/scalar/struct/struct_insert.cpp +3 -3
  229. package/src/duckdb/src/core_functions/scalar/struct/struct_pack.cpp +1 -1
  230. package/src/duckdb/src/execution/aggregate_hashtable.cpp +9 -2
  231. package/src/duckdb/src/execution/column_binding_resolver.cpp +44 -10
  232. package/src/duckdb/src/execution/expression_executor/execute_between.cpp +4 -0
  233. package/src/duckdb/src/execution/expression_executor/execute_case.cpp +4 -0
  234. package/src/duckdb/src/execution/expression_executor/execute_comparison.cpp +4 -0
  235. package/src/duckdb/src/execution/expression_executor.cpp +2 -1
  236. package/src/duckdb/src/execution/index/art/art.cpp +202 -53
  237. package/src/duckdb/src/execution/index/art/art_key.cpp +20 -27
  238. package/src/duckdb/src/execution/index/fixed_size_allocator.cpp +52 -17
  239. package/src/duckdb/src/execution/index/fixed_size_buffer.cpp +14 -8
  240. package/src/duckdb/src/execution/index/index_type_set.cpp +32 -0
  241. package/src/duckdb/src/execution/index/unknown_index.cpp +65 -0
  242. package/src/duckdb/src/execution/join_hashtable.cpp +151 -174
  243. package/src/duckdb/src/execution/nested_loop_join/nested_loop_join_inner.cpp +4 -0
  244. package/src/duckdb/src/execution/nested_loop_join/nested_loop_join_mark.cpp +4 -0
  245. package/src/duckdb/src/execution/operator/aggregate/aggregate_object.cpp +2 -1
  246. package/src/duckdb/src/execution/operator/aggregate/physical_hash_aggregate.cpp +82 -36
  247. package/src/duckdb/src/execution/operator/aggregate/physical_ungrouped_aggregate.cpp +58 -32
  248. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +35 -19
  249. package/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_buffer.cpp +90 -0
  250. package/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_buffer_manager.cpp +124 -0
  251. package/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_file_handle.cpp +97 -0
  252. package/src/duckdb/src/execution/operator/csv_scanner/scanner/base_scanner.cpp +71 -0
  253. package/src/duckdb/src/execution/operator/csv_scanner/scanner/column_count_scanner.cpp +98 -0
  254. package/src/duckdb/src/execution/operator/csv_scanner/scanner/scanner_boundary.cpp +105 -0
  255. package/src/duckdb/src/execution/operator/csv_scanner/scanner/skip_scanner.cpp +63 -0
  256. package/src/duckdb/src/execution/operator/csv_scanner/scanner/string_value_scanner.cpp +1091 -0
  257. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/csv_sniffer.cpp +124 -26
  258. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/dialect_detection.cpp +117 -129
  259. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/header_detection.cpp +46 -22
  260. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/type_detection.cpp +83 -199
  261. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/type_refinement.cpp +21 -122
  262. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/type_replacement.cpp +18 -17
  263. package/src/duckdb/src/execution/operator/csv_scanner/state_machine/csv_state_machine.cpp +22 -0
  264. package/src/duckdb/src/execution/operator/csv_scanner/state_machine/csv_state_machine_cache.cpp +201 -0
  265. package/src/duckdb/src/execution/operator/csv_scanner/table_function/csv_file_scanner.cpp +221 -0
  266. package/src/duckdb/src/execution/operator/csv_scanner/table_function/global_csv_state.cpp +204 -0
  267. package/src/duckdb/src/execution/operator/csv_scanner/util/csv_error.cpp +186 -0
  268. package/src/duckdb/src/execution/operator/csv_scanner/util/csv_reader_options.cpp +532 -0
  269. package/src/duckdb/src/execution/operator/helper/physical_buffered_collector.cpp +85 -0
  270. package/src/duckdb/src/execution/operator/helper/physical_create_secret.cpp +21 -0
  271. package/src/duckdb/src/execution/operator/helper/physical_materialized_collector.cpp +1 -1
  272. package/src/duckdb/src/execution/operator/helper/physical_pragma.cpp +2 -2
  273. package/src/duckdb/src/execution/operator/helper/physical_reservoir_sample.cpp +34 -9
  274. package/src/duckdb/src/execution/operator/helper/physical_result_collector.cpp +10 -0
  275. package/src/duckdb/src/execution/operator/helper/physical_transaction.cpp +1 -0
  276. package/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp +25 -10
  277. package/src/duckdb/src/execution/operator/join/perfect_hash_join_executor.cpp +7 -8
  278. package/src/duckdb/src/execution/operator/join/physical_asof_join.cpp +1 -1
  279. package/src/duckdb/src/execution/operator/join/physical_blockwise_nl_join.cpp +5 -2
  280. package/src/duckdb/src/execution/operator/join/physical_comparison_join.cpp +1 -1
  281. package/src/duckdb/src/execution/operator/join/physical_delim_join.cpp +5 -127
  282. package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +221 -61
  283. package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +18 -21
  284. package/src/duckdb/src/execution/operator/join/physical_join.cpp +10 -5
  285. package/src/duckdb/src/execution/operator/join/physical_left_delim_join.cpp +137 -0
  286. package/src/duckdb/src/execution/operator/join/physical_nested_loop_join.cpp +11 -4
  287. package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +2 -2
  288. package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +19 -4
  289. package/src/duckdb/src/execution/operator/join/physical_right_delim_join.cpp +121 -0
  290. package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +3 -2
  291. package/src/duckdb/src/execution/operator/persistent/physical_copy_database.cpp +59 -0
  292. package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +132 -92
  293. package/src/duckdb/src/execution/operator/persistent/physical_export.cpp +54 -54
  294. package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +1 -1
  295. package/src/duckdb/src/execution/operator/projection/physical_unnest.cpp +4 -0
  296. package/src/duckdb/src/execution/operator/scan/physical_column_data_scan.cpp +21 -3
  297. package/src/duckdb/src/execution/operator/schema/physical_alter.cpp +1 -0
  298. package/src/duckdb/src/execution/operator/schema/physical_attach.cpp +61 -43
  299. package/src/duckdb/src/execution/operator/schema/physical_create_art_index.cpp +15 -13
  300. package/src/duckdb/src/execution/operator/schema/physical_create_schema.cpp +1 -0
  301. package/src/duckdb/src/execution/operator/schema/physical_drop.cpp +10 -0
  302. package/src/duckdb/src/execution/operator/set/physical_cte.cpp +44 -90
  303. package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +3 -0
  304. package/src/duckdb/src/execution/operator/set/physical_union.cpp +8 -4
  305. package/src/duckdb/src/execution/physical_operator.cpp +3 -1
  306. package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +30 -143
  307. package/src/duckdb/src/execution/physical_plan/plan_copy_database.cpp +12 -0
  308. package/src/duckdb/src/execution/physical_plan/plan_copy_to_file.cpp +11 -4
  309. package/src/duckdb/src/execution/physical_plan/plan_create_index.cpp +8 -8
  310. package/src/duckdb/src/execution/physical_plan/plan_create_secret.cpp +11 -0
  311. package/src/duckdb/src/execution/physical_plan/plan_create_table.cpp +9 -8
  312. package/src/duckdb/src/execution/physical_plan/plan_cte.cpp +5 -3
  313. package/src/duckdb/src/execution/physical_plan/plan_delim_join.cpp +15 -6
  314. package/src/duckdb/src/execution/physical_plan/plan_positional_join.cpp +1 -0
  315. package/src/duckdb/src/execution/physical_plan/plan_pragma.cpp +1 -1
  316. package/src/duckdb/src/execution/physical_plan/plan_recursive_cte.cpp +3 -1
  317. package/src/duckdb/src/execution/physical_plan/plan_set_operation.cpp +90 -12
  318. package/src/duckdb/src/execution/physical_plan/plan_window.cpp +67 -22
  319. package/src/duckdb/src/execution/physical_plan_generator.cpp +6 -3
  320. package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +163 -32
  321. package/src/duckdb/src/execution/reservoir_sample.cpp +112 -32
  322. package/src/duckdb/src/execution/window_executor.cpp +291 -26
  323. package/src/duckdb/src/execution/window_segment_tree.cpp +958 -114
  324. package/src/duckdb/src/function/aggregate/distributive/count.cpp +18 -16
  325. package/src/duckdb/src/function/aggregate/distributive/first.cpp +11 -4
  326. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +303 -131
  327. package/src/duckdb/src/function/cast/array_casts.cpp +226 -0
  328. package/src/duckdb/src/function/cast/bit_cast.cpp +2 -0
  329. package/src/duckdb/src/function/cast/cast_function_set.cpp +13 -2
  330. package/src/duckdb/src/function/cast/decimal_cast.cpp +2 -0
  331. package/src/duckdb/src/function/cast/default_casts.cpp +4 -1
  332. package/src/duckdb/src/function/cast/list_casts.cpp +151 -6
  333. package/src/duckdb/src/function/cast/numeric_casts.cpp +4 -0
  334. package/src/duckdb/src/function/cast/string_cast.cpp +95 -5
  335. package/src/duckdb/src/function/cast/struct_cast.cpp +53 -19
  336. package/src/duckdb/src/function/cast/time_casts.cpp +23 -1
  337. package/src/duckdb/src/function/cast/union/from_struct.cpp +1 -0
  338. package/src/duckdb/src/function/cast/union_casts.cpp +4 -3
  339. package/src/duckdb/src/function/cast/vector_cast_helpers.cpp +8 -4
  340. package/src/duckdb/src/function/cast_rules.cpp +197 -31
  341. package/src/duckdb/src/function/compression_config.cpp +4 -0
  342. package/src/duckdb/src/function/function.cpp +15 -9
  343. package/src/duckdb/src/function/function_binder.cpp +80 -29
  344. package/src/duckdb/src/function/function_set.cpp +6 -6
  345. package/src/duckdb/src/function/pragma/pragma_functions.cpp +10 -8
  346. package/src/duckdb/src/function/pragma/pragma_queries.cpp +34 -38
  347. package/src/duckdb/src/function/scalar/compressed_materialization/compress_integral.cpp +12 -0
  348. package/src/duckdb/src/function/scalar/list/contains_or_position.cpp +10 -1
  349. package/src/duckdb/src/function/scalar/list/list_concat.cpp +11 -1
  350. package/src/duckdb/src/function/scalar/list/list_extract.cpp +14 -3
  351. package/src/duckdb/src/function/scalar/list/list_resize.cpp +4 -0
  352. package/src/duckdb/src/function/scalar/list/list_select.cpp +176 -0
  353. package/src/duckdb/src/function/scalar/list/list_zip.cpp +165 -0
  354. package/src/duckdb/src/function/scalar/nested_functions.cpp +33 -0
  355. package/src/duckdb/src/function/scalar/operators/add.cpp +53 -6
  356. package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +48 -14
  357. package/src/duckdb/src/function/scalar/operators/multiply.cpp +9 -1
  358. package/src/duckdb/src/function/scalar/operators/subtract.cpp +19 -4
  359. package/src/duckdb/src/function/scalar/sequence/nextval.cpp +28 -55
  360. package/src/duckdb/src/function/scalar/strftime_format.cpp +242 -19
  361. package/src/duckdb/src/function/scalar/string/caseconvert.cpp +2 -2
  362. package/src/duckdb/src/function/scalar/string/concat.cpp +16 -6
  363. package/src/duckdb/src/function/scalar/string/length.cpp +124 -24
  364. package/src/duckdb/src/function/scalar/string/regexp.cpp +27 -27
  365. package/src/duckdb/src/function/scalar/struct/struct_extract.cpp +64 -15
  366. package/src/duckdb/src/function/scalar/system/aggregate_export.cpp +4 -3
  367. package/src/duckdb/src/function/scalar_function.cpp +8 -7
  368. package/src/duckdb/src/function/table/arrow/arrow_duck_schema.cpp +12 -0
  369. package/src/duckdb/src/function/table/arrow.cpp +20 -27
  370. package/src/duckdb/src/function/table/arrow_conversion.cpp +433 -150
  371. package/src/duckdb/src/function/table/copy_csv.cpp +62 -62
  372. package/src/duckdb/src/function/table/range.cpp +6 -3
  373. package/src/duckdb/src/function/table/read_csv.cpp +107 -759
  374. package/src/duckdb/src/function/table/read_file.cpp +242 -0
  375. package/src/duckdb/src/function/table/sniff_csv.cpp +275 -0
  376. package/src/duckdb/src/function/table/system/duckdb_columns.cpp +15 -3
  377. package/src/duckdb/src/function/table/system/duckdb_databases.cpp +5 -0
  378. package/src/duckdb/src/function/table/system/duckdb_dependencies.cpp +9 -13
  379. package/src/duckdb/src/function/table/system/duckdb_functions.cpp +67 -14
  380. package/src/duckdb/src/function/table/system/duckdb_indexes.cpp +12 -15
  381. package/src/duckdb/src/function/table/system/duckdb_memory.cpp +63 -0
  382. package/src/duckdb/src/function/table/system/duckdb_optimizers.cpp +57 -0
  383. package/src/duckdb/src/function/table/system/duckdb_schemas.cpp +5 -0
  384. package/src/duckdb/src/function/table/system/duckdb_secrets.cpp +128 -0
  385. package/src/duckdb/src/function/table/system/duckdb_sequences.cpp +12 -6
  386. package/src/duckdb/src/function/table/system/duckdb_settings.cpp +0 -1
  387. package/src/duckdb/src/function/table/system/duckdb_tables.cpp +5 -0
  388. package/src/duckdb/src/function/table/system/duckdb_types.cpp +6 -0
  389. package/src/duckdb/src/function/table/system/duckdb_views.cpp +5 -0
  390. package/src/duckdb/src/function/table/system/pragma_table_info.cpp +166 -64
  391. package/src/duckdb/src/function/table/system/test_all_types.cpp +2 -1
  392. package/src/duckdb/src/function/table/system_functions.cpp +3 -2
  393. package/src/duckdb/src/function/table/table_scan.cpp +50 -110
  394. package/src/duckdb/src/function/table/version/pragma_version.cpp +4 -44
  395. package/src/duckdb/src/function/table_function.cpp +2 -2
  396. package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +4 -3
  397. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/dependency/dependency_dependent_entry.hpp +27 -0
  398. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/dependency/dependency_entry.hpp +66 -0
  399. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/dependency/dependency_subject_entry.hpp +27 -0
  400. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_index_entry.hpp +25 -5
  401. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_schema_entry.hpp +3 -1
  402. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_table_entry.hpp +2 -1
  403. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/index_catalog_entry.hpp +19 -5
  404. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/list.hpp +1 -0
  405. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/scalar_macro_catalog_entry.hpp +2 -0
  406. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/schema_catalog_entry.hpp +1 -1
  407. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/sequence_catalog_entry.hpp +26 -11
  408. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_catalog_entry.hpp +1 -0
  409. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_macro_catalog_entry.hpp +2 -0
  410. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/type_catalog_entry.hpp +1 -0
  411. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/view_catalog_entry.hpp +2 -0
  412. package/src/duckdb/src/include/duckdb/catalog/catalog_entry.hpp +15 -0
  413. package/src/duckdb/src/include/duckdb/catalog/catalog_set.hpp +41 -49
  414. package/src/duckdb/src/include/duckdb/catalog/catalog_transaction.hpp +1 -0
  415. package/src/duckdb/src/include/duckdb/catalog/default/builtin_types/types.hpp +3 -1
  416. package/src/duckdb/src/include/duckdb/catalog/dependency.hpp +120 -8
  417. package/src/duckdb/src/include/duckdb/catalog/dependency_catalog_set.hpp +32 -0
  418. package/src/duckdb/src/include/duckdb/catalog/dependency_list.hpp +2 -0
  419. package/src/duckdb/src/include/duckdb/catalog/dependency_manager.hpp +92 -12
  420. package/src/duckdb/src/include/duckdb/catalog/standard_entry.hpp +1 -1
  421. package/src/duckdb/src/include/duckdb/common/adbc/adbc-init.hpp +4 -2
  422. package/src/duckdb/src/include/duckdb/common/adbc/adbc.h +1153 -12
  423. package/src/duckdb/src/include/duckdb/common/adbc/adbc.hpp +6 -6
  424. package/src/duckdb/src/include/duckdb/common/adbc/driver_manager.h +0 -2
  425. package/src/duckdb/src/include/duckdb/common/adbc/options.h +64 -0
  426. package/src/duckdb/src/include/duckdb/common/adbc/single_batch_array_stream.hpp +8 -0
  427. package/src/duckdb/src/include/duckdb/common/arrow/arrow.hpp +25 -6
  428. package/src/duckdb/src/include/duckdb/common/arrow/arrow_wrapper.hpp +3 -3
  429. package/src/duckdb/src/include/duckdb/common/arrow/result_arrow_wrapper.hpp +1 -1
  430. package/src/duckdb/src/include/duckdb/common/bit_utils.hpp +30 -0
  431. package/src/duckdb/src/include/duckdb/common/bitpacking.hpp +6 -6
  432. package/src/duckdb/src/include/duckdb/common/case_insensitive_map.hpp +10 -0
  433. package/src/duckdb/src/include/duckdb/common/constants.hpp +1 -0
  434. package/src/duckdb/src/include/duckdb/common/enum_util.hpp +75 -19
  435. package/src/duckdb/src/include/duckdb/common/enums/catalog_type.hpp +11 -1
  436. package/src/duckdb/src/include/duckdb/common/enums/compression_type.hpp +3 -0
  437. package/src/duckdb/src/include/duckdb/common/enums/expression_type.hpp +2 -0
  438. package/src/duckdb/src/include/duckdb/common/enums/index_constraint_type.hpp +35 -0
  439. package/src/duckdb/src/include/duckdb/common/enums/join_type.hpp +16 -3
  440. package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +6 -5
  441. package/src/duckdb/src/include/duckdb/common/enums/memory_tag.hpp +32 -0
  442. package/src/duckdb/src/include/duckdb/common/enums/on_create_conflict.hpp +26 -0
  443. package/src/duckdb/src/include/duckdb/common/enums/optimizer_type.hpp +2 -0
  444. package/src/duckdb/src/include/duckdb/common/enums/pending_execution_result.hpp +7 -1
  445. package/src/duckdb/src/include/duckdb/common/enums/physical_operator_type.hpp +9 -3
  446. package/src/duckdb/src/include/duckdb/common/enums/statement_type.hpp +6 -5
  447. package/src/duckdb/src/include/duckdb/common/enums/tableref_type.hpp +3 -2
  448. package/src/duckdb/src/include/duckdb/common/enums/wal_type.hpp +1 -0
  449. package/src/duckdb/src/include/duckdb/common/error_data.hpp +72 -0
  450. package/src/duckdb/src/include/duckdb/common/exception/binder_exception.hpp +47 -0
  451. package/src/duckdb/src/include/duckdb/common/exception/catalog_exception.hpp +39 -0
  452. package/src/duckdb/src/include/duckdb/common/exception/conversion_exception.hpp +27 -0
  453. package/src/duckdb/src/include/duckdb/common/exception/http_exception.hpp +62 -0
  454. package/src/duckdb/src/include/duckdb/common/exception/list.hpp +6 -0
  455. package/src/duckdb/src/include/duckdb/common/exception/parser_exception.hpp +29 -0
  456. package/src/duckdb/src/include/duckdb/common/exception/transaction_exception.hpp +25 -0
  457. package/src/duckdb/src/include/duckdb/common/exception.hpp +52 -166
  458. package/src/duckdb/src/include/duckdb/common/exception_format_value.hpp +7 -4
  459. package/src/duckdb/src/include/duckdb/common/extra_type_info.hpp +53 -1
  460. package/src/duckdb/src/include/duckdb/common/helper.hpp +13 -3
  461. package/src/duckdb/src/include/duckdb/common/http_state.hpp +18 -4
  462. package/src/duckdb/src/include/duckdb/common/hugeint.hpp +5 -1
  463. package/src/duckdb/src/include/duckdb/common/limits.hpp +19 -1
  464. package/src/duckdb/src/include/duckdb/common/local_file_system.hpp +1 -0
  465. package/src/duckdb/src/include/duckdb/common/multi_file_reader.hpp +7 -2
  466. package/src/duckdb/src/include/duckdb/common/numeric_utils.hpp +16 -3
  467. package/src/duckdb/src/include/duckdb/common/operator/add.hpp +13 -2
  468. package/src/duckdb/src/include/duckdb/common/operator/cast_operators.hpp +114 -5
  469. package/src/duckdb/src/include/duckdb/common/operator/comparison_operators.hpp +0 -4
  470. package/src/duckdb/src/include/duckdb/common/operator/convert_to_string.hpp +2 -0
  471. package/src/duckdb/src/include/duckdb/common/operator/decimal_cast_operators.hpp +29 -0
  472. package/src/duckdb/src/include/duckdb/common/operator/double_cast_operator.hpp +52 -0
  473. package/src/duckdb/src/include/duckdb/common/operator/integer_cast_operator.hpp +459 -0
  474. package/src/duckdb/src/include/duckdb/common/operator/multiply.hpp +2 -0
  475. package/src/duckdb/src/include/duckdb/common/operator/numeric_cast.hpp +136 -0
  476. package/src/duckdb/src/include/duckdb/common/operator/string_cast.hpp +2 -0
  477. package/src/duckdb/src/include/duckdb/common/operator/subtract.hpp +7 -1
  478. package/src/duckdb/src/include/duckdb/common/optional_idx.hpp +7 -5
  479. package/src/duckdb/src/include/duckdb/common/platform.h +53 -0
  480. package/src/duckdb/src/include/duckdb/common/progress_bar/display/terminal_progress_bar_display.hpp +5 -5
  481. package/src/duckdb/src/include/duckdb/common/progress_bar/progress_bar.hpp +22 -6
  482. package/src/duckdb/src/include/duckdb/common/radix.hpp +6 -0
  483. package/src/duckdb/src/include/duckdb/common/row_operations/row_operations.hpp +20 -6
  484. package/src/duckdb/src/include/duckdb/common/serializer/binary_deserializer.hpp +1 -0
  485. package/src/duckdb/src/include/duckdb/common/serializer/binary_serializer.hpp +1 -0
  486. package/src/duckdb/src/include/duckdb/common/serializer/deserializer.hpp +43 -4
  487. package/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp +1 -0
  488. package/src/duckdb/src/include/duckdb/common/serializer/serializer.hpp +15 -0
  489. package/src/duckdb/src/include/duckdb/common/sort/comparators.hpp +2 -0
  490. package/src/duckdb/src/include/duckdb/common/sort/partition_state.hpp +12 -2
  491. package/src/duckdb/src/include/duckdb/common/sort/sort.hpp +81 -0
  492. package/src/duckdb/src/include/duckdb/common/sort/sorted_block.hpp +0 -78
  493. package/src/duckdb/src/include/duckdb/common/string_util.hpp +23 -1
  494. package/src/duckdb/src/include/duckdb/common/type_util.hpp +5 -1
  495. package/src/duckdb/src/include/duckdb/common/types/cast_helpers.hpp +26 -3
  496. package/src/duckdb/src/include/duckdb/common/types/conflict_manager.hpp +8 -0
  497. package/src/duckdb/src/include/duckdb/common/types/data_chunk.hpp +3 -0
  498. package/src/duckdb/src/include/duckdb/common/types/date.hpp +3 -0
  499. package/src/duckdb/src/include/duckdb/common/types/datetime.hpp +5 -3
  500. package/src/duckdb/src/include/duckdb/common/types/hash.hpp +2 -0
  501. package/src/duckdb/src/include/duckdb/common/types/hugeint.hpp +81 -15
  502. package/src/duckdb/src/include/duckdb/common/types/interval.hpp +57 -29
  503. package/src/duckdb/src/include/duckdb/common/types/list_segment.hpp +1 -1
  504. package/src/duckdb/src/include/duckdb/common/types/row/partitioned_tuple_data.hpp +4 -2
  505. package/src/duckdb/src/include/duckdb/common/types/row/row_data_collection.hpp +2 -2
  506. package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_collection.hpp +26 -22
  507. package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_states.hpp +7 -0
  508. package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +7 -5
  509. package/src/duckdb/src/include/duckdb/common/types/time.hpp +6 -2
  510. package/src/duckdb/src/include/duckdb/common/types/timestamp.hpp +2 -0
  511. package/src/duckdb/src/include/duckdb/common/types/uhugeint.hpp +216 -0
  512. package/src/duckdb/src/include/duckdb/common/types/validity_mask.hpp +18 -10
  513. package/src/duckdb/src/include/duckdb/common/types/value.hpp +31 -0
  514. package/src/duckdb/src/include/duckdb/common/types/vector.hpp +18 -2
  515. package/src/duckdb/src/include/duckdb/common/types/vector_buffer.hpp +22 -1
  516. package/src/duckdb/src/include/duckdb/common/types.hpp +151 -49
  517. package/src/duckdb/src/include/duckdb/common/uhugeint.hpp +81 -0
  518. package/src/duckdb/src/include/duckdb/common/vector_operations/aggregate_executor.hpp +70 -6
  519. package/src/duckdb/src/include/duckdb/common/vector_size.hpp +6 -6
  520. package/src/duckdb/src/include/duckdb/core_functions/aggregate/distributive_functions.hpp +29 -2
  521. package/src/duckdb/src/include/duckdb/core_functions/lambda_functions.hpp +131 -0
  522. package/src/duckdb/src/include/duckdb/core_functions/scalar/array_functions.hpp +69 -0
  523. package/src/duckdb/src/include/duckdb/core_functions/scalar/blob_functions.hpp +9 -0
  524. package/src/duckdb/src/include/duckdb/core_functions/scalar/date_functions.hpp +40 -4
  525. package/src/duckdb/src/include/duckdb/core_functions/scalar/list_functions.hpp +42 -0
  526. package/src/duckdb/src/include/duckdb/core_functions/scalar/secret_functions.hpp +27 -0
  527. package/src/duckdb/src/include/duckdb/core_functions/scalar/string_functions.hpp +56 -2
  528. package/src/duckdb/src/include/duckdb/core_functions/to_interval.hpp +29 -0
  529. package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +2 -2
  530. package/src/duckdb/src/include/duckdb/execution/executor.hpp +11 -13
  531. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +34 -19
  532. package/src/duckdb/src/include/duckdb/execution/index/fixed_size_allocator.hpp +18 -14
  533. package/src/duckdb/src/include/duckdb/execution/index/fixed_size_buffer.hpp +2 -1
  534. package/src/duckdb/src/include/duckdb/execution/index/index_type.hpp +57 -0
  535. package/src/duckdb/src/include/duckdb/execution/index/index_type_set.hpp +29 -0
  536. package/src/duckdb/src/include/duckdb/execution/index/unknown_index.hpp +65 -0
  537. package/src/duckdb/src/include/duckdb/execution/join_hashtable.hpp +35 -24
  538. package/src/duckdb/src/include/duckdb/execution/merge_sort_tree.hpp +630 -0
  539. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_hash_aggregate.hpp +2 -0
  540. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_window.hpp +3 -2
  541. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/buffer_manager/csv_buffer.hpp +103 -0
  542. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/buffer_manager/csv_buffer_manager.hpp +74 -0
  543. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/buffer_manager/csv_file_handle.hpp +60 -0
  544. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/options/csv_option.hpp +155 -0
  545. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/options/csv_reader_options.hpp +163 -0
  546. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/options/state_machine_options.hpp +35 -0
  547. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/scanner/base_scanner.hpp +228 -0
  548. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/scanner/column_count_scanner.hpp +70 -0
  549. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/scanner/scanner_boundary.hpp +93 -0
  550. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/scanner/skip_scanner.hpp +60 -0
  551. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/scanner/string_value_scanner.hpp +197 -0
  552. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/sniffer/csv_sniffer.hpp +189 -0
  553. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/sniffer/quote_rules.hpp +21 -0
  554. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/state_machine/csv_state.hpp +30 -0
  555. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/state_machine/csv_state_machine.hpp +99 -0
  556. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/state_machine/csv_state_machine_cache.hpp +87 -0
  557. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/table_function/csv_file_scanner.hpp +70 -0
  558. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/table_function/global_csv_state.hpp +80 -0
  559. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/util/csv_casting.hpp +137 -0
  560. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/util/csv_error.hpp +104 -0
  561. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_batch_collector.hpp +0 -4
  562. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_buffered_collector.hpp +37 -0
  563. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_create_secret.hpp +38 -0
  564. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_pragma.hpp +4 -7
  565. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_reservoir_sample.hpp +6 -2
  566. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_blockwise_nl_join.hpp +1 -2
  567. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_delim_join.hpp +5 -18
  568. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_hash_join.hpp +14 -5
  569. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_iejoin.hpp +2 -2
  570. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_join.hpp +2 -1
  571. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_left_delim_join.hpp +37 -0
  572. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_nested_loop_join.hpp +1 -2
  573. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_piecewise_merge_join.hpp +1 -1
  574. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_range_join.hpp +1 -1
  575. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_right_delim_join.hpp +37 -0
  576. package/src/duckdb/src/include/duckdb/execution/operator/order/physical_order.hpp +0 -1
  577. package/src/duckdb/src/include/duckdb/execution/operator/order/physical_top_n.hpp +0 -1
  578. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_copy_database.hpp +35 -0
  579. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_copy_to_file.hpp +8 -3
  580. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_export.hpp +14 -0
  581. package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_column_data_scan.hpp +1 -4
  582. package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_expression_scan.hpp +0 -1
  583. package/src/duckdb/src/include/duckdb/execution/operator/set/physical_cte.hpp +17 -12
  584. package/src/duckdb/src/include/duckdb/execution/operator/set/physical_recursive_cte.hpp +4 -0
  585. package/src/duckdb/src/include/duckdb/execution/operator/set/physical_union.hpp +3 -1
  586. package/src/duckdb/src/include/duckdb/execution/physical_operator.hpp +2 -1
  587. package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +6 -2
  588. package/src/duckdb/src/include/duckdb/execution/radix_partitioned_hashtable.hpp +3 -1
  589. package/src/duckdb/src/include/duckdb/execution/reservoir_sample.hpp +32 -18
  590. package/src/duckdb/src/include/duckdb/execution/task_error_manager.hpp +57 -0
  591. package/src/duckdb/src/include/duckdb/execution/window_executor.hpp +2 -0
  592. package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +101 -19
  593. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +46 -14
  594. package/src/duckdb/src/include/duckdb/function/aggregate_state.hpp +6 -2
  595. package/src/duckdb/src/include/duckdb/function/built_in_functions.hpp +1 -0
  596. package/src/duckdb/src/include/duckdb/function/cast/bound_cast_data.hpp +26 -1
  597. package/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp +3 -0
  598. package/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp +1 -0
  599. package/src/duckdb/src/include/duckdb/function/cast/vector_cast_helpers.hpp +7 -1
  600. package/src/duckdb/src/include/duckdb/function/compression/compression.hpp +10 -0
  601. package/src/duckdb/src/include/duckdb/function/copy_function.hpp +16 -4
  602. package/src/duckdb/src/include/duckdb/function/function.hpp +12 -7
  603. package/src/duckdb/src/include/duckdb/function/function_binder.hpp +15 -12
  604. package/src/duckdb/src/include/duckdb/function/function_serialization.hpp +4 -3
  605. package/src/duckdb/src/include/duckdb/function/macro_function.hpp +3 -3
  606. package/src/duckdb/src/include/duckdb/function/pragma/pragma_functions.hpp +4 -1
  607. package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +3 -0
  608. package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +21 -1
  609. package/src/duckdb/src/include/duckdb/function/scalar/sequence_functions.hpp +22 -0
  610. package/src/duckdb/src/include/duckdb/function/scalar/strftime_format.hpp +16 -2
  611. package/src/duckdb/src/include/duckdb/function/scalar_function.hpp +22 -8
  612. package/src/duckdb/src/include/duckdb/function/table/arrow/arrow_duck_schema.hpp +6 -0
  613. package/src/duckdb/src/include/duckdb/function/table/arrow.hpp +35 -3
  614. package/src/duckdb/src/include/duckdb/function/table/list.hpp +1 -0
  615. package/src/duckdb/src/include/duckdb/function/table/range.hpp +12 -0
  616. package/src/duckdb/src/include/duckdb/function/table/read_csv.hpp +14 -16
  617. package/src/duckdb/src/include/duckdb/function/table/system_functions.hpp +12 -8
  618. package/src/duckdb/src/include/duckdb/function/table/table_scan.hpp +0 -2
  619. package/src/duckdb/src/include/duckdb/function/table_function.hpp +8 -3
  620. package/src/duckdb/src/include/duckdb/main/appender.hpp +3 -1
  621. package/src/duckdb/src/include/duckdb/main/attached_database.hpp +3 -2
  622. package/src/duckdb/src/include/duckdb/main/buffered_data/buffered_data.hpp +89 -0
  623. package/src/duckdb/src/include/duckdb/main/buffered_data/simple_buffered_data.hpp +53 -0
  624. package/src/duckdb/src/include/duckdb/main/capi/capi_internal.hpp +2 -1
  625. package/src/duckdb/src/include/duckdb/main/capi/cast/generic.hpp +2 -0
  626. package/src/duckdb/src/include/duckdb/main/chunk_scan_state/query_result.hpp +4 -4
  627. package/src/duckdb/src/include/duckdb/main/chunk_scan_state.hpp +3 -3
  628. package/src/duckdb/src/include/duckdb/main/client_config.hpp +8 -10
  629. package/src/duckdb/src/include/duckdb/main/client_context.hpp +22 -23
  630. package/src/duckdb/src/include/duckdb/main/client_context_state.hpp +37 -0
  631. package/src/duckdb/src/include/duckdb/main/client_data.hpp +1 -7
  632. package/src/duckdb/src/include/duckdb/main/config.hpp +24 -7
  633. package/src/duckdb/src/include/duckdb/main/connection.hpp +8 -1
  634. package/src/duckdb/src/include/duckdb/main/connection_manager.hpp +17 -26
  635. package/src/duckdb/src/include/duckdb/main/database.hpp +4 -2
  636. package/src/duckdb/src/include/duckdb/main/database_manager.hpp +39 -7
  637. package/src/duckdb/src/include/duckdb/main/database_path_and_type.hpp +5 -4
  638. package/src/duckdb/src/include/duckdb/main/error_manager.hpp +4 -1
  639. package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +203 -197
  640. package/src/duckdb/src/include/duckdb/main/extension_helper.hpp +42 -16
  641. package/src/duckdb/src/include/duckdb/main/extension_util.hpp +8 -1
  642. package/src/duckdb/src/include/duckdb/main/materialized_query_result.hpp +1 -1
  643. package/src/duckdb/src/include/duckdb/main/pending_query_result.hpp +5 -2
  644. package/src/duckdb/src/include/duckdb/main/prepared_statement.hpp +4 -4
  645. package/src/duckdb/src/include/duckdb/main/prepared_statement_data.hpp +2 -0
  646. package/src/duckdb/src/include/duckdb/main/query_profiler.hpp +0 -32
  647. package/src/duckdb/src/include/duckdb/main/query_result.hpp +13 -12
  648. package/src/duckdb/src/include/duckdb/main/relation/read_csv_relation.hpp +6 -6
  649. package/src/duckdb/src/include/duckdb/main/relation/setop_relation.hpp +3 -1
  650. package/src/duckdb/src/include/duckdb/main/secret/secret.hpp +206 -0
  651. package/src/duckdb/src/include/duckdb/main/secret/secret_manager.hpp +211 -0
  652. package/src/duckdb/src/include/duckdb/main/secret/secret_storage.hpp +164 -0
  653. package/src/duckdb/src/include/duckdb/main/settings.hpp +52 -13
  654. package/src/duckdb/src/include/duckdb/main/stream_query_result.hpp +9 -1
  655. package/src/duckdb/src/include/duckdb/optimizer/deliminator.hpp +4 -1
  656. package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +2 -0
  657. package/src/duckdb/src/include/duckdb/optimizer/join_order/join_node.hpp +1 -1
  658. package/src/duckdb/src/include/duckdb/optimizer/join_order/join_relation.hpp +2 -0
  659. package/src/duckdb/src/include/duckdb/optimizer/join_order/query_graph_manager.hpp +3 -0
  660. package/src/duckdb/src/include/duckdb/optimizer/join_order/relation_statistics_helper.hpp +1 -0
  661. package/src/duckdb/src/include/duckdb/parallel/event.hpp +2 -2
  662. package/src/duckdb/src/include/duckdb/parallel/meta_pipeline.hpp +14 -22
  663. package/src/duckdb/src/include/duckdb/parallel/pipeline.hpp +20 -0
  664. package/src/duckdb/src/include/duckdb/parallel/pipeline_executor.hpp +3 -5
  665. package/src/duckdb/src/include/duckdb/parallel/task.hpp +7 -0
  666. package/src/duckdb/src/include/duckdb/parallel/task_scheduler.hpp +10 -4
  667. package/src/duckdb/src/include/duckdb/parser/base_expression.hpp +3 -0
  668. package/src/duckdb/src/include/duckdb/parser/column_definition.hpp +8 -1
  669. package/src/duckdb/src/include/duckdb/parser/expression/function_expression.hpp +11 -4
  670. package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +16 -9
  671. package/src/duckdb/src/include/duckdb/parser/expression/lambdaref_expression.hpp +47 -0
  672. package/src/duckdb/src/include/duckdb/parser/expression/list.hpp +1 -0
  673. package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +29 -2
  674. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_info.hpp +2 -1
  675. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp +47 -2
  676. package/src/duckdb/src/include/duckdb/parser/parsed_data/attach_info.hpp +3 -0
  677. package/src/duckdb/src/include/duckdb/parser/parsed_data/bound_pragma_info.hpp +29 -0
  678. package/src/duckdb/src/include/duckdb/parser/parsed_data/comment_on_info.hpp +45 -0
  679. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_index_info.hpp +21 -22
  680. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_info.hpp +5 -11
  681. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_schema_info.hpp +23 -0
  682. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_secret_info.hpp +47 -0
  683. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_table_info.hpp +3 -1
  684. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_type_info.hpp +2 -0
  685. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_view_info.hpp +4 -0
  686. package/src/duckdb/src/include/duckdb/parser/parsed_data/drop_info.hpp +6 -1
  687. package/src/duckdb/src/include/duckdb/parser/parsed_data/extra_drop_info.hpp +66 -0
  688. package/src/duckdb/src/include/duckdb/parser/parsed_data/parse_info.hpp +3 -1
  689. package/src/duckdb/src/include/duckdb/parser/parsed_data/pragma_info.hpp +8 -4
  690. package/src/duckdb/src/include/duckdb/parser/parsed_expression.hpp +1 -3
  691. package/src/duckdb/src/include/duckdb/parser/parser_extension.hpp +2 -0
  692. package/src/duckdb/src/include/duckdb/parser/qualified_name.hpp +1 -1
  693. package/src/duckdb/src/include/duckdb/parser/query_error_context.hpp +5 -22
  694. package/src/duckdb/src/include/duckdb/parser/query_node/set_operation_node.hpp +2 -0
  695. package/src/duckdb/src/include/duckdb/parser/statement/copy_database_statement.hpp +40 -0
  696. package/src/duckdb/src/include/duckdb/parser/statement/list.hpp +1 -1
  697. package/src/duckdb/src/include/duckdb/parser/statement/set_statement.hpp +4 -3
  698. package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +2 -2
  699. package/src/duckdb/src/include/duckdb/parser/tableref/list.hpp +1 -0
  700. package/src/duckdb/src/include/duckdb/parser/tableref/showref.hpp +47 -0
  701. package/src/duckdb/src/include/duckdb/parser/tableref.hpp +2 -1
  702. package/src/duckdb/src/include/duckdb/parser/tokens.hpp +2 -1
  703. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +20 -3
  704. package/src/duckdb/src/include/duckdb/planner/bind_context.hpp +5 -1
  705. package/src/duckdb/src/include/duckdb/planner/binder.hpp +24 -27
  706. package/src/duckdb/src/include/duckdb/planner/bound_result_modifier.hpp +4 -0
  707. package/src/duckdb/src/include/duckdb/planner/expression/bound_cast_expression.hpp +4 -0
  708. package/src/duckdb/src/include/duckdb/planner/expression/bound_comparison_expression.hpp +4 -1
  709. package/src/duckdb/src/include/duckdb/planner/expression/bound_function_expression.hpp +2 -1
  710. package/src/duckdb/src/include/duckdb/planner/expression/bound_lambda_expression.hpp +4 -2
  711. package/src/duckdb/src/include/duckdb/planner/expression/bound_lambdaref_expression.hpp +5 -6
  712. package/src/duckdb/src/include/duckdb/planner/expression/bound_window_expression.hpp +11 -0
  713. package/src/duckdb/src/include/duckdb/planner/expression.hpp +2 -1
  714. package/src/duckdb/src/include/duckdb/planner/expression_binder/column_alias_binder.hpp +2 -2
  715. package/src/duckdb/src/include/duckdb/planner/expression_binder/index_binder.hpp +3 -2
  716. package/src/duckdb/src/include/duckdb/planner/expression_binder/order_binder.hpp +2 -1
  717. package/src/duckdb/src/include/duckdb/planner/expression_binder/table_function_binder.hpp +2 -1
  718. package/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +65 -22
  719. package/src/duckdb/src/include/duckdb/planner/filter/struct_filter.hpp +41 -0
  720. package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +2 -1
  721. package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +2 -1
  722. package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +2 -0
  723. package/src/duckdb/src/include/duckdb/planner/operator/logical_copy_database.hpp +45 -0
  724. package/src/duckdb/src/include/duckdb/planner/operator/logical_copy_to_file.hpp +3 -0
  725. package/src/duckdb/src/include/duckdb/planner/operator/logical_create_secret.hpp +43 -0
  726. package/src/duckdb/src/include/duckdb/planner/operator/logical_cteref.hpp +3 -2
  727. package/src/duckdb/src/include/duckdb/planner/operator/logical_pragma.hpp +5 -10
  728. package/src/duckdb/src/include/duckdb/planner/operator/logical_recursive_cte.hpp +2 -0
  729. package/src/duckdb/src/include/duckdb/planner/operator/logical_set_operation.hpp +11 -4
  730. package/src/duckdb/src/include/duckdb/planner/parsed_data/bound_create_table_info.hpp +3 -3
  731. package/src/duckdb/src/include/duckdb/planner/pragma_handler.hpp +1 -1
  732. package/src/duckdb/src/include/duckdb/planner/query_node/bound_set_operation_node.hpp +2 -0
  733. package/src/duckdb/src/include/duckdb/planner/subquery/flatten_dependent_join.hpp +3 -0
  734. package/src/duckdb/src/include/duckdb/planner/subquery/rewrite_cte_scan.hpp +29 -0
  735. package/src/duckdb/src/include/duckdb/planner/table_binding.hpp +9 -7
  736. package/src/duckdb/src/include/duckdb/planner/table_filter.hpp +2 -1
  737. package/src/duckdb/src/include/duckdb/planner/tableref/bound_dummytableref.hpp +3 -2
  738. package/src/duckdb/src/include/duckdb/storage/buffer/block_handle.hpp +9 -5
  739. package/src/duckdb/src/include/duckdb/storage/buffer/buffer_pool.hpp +23 -6
  740. package/src/duckdb/src/include/duckdb/storage/buffer/temporary_file_information.hpp +7 -0
  741. package/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp +11 -4
  742. package/src/duckdb/src/include/duckdb/storage/checkpoint/row_group_writer.hpp +0 -3
  743. package/src/duckdb/src/include/duckdb/storage/checkpoint/string_checkpoint_state.hpp +1 -1
  744. package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp +7 -7
  745. package/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp +1 -1
  746. package/src/duckdb/src/include/duckdb/storage/compression/alp/algorithm/alp.hpp +408 -0
  747. package/src/duckdb/src/include/duckdb/storage/compression/alp/alp_analyze.hpp +173 -0
  748. package/src/duckdb/src/include/duckdb/storage/compression/alp/alp_compress.hpp +283 -0
  749. package/src/duckdb/src/include/duckdb/storage/compression/alp/alp_constants.hpp +134 -0
  750. package/src/duckdb/src/include/duckdb/storage/compression/alp/alp_fetch.hpp +42 -0
  751. package/src/duckdb/src/include/duckdb/storage/compression/alp/alp_scan.hpp +244 -0
  752. package/src/duckdb/src/include/duckdb/storage/compression/alp/alp_utils.hpp +103 -0
  753. package/src/duckdb/src/include/duckdb/storage/compression/alprd/algorithm/alprd.hpp +235 -0
  754. package/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_analyze.hpp +134 -0
  755. package/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_compress.hpp +301 -0
  756. package/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_constants.hpp +35 -0
  757. package/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_fetch.hpp +41 -0
  758. package/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_scan.hpp +252 -0
  759. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_analyze.hpp +7 -103
  760. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_compress.hpp +5 -234
  761. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_scan.hpp +2 -2
  762. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_analyze.hpp +7 -107
  763. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_compress.hpp +5 -184
  764. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +12 -17
  765. package/src/duckdb/src/include/duckdb/storage/database_size.hpp +1 -0
  766. package/src/duckdb/src/include/duckdb/storage/index.hpp +40 -42
  767. package/src/duckdb/src/include/duckdb/storage/index_storage_info.hpp +77 -0
  768. package/src/duckdb/src/include/duckdb/storage/metadata/metadata_manager.hpp +6 -2
  769. package/src/duckdb/src/include/duckdb/storage/object_cache.hpp +0 -1
  770. package/src/duckdb/src/include/duckdb/storage/partial_block_manager.hpp +12 -6
  771. package/src/duckdb/src/include/duckdb/storage/segment/uncompressed.hpp +8 -3
  772. package/src/duckdb/src/include/duckdb/storage/standard_buffer_manager.hpp +17 -17
  773. package/src/duckdb/src/include/duckdb/storage/statistics/array_stats.hpp +40 -0
  774. package/src/duckdb/src/include/duckdb/storage/statistics/base_statistics.hpp +12 -3
  775. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats_union.hpp +3 -0
  776. package/src/duckdb/src/include/duckdb/storage/storage_extension.hpp +3 -2
  777. package/src/duckdb/src/include/duckdb/storage/storage_info.hpp +49 -24
  778. package/src/duckdb/src/include/duckdb/storage/storage_manager.hpp +8 -4
  779. package/src/duckdb/src/include/duckdb/storage/table/array_column_data.hpp +67 -0
  780. package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +3 -3
  781. package/src/duckdb/src/include/duckdb/storage/table/column_data_checkpointer.hpp +1 -0
  782. package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +1 -2
  783. package/src/duckdb/src/include/duckdb/storage/table/data_table_info.hpp +8 -3
  784. package/src/duckdb/src/include/duckdb/storage/table/list_column_data.hpp +1 -1
  785. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +4 -2
  786. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +7 -0
  787. package/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp +12 -1
  788. package/src/duckdb/src/include/duckdb/storage/table/standard_column_data.hpp +1 -1
  789. package/src/duckdb/src/include/duckdb/storage/table/struct_column_data.hpp +1 -1
  790. package/src/duckdb/src/include/duckdb/storage/table/table_index_list.hpp +16 -12
  791. package/src/duckdb/src/include/duckdb/storage/table/table_statistics.hpp +4 -0
  792. package/src/duckdb/src/include/duckdb/storage/table_storage_info.hpp +6 -9
  793. package/src/duckdb/src/include/duckdb/storage/temporary_memory_manager.hpp +119 -0
  794. package/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +13 -55
  795. package/src/duckdb/src/include/duckdb/transaction/duck_transaction.hpp +1 -1
  796. package/src/duckdb/src/include/duckdb/transaction/duck_transaction_manager.hpp +4 -5
  797. package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +2 -2
  798. package/src/duckdb/src/include/duckdb/transaction/meta_transaction.hpp +6 -3
  799. package/src/duckdb/src/include/duckdb/transaction/transaction_context.hpp +4 -4
  800. package/src/duckdb/src/include/duckdb/transaction/transaction_manager.hpp +3 -3
  801. package/src/duckdb/src/include/duckdb/verification/fetch_row_verifier.hpp +25 -0
  802. package/src/duckdb/src/include/duckdb/verification/statement_verifier.hpp +5 -0
  803. package/src/duckdb/src/include/duckdb.h +571 -143
  804. package/src/duckdb/src/main/appender.cpp +17 -2
  805. package/src/duckdb/src/main/attached_database.cpp +24 -12
  806. package/src/duckdb/src/main/buffered_data/simple_buffered_data.cpp +96 -0
  807. package/src/duckdb/src/main/capi/appender-c.cpp +42 -3
  808. package/src/duckdb/src/main/capi/arrow-c.cpp +32 -9
  809. package/src/duckdb/src/main/capi/datetime-c.cpp +22 -0
  810. package/src/duckdb/src/main/capi/duckdb-c.cpp +14 -4
  811. package/src/duckdb/src/main/capi/duckdb_value-c.cpp +66 -2
  812. package/src/duckdb/src/main/capi/helper-c.cpp +76 -2
  813. package/src/duckdb/src/main/capi/hugeint-c.cpp +23 -0
  814. package/src/duckdb/src/main/capi/logical_types-c.cpp +27 -3
  815. package/src/duckdb/src/main/capi/pending-c.cpp +43 -9
  816. package/src/duckdb/src/main/capi/prepared-c.cpp +38 -2
  817. package/src/duckdb/src/main/capi/result-c.cpp +54 -3
  818. package/src/duckdb/src/main/capi/table_function-c.cpp +4 -4
  819. package/src/duckdb/src/main/capi/value-c.cpp +10 -0
  820. package/src/duckdb/src/main/chunk_scan_state/query_result.cpp +3 -3
  821. package/src/duckdb/src/main/client_context.cpp +259 -250
  822. package/src/duckdb/src/main/client_data.cpp +0 -1
  823. package/src/duckdb/src/main/client_verify.cpp +26 -8
  824. package/src/duckdb/src/main/config.cpp +34 -13
  825. package/src/duckdb/src/main/connection.cpp +27 -6
  826. package/src/duckdb/src/main/connection_manager.cpp +54 -0
  827. package/src/duckdb/src/main/database.cpp +44 -39
  828. package/src/duckdb/src/main/database_manager.cpp +106 -8
  829. package/src/duckdb/src/main/database_path_and_type.cpp +27 -8
  830. package/src/duckdb/src/main/db_instance_cache.cpp +4 -4
  831. package/src/duckdb/src/main/error_manager.cpp +12 -3
  832. package/src/duckdb/src/main/extension/extension_alias.cpp +2 -2
  833. package/src/duckdb/src/main/extension/extension_helper.cpp +15 -16
  834. package/src/duckdb/src/main/extension/extension_install.cpp +33 -24
  835. package/src/duckdb/src/main/extension/extension_load.cpp +22 -21
  836. package/src/duckdb/src/main/extension/extension_util.cpp +12 -0
  837. package/src/duckdb/src/main/materialized_query_result.cpp +1 -1
  838. package/src/duckdb/src/main/pending_query_result.cpp +25 -8
  839. package/src/duckdb/src/main/prepared_statement.cpp +5 -5
  840. package/src/duckdb/src/main/prepared_statement_data.cpp +8 -1
  841. package/src/duckdb/src/main/query_profiler.cpp +11 -11
  842. package/src/duckdb/src/main/query_result.cpp +32 -6
  843. package/src/duckdb/src/main/relation/cross_product_relation.cpp +1 -1
  844. package/src/duckdb/src/main/relation/join_relation.cpp +2 -2
  845. package/src/duckdb/src/main/relation/read_csv_relation.cpp +38 -32
  846. package/src/duckdb/src/main/relation/setop_relation.cpp +5 -3
  847. package/src/duckdb/src/main/relation.cpp +5 -5
  848. package/src/duckdb/src/main/secret/secret.cpp +135 -0
  849. package/src/duckdb/src/main/secret/secret_manager.cpp +634 -0
  850. package/src/duckdb/src/main/secret/secret_storage.cpp +233 -0
  851. package/src/duckdb/src/main/settings/settings.cpp +133 -38
  852. package/src/duckdb/src/main/stream_query_result.cpp +53 -14
  853. package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +6 -0
  854. package/src/duckdb/src/optimizer/cse_optimizer.cpp +1 -1
  855. package/src/duckdb/src/optimizer/deliminator.cpp +136 -14
  856. package/src/duckdb/src/optimizer/filter_combiner.cpp +72 -26
  857. package/src/duckdb/src/optimizer/filter_pushdown.cpp +3 -0
  858. package/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp +2 -1
  859. package/src/duckdb/src/optimizer/join_order/cost_model.cpp +0 -1
  860. package/src/duckdb/src/optimizer/join_order/join_node.cpp +4 -0
  861. package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +3 -6
  862. package/src/duckdb/src/optimizer/join_order/join_relation_set.cpp +20 -0
  863. package/src/duckdb/src/optimizer/join_order/query_graph_manager.cpp +71 -40
  864. package/src/duckdb/src/optimizer/join_order/relation_manager.cpp +12 -3
  865. package/src/duckdb/src/optimizer/join_order/relation_statistics_helper.cpp +77 -3
  866. package/src/duckdb/src/optimizer/pushdown/pushdown_projection.cpp +7 -7
  867. package/src/duckdb/src/optimizer/pushdown/pushdown_semi_anti_join.cpp +56 -0
  868. package/src/duckdb/src/optimizer/remove_unused_columns.cpp +21 -0
  869. package/src/duckdb/src/optimizer/rule/date_part_simplification.cpp +2 -2
  870. package/src/duckdb/src/optimizer/rule/move_constants.cpp +15 -10
  871. package/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp +70 -0
  872. package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +17 -5
  873. package/src/duckdb/src/optimizer/statistics/expression/propagate_cast.cpp +1 -0
  874. package/src/duckdb/src/optimizer/statistics/expression/propagate_comparison.cpp +1 -0
  875. package/src/duckdb/src/optimizer/statistics/operator/propagate_filter.cpp +1 -2
  876. package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +22 -9
  877. package/src/duckdb/src/optimizer/statistics/operator/propagate_window.cpp +28 -4
  878. package/src/duckdb/src/optimizer/unnest_rewriter.cpp +12 -7
  879. package/src/duckdb/src/parallel/event.cpp +2 -2
  880. package/src/duckdb/src/parallel/executor.cpp +114 -81
  881. package/src/duckdb/src/parallel/executor_task.cpp +2 -4
  882. package/src/duckdb/src/parallel/meta_pipeline.cpp +28 -29
  883. package/src/duckdb/src/parallel/pipeline.cpp +41 -41
  884. package/src/duckdb/src/parallel/pipeline_event.cpp +2 -4
  885. package/src/duckdb/src/parallel/pipeline_executor.cpp +13 -75
  886. package/src/duckdb/src/parallel/task_scheduler.cpp +22 -13
  887. package/src/duckdb/src/parser/column_definition.cpp +22 -4
  888. package/src/duckdb/src/parser/column_list.cpp +2 -1
  889. package/src/duckdb/src/parser/expression/function_expression.cpp +1 -1
  890. package/src/duckdb/src/parser/expression/lambda_expression.cpp +51 -0
  891. package/src/duckdb/src/parser/expression/lambdaref_expression.cpp +59 -0
  892. package/src/duckdb/src/parser/expression/window_expression.cpp +9 -1
  893. package/src/duckdb/src/parser/parsed_data/alter_table_info.cpp +40 -0
  894. package/src/duckdb/src/parser/parsed_data/attach_info.cpp +1 -0
  895. package/src/duckdb/src/parser/parsed_data/comment_on_info.cpp +19 -0
  896. package/src/duckdb/src/parser/parsed_data/create_index_info.cpp +11 -9
  897. package/src/duckdb/src/parser/parsed_data/create_info.cpp +1 -0
  898. package/src/duckdb/src/parser/parsed_data/create_secret_info.cpp +22 -0
  899. package/src/duckdb/src/parser/parsed_data/create_table_info.cpp +17 -0
  900. package/src/duckdb/src/parser/parsed_data/create_type_info.cpp +19 -0
  901. package/src/duckdb/src/parser/parsed_data/create_view_info.cpp +13 -9
  902. package/src/duckdb/src/parser/parsed_data/drop_info.cpp +8 -9
  903. package/src/duckdb/src/parser/parsed_data/extra_drop_info.cpp +16 -0
  904. package/src/duckdb/src/parser/parsed_expression_iterator.cpp +3 -1
  905. package/src/duckdb/src/parser/parser.cpp +14 -8
  906. package/src/duckdb/src/parser/query_error_context.cpp +12 -13
  907. package/src/duckdb/src/parser/query_node/select_node.cpp +5 -1
  908. package/src/duckdb/src/parser/query_node/set_operation_node.cpp +8 -13
  909. package/src/duckdb/src/parser/statement/copy_database_statement.cpp +41 -0
  910. package/src/duckdb/src/parser/statement/set_statement.cpp +5 -1
  911. package/src/duckdb/src/parser/tableref/basetableref.cpp +1 -0
  912. package/src/duckdb/src/parser/tableref/showref.cpp +47 -0
  913. package/src/duckdb/src/parser/transform/constraint/transform_constraint.cpp +6 -2
  914. package/src/duckdb/src/parser/transform/expression/transform_bool_expr.cpp +1 -0
  915. package/src/duckdb/src/parser/transform/expression/transform_boolean_test.cpp +30 -15
  916. package/src/duckdb/src/parser/transform/expression/transform_case.cpp +1 -0
  917. package/src/duckdb/src/parser/transform/expression/transform_columnref.cpp +3 -2
  918. package/src/duckdb/src/parser/transform/expression/transform_constant.cpp +34 -4
  919. package/src/duckdb/src/parser/transform/expression/transform_function.cpp +26 -12
  920. package/src/duckdb/src/parser/transform/expression/transform_grouping_function.cpp +1 -1
  921. package/src/duckdb/src/parser/transform/expression/transform_interval.cpp +34 -5
  922. package/src/duckdb/src/parser/transform/expression/transform_is_null.cpp +3 -1
  923. package/src/duckdb/src/parser/transform/expression/transform_lambda.cpp +3 -1
  924. package/src/duckdb/src/parser/transform/expression/transform_multi_assign_reference.cpp +3 -3
  925. package/src/duckdb/src/parser/transform/expression/transform_operator.cpp +3 -3
  926. package/src/duckdb/src/parser/transform/expression/transform_positional_reference.cpp +1 -1
  927. package/src/duckdb/src/parser/transform/expression/transform_subquery.cpp +13 -13
  928. package/src/duckdb/src/parser/transform/helpers/nodetype_to_string.cpp +2 -0
  929. package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +1 -1
  930. package/src/duckdb/src/parser/transform/helpers/transform_typename.cpp +32 -1
  931. package/src/duckdb/src/parser/transform/statement/transform_alter_table.cpp +1 -1
  932. package/src/duckdb/src/parser/transform/statement/transform_attach.cpp +1 -0
  933. package/src/duckdb/src/parser/transform/statement/transform_comment_on.cpp +108 -0
  934. package/src/duckdb/src/parser/transform/statement/transform_copy.cpp +45 -37
  935. package/src/duckdb/src/parser/transform/statement/transform_copy_database.cpp +29 -0
  936. package/src/duckdb/src/parser/transform/statement/transform_create_index.cpp +5 -14
  937. package/src/duckdb/src/parser/transform/statement/transform_create_table.cpp +0 -1
  938. package/src/duckdb/src/parser/transform/statement/transform_delete.cpp +1 -1
  939. package/src/duckdb/src/parser/transform/statement/transform_drop.cpp +25 -6
  940. package/src/duckdb/src/parser/transform/statement/transform_import.cpp +2 -1
  941. package/src/duckdb/src/parser/transform/statement/transform_pragma.cpp +6 -14
  942. package/src/duckdb/src/parser/transform/statement/transform_secret.cpp +103 -0
  943. package/src/duckdb/src/parser/transform/statement/transform_select.cpp +8 -1
  944. package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +4 -8
  945. package/src/duckdb/src/parser/transform/statement/transform_set.cpp +18 -5
  946. package/src/duckdb/src/parser/transform/statement/transform_show.cpp +14 -41
  947. package/src/duckdb/src/parser/transform/statement/transform_show_select.cpp +13 -6
  948. package/src/duckdb/src/parser/transform/statement/transform_use.cpp +3 -1
  949. package/src/duckdb/src/parser/transform/tableref/transform_base_tableref.cpp +1 -1
  950. package/src/duckdb/src/parser/transform/tableref/transform_join.cpp +1 -2
  951. package/src/duckdb/src/parser/transform/tableref/transform_pivot.cpp +6 -5
  952. package/src/duckdb/src/parser/transform/tableref/transform_table_function.cpp +1 -1
  953. package/src/duckdb/src/parser/transformer.cpp +22 -0
  954. package/src/duckdb/src/planner/bind_context.cpp +23 -14
  955. package/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp +15 -14
  956. package/src/duckdb/src/planner/binder/expression/bind_between_expression.cpp +20 -9
  957. package/src/duckdb/src/planner/binder/expression/bind_case_expression.cpp +12 -7
  958. package/src/duckdb/src/planner/binder/expression/bind_cast_expression.cpp +4 -4
  959. package/src/duckdb/src/planner/binder/expression/bind_collate_expression.cpp +3 -3
  960. package/src/duckdb/src/planner/binder/expression/bind_columnref_expression.cpp +279 -195
  961. package/src/duckdb/src/planner/binder/expression/bind_comparison_expression.cpp +103 -17
  962. package/src/duckdb/src/planner/binder/expression/bind_conjunction_expression.cpp +3 -3
  963. package/src/duckdb/src/planner/binder/expression/bind_function_expression.cpp +91 -68
  964. package/src/duckdb/src/planner/binder/expression/bind_lambda.cpp +116 -84
  965. package/src/duckdb/src/planner/binder/expression/bind_macro_expression.cpp +85 -15
  966. package/src/duckdb/src/planner/binder/expression/bind_operator_expression.cpp +68 -31
  967. package/src/duckdb/src/planner/binder/expression/bind_star_expression.cpp +7 -7
  968. package/src/duckdb/src/planner/binder/expression/bind_subquery_expression.cpp +11 -7
  969. package/src/duckdb/src/planner/binder/expression/bind_unnest_expression.cpp +42 -19
  970. package/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp +38 -16
  971. package/src/duckdb/src/planner/binder/query_node/bind_cte_node.cpp +16 -7
  972. package/src/duckdb/src/planner/binder/query_node/bind_recursive_cte_node.cpp +3 -0
  973. package/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +83 -12
  974. package/src/duckdb/src/planner/binder/query_node/bind_setop_node.cpp +28 -37
  975. package/src/duckdb/src/planner/binder/query_node/bind_table_macro_node.cpp +3 -4
  976. package/src/duckdb/src/planner/binder/query_node/plan_cte_node.cpp +2 -2
  977. package/src/duckdb/src/planner/binder/query_node/plan_recursive_cte_node.cpp +3 -3
  978. package/src/duckdb/src/planner/binder/query_node/plan_setop.cpp +7 -5
  979. package/src/duckdb/src/planner/binder/query_node/plan_subquery.cpp +10 -0
  980. package/src/duckdb/src/planner/binder/statement/bind_copy.cpp +48 -50
  981. package/src/duckdb/src/planner/binder/statement/bind_copy_database.cpp +187 -0
  982. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +38 -22
  983. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +8 -15
  984. package/src/duckdb/src/planner/binder/statement/bind_drop.cpp +6 -1
  985. package/src/duckdb/src/planner/binder/statement/bind_export.cpp +2 -2
  986. package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +12 -10
  987. package/src/duckdb/src/planner/binder/statement/bind_pragma.cpp +37 -13
  988. package/src/duckdb/src/planner/binder/statement/bind_set.cpp +8 -2
  989. package/src/duckdb/src/planner/binder/statement/bind_simple.cpp +2 -0
  990. package/src/duckdb/src/planner/binder/statement/bind_summarize.cpp +29 -14
  991. package/src/duckdb/src/planner/binder/statement/bind_vacuum.cpp +1 -1
  992. package/src/duckdb/src/planner/binder/tableref/bind_basetableref.cpp +16 -6
  993. package/src/duckdb/src/planner/binder/tableref/bind_expressionlistref.cpp +11 -4
  994. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +1 -1
  995. package/src/duckdb/src/planner/binder/tableref/bind_named_parameters.cpp +2 -2
  996. package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +18 -17
  997. package/src/duckdb/src/planner/binder/tableref/bind_showref.cpp +85 -0
  998. package/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp +11 -17
  999. package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -9
  1000. package/src/duckdb/src/planner/binder.cpp +31 -26
  1001. package/src/duckdb/src/planner/bound_result_modifier.cpp +24 -0
  1002. package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +1 -1
  1003. package/src/duckdb/src/planner/expression/bound_cast_expression.cpp +10 -1
  1004. package/src/duckdb/src/planner/expression/bound_function_expression.cpp +20 -4
  1005. package/src/duckdb/src/planner/expression/bound_lambdaref_expression.cpp +9 -10
  1006. package/src/duckdb/src/planner/expression/bound_window_expression.cpp +65 -3
  1007. package/src/duckdb/src/planner/expression.cpp +15 -5
  1008. package/src/duckdb/src/planner/expression_binder/base_select_binder.cpp +5 -6
  1009. package/src/duckdb/src/planner/expression_binder/check_binder.cpp +9 -8
  1010. package/src/duckdb/src/planner/expression_binder/column_alias_binder.cpp +10 -7
  1011. package/src/duckdb/src/planner/expression_binder/having_binder.cpp +9 -4
  1012. package/src/duckdb/src/planner/expression_binder/index_binder.cpp +0 -25
  1013. package/src/duckdb/src/planner/expression_binder/order_binder.cpp +8 -11
  1014. package/src/duckdb/src/planner/expression_binder/qualify_binder.cpp +3 -2
  1015. package/src/duckdb/src/planner/expression_binder/table_function_binder.cpp +15 -8
  1016. package/src/duckdb/src/planner/expression_binder/where_binder.cpp +3 -4
  1017. package/src/duckdb/src/planner/expression_binder.cpp +51 -25
  1018. package/src/duckdb/src/planner/expression_iterator.cpp +2 -1
  1019. package/src/duckdb/src/planner/filter/constant_filter.cpp +1 -0
  1020. package/src/duckdb/src/planner/filter/struct_filter.cpp +33 -0
  1021. package/src/duckdb/src/planner/joinside.cpp +1 -1
  1022. package/src/duckdb/src/planner/logical_operator.cpp +2 -1
  1023. package/src/duckdb/src/planner/operator/logical_copy_database.cpp +32 -0
  1024. package/src/duckdb/src/planner/operator/logical_copy_to_file.cpp +13 -4
  1025. package/src/duckdb/src/planner/operator/logical_create_table.cpp +2 -0
  1026. package/src/duckdb/src/planner/operator/logical_get.cpp +4 -1
  1027. package/src/duckdb/src/planner/operator/logical_join.cpp +8 -0
  1028. package/src/duckdb/src/planner/planner.cpp +24 -23
  1029. package/src/duckdb/src/planner/pragma_handler.cpp +10 -19
  1030. package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +99 -6
  1031. package/src/duckdb/src/planner/subquery/rewrite_cte_scan.cpp +36 -0
  1032. package/src/duckdb/src/planner/table_binding.cpp +14 -12
  1033. package/src/duckdb/src/storage/buffer/block_handle.cpp +12 -10
  1034. package/src/duckdb/src/storage/buffer/block_manager.cpp +1 -1
  1035. package/src/duckdb/src/storage/buffer/buffer_pool.cpp +25 -9
  1036. package/src/duckdb/src/storage/buffer/buffer_pool_reservation.cpp +4 -3
  1037. package/src/duckdb/src/storage/buffer_manager.cpp +14 -3
  1038. package/src/duckdb/src/storage/checkpoint/row_group_writer.cpp +0 -8
  1039. package/src/duckdb/src/storage/checkpoint/table_data_writer.cpp +15 -7
  1040. package/src/duckdb/src/storage/checkpoint/write_overflow_strings_to_disk.cpp +1 -1
  1041. package/src/duckdb/src/storage/checkpoint_manager.cpp +94 -41
  1042. package/src/duckdb/src/storage/compression/alp/alp.cpp +57 -0
  1043. package/src/duckdb/src/storage/compression/alp/alp_constants.cpp +13 -0
  1044. package/src/duckdb/src/storage/compression/alprd.cpp +57 -0
  1045. package/src/duckdb/src/storage/compression/bitpacking.cpp +86 -55
  1046. package/src/duckdb/src/storage/compression/bitpacking_hugeint.cpp +41 -41
  1047. package/src/duckdb/src/storage/compression/dictionary_compression.cpp +1 -3
  1048. package/src/duckdb/src/storage/compression/fixed_size_uncompressed.cpp +2 -0
  1049. package/src/duckdb/src/storage/compression/fsst.cpp +4 -4
  1050. package/src/duckdb/src/storage/compression/numeric_constant.cpp +3 -0
  1051. package/src/duckdb/src/storage/compression/rle.cpp +6 -4
  1052. package/src/duckdb/src/storage/compression/string_uncompressed.cpp +7 -7
  1053. package/src/duckdb/src/storage/compression/uncompressed.cpp +1 -0
  1054. package/src/duckdb/src/storage/compression/validity_uncompressed.cpp +6 -6
  1055. package/src/duckdb/src/storage/data_table.cpp +32 -96
  1056. package/src/duckdb/src/storage/index.cpp +23 -11
  1057. package/src/duckdb/src/storage/local_storage.cpp +36 -19
  1058. package/src/duckdb/src/storage/metadata/metadata_manager.cpp +2 -2
  1059. package/src/duckdb/src/storage/partial_block_manager.cpp +1 -1
  1060. package/src/duckdb/src/storage/serialization/serialize_create_info.cpp +9 -4
  1061. package/src/duckdb/src/storage/serialization/serialize_expression.cpp +3 -3
  1062. package/src/duckdb/src/storage/serialization/serialize_extra_drop_info.cpp +42 -0
  1063. package/src/duckdb/src/storage/serialization/serialize_logical_operator.cpp +7 -17
  1064. package/src/duckdb/src/storage/serialization/serialize_macro_function.cpp +2 -2
  1065. package/src/duckdb/src/storage/serialization/serialize_nodes.cpp +84 -77
  1066. package/src/duckdb/src/storage/serialization/serialize_parse_info.cpp +63 -4
  1067. package/src/duckdb/src/storage/serialization/serialize_parsed_expression.cpp +23 -0
  1068. package/src/duckdb/src/storage/serialization/serialize_query_node.cpp +2 -0
  1069. package/src/duckdb/src/storage/serialization/serialize_storage.cpp +35 -0
  1070. package/src/duckdb/src/storage/serialization/serialize_table_filter.cpp +19 -0
  1071. package/src/duckdb/src/storage/serialization/serialize_tableref.cpp +22 -1
  1072. package/src/duckdb/src/storage/serialization/serialize_types.cpp +50 -0
  1073. package/src/duckdb/src/storage/single_file_block_manager.cpp +46 -7
  1074. package/src/duckdb/src/storage/standard_buffer_manager.cpp +57 -28
  1075. package/src/duckdb/src/storage/statistics/array_stats.cpp +131 -0
  1076. package/src/duckdb/src/storage/statistics/base_statistics.cpp +62 -4
  1077. package/src/duckdb/src/storage/statistics/column_statistics.cpp +1 -0
  1078. package/src/duckdb/src/storage/statistics/distinct_statistics.cpp +3 -1
  1079. package/src/duckdb/src/storage/statistics/numeric_stats.cpp +21 -0
  1080. package/src/duckdb/src/storage/statistics/numeric_stats_union.cpp +5 -0
  1081. package/src/duckdb/src/storage/statistics/string_stats.cpp +2 -2
  1082. package/src/duckdb/src/storage/storage_info.cpp +1 -1
  1083. package/src/duckdb/src/storage/storage_manager.cpp +47 -22
  1084. package/src/duckdb/src/storage/table/array_column_data.cpp +241 -0
  1085. package/src/duckdb/src/storage/table/chunk_info.cpp +2 -1
  1086. package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +3 -1
  1087. package/src/duckdb/src/storage/table/column_data.cpp +41 -18
  1088. package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +12 -3
  1089. package/src/duckdb/src/storage/table/column_segment.cpp +40 -6
  1090. package/src/duckdb/src/storage/table/list_column_data.cpp +18 -15
  1091. package/src/duckdb/src/storage/table/row_group.cpp +73 -21
  1092. package/src/duckdb/src/storage/table/row_group_collection.cpp +395 -20
  1093. package/src/duckdb/src/storage/table/row_version_manager.cpp +2 -1
  1094. package/src/duckdb/src/storage/table/scan_state.cpp +4 -0
  1095. package/src/duckdb/src/storage/table/standard_column_data.cpp +11 -5
  1096. package/src/duckdb/src/storage/table/struct_column_data.cpp +30 -10
  1097. package/src/duckdb/src/storage/table/table_statistics.cpp +7 -1
  1098. package/src/duckdb/src/storage/table/update_segment.cpp +18 -2
  1099. package/src/duckdb/src/storage/table_index_list.cpp +73 -7
  1100. package/src/duckdb/src/storage/temporary_memory_manager.cpp +148 -0
  1101. package/src/duckdb/src/storage/wal_replay.cpp +329 -152
  1102. package/src/duckdb/src/storage/write_ahead_log.cpp +157 -137
  1103. package/src/duckdb/src/transaction/cleanup_state.cpp +3 -2
  1104. package/src/duckdb/src/transaction/commit_state.cpp +89 -63
  1105. package/src/duckdb/src/transaction/duck_transaction.cpp +5 -3
  1106. package/src/duckdb/src/transaction/duck_transaction_manager.cpp +26 -54
  1107. package/src/duckdb/src/transaction/meta_transaction.cpp +37 -23
  1108. package/src/duckdb/src/transaction/transaction_context.cpp +23 -4
  1109. package/src/duckdb/src/transaction/undo_buffer.cpp +16 -2
  1110. package/src/duckdb/src/verification/fetch_row_verifier.cpp +13 -0
  1111. package/src/duckdb/src/verification/prepared_statement_verifier.cpp +5 -7
  1112. package/src/duckdb/src/verification/statement_verifier.cpp +6 -5
  1113. package/src/duckdb/third_party/fast_float/fast_float/fast_float.h +100 -29
  1114. package/src/duckdb/third_party/fmt/include/fmt/format-inl.h +1 -1
  1115. package/src/duckdb/third_party/fmt/include/fmt/format.h +4 -2
  1116. package/src/duckdb/third_party/fmt/include/fmt/printf.h +5 -5
  1117. package/src/duckdb/third_party/libpg_query/include/nodes/nodes.hpp +4 -0
  1118. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +82 -21
  1119. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +551 -1004
  1120. package/src/duckdb/third_party/libpg_query/include/parser/kwlist.hpp +17 -3
  1121. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +24861 -23465
  1122. package/src/duckdb/third_party/libpg_query/src_backend_parser_scan.cpp +420 -389
  1123. package/src/duckdb/third_party/mbedtls/include/mbedtls/aes.h +640 -1
  1124. package/src/duckdb/third_party/mbedtls/include/mbedtls/aes_alt.h +1 -0
  1125. package/src/duckdb/third_party/mbedtls/include/mbedtls/aria.h +358 -0
  1126. package/src/duckdb/third_party/mbedtls/include/mbedtls/aria_alt.h +1 -0
  1127. package/src/duckdb/third_party/mbedtls/include/mbedtls/camellia.h +316 -0
  1128. package/src/duckdb/third_party/mbedtls/include/mbedtls/camellia_alt.h +1 -0
  1129. package/src/duckdb/third_party/mbedtls/include/mbedtls/ccm.h +1 -1
  1130. package/src/duckdb/third_party/mbedtls/include/mbedtls/ccm_alt.h +1 -0
  1131. package/src/duckdb/third_party/mbedtls/include/mbedtls/chacha20.h +1 -0
  1132. package/src/duckdb/third_party/mbedtls/include/mbedtls/chachapoly.h +1 -0
  1133. package/src/duckdb/third_party/mbedtls/include/mbedtls/cipher.h +124 -124
  1134. package/src/duckdb/third_party/mbedtls/include/mbedtls/cmac.h +1 -0
  1135. package/src/duckdb/third_party/mbedtls/include/mbedtls/entropy.h +293 -0
  1136. package/src/duckdb/third_party/mbedtls/include/mbedtls/gcm.h +383 -0
  1137. package/src/duckdb/third_party/mbedtls/include/mbedtls/gcm_alt.h +1 -0
  1138. package/src/duckdb/third_party/mbedtls/include/mbedtls/mbedtls_config.h +9 -0
  1139. package/src/duckdb/third_party/mbedtls/include/mbedtls/nist_kw.h +1 -0
  1140. package/src/duckdb/third_party/mbedtls/include/mbedtls/timing.h +1 -0
  1141. package/src/duckdb/third_party/mbedtls/include/mbedtls_wrapper.hpp +35 -6
  1142. package/src/duckdb/third_party/mbedtls/library/aes.cpp +2171 -0
  1143. package/src/duckdb/third_party/mbedtls/library/aesni.h +1 -0
  1144. package/src/duckdb/third_party/mbedtls/library/aria.cpp +1058 -0
  1145. package/src/duckdb/third_party/mbedtls/library/camellia.cpp +1087 -0
  1146. package/src/duckdb/third_party/mbedtls/library/cipher.cpp +1633 -0
  1147. package/src/duckdb/third_party/mbedtls/library/cipher_wrap.cpp +2270 -0
  1148. package/src/duckdb/third_party/mbedtls/library/cipher_wrap.h +146 -0
  1149. package/src/duckdb/third_party/mbedtls/library/entropy.cpp +701 -0
  1150. package/src/duckdb/third_party/mbedtls/library/entropy_poll.cpp +237 -0
  1151. package/src/duckdb/third_party/mbedtls/library/entropy_poll.h +76 -0
  1152. package/src/duckdb/third_party/mbedtls/library/gcm.cpp +1161 -0
  1153. package/src/duckdb/third_party/mbedtls/library/padlock.h +1 -0
  1154. package/src/duckdb/third_party/mbedtls/mbedtls_wrapper.cpp +132 -24
  1155. package/src/duckdb/third_party/pcg/pcg_uint128.hpp +1 -1
  1156. package/src/duckdb/third_party/skiplist/HeadNode.h +934 -0
  1157. package/src/duckdb/third_party/skiplist/IntegrityEnums.h +62 -0
  1158. package/src/duckdb/third_party/skiplist/Node.h +641 -0
  1159. package/src/duckdb/third_party/skiplist/NodeRefs.h +251 -0
  1160. package/src/duckdb/third_party/skiplist/RollingMedian.h +202 -0
  1161. package/src/duckdb/third_party/skiplist/SkipList.cpp +40 -0
  1162. package/src/duckdb/third_party/skiplist/SkipList.h +549 -0
  1163. package/src/duckdb/third_party/thrift/thrift/thrift-config.h +1 -1
  1164. package/src/duckdb/ub_extension_json_json_functions.cpp +2 -0
  1165. package/src/duckdb/ub_src_catalog.cpp +3 -1
  1166. package/src/duckdb/ub_src_catalog_catalog_entry_dependency.cpp +6 -0
  1167. package/src/duckdb/ub_src_common.cpp +1 -1
  1168. package/src/duckdb/ub_src_common_exception.cpp +6 -0
  1169. package/src/duckdb/ub_src_common_types.cpp +2 -2
  1170. package/src/duckdb/ub_src_core_functions.cpp +2 -0
  1171. package/src/duckdb/ub_src_core_functions_scalar_array.cpp +4 -0
  1172. package/src/duckdb/ub_src_core_functions_scalar_blob.cpp +2 -0
  1173. package/src/duckdb/ub_src_core_functions_scalar_list.cpp +7 -3
  1174. package/src/duckdb/ub_src_core_functions_scalar_secret.cpp +2 -0
  1175. package/src/duckdb/ub_src_core_functions_scalar_string.cpp +4 -0
  1176. package/src/duckdb/ub_src_execution_index.cpp +4 -0
  1177. package/src/duckdb/ub_src_execution_operator_csv_scanner_buffer_manager.cpp +6 -0
  1178. package/src/duckdb/ub_src_execution_operator_csv_scanner_scanner.cpp +10 -0
  1179. package/src/duckdb/ub_src_execution_operator_csv_scanner_state_machine.cpp +4 -0
  1180. package/src/duckdb/ub_src_execution_operator_csv_scanner_table_function.cpp +4 -0
  1181. package/src/duckdb/ub_src_execution_operator_csv_scanner_util.cpp +4 -0
  1182. package/src/duckdb/ub_src_execution_operator_helper.cpp +4 -0
  1183. package/src/duckdb/ub_src_execution_operator_join.cpp +4 -2
  1184. package/src/duckdb/ub_src_execution_operator_persistent.cpp +2 -0
  1185. package/src/duckdb/ub_src_execution_physical_plan.cpp +4 -2
  1186. package/src/duckdb/ub_src_function_cast.cpp +2 -0
  1187. package/src/duckdb/ub_src_function_scalar_list.cpp +4 -0
  1188. package/src/duckdb/ub_src_function_table.cpp +4 -4
  1189. package/src/duckdb/ub_src_function_table_system.cpp +6 -0
  1190. package/src/duckdb/ub_src_main.cpp +2 -0
  1191. package/src/duckdb/ub_src_main_buffered_data.cpp +2 -0
  1192. package/src/duckdb/ub_src_main_secret.cpp +6 -0
  1193. package/src/duckdb/ub_src_optimizer_pushdown.cpp +2 -0
  1194. package/src/duckdb/ub_src_parser_expression.cpp +2 -0
  1195. package/src/duckdb/ub_src_parser_parsed_data.cpp +6 -0
  1196. package/src/duckdb/ub_src_parser_statement.cpp +2 -2
  1197. package/src/duckdb/ub_src_parser_tableref.cpp +2 -0
  1198. package/src/duckdb/ub_src_parser_transform_statement.cpp +6 -0
  1199. package/src/duckdb/ub_src_planner_binder_statement.cpp +2 -2
  1200. package/src/duckdb/ub_src_planner_binder_tableref.cpp +2 -0
  1201. package/src/duckdb/ub_src_planner_filter.cpp +2 -0
  1202. package/src/duckdb/ub_src_planner_operator.cpp +2 -0
  1203. package/src/duckdb/ub_src_planner_subquery.cpp +2 -0
  1204. package/src/duckdb/ub_src_storage.cpp +2 -0
  1205. package/src/duckdb/ub_src_storage_compression.cpp +2 -0
  1206. package/src/duckdb/ub_src_storage_compression_alp.cpp +4 -0
  1207. package/src/duckdb/ub_src_storage_serialization.cpp +2 -0
  1208. package/src/duckdb/ub_src_storage_statistics.cpp +2 -0
  1209. package/src/duckdb/ub_src_storage_table.cpp +2 -0
  1210. package/src/duckdb_node.hpp +1 -1
  1211. package/src/statement.cpp +18 -8
  1212. package/src/utils.cpp +1 -15
  1213. package/test/columns.test.ts +2 -1
  1214. package/test/config.test.ts +30 -0
  1215. package/test/test_all_types.test.ts +9 -4
@@ -3,7 +3,11 @@
3
3
  #include "duckdb/common/algorithm.hpp"
4
4
  #include "duckdb/common/helper.hpp"
5
5
  #include "duckdb/common/vector_operations/vector_operations.hpp"
6
+ #include "duckdb/execution/merge_sort_tree.hpp"
7
+ #include "duckdb/planner/expression/bound_constant_expression.hpp"
8
+ #include "duckdb/execution/window_executor.hpp"
6
9
 
10
+ #include <numeric>
7
11
  #include <utility>
8
12
 
9
13
  namespace duckdb {
@@ -14,9 +18,10 @@ namespace duckdb {
14
18
  WindowAggregatorState::WindowAggregatorState() : allocator(Allocator::DefaultAllocator()) {
15
19
  }
16
20
 
17
- WindowAggregator::WindowAggregator(AggregateObject aggr, const LogicalType &result_type_p, idx_t partition_count_p)
21
+ WindowAggregator::WindowAggregator(AggregateObject aggr, const LogicalType &result_type_p,
22
+ const WindowExcludeMode exclude_mode_p, idx_t partition_count_p)
18
23
  : aggr(std::move(aggr)), result_type(result_type_p), partition_count(partition_count_p),
19
- state_size(aggr.function.state_size()), filter_pos(0) {
24
+ state_size(aggr.function.state_size()), filter_pos(0), exclude_mode(exclude_mode_p) {
20
25
  }
21
26
 
22
27
  WindowAggregator::~WindowAggregator() {
@@ -43,15 +48,16 @@ void WindowAggregator::Sink(DataChunk &payload_chunk, SelectionVector *filter_se
43
48
  }
44
49
  }
45
50
 
46
- void WindowAggregator::Finalize() {
51
+ void WindowAggregator::Finalize(const FrameStats &stats) {
47
52
  }
48
53
 
49
54
  //===--------------------------------------------------------------------===//
50
55
  // WindowConstantAggregate
51
56
  //===--------------------------------------------------------------------===//
52
57
  WindowConstantAggregator::WindowConstantAggregator(AggregateObject aggr, const LogicalType &result_type,
53
- const ValidityMask &partition_mask, const idx_t count)
54
- : WindowAggregator(std::move(aggr), result_type, count), partition(0), row(0), state(state_size),
58
+ const ValidityMask &partition_mask,
59
+ const WindowExcludeMode exclude_mode_p, const idx_t count)
60
+ : WindowAggregator(std::move(aggr), result_type, exclude_mode_p, count), partition(0), row(0), state(state_size),
55
61
  statep(Value::POINTER(CastPointerToValue(state.data()))),
56
62
  statef(Value::POINTER(CastPointerToValue(state.data()))) {
57
63
 
@@ -180,7 +186,7 @@ void WindowConstantAggregator::Sink(DataChunk &payload_chunk, SelectionVector *f
180
186
  }
181
187
  }
182
188
 
183
- void WindowConstantAggregator::Finalize() {
189
+ void WindowConstantAggregator::Finalize(const FrameStats &stats) {
184
190
  AggegateFinal(*results, partition++);
185
191
  }
186
192
 
@@ -203,8 +209,9 @@ unique_ptr<WindowAggregatorState> WindowConstantAggregator::GetLocalState() cons
203
209
  return make_uniq<WindowConstantAggregatorState>();
204
210
  }
205
211
 
206
- void WindowConstantAggregator::Evaluate(WindowAggregatorState &lstate, const idx_t *begins, const idx_t *ends,
207
- Vector &target, idx_t count) const {
212
+ void WindowConstantAggregator::Evaluate(WindowAggregatorState &lstate, const DataChunk &bounds, Vector &target,
213
+ idx_t count, idx_t row_idx) const {
214
+ auto begins = FlatVector::GetData<const idx_t>(bounds.data[WINDOW_BEGIN]);
208
215
  // Chunk up the constants and copy them one at a time
209
216
  auto &lcstate = lstate.Cast<WindowConstantAggregatorState>();
210
217
  idx_t matched = 0;
@@ -234,8 +241,9 @@ void WindowConstantAggregator::Evaluate(WindowAggregatorState &lstate, const idx
234
241
  //===--------------------------------------------------------------------===//
235
242
  // WindowCustomAggregator
236
243
  //===--------------------------------------------------------------------===//
237
- WindowCustomAggregator::WindowCustomAggregator(AggregateObject aggr, const LogicalType &result_type, idx_t count)
238
- : WindowAggregator(std::move(aggr), result_type, count) {
244
+ WindowCustomAggregator::WindowCustomAggregator(AggregateObject aggr, const LogicalType &result_type,
245
+ const WindowExcludeMode exclude_mode_p, idx_t count)
246
+ : WindowAggregator(std::move(aggr), result_type, exclude_mode_p, count) {
239
247
  }
240
248
 
241
249
  WindowCustomAggregator::~WindowCustomAggregator() {
@@ -243,27 +251,45 @@ WindowCustomAggregator::~WindowCustomAggregator() {
243
251
 
244
252
  class WindowCustomAggregatorState : public WindowAggregatorState {
245
253
  public:
246
- explicit WindowCustomAggregatorState(const AggregateObject &aggr, DataChunk &inputs);
254
+ WindowCustomAggregatorState(const AggregateObject &aggr, const WindowExcludeMode exclude_mode);
247
255
  ~WindowCustomAggregatorState() override;
248
256
 
249
257
  public:
250
258
  //! The aggregate function
251
259
  const AggregateObject &aggr;
252
- //! The aggregate function
253
- DataChunk &inputs;
254
260
  //! Data pointer that contains a single state, shared by all the custom evaluators
255
261
  vector<data_t> state;
256
262
  //! Reused result state container for the window functions
257
263
  Vector statef;
258
264
  //! The frame boundaries, used for the window functions
259
- FrameBounds frame;
265
+ SubFrames frames;
260
266
  };
261
267
 
262
- WindowCustomAggregatorState::WindowCustomAggregatorState(const AggregateObject &aggr, DataChunk &inputs)
263
- : aggr(aggr), inputs(inputs), state(aggr.function.state_size()),
264
- statef(Value::POINTER(CastPointerToValue(state.data()))), frame(0, 0) {
268
+ static void InitSubFrames(SubFrames &frames, const WindowExcludeMode exclude_mode) {
269
+ idx_t nframes = 0;
270
+ switch (exclude_mode) {
271
+ case WindowExcludeMode::NO_OTHER:
272
+ nframes = 1;
273
+ break;
274
+ case WindowExcludeMode::TIES:
275
+ nframes = 3;
276
+ break;
277
+ case WindowExcludeMode::CURRENT_ROW:
278
+ case WindowExcludeMode::GROUP:
279
+ nframes = 2;
280
+ break;
281
+ }
282
+ frames.resize(nframes, {0, 0});
283
+ }
284
+
285
+ WindowCustomAggregatorState::WindowCustomAggregatorState(const AggregateObject &aggr,
286
+ const WindowExcludeMode exclude_mode)
287
+ : aggr(aggr), state(aggr.function.state_size()), statef(Value::POINTER(CastPointerToValue(state.data()))),
288
+ frames(3, {0, 0}) {
265
289
  // if we have a frame-by-frame method, share the single state
266
290
  aggr.function.initialize(state.data());
291
+
292
+ InitSubFrames(frames, exclude_mode);
267
293
  }
268
294
 
269
295
  WindowCustomAggregatorState::~WindowCustomAggregatorState() {
@@ -273,45 +299,314 @@ WindowCustomAggregatorState::~WindowCustomAggregatorState() {
273
299
  }
274
300
  }
275
301
 
302
+ void WindowCustomAggregator::Finalize(const FrameStats &stats) {
303
+ WindowAggregator::Finalize(stats);
304
+ partition_input =
305
+ make_uniq<WindowPartitionInput>(inputs.data.data(), inputs.ColumnCount(), inputs.size(), filter_mask, stats);
306
+
307
+ if (aggr.function.window_init) {
308
+ gstate = GetLocalState();
309
+ auto &gcstate = gstate->Cast<WindowCustomAggregatorState>();
310
+
311
+ AggregateInputData aggr_input_data(aggr.GetFunctionData(), gcstate.allocator);
312
+ aggr.function.window_init(aggr_input_data, *partition_input, gcstate.state.data());
313
+ }
314
+ }
315
+
276
316
  unique_ptr<WindowAggregatorState> WindowCustomAggregator::GetLocalState() const {
277
- return make_uniq<WindowCustomAggregatorState>(aggr, const_cast<DataChunk &>(inputs));
317
+ return make_uniq<WindowCustomAggregatorState>(aggr, exclude_mode);
278
318
  }
279
319
 
280
- void WindowCustomAggregator::Evaluate(WindowAggregatorState &lstate, const idx_t *begins, const idx_t *ends,
281
- Vector &result, idx_t count) const {
282
- // TODO: window should take a const Vector*
283
- auto &lcstate = lstate.Cast<WindowCustomAggregatorState>();
284
- auto &frame = lcstate.frame;
285
- auto params = lcstate.inputs.data.data();
286
- auto &rmask = FlatVector::Validity(result);
287
- for (idx_t i = 0; i < count; ++i) {
288
- const auto begin = begins[i];
289
- const auto end = ends[i];
290
- if (begin >= end) {
291
- rmask.SetInvalid(i);
292
- continue;
320
+ template <typename OP>
321
+ static void EvaluateSubFrames(const DataChunk &bounds, const WindowExcludeMode exclude_mode, idx_t count, idx_t row_idx,
322
+ SubFrames &frames, OP operation) {
323
+ auto begins = FlatVector::GetData<const idx_t>(bounds.data[WINDOW_BEGIN]);
324
+ auto ends = FlatVector::GetData<const idx_t>(bounds.data[WINDOW_END]);
325
+ auto peer_begin = FlatVector::GetData<const idx_t>(bounds.data[PEER_BEGIN]);
326
+ auto peer_end = FlatVector::GetData<const idx_t>(bounds.data[PEER_END]);
327
+
328
+ for (idx_t i = 0, cur_row = row_idx; i < count; ++i, ++cur_row) {
329
+ idx_t nframes = 0;
330
+ if (exclude_mode == WindowExcludeMode::NO_OTHER) {
331
+ auto begin = begins[i];
332
+ auto end = ends[i];
333
+ frames[nframes++] = FrameBounds(begin, end);
334
+ } else {
335
+ // The frame_exclusion option allows rows around the current row to be excluded from the frame,
336
+ // even if they would be included according to the frame start and frame end options.
337
+ // EXCLUDE CURRENT ROW excludes the current row from the frame.
338
+ // EXCLUDE GROUP excludes the current row and its ordering peers from the frame.
339
+ // EXCLUDE TIES excludes any peers of the current row from the frame, but not the current row itself.
340
+ // EXCLUDE NO OTHERS simply specifies explicitly the default behavior
341
+ // of not excluding the current row or its peers.
342
+ // https://www.postgresql.org/docs/current/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS
343
+ //
344
+ // For the sake of the client, we make some guarantees about the subframes:
345
+ // * They are in order left-to-right
346
+ // * They do not intersect
347
+ // * start <= end
348
+ // * The number is always the same
349
+ //
350
+ // Since we always have peer_begin <= cur_row < cur_row + 1 <= peer_end
351
+ // this is not too hard to arrange, but it may be that some subframes are contiguous,
352
+ // and some are empty.
353
+
354
+ // WindowExcludePart::LEFT
355
+ auto begin = begins[i];
356
+ auto end = (exclude_mode == WindowExcludeMode::CURRENT_ROW) ? cur_row : peer_begin[i];
357
+ end = MaxValue(begin, end);
358
+ frames[nframes++] = FrameBounds(begin, end);
359
+
360
+ // with EXCLUDE TIES, in addition to the frame part right of the peer group's end,
361
+ // we also need to consider the current row
362
+ if (exclude_mode == WindowExcludeMode::TIES) {
363
+ frames[nframes++] = FrameBounds(cur_row, cur_row + 1);
364
+ }
365
+
366
+ // WindowExcludePart::RIGHT
367
+ end = ends[i];
368
+ begin = (exclude_mode == WindowExcludeMode::CURRENT_ROW) ? (cur_row + 1) : peer_end[i];
369
+ begin = MinValue(begin, end);
370
+ frames[nframes++] = FrameBounds(begin, end);
293
371
  }
294
372
 
295
- // Frame boundaries
296
- auto prev = frame;
297
- frame = FrameBounds(begin, end);
373
+ operation(i);
374
+ }
375
+ }
298
376
 
377
+ void WindowCustomAggregator::Evaluate(WindowAggregatorState &lstate, const DataChunk &bounds, Vector &result,
378
+ idx_t count, idx_t row_idx) const {
379
+ auto &lcstate = lstate.Cast<WindowCustomAggregatorState>();
380
+ auto &frames = lcstate.frames;
381
+ const_data_ptr_t gstate_p = nullptr;
382
+ if (gstate) {
383
+ auto &gcstate = gstate->Cast<WindowCustomAggregatorState>();
384
+ gstate_p = gcstate.state.data();
385
+ }
386
+
387
+ EvaluateSubFrames(bounds, exclude_mode, count, row_idx, frames, [&](idx_t i) {
299
388
  // Extract the range
300
389
  AggregateInputData aggr_input_data(aggr.GetFunctionData(), lstate.allocator);
301
- aggr.function.window(params, filter_mask, aggr_input_data, inputs.ColumnCount(), lcstate.state.data(), frame,
302
- prev, result, i, 0);
390
+ aggr.function.window(aggr_input_data, *partition_input, gstate_p, lcstate.state.data(), frames, result, i);
391
+ });
392
+ }
393
+
394
+ //===--------------------------------------------------------------------===//
395
+ // WindowNaiveAggregator
396
+ //===--------------------------------------------------------------------===//
397
+ WindowNaiveAggregator::WindowNaiveAggregator(AggregateObject aggr, const LogicalType &result_type,
398
+ const WindowExcludeMode exclude_mode_p, idx_t partition_count)
399
+ : WindowAggregator(std::move(aggr), result_type, exclude_mode_p, partition_count) {
400
+ }
401
+
402
+ WindowNaiveAggregator::~WindowNaiveAggregator() {
403
+ }
404
+
405
+ class WindowNaiveState : public WindowAggregatorState {
406
+ public:
407
+ struct HashRow {
408
+ explicit HashRow(WindowNaiveState &state) : state(state) {
409
+ }
410
+
411
+ size_t operator()(const idx_t &i) const {
412
+ return state.Hash(i);
413
+ }
414
+
415
+ WindowNaiveState &state;
416
+ };
417
+
418
+ struct EqualRow {
419
+ explicit EqualRow(WindowNaiveState &state) : state(state) {
420
+ }
421
+
422
+ bool operator()(const idx_t &lhs, const idx_t &rhs) const {
423
+ return state.KeyEqual(lhs, rhs);
424
+ }
425
+
426
+ WindowNaiveState &state;
427
+ };
428
+
429
+ using RowSet = std::unordered_set<idx_t, HashRow, EqualRow>;
430
+
431
+ explicit WindowNaiveState(const WindowNaiveAggregator &gstate);
432
+
433
+ void Evaluate(const DataChunk &bounds, Vector &result, idx_t count, idx_t row_idx);
434
+
435
+ protected:
436
+ //! Flush the accumulated intermediate states into the result states
437
+ void FlushStates();
438
+
439
+ //! Hashes a value for the hash table
440
+ size_t Hash(idx_t rid);
441
+ //! Compares two values for the hash table
442
+ bool KeyEqual(const idx_t &lhs, const idx_t &rhs);
443
+
444
+ //! The global state
445
+ const WindowNaiveAggregator &gstate;
446
+ //! Data pointer that contains a vector of states, used for row aggregation
447
+ vector<data_t> state;
448
+ //! Reused result state container for the aggregate
449
+ Vector statef;
450
+ //! A vector of pointers to "state", used for buffering intermediate aggregates
451
+ Vector statep;
452
+ //! Input data chunk, used for leaf segment aggregation
453
+ DataChunk leaves;
454
+ //! The rows beging updated.
455
+ SelectionVector update_sel;
456
+ //! Count of buffered values
457
+ idx_t flush_count;
458
+ //! The frame boundaries, used for EXCLUDE
459
+ SubFrames frames;
460
+ //! The optional hash table used for DISTINCT
461
+ Vector hashes;
462
+ HashRow hash_row;
463
+ EqualRow equal_row;
464
+ RowSet row_set;
465
+ };
466
+
467
+ WindowNaiveState::WindowNaiveState(const WindowNaiveAggregator &gstate)
468
+ : gstate(gstate), state(gstate.state_size * STANDARD_VECTOR_SIZE), statef(LogicalType::POINTER),
469
+ statep((LogicalType::POINTER)), flush_count(0), hashes(LogicalType::HASH), hash_row(*this), equal_row(*this),
470
+ row_set(STANDARD_VECTOR_SIZE, hash_row, equal_row) {
471
+ InitSubFrames(frames, gstate.exclude_mode);
472
+
473
+ auto &inputs = const_cast<DataChunk &>(gstate.GetInputs());
474
+ if (inputs.ColumnCount() > 0) {
475
+ leaves.Initialize(Allocator::DefaultAllocator(), inputs.GetTypes());
476
+ }
477
+
478
+ update_sel.Initialize();
479
+
480
+ // Build the finalise vector that just points to the result states
481
+ data_ptr_t state_ptr = state.data();
482
+ D_ASSERT(statef.GetVectorType() == VectorType::FLAT_VECTOR);
483
+ statef.SetVectorType(VectorType::CONSTANT_VECTOR);
484
+ statef.Flatten(STANDARD_VECTOR_SIZE);
485
+ auto fdata = FlatVector::GetData<data_ptr_t>(statef);
486
+ for (idx_t i = 0; i < STANDARD_VECTOR_SIZE; ++i) {
487
+ fdata[i] = state_ptr;
488
+ state_ptr += gstate.state_size;
303
489
  }
304
490
  }
305
491
 
492
+ void WindowNaiveState::FlushStates() {
493
+ if (!flush_count) {
494
+ return;
495
+ }
496
+
497
+ auto &inputs = const_cast<DataChunk &>(gstate.GetInputs());
498
+ leaves.Reference(inputs);
499
+ leaves.Slice(update_sel, flush_count);
500
+
501
+ auto &aggr = gstate.aggr;
502
+ AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator);
503
+ aggr.function.update(leaves.data.data(), aggr_input_data, leaves.ColumnCount(), statep, flush_count);
504
+
505
+ flush_count = 0;
506
+ }
507
+
508
+ size_t WindowNaiveState::Hash(idx_t rid) {
509
+ auto &inputs = const_cast<DataChunk &>(gstate.GetInputs());
510
+ leaves.Reference(inputs);
511
+
512
+ sel_t s = rid;
513
+ SelectionVector sel(&s);
514
+ leaves.Slice(sel, 1);
515
+ leaves.Hash(hashes);
516
+
517
+ return *FlatVector::GetData<hash_t>(hashes);
518
+ }
519
+
520
+ bool WindowNaiveState::KeyEqual(const idx_t &lhs, const idx_t &rhs) {
521
+ auto &inputs = const_cast<DataChunk &>(gstate.GetInputs());
522
+
523
+ sel_t l = lhs;
524
+ SelectionVector lsel(&l);
525
+
526
+ sel_t r = rhs;
527
+ SelectionVector rsel(&r);
528
+
529
+ sel_t f = 0;
530
+ SelectionVector fsel(&f);
531
+
532
+ for (auto &input : inputs.data) {
533
+ Vector left(input, lsel, 1);
534
+ Vector right(input, rsel, 1);
535
+ if (!VectorOperations::NotDistinctFrom(left, right, nullptr, 1, nullptr, &fsel)) {
536
+ return false;
537
+ }
538
+ }
539
+
540
+ return true;
541
+ }
542
+
543
+ void WindowNaiveState::Evaluate(const DataChunk &bounds, Vector &result, idx_t count, idx_t row_idx) {
544
+ auto &aggr = gstate.aggr;
545
+ auto &filter_mask = gstate.GetFilterMask();
546
+
547
+ auto fdata = FlatVector::GetData<data_ptr_t>(statef);
548
+ auto pdata = FlatVector::GetData<data_ptr_t>(statep);
549
+
550
+ EvaluateSubFrames(bounds, gstate.exclude_mode, count, row_idx, frames, [&](idx_t rid) {
551
+ auto agg_state = fdata[rid];
552
+ aggr.function.initialize(agg_state);
553
+
554
+ // Just update the aggregate with the unfiltered input rows
555
+ row_set.clear();
556
+ for (const auto &frame : frames) {
557
+ for (auto f = frame.start; f < frame.end; ++f) {
558
+ if (!filter_mask.RowIsValid(f)) {
559
+ continue;
560
+ }
561
+
562
+ // Filter out duplicates
563
+ if (aggr.IsDistinct() && !row_set.insert(f).second) {
564
+ continue;
565
+ }
566
+
567
+ pdata[flush_count] = agg_state;
568
+ update_sel[flush_count++] = f;
569
+ if (flush_count >= STANDARD_VECTOR_SIZE) {
570
+ FlushStates();
571
+ }
572
+ }
573
+ }
574
+ });
575
+
576
+ // Flush the final states
577
+ FlushStates();
578
+
579
+ // Finalise the result aggregates and write to the result
580
+ AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator);
581
+ aggr.function.finalize(statef, aggr_input_data, result, count, 0);
582
+
583
+ // Destruct the result aggregates
584
+ if (aggr.function.destructor) {
585
+ aggr.function.destructor(statef, aggr_input_data, count);
586
+ }
587
+ }
588
+
589
+ unique_ptr<WindowAggregatorState> WindowNaiveAggregator::GetLocalState() const {
590
+ return make_uniq<WindowNaiveState>(*this);
591
+ }
592
+
593
+ void WindowNaiveAggregator::Evaluate(WindowAggregatorState &lstate, const DataChunk &bounds, Vector &result,
594
+ idx_t count, idx_t row_idx) const {
595
+ auto &ldstate = lstate.Cast<WindowNaiveState>();
596
+ ldstate.Evaluate(bounds, result, count, row_idx);
597
+ }
598
+
306
599
  //===--------------------------------------------------------------------===//
307
600
  // WindowSegmentTree
308
601
  //===--------------------------------------------------------------------===//
309
- WindowSegmentTree::WindowSegmentTree(AggregateObject aggr, const LogicalType &result_type, idx_t count,
310
- WindowAggregationMode mode_p)
311
- : WindowAggregator(std::move(aggr), result_type, count), internal_nodes(0), mode(mode_p) {
602
+ WindowSegmentTree::WindowSegmentTree(AggregateObject aggr, const LogicalType &result_type, WindowAggregationMode mode_p,
603
+ const WindowExcludeMode exclude_mode_p, idx_t count)
604
+ : WindowAggregator(std::move(aggr), result_type, exclude_mode_p, count), internal_nodes(0), mode(mode_p) {
312
605
  }
313
606
 
314
- void WindowSegmentTree::Finalize() {
607
+ void WindowSegmentTree::Finalize(const FrameStats &stats) {
608
+ WindowAggregator::Finalize(stats);
609
+
315
610
  gstate = GetLocalState();
316
611
  if (inputs.ColumnCount() > 0) {
317
612
  if (aggr.function.combine && UseCombineAPI()) {
@@ -342,27 +637,56 @@ WindowSegmentTree::~WindowSegmentTree() {
342
637
  }
343
638
  }
344
639
 
345
- class WindowSegmentTreeState : public WindowAggregatorState {
640
+ class WindowSegmentTreePart {
346
641
  public:
347
- WindowSegmentTreeState(const AggregateObject &aggr, DataChunk &inputs, const ValidityMask &filter_mask);
348
- ~WindowSegmentTreeState() override;
642
+ //! Right side nodes need to be cached and processed in reverse order
643
+ using RightEntry = std::pair<idx_t, idx_t>;
644
+
645
+ enum FramePart : uint8_t { FULL = 0, LEFT = 1, RIGHT = 2 };
646
+
647
+ WindowSegmentTreePart(ArenaAllocator &allocator, const AggregateObject &aggr, DataChunk &inputs,
648
+ const ValidityMask &filter_mask);
649
+ ~WindowSegmentTreePart();
650
+
651
+ unique_ptr<WindowSegmentTreePart> Copy() const {
652
+ return make_uniq<WindowSegmentTreePart>(allocator, aggr, inputs, filter_mask);
653
+ }
349
654
 
350
655
  void FlushStates(bool combining);
351
656
  void ExtractFrame(idx_t begin, idx_t end, data_ptr_t current_state);
352
657
  void WindowSegmentValue(const WindowSegmentTree &tree, idx_t l_idx, idx_t begin, idx_t end,
353
658
  data_ptr_t current_state);
659
+ //! Writes result and calls destructors
354
660
  void Finalize(Vector &result, idx_t count);
355
661
 
662
+ void Combine(WindowSegmentTreePart &other, idx_t count);
663
+
664
+ void Evaluate(const WindowSegmentTree &tree, const idx_t *begins, const idx_t *ends, Vector &result, idx_t count,
665
+ idx_t row_idx, FramePart frame_part);
666
+
667
+ protected:
668
+ //! Initialises the accumulation state vector (statef)
669
+ void Initialize(idx_t count);
670
+ //! Accumulate upper tree levels
671
+ void EvaluateUpperLevels(const WindowSegmentTree &tree, const idx_t *begins, const idx_t *ends, idx_t count,
672
+ idx_t row_idx, FramePart frame_part);
673
+ void EvaluateLeaves(const WindowSegmentTree &tree, const idx_t *begins, const idx_t *ends, idx_t count,
674
+ idx_t row_idx, FramePart frame_part, FramePart leaf_part);
675
+
356
676
  public:
677
+ //! Allocator for aggregates
678
+ ArenaAllocator &allocator;
357
679
  //! The aggregate function
358
680
  const AggregateObject &aggr;
359
- //! The aggregate function
681
+ //! Order insensitive aggregate (we can optimise internal combines)
682
+ const bool order_insensitive;
683
+ //! The partition arguments
360
684
  DataChunk &inputs;
361
685
  //! The filtered rows in inputs
362
686
  const ValidityMask &filter_mask;
363
687
  //! The size of a single aggregate state
364
688
  const idx_t state_size;
365
- //! Data pointer that contains a single state, used for intermediate window segment aggregation
689
+ //! Data pointer that contains a vector of states, used for intermediate window segment aggregation
366
690
  vector<data_t> state;
367
691
  //! Input data chunk, used for leaf segment aggregation
368
692
  DataChunk leaves;
@@ -376,13 +700,34 @@ public:
376
700
  Vector statef;
377
701
  //! Count of buffered values
378
702
  idx_t flush_count;
703
+ //! Cache of right side tree ranges for ordered aggregates
704
+ vector<RightEntry> right_stack;
379
705
  };
380
706
 
381
- WindowSegmentTreeState::WindowSegmentTreeState(const AggregateObject &aggr, DataChunk &inputs,
382
- const ValidityMask &filter_mask)
383
- : aggr(aggr), inputs(inputs), filter_mask(filter_mask), state_size(aggr.function.state_size()),
384
- state(state_size * STANDARD_VECTOR_SIZE), statep(LogicalType::POINTER), statel(LogicalType::POINTER),
385
- statef(LogicalType::POINTER), flush_count(0) {
707
+ class WindowSegmentTreeState : public WindowAggregatorState {
708
+ public:
709
+ WindowSegmentTreeState(const AggregateObject &aggr, DataChunk &inputs, const ValidityMask &filter_mask)
710
+ : aggr(aggr), inputs(inputs), filter_mask(filter_mask), part(allocator, aggr, inputs, filter_mask) {
711
+ }
712
+
713
+ //! The aggregate function
714
+ const AggregateObject &aggr;
715
+ //! The aggregate function
716
+ DataChunk &inputs;
717
+ //! The filtered rows in inputs
718
+ const ValidityMask &filter_mask;
719
+ //! The left (default) segment tree part
720
+ WindowSegmentTreePart part;
721
+ //! The right segment tree part (for EXCLUDE)
722
+ unique_ptr<WindowSegmentTreePart> right_part;
723
+ };
724
+
725
+ WindowSegmentTreePart::WindowSegmentTreePart(ArenaAllocator &allocator, const AggregateObject &aggr, DataChunk &inputs,
726
+ const ValidityMask &filter_mask)
727
+ : allocator(allocator), aggr(aggr),
728
+ order_insensitive(aggr.function.order_dependent == AggregateOrderDependent::NOT_ORDER_DEPENDENT), inputs(inputs),
729
+ filter_mask(filter_mask), state_size(aggr.function.state_size()), state(state_size * STANDARD_VECTOR_SIZE),
730
+ statep(LogicalType::POINTER), statel(LogicalType::POINTER), statef(LogicalType::POINTER), flush_count(0) {
386
731
  if (inputs.ColumnCount() > 0) {
387
732
  leaves.Initialize(Allocator::DefaultAllocator(), inputs.GetTypes());
388
733
  filter_sel.Initialize();
@@ -400,14 +745,14 @@ WindowSegmentTreeState::WindowSegmentTreeState(const AggregateObject &aggr, Data
400
745
  }
401
746
  }
402
747
 
403
- WindowSegmentTreeState::~WindowSegmentTreeState() {
748
+ WindowSegmentTreePart::~WindowSegmentTreePart() {
404
749
  }
405
750
 
406
751
  unique_ptr<WindowAggregatorState> WindowSegmentTree::GetLocalState() const {
407
752
  return make_uniq<WindowSegmentTreeState>(aggr, const_cast<DataChunk &>(inputs), filter_mask);
408
753
  }
409
754
 
410
- void WindowSegmentTreeState::FlushStates(bool combining) {
755
+ void WindowSegmentTreePart::FlushStates(bool combining) {
411
756
  if (!flush_count) {
412
757
  return;
413
758
  }
@@ -425,7 +770,12 @@ void WindowSegmentTreeState::FlushStates(bool combining) {
425
770
  flush_count = 0;
426
771
  }
427
772
 
428
- void WindowSegmentTreeState::ExtractFrame(idx_t begin, idx_t end, data_ptr_t state_ptr) {
773
+ void WindowSegmentTreePart::Combine(WindowSegmentTreePart &other, idx_t count) {
774
+ AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator);
775
+ aggr.function.combine(other.statef, statef, aggr_input_data, count);
776
+ }
777
+
778
+ void WindowSegmentTreePart::ExtractFrame(idx_t begin, idx_t end, data_ptr_t state_ptr) {
429
779
  const auto count = end - begin;
430
780
 
431
781
  // If we are not filtering,
@@ -453,8 +803,8 @@ void WindowSegmentTreeState::ExtractFrame(idx_t begin, idx_t end, data_ptr_t sta
453
803
  }
454
804
  }
455
805
 
456
- void WindowSegmentTreeState::WindowSegmentValue(const WindowSegmentTree &tree, idx_t l_idx, idx_t begin, idx_t end,
457
- data_ptr_t state_ptr) {
806
+ void WindowSegmentTreePart::WindowSegmentValue(const WindowSegmentTree &tree, idx_t l_idx, idx_t begin, idx_t end,
807
+ data_ptr_t state_ptr) {
458
808
  D_ASSERT(begin <= end);
459
809
  if (begin == end || inputs.ColumnCount() == 0) {
460
810
  return;
@@ -479,8 +829,8 @@ void WindowSegmentTreeState::WindowSegmentValue(const WindowSegmentTree &tree, i
479
829
  }
480
830
  }
481
831
  }
482
- void WindowSegmentTreeState::Finalize(Vector &result, idx_t count) {
483
- // Finalise the result aggregates
832
+ void WindowSegmentTreePart::Finalize(Vector &result, idx_t count) {
833
+ // Finalise the result aggregates and write to result if write_result is set
484
834
  AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator);
485
835
  aggr.function.finalize(statef, aggr_input_data, result, count, 0);
486
836
 
@@ -494,7 +844,7 @@ void WindowSegmentTree::ConstructTree() {
494
844
  D_ASSERT(inputs.ColumnCount() > 0);
495
845
 
496
846
  // Use a temporary scan state to build the tree
497
- auto &gtstate = gstate->Cast<WindowSegmentTreeState>();
847
+ auto &gtstate = gstate->Cast<WindowSegmentTreeState>().part;
498
848
 
499
849
  // compute space required to store internal nodes of segment tree
500
850
  internal_nodes = 0;
@@ -533,51 +883,110 @@ void WindowSegmentTree::ConstructTree() {
533
883
  }
534
884
  }
535
885
 
536
- void WindowSegmentTree::Evaluate(WindowAggregatorState &lstate, const idx_t *begins, const idx_t *ends, Vector &result,
537
- idx_t count) const {
886
+ void WindowSegmentTree::Evaluate(WindowAggregatorState &lstate, const DataChunk &bounds, Vector &result, idx_t count,
887
+ idx_t row_idx) const {
888
+
538
889
  auto &ltstate = lstate.Cast<WindowSegmentTreeState>();
539
- const auto cant_combine = (!aggr.function.combine || !UseCombineAPI());
540
- auto fdata = FlatVector::GetData<data_ptr_t>(ltstate.statef);
890
+ auto window_begin = FlatVector::GetData<const idx_t>(bounds.data[WINDOW_BEGIN]);
891
+ auto window_end = FlatVector::GetData<const idx_t>(bounds.data[WINDOW_END]);
892
+ auto peer_begin = FlatVector::GetData<const idx_t>(bounds.data[PEER_BEGIN]);
893
+ auto peer_end = FlatVector::GetData<const idx_t>(bounds.data[PEER_END]);
894
+
895
+ auto &part = ltstate.part;
896
+ if (exclude_mode != WindowExcludeMode::NO_OTHER) {
897
+ // 1. evaluate the tree left of the excluded part
898
+ part.Evaluate(*this, window_begin, peer_begin, result, count, row_idx, WindowSegmentTreePart::LEFT);
899
+
900
+ // 2. set up a second state for the right of the excluded part
901
+ if (!ltstate.right_part) {
902
+ ltstate.right_part = part.Copy();
903
+ }
904
+ auto &right_part = *ltstate.right_part;
905
+
906
+ // 3. evaluate the tree right of the excluded part
907
+ right_part.Evaluate(*this, peer_end, window_end, result, count, row_idx, WindowSegmentTreePart::RIGHT);
908
+
909
+ // 4. combine the buffer state into the Segment Tree State
910
+ part.Combine(right_part, count);
911
+ } else {
912
+ part.Evaluate(*this, window_begin, window_end, result, count, row_idx, WindowSegmentTreePart::FULL);
913
+ }
914
+
915
+ part.Finalize(result, count);
916
+ }
917
+
918
+ void WindowSegmentTreePart::Evaluate(const WindowSegmentTree &tree, const idx_t *begins, const idx_t *ends,
919
+ Vector &result, idx_t count, idx_t row_idx, FramePart frame_part) {
920
+ D_ASSERT(aggr.function.combine && tree.UseCombineAPI());
921
+
922
+ Initialize(count);
923
+
924
+ if (order_insensitive) {
925
+ // First pass: aggregate the segment tree nodes with sharing
926
+ EvaluateUpperLevels(tree, begins, ends, count, row_idx, frame_part);
927
+
928
+ // Second pass: aggregate the ragged leaves
929
+ EvaluateLeaves(tree, begins, ends, count, row_idx, frame_part, FramePart::FULL);
930
+ } else {
931
+ // Evaluate leaves in order
932
+ EvaluateLeaves(tree, begins, ends, count, row_idx, frame_part, FramePart::LEFT);
933
+ EvaluateUpperLevels(tree, begins, ends, count, row_idx, frame_part);
934
+ EvaluateLeaves(tree, begins, ends, count, row_idx, frame_part, FramePart::RIGHT);
935
+ }
936
+ }
937
+
938
+ void WindowSegmentTreePart::Initialize(idx_t count) {
939
+ auto fdata = FlatVector::GetData<data_ptr_t>(statef);
940
+ for (idx_t rid = 0; rid < count; ++rid) {
941
+ auto state_ptr = fdata[rid];
942
+ aggr.function.initialize(state_ptr);
943
+ }
944
+ }
945
+
946
+ void WindowSegmentTreePart::EvaluateUpperLevels(const WindowSegmentTree &tree, const idx_t *begins, const idx_t *ends,
947
+ idx_t count, idx_t row_idx, FramePart frame_part) {
948
+ auto fdata = FlatVector::GetData<data_ptr_t>(statef);
949
+
950
+ const auto exclude_mode = tree.exclude_mode;
951
+ const bool begin_on_curr_row = frame_part == FramePart::RIGHT && exclude_mode == WindowExcludeMode::CURRENT_ROW;
952
+ const bool end_on_curr_row = frame_part == FramePart::LEFT && exclude_mode == WindowExcludeMode::CURRENT_ROW;
953
+
954
+ const auto max_level = tree.levels_flat_start.size() + 1;
955
+ right_stack.resize(max_level, {0, 0});
541
956
 
542
- // First pass: aggregate the segment tree nodes
543
957
  // Share adjacent identical states
544
958
  // We do this first because we want to share only tree aggregations
545
959
  idx_t prev_begin = 1;
546
960
  idx_t prev_end = 0;
547
- auto ldata = FlatVector::GetData<data_ptr_t>(ltstate.statel);
548
- auto pdata = FlatVector::GetData<data_ptr_t>(ltstate.statep);
961
+ auto ldata = FlatVector::GetData<data_ptr_t>(statel);
962
+ auto pdata = FlatVector::GetData<data_ptr_t>(statep);
549
963
  data_ptr_t prev_state = nullptr;
550
- for (idx_t rid = 0; rid < count; ++rid) {
964
+ for (idx_t rid = 0, cur_row = row_idx; rid < count; ++rid, ++cur_row) {
551
965
  auto state_ptr = fdata[rid];
552
- aggr.function.initialize(state_ptr);
553
-
554
- if (cant_combine) {
555
- // Make sure we initialise all states
556
- continue;
557
- }
558
966
 
559
- auto begin = begins[rid];
560
- auto end = ends[rid];
967
+ auto begin = begin_on_curr_row ? cur_row + 1 : begins[rid];
968
+ auto end = end_on_curr_row ? cur_row : ends[rid];
561
969
  if (begin >= end) {
562
970
  continue;
563
971
  }
564
972
 
565
973
  // Skip level 0
566
974
  idx_t l_idx = 0;
567
- for (; l_idx < levels_flat_start.size() + 1; l_idx++) {
568
- idx_t parent_begin = begin / TREE_FANOUT;
569
- idx_t parent_end = end / TREE_FANOUT;
975
+ idx_t right_max = 0;
976
+ for (; l_idx < max_level; l_idx++) {
977
+ idx_t parent_begin = begin / tree.TREE_FANOUT;
978
+ idx_t parent_end = end / tree.TREE_FANOUT;
570
979
  if (prev_state && l_idx == 1 && begin == prev_begin && end == prev_end) {
571
980
  // Just combine the previous top level result
572
- ldata[ltstate.flush_count] = prev_state;
573
- pdata[ltstate.flush_count] = state_ptr;
574
- if (++ltstate.flush_count >= STANDARD_VECTOR_SIZE) {
575
- ltstate.FlushStates(true);
981
+ ldata[flush_count] = prev_state;
982
+ pdata[flush_count] = state_ptr;
983
+ if (++flush_count >= STANDARD_VECTOR_SIZE) {
984
+ FlushStates(true);
576
985
  }
577
986
  break;
578
987
  }
579
988
 
580
- if (l_idx == 1) {
989
+ if (order_insensitive && l_idx == 1) {
581
990
  prev_state = state_ptr;
582
991
  prev_begin = begin;
583
992
  prev_end = end;
@@ -585,72 +994,507 @@ void WindowSegmentTree::Evaluate(WindowAggregatorState &lstate, const idx_t *beg
585
994
 
586
995
  if (parent_begin == parent_end) {
587
996
  if (l_idx) {
588
- ltstate.WindowSegmentValue(*this, l_idx, begin, end, state_ptr);
997
+ WindowSegmentValue(tree, l_idx, begin, end, state_ptr);
589
998
  }
590
999
  break;
591
1000
  }
592
- idx_t group_begin = parent_begin * TREE_FANOUT;
1001
+ idx_t group_begin = parent_begin * tree.TREE_FANOUT;
593
1002
  if (begin != group_begin) {
594
1003
  if (l_idx) {
595
- ltstate.WindowSegmentValue(*this, l_idx, begin, group_begin + TREE_FANOUT, state_ptr);
1004
+ WindowSegmentValue(tree, l_idx, begin, group_begin + tree.TREE_FANOUT, state_ptr);
596
1005
  }
597
1006
  parent_begin++;
598
1007
  }
599
- idx_t group_end = parent_end * TREE_FANOUT;
1008
+ idx_t group_end = parent_end * tree.TREE_FANOUT;
600
1009
  if (end != group_end) {
601
1010
  if (l_idx) {
602
- ltstate.WindowSegmentValue(*this, l_idx, group_end, end, state_ptr);
1011
+ if (order_insensitive) {
1012
+ WindowSegmentValue(tree, l_idx, group_end, end, state_ptr);
1013
+ } else {
1014
+ right_stack[l_idx] = {group_end, end};
1015
+ right_max = l_idx;
1016
+ }
603
1017
  }
604
1018
  }
605
1019
  begin = parent_begin;
606
1020
  end = parent_end;
607
1021
  }
1022
+
1023
+ // Flush the right side values from left to right for order_sensitive aggregates
1024
+ // As we go up the tree, the right side ranges move left,
1025
+ // so we just cache them in a fixed size, preallocated array.
1026
+ // Then we can just reverse scan the array and append the cached ranges.
1027
+ for (l_idx = right_max; l_idx > 0; --l_idx) {
1028
+ auto &right_entry = right_stack[l_idx];
1029
+ const auto group_end = right_entry.first;
1030
+ const auto end = right_entry.second;
1031
+ if (end) {
1032
+ WindowSegmentValue(tree, l_idx, group_end, end, state_ptr);
1033
+ right_entry = {0, 0};
1034
+ }
1035
+ }
608
1036
  }
609
- ltstate.FlushStates(true);
1037
+ FlushStates(true);
1038
+ }
610
1039
 
611
- // Second pass: aggregate the ragged leaves
612
- // (or everything if we can't combine)
613
- for (idx_t rid = 0; rid < count; ++rid) {
1040
+ void WindowSegmentTreePart::EvaluateLeaves(const WindowSegmentTree &tree, const idx_t *begins, const idx_t *ends,
1041
+ idx_t count, idx_t row_idx, FramePart frame_part, FramePart leaf_part) {
1042
+
1043
+ auto fdata = FlatVector::GetData<data_ptr_t>(statef);
1044
+
1045
+ // For order-sensitive aggregates, we have to process the ragged leaves in two pieces.
1046
+ // The left side have to be added before the main tree followed by the ragged right sides.
1047
+ // The current row is the leftmost value of the right hand side.
1048
+ const bool compute_left = leaf_part != FramePart::RIGHT;
1049
+ const bool compute_right = leaf_part != FramePart::LEFT;
1050
+ const auto exclude_mode = tree.exclude_mode;
1051
+ const bool begin_on_curr_row = frame_part == FramePart::RIGHT && exclude_mode == WindowExcludeMode::CURRENT_ROW;
1052
+ const bool end_on_curr_row = frame_part == FramePart::LEFT && exclude_mode == WindowExcludeMode::CURRENT_ROW;
1053
+ // with EXCLUDE TIES, in addition to the frame part right of the peer group's end, we also need to consider the
1054
+ // current row
1055
+ const bool add_curr_row = compute_left && frame_part == FramePart::RIGHT && exclude_mode == WindowExcludeMode::TIES;
1056
+
1057
+ for (idx_t rid = 0, cur_row = row_idx; rid < count; ++rid, ++cur_row) {
614
1058
  auto state_ptr = fdata[rid];
615
1059
 
616
- const auto begin = begins[rid];
617
- const auto end = ends[rid];
1060
+ const auto begin = begin_on_curr_row ? cur_row + 1 : begins[rid];
1061
+ const auto end = end_on_curr_row ? cur_row : ends[rid];
1062
+ if (add_curr_row) {
1063
+ WindowSegmentValue(tree, 0, cur_row, cur_row + 1, state_ptr);
1064
+ }
618
1065
  if (begin >= end) {
619
1066
  continue;
620
1067
  }
621
1068
 
622
- // Aggregate everything at once if we can't combine states
623
- idx_t parent_begin = begin / TREE_FANOUT;
624
- idx_t parent_end = end / TREE_FANOUT;
625
- if (parent_begin == parent_end || cant_combine) {
626
- ltstate.WindowSegmentValue(*this, 0, begin, end, state_ptr);
1069
+ idx_t parent_begin = begin / tree.TREE_FANOUT;
1070
+ idx_t parent_end = end / tree.TREE_FANOUT;
1071
+ if (parent_begin == parent_end) {
1072
+ if (compute_left) {
1073
+ WindowSegmentValue(tree, 0, begin, end, state_ptr);
1074
+ }
627
1075
  continue;
628
1076
  }
629
1077
 
630
- idx_t group_begin = parent_begin * TREE_FANOUT;
631
- if (begin != group_begin) {
632
- ltstate.WindowSegmentValue(*this, 0, begin, group_begin + TREE_FANOUT, state_ptr);
633
- parent_begin++;
1078
+ idx_t group_begin = parent_begin * tree.TREE_FANOUT;
1079
+ if (begin != group_begin && compute_left) {
1080
+ WindowSegmentValue(tree, 0, begin, group_begin + tree.TREE_FANOUT, state_ptr);
634
1081
  }
635
- idx_t group_end = parent_end * TREE_FANOUT;
636
- if (end != group_end) {
637
- ltstate.WindowSegmentValue(*this, 0, group_end, end, state_ptr);
1082
+ idx_t group_end = parent_end * tree.TREE_FANOUT;
1083
+ if (end != group_end && compute_right) {
1084
+ WindowSegmentValue(tree, 0, group_end, end, state_ptr);
638
1085
  }
639
1086
  }
640
- ltstate.FlushStates(false);
1087
+ FlushStates(false);
1088
+ }
641
1089
 
642
- ltstate.Finalize(result, count);
1090
+ //===--------------------------------------------------------------------===//
1091
+ // WindowDistinctAggregator
1092
+ //===--------------------------------------------------------------------===//
1093
+ WindowDistinctAggregator::WindowDistinctAggregator(AggregateObject aggr, const LogicalType &result_type,
1094
+ const WindowExcludeMode exclude_mode_p, idx_t count,
1095
+ ClientContext &context)
1096
+ : WindowAggregator(std::move(aggr), result_type, exclude_mode_p, count), context(context),
1097
+ allocator(Allocator::DefaultAllocator()) {
1098
+
1099
+ payload_types.emplace_back(LogicalType::UBIGINT);
1100
+ payload_chunk.Initialize(Allocator::DefaultAllocator(), payload_types);
1101
+ }
643
1102
 
644
- // Set the validity mask on the invalid rows
645
- auto &rmask = FlatVector::Validity(result);
646
- for (idx_t rid = 0; rid < count; ++rid) {
647
- const auto begin = begins[rid];
648
- const auto end = ends[rid];
1103
+ WindowDistinctAggregator::~WindowDistinctAggregator() {
1104
+ if (!aggr.function.destructor) {
1105
+ // nothing to destroy
1106
+ return;
1107
+ }
1108
+ AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator);
1109
+ // call the destructor for all the intermediate states
1110
+ data_ptr_t address_data[STANDARD_VECTOR_SIZE];
1111
+ Vector addresses(LogicalType::POINTER, data_ptr_cast(address_data));
1112
+ idx_t count = 0;
1113
+ for (idx_t i = 0; i < internal_nodes; i++) {
1114
+ address_data[count++] = data_ptr_t(levels_flat_native.get() + i * state_size);
1115
+ if (count == STANDARD_VECTOR_SIZE) {
1116
+ aggr.function.destructor(addresses, aggr_input_data, count);
1117
+ count = 0;
1118
+ }
1119
+ }
1120
+ if (count > 0) {
1121
+ aggr.function.destructor(addresses, aggr_input_data, count);
1122
+ }
1123
+ }
649
1124
 
650
- if (begin >= end) {
651
- rmask.SetInvalid(rid);
1125
+ void WindowDistinctAggregator::Sink(DataChunk &arg_chunk, SelectionVector *filter_sel, idx_t filtered) {
1126
+ WindowAggregator::Sink(arg_chunk, filter_sel, filtered);
1127
+
1128
+ // We sort the arguments and use the partition index as a tie-breaker.
1129
+ // TODO: Use a hash table?
1130
+ if (!global_sort) {
1131
+ // 1: functionComputePrevIdcs(𝑖𝑛)
1132
+ // 2: sorted ← []
1133
+ vector<LogicalType> sort_types;
1134
+ for (const auto &col : arg_chunk.data) {
1135
+ sort_types.emplace_back(col.GetType());
1136
+ }
1137
+
1138
+ for (const auto &type : payload_types) {
1139
+ sort_types.emplace_back(type);
1140
+ }
1141
+
1142
+ vector<BoundOrderByNode> orders;
1143
+ for (const auto &type : sort_types) {
1144
+ auto expr = make_uniq<BoundConstantExpression>(Value(type));
1145
+ orders.emplace_back(BoundOrderByNode(OrderType::ASCENDING, OrderByNullType::NULLS_FIRST, std::move(expr)));
1146
+ }
1147
+
1148
+ RowLayout payload_layout;
1149
+ payload_layout.Initialize(payload_types);
1150
+
1151
+ global_sort = make_uniq<GlobalSortState>(BufferManager::GetBufferManager(context), orders, payload_layout);
1152
+ local_sort.Initialize(*global_sort, global_sort->buffer_manager);
1153
+
1154
+ sort_chunk.Initialize(Allocator::DefaultAllocator(), sort_types);
1155
+ sort_chunk.data.back().Reference(payload_chunk.data[0]);
1156
+ payload_pos = 0;
1157
+ memory_per_thread = PhysicalOperator::GetMaxThreadMemory(context);
1158
+ }
1159
+
1160
+ // 3: for i ← 0 to in.size do
1161
+ // 4: sorted[i] ← (in[i], i)
1162
+ const auto count = arg_chunk.size();
1163
+ auto payload_data = FlatVector::GetData<idx_t>(payload_chunk.data[0]);
1164
+ std::iota(payload_data, payload_data + count, payload_pos);
1165
+ payload_pos += count;
1166
+
1167
+ for (column_t c = 0; c < arg_chunk.ColumnCount(); ++c) {
1168
+ sort_chunk.data[c].Reference(arg_chunk.data[c]);
1169
+ }
1170
+ sort_chunk.SetCardinality(arg_chunk);
1171
+ payload_chunk.SetCardinality(sort_chunk);
1172
+
1173
+ // Apply FILTER clause, if any
1174
+ if (filter_sel) {
1175
+ sort_chunk.Slice(*filter_sel, filtered);
1176
+ payload_chunk.Slice(*filter_sel, filtered);
1177
+ }
1178
+
1179
+ local_sort.SinkChunk(sort_chunk, payload_chunk);
1180
+
1181
+ if (local_sort.SizeInBytes() > memory_per_thread) {
1182
+ local_sort.Sort(*global_sort, true);
1183
+ }
1184
+ }
1185
+
1186
+ class WindowDistinctAggregator::DistinctSortTree : public MergeSortTree<idx_t, idx_t> {
1187
+ public:
1188
+ // prev_idx, input_idx
1189
+ using ZippedTuple = std::tuple<idx_t, idx_t>;
1190
+ using ZippedElements = vector<ZippedTuple>;
1191
+
1192
+ DistinctSortTree(ZippedElements &&prev_idcs, WindowDistinctAggregator &wda);
1193
+ };
1194
+
1195
+ void WindowDistinctAggregator::Finalize(const FrameStats &stats) {
1196
+ // 5: Sort sorted lexicographically increasing
1197
+ global_sort->AddLocalState(local_sort);
1198
+ global_sort->PrepareMergePhase();
1199
+ while (global_sort->sorted_blocks.size() > 1) {
1200
+ global_sort->InitializeMergeRound();
1201
+ MergeSorter merge_sorter(*global_sort, global_sort->buffer_manager);
1202
+ merge_sorter.PerformInMergeRound();
1203
+ global_sort->CompleteMergeRound(true);
1204
+ }
1205
+
1206
+ DataChunk scan_chunk;
1207
+ scan_chunk.Initialize(Allocator::DefaultAllocator(), payload_types);
1208
+
1209
+ auto scanner = make_uniq<PayloadScanner>(*global_sort);
1210
+ const auto in_size = scanner->Remaining();
1211
+ scanner->Scan(scan_chunk);
1212
+ idx_t scan_idx = 0;
1213
+
1214
+ // 6: prevIdcs ← []
1215
+ // 7: prevIdcs[0] ← “-”
1216
+ const auto count = inputs.size();
1217
+ using ZippedTuple = DistinctSortTree::ZippedTuple;
1218
+ DistinctSortTree::ZippedElements prev_idcs;
1219
+ prev_idcs.resize(count);
1220
+
1221
+ // To handle FILTER clauses we make the missing elements
1222
+ // point to themselves so they won't be counted.
1223
+ if (in_size < count) {
1224
+ for (idx_t i = 0; i < count; ++i) {
1225
+ prev_idcs[i] = ZippedTuple(i + 1, i);
1226
+ }
1227
+ }
1228
+
1229
+ auto *input_idx = FlatVector::GetData<idx_t>(scan_chunk.data[0]);
1230
+ auto i = input_idx[scan_idx++];
1231
+ prev_idcs[i] = ZippedTuple(0, i);
1232
+
1233
+ SBIterator curr(*global_sort, ExpressionType::COMPARE_LESSTHAN);
1234
+ SBIterator prev(*global_sort, ExpressionType::COMPARE_LESSTHAN);
1235
+ auto prefix_layout = global_sort->sort_layout.GetPrefixComparisonLayout(sort_chunk.ColumnCount() - 1);
1236
+
1237
+ // 8: for i ← 1 to in.size do
1238
+ for (++curr; curr.GetIndex() < in_size; ++curr, ++prev) {
1239
+ // Scan second one chunk at a time
1240
+ // Note the scan is one behind the iterators
1241
+ if (scan_idx >= scan_chunk.size()) {
1242
+ scan_chunk.Reset();
1243
+ scanner->Scan(scan_chunk);
1244
+ scan_idx = 0;
1245
+ input_idx = FlatVector::GetData<idx_t>(scan_chunk.data[0]);
1246
+ }
1247
+ auto second = i;
1248
+ i = input_idx[scan_idx++];
1249
+
1250
+ int lt = 0;
1251
+ if (prefix_layout.all_constant) {
1252
+ lt = FastMemcmp(prev.entry_ptr, curr.entry_ptr, prefix_layout.comparison_size);
1253
+ } else {
1254
+ lt = Comparators::CompareTuple(prev.scan, curr.scan, prev.entry_ptr, curr.entry_ptr, prefix_layout,
1255
+ prev.external);
1256
+ }
1257
+
1258
+ // 9: if sorted[i].first == sorted[i-1].first then
1259
+ // 10: prevIdcs[i] ← sorted[i-1].second
1260
+ // 11: else
1261
+ // 12: prevIdcs[i] ← “-”
1262
+ if (!lt) {
1263
+ prev_idcs[i] = ZippedTuple(second + 1, i);
1264
+ } else {
1265
+ prev_idcs[i] = ZippedTuple(0, i);
1266
+ }
1267
+ }
1268
+ // 13: return prevIdcs
1269
+
1270
+ merge_sort_tree = make_uniq<DistinctSortTree>(std::move(prev_idcs), *this);
1271
+ }
1272
+
1273
+ WindowDistinctAggregator::DistinctSortTree::DistinctSortTree(ZippedElements &&prev_idcs,
1274
+ WindowDistinctAggregator &wda) {
1275
+ auto &inputs = wda.inputs;
1276
+ auto &aggr = wda.aggr;
1277
+ auto &allocator = wda.allocator;
1278
+ const auto state_size = wda.state_size;
1279
+ auto &internal_nodes = wda.internal_nodes;
1280
+ auto &levels_flat_native = wda.levels_flat_native;
1281
+ auto &levels_flat_start = wda.levels_flat_start;
1282
+
1283
+ //! Input data chunk, used for leaf segment aggregation
1284
+ DataChunk leaves;
1285
+ leaves.Initialize(Allocator::DefaultAllocator(), inputs.GetTypes());
1286
+ SelectionVector sel;
1287
+ sel.Initialize();
1288
+
1289
+ AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator);
1290
+
1291
+ //! The states to update
1292
+ Vector update_v(LogicalType::POINTER);
1293
+ auto updates = FlatVector::GetData<data_ptr_t>(update_v);
1294
+ idx_t nupdate = 0;
1295
+
1296
+ Vector source_v(LogicalType::POINTER);
1297
+ auto sources = FlatVector::GetData<data_ptr_t>(source_v);
1298
+ Vector target_v(LogicalType::POINTER);
1299
+ auto targets = FlatVector::GetData<data_ptr_t>(target_v);
1300
+ idx_t ncombine = 0;
1301
+
1302
+ // compute space required to store aggregation states of merge sort tree
1303
+ // this is one aggregate state per entry per level
1304
+ MergeSortTree<ZippedTuple> zipped_tree(std::move(prev_idcs));
1305
+ internal_nodes = 0;
1306
+ for (idx_t level_nr = 0; level_nr < zipped_tree.tree.size(); ++level_nr) {
1307
+ internal_nodes += zipped_tree.tree[level_nr].first.size();
1308
+ }
1309
+ levels_flat_native = make_unsafe_uniq_array<data_t>(internal_nodes * state_size);
1310
+ levels_flat_start.push_back(0);
1311
+ idx_t levels_flat_offset = 0;
1312
+
1313
+ // Walk the distinct value tree building the intermediate aggregates
1314
+ tree.reserve(zipped_tree.tree.size());
1315
+ idx_t level_width = 1;
1316
+ for (idx_t level_nr = 0; level_nr < zipped_tree.tree.size(); ++level_nr) {
1317
+ auto &zipped_level = zipped_tree.tree[level_nr].first;
1318
+ vector<ElementType> level;
1319
+ level.reserve(zipped_level.size());
1320
+
1321
+ for (idx_t i = 0; i < zipped_level.size(); i += level_width) {
1322
+ // Reset the combine state
1323
+ data_ptr_t prev_state = nullptr;
1324
+ auto next_limit = MinValue<idx_t>(zipped_level.size(), i + level_width);
1325
+ for (auto j = i; j < next_limit; ++j) {
1326
+ // Initialise the next aggregate
1327
+ auto curr_state = levels_flat_native.get() + (levels_flat_offset++ * state_size);
1328
+ aggr.function.initialize(curr_state);
1329
+
1330
+ // Update this state (if it matches)
1331
+ const auto prev_idx = std::get<0>(zipped_level[j]);
1332
+ level.emplace_back(prev_idx);
1333
+ if (prev_idx < i + 1) {
1334
+ updates[nupdate] = curr_state;
1335
+ // input_idx
1336
+ sel[nupdate] = std::get<1>(zipped_level[j]);
1337
+ ++nupdate;
1338
+ }
1339
+
1340
+ // Merge the previous state (if any)
1341
+ if (prev_state) {
1342
+ sources[ncombine] = prev_state;
1343
+ targets[ncombine] = curr_state;
1344
+ ++ncombine;
1345
+ }
1346
+ prev_state = curr_state;
1347
+
1348
+ // Flush the states if one is maxed out.
1349
+ if (MaxValue<idx_t>(ncombine, nupdate) >= STANDARD_VECTOR_SIZE) {
1350
+ // Push the updates first so they propagate
1351
+ leaves.Reference(inputs);
1352
+ leaves.Slice(sel, nupdate);
1353
+ aggr.function.update(leaves.data.data(), aggr_input_data, leaves.ColumnCount(), update_v, nupdate);
1354
+ nupdate = 0;
1355
+
1356
+ // Combine the states sequentially
1357
+ aggr.function.combine(source_v, target_v, aggr_input_data, ncombine);
1358
+ ncombine = 0;
1359
+ }
1360
+ }
652
1361
  }
1362
+
1363
+ tree.emplace_back(std::move(level), std::move(zipped_tree.tree[level_nr].second));
1364
+
1365
+ levels_flat_start.push_back(levels_flat_offset);
1366
+ level_width *= FANOUT;
1367
+ }
1368
+
1369
+ // Flush any remaining states
1370
+ if (ncombine || nupdate) {
1371
+ // Push the updates
1372
+ leaves.Reference(inputs);
1373
+ leaves.Slice(sel, nupdate);
1374
+ aggr.function.update(leaves.data.data(), aggr_input_data, leaves.ColumnCount(), update_v, nupdate);
1375
+ nupdate = 0;
1376
+
1377
+ // Combine the states sequentially
1378
+ aggr.function.combine(source_v, target_v, aggr_input_data, ncombine);
1379
+ ncombine = 0;
1380
+ }
1381
+ }
1382
+
1383
+ class WindowDistinctState : public WindowAggregatorState {
1384
+ public:
1385
+ WindowDistinctState(const AggregateObject &aggr, DataChunk &inputs, const WindowDistinctAggregator &tree);
1386
+
1387
+ void Evaluate(const DataChunk &bounds, Vector &result, idx_t count, idx_t row_idx);
1388
+
1389
+ protected:
1390
+ //! Flush the accumulated intermediate states into the result states
1391
+ void FlushStates();
1392
+
1393
+ //! The aggregate function
1394
+ const AggregateObject &aggr;
1395
+ //! The aggregate function
1396
+ DataChunk &inputs;
1397
+ //! The merge sort tree data
1398
+ const WindowDistinctAggregator &tree;
1399
+ //! The size of a single aggregate state
1400
+ const idx_t state_size;
1401
+ //! Data pointer that contains a vector of states, used for row aggregation
1402
+ vector<data_t> state;
1403
+ //! Reused result state container for the window functions
1404
+ Vector statef;
1405
+ //! A vector of pointers to "state", used for buffering intermediate aggregates
1406
+ Vector statep;
1407
+ //! Reused state pointers for combining tree elements
1408
+ Vector statel;
1409
+ //! Count of buffered values
1410
+ idx_t flush_count;
1411
+ //! The frame boundaries, used for the window functions
1412
+ SubFrames frames;
1413
+ };
1414
+
1415
+ WindowDistinctState::WindowDistinctState(const AggregateObject &aggr, DataChunk &inputs,
1416
+ const WindowDistinctAggregator &tree)
1417
+ : aggr(aggr), inputs(inputs), tree(tree), state_size(aggr.function.state_size()),
1418
+ state((state_size * STANDARD_VECTOR_SIZE)), statef(LogicalType::POINTER), statep(LogicalType::POINTER),
1419
+ statel(LogicalType::POINTER), flush_count(0) {
1420
+ InitSubFrames(frames, tree.exclude_mode);
1421
+
1422
+ // Build the finalise vector that just points to the result states
1423
+ data_ptr_t state_ptr = state.data();
1424
+ D_ASSERT(statef.GetVectorType() == VectorType::FLAT_VECTOR);
1425
+ statef.SetVectorType(VectorType::CONSTANT_VECTOR);
1426
+ statef.Flatten(STANDARD_VECTOR_SIZE);
1427
+ auto fdata = FlatVector::GetData<data_ptr_t>(statef);
1428
+ for (idx_t i = 0; i < STANDARD_VECTOR_SIZE; ++i) {
1429
+ fdata[i] = state_ptr;
1430
+ state_ptr += state_size;
1431
+ }
1432
+ }
1433
+
1434
+ void WindowDistinctState::FlushStates() {
1435
+ if (!flush_count) {
1436
+ return;
653
1437
  }
1438
+
1439
+ AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator);
1440
+ statel.Verify(flush_count);
1441
+ aggr.function.combine(statel, statep, aggr_input_data, flush_count);
1442
+
1443
+ flush_count = 0;
1444
+ }
1445
+
1446
+ void WindowDistinctState::Evaluate(const DataChunk &bounds, Vector &result, idx_t count, idx_t row_idx) {
1447
+ auto fdata = FlatVector::GetData<data_ptr_t>(statef);
1448
+ auto ldata = FlatVector::GetData<data_ptr_t>(statel);
1449
+ auto pdata = FlatVector::GetData<data_ptr_t>(statep);
1450
+
1451
+ const auto &merge_sort_tree = *tree.merge_sort_tree;
1452
+ const auto running_aggs = tree.levels_flat_native.get();
1453
+
1454
+ EvaluateSubFrames(bounds, tree.exclude_mode, count, row_idx, frames, [&](idx_t rid) {
1455
+ auto agg_state = fdata[rid];
1456
+ aggr.function.initialize(agg_state);
1457
+
1458
+ // TODO: Extend AggregateLowerBound to handle subframes, just like SelectNth.
1459
+ const auto lower = frames[0].start;
1460
+ const auto upper = frames[0].end;
1461
+ merge_sort_tree.AggregateLowerBound(lower, upper, lower + 1,
1462
+ [&](idx_t level, const idx_t run_begin, const idx_t run_pos) {
1463
+ if (run_pos != run_begin) {
1464
+ // Find the source aggregate
1465
+ // Buffer a merge of the indicated state into the current state
1466
+ const auto agg_idx = tree.levels_flat_start[level] + run_pos - 1;
1467
+ const auto running_agg = running_aggs + agg_idx * state_size;
1468
+ pdata[flush_count] = agg_state;
1469
+ ldata[flush_count++] = running_agg;
1470
+ if (flush_count >= STANDARD_VECTOR_SIZE) {
1471
+ FlushStates();
1472
+ }
1473
+ }
1474
+ });
1475
+ });
1476
+
1477
+ // Flush the final states
1478
+ FlushStates();
1479
+
1480
+ // Finalise the result aggregates and write to the result
1481
+ AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator);
1482
+ aggr.function.finalize(statef, aggr_input_data, result, count, 0);
1483
+
1484
+ // Destruct the result aggregates
1485
+ if (aggr.function.destructor) {
1486
+ aggr.function.destructor(statef, aggr_input_data, count);
1487
+ }
1488
+ }
1489
+
1490
+ unique_ptr<WindowAggregatorState> WindowDistinctAggregator::GetLocalState() const {
1491
+ return make_uniq<WindowDistinctState>(aggr, const_cast<DataChunk &>(inputs), *this);
1492
+ }
1493
+
1494
+ void WindowDistinctAggregator::Evaluate(WindowAggregatorState &lstate, const DataChunk &bounds, Vector &result,
1495
+ idx_t count, idx_t row_idx) const {
1496
+ auto &ldstate = lstate.Cast<WindowDistinctState>();
1497
+ ldstate.Evaluate(bounds, result, count, row_idx);
654
1498
  }
655
1499
 
656
1500
  } // namespace duckdb