duckdb 0.8.2-dev157.0 → 0.8.2-dev1573.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 (493) hide show
  1. package/binding.gyp +15 -12
  2. package/binding.gyp.in +1 -1
  3. package/configure.py +1 -1
  4. package/duckdb_extension_config.cmake +10 -0
  5. package/package.json +1 -1
  6. package/src/duckdb/extension/icu/icu-dateadd.cpp +2 -2
  7. package/src/duckdb/extension/icu/icu-datefunc.cpp +1 -1
  8. package/src/duckdb/extension/icu/icu-datepart.cpp +2 -2
  9. package/src/duckdb/extension/icu/icu-datesub.cpp +2 -2
  10. package/src/duckdb/extension/icu/icu-datetrunc.cpp +1 -1
  11. package/src/duckdb/extension/icu/icu-list-range.cpp +1 -1
  12. package/src/duckdb/extension/icu/icu-makedate.cpp +7 -0
  13. package/src/duckdb/extension/icu/icu-strptime.cpp +4 -4
  14. package/src/duckdb/extension/icu/icu-table-range.cpp +5 -5
  15. package/src/duckdb/extension/icu/icu-timebucket.cpp +16 -16
  16. package/src/duckdb/extension/icu/icu-timezone.cpp +8 -8
  17. package/src/duckdb/extension/icu/icu_extension.cpp +3 -3
  18. package/src/duckdb/extension/json/include/json_common.hpp +47 -231
  19. package/src/duckdb/extension/json/include/json_executors.hpp +49 -13
  20. package/src/duckdb/extension/json/include/json_functions.hpp +2 -1
  21. package/src/duckdb/extension/json/json_common.cpp +272 -40
  22. package/src/duckdb/extension/json/json_functions/json_structure.cpp +1 -1
  23. package/src/duckdb/extension/json/json_functions/json_transform.cpp +17 -37
  24. package/src/duckdb/extension/json/json_functions/json_type.cpp +1 -1
  25. package/src/duckdb/extension/json/json_functions.cpp +24 -24
  26. package/src/duckdb/extension/json/json_scan.cpp +3 -6
  27. package/src/duckdb/extension/parquet/column_reader.cpp +19 -21
  28. package/src/duckdb/extension/parquet/column_writer.cpp +77 -61
  29. package/src/duckdb/extension/parquet/include/cast_column_reader.hpp +2 -2
  30. package/src/duckdb/extension/parquet/include/column_reader.hpp +14 -16
  31. package/src/duckdb/extension/parquet/include/column_writer.hpp +9 -7
  32. package/src/duckdb/extension/parquet/include/list_column_reader.hpp +2 -2
  33. package/src/duckdb/extension/parquet/include/parquet_dbp_decoder.hpp +3 -3
  34. package/src/duckdb/extension/parquet/include/parquet_decimal_utils.hpp +3 -3
  35. package/src/duckdb/extension/parquet/include/parquet_file_metadata_cache.hpp +2 -2
  36. package/src/duckdb/extension/parquet/include/parquet_statistics.hpp +2 -2
  37. package/src/duckdb/extension/parquet/include/parquet_support.hpp +9 -11
  38. package/src/duckdb/extension/parquet/include/parquet_writer.hpp +24 -5
  39. package/src/duckdb/extension/parquet/include/string_column_reader.hpp +1 -1
  40. package/src/duckdb/extension/parquet/include/struct_column_reader.hpp +2 -3
  41. package/src/duckdb/extension/parquet/include/zstd_file_system.hpp +2 -2
  42. package/src/duckdb/extension/parquet/parquet_extension.cpp +192 -20
  43. package/src/duckdb/extension/parquet/parquet_reader.cpp +6 -6
  44. package/src/duckdb/extension/parquet/parquet_statistics.cpp +7 -6
  45. package/src/duckdb/extension/parquet/parquet_writer.cpp +79 -16
  46. package/src/duckdb/extension/parquet/zstd_file_system.cpp +2 -2
  47. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +1 -1
  48. package/src/duckdb/src/catalog/catalog_search_path.cpp +5 -4
  49. package/src/duckdb/src/catalog/default/default_functions.cpp +16 -0
  50. package/src/duckdb/src/common/adbc/adbc.cpp +75 -10
  51. package/src/duckdb/src/common/adbc/driver_manager.cpp +6 -11
  52. package/src/duckdb/src/common/allocator.cpp +14 -2
  53. package/src/duckdb/src/common/arrow/arrow_appender.cpp +5 -11
  54. package/src/duckdb/src/common/assert.cpp +3 -0
  55. package/src/duckdb/src/common/enum_util.cpp +4619 -4446
  56. package/src/duckdb/src/common/enums/logical_operator_type.cpp +4 -0
  57. package/src/duckdb/src/common/enums/optimizer_type.cpp +2 -0
  58. package/src/duckdb/src/common/enums/physical_operator_type.cpp +4 -0
  59. package/src/duckdb/src/common/exception.cpp +2 -2
  60. package/src/duckdb/src/common/extra_type_info.cpp +506 -0
  61. package/src/duckdb/src/common/file_system.cpp +19 -0
  62. package/src/duckdb/src/common/hive_partitioning.cpp +10 -6
  63. package/src/duckdb/src/common/local_file_system.cpp +14 -14
  64. package/src/duckdb/src/common/multi_file_reader.cpp +184 -20
  65. package/src/duckdb/src/common/operator/cast_operators.cpp +35 -1
  66. package/src/duckdb/src/common/radix_partitioning.cpp +26 -8
  67. package/src/duckdb/src/common/re2_regex.cpp +1 -1
  68. package/src/duckdb/src/common/row_operations/row_external.cpp +1 -1
  69. package/src/duckdb/src/common/sort/merge_sorter.cpp +9 -16
  70. package/src/duckdb/src/common/sort/partition_state.cpp +44 -11
  71. package/src/duckdb/src/common/types/batched_data_collection.cpp +7 -2
  72. package/src/duckdb/src/common/types/bit.cpp +51 -0
  73. package/src/duckdb/src/common/types/column/column_data_allocator.cpp +9 -6
  74. package/src/duckdb/src/common/types/column/column_data_collection.cpp +17 -2
  75. package/src/duckdb/src/common/types/column/column_data_collection_segment.cpp +15 -6
  76. package/src/duckdb/src/common/types/column/partitioned_column_data.cpp +2 -2
  77. package/src/duckdb/src/common/types/data_chunk.cpp +2 -2
  78. package/src/duckdb/src/common/types/date.cpp +9 -0
  79. package/src/duckdb/src/common/types/list_segment.cpp +24 -74
  80. package/src/duckdb/src/common/types/row/partitioned_tuple_data.cpp +3 -9
  81. package/src/duckdb/src/common/types/row/tuple_data_collection.cpp +2 -0
  82. package/src/duckdb/src/common/types/row/tuple_data_scatter_gather.cpp +2 -2
  83. package/src/duckdb/src/common/types/uuid.cpp +2 -2
  84. package/src/duckdb/src/common/types/validity_mask.cpp +33 -0
  85. package/src/duckdb/src/common/types.cpp +8 -655
  86. package/src/duckdb/src/common/virtual_file_system.cpp +138 -1
  87. package/src/duckdb/src/core_functions/aggregate/holistic/reservoir_quantile.cpp +2 -0
  88. package/src/duckdb/src/core_functions/aggregate/nested/list.cpp +2 -2
  89. package/src/duckdb/src/core_functions/aggregate/regression/regr_avg.cpp +4 -4
  90. package/src/duckdb/src/core_functions/aggregate/regression/regr_intercept.cpp +4 -4
  91. package/src/duckdb/src/core_functions/aggregate/regression/regr_r2.cpp +5 -4
  92. package/src/duckdb/src/core_functions/aggregate/regression/regr_sxx_syy.cpp +8 -8
  93. package/src/duckdb/src/core_functions/aggregate/regression/regr_sxy.cpp +4 -3
  94. package/src/duckdb/src/core_functions/function_list.cpp +4 -2
  95. package/src/duckdb/src/core_functions/scalar/date/date_part.cpp +208 -42
  96. package/src/duckdb/src/core_functions/scalar/date/epoch.cpp +10 -24
  97. package/src/duckdb/src/core_functions/scalar/date/make_date.cpp +19 -4
  98. package/src/duckdb/src/core_functions/scalar/list/list_aggregates.cpp +4 -2
  99. package/src/duckdb/src/execution/aggregate_hashtable.cpp +34 -18
  100. package/src/duckdb/src/execution/expression_executor.cpp +1 -1
  101. package/src/duckdb/src/execution/index/art/art.cpp +149 -139
  102. package/src/duckdb/src/execution/index/art/fixed_size_allocator.cpp +1 -1
  103. package/src/duckdb/src/execution/index/art/iterator.cpp +129 -207
  104. package/src/duckdb/src/execution/index/art/leaf.cpp +8 -37
  105. package/src/duckdb/src/execution/index/art/node.cpp +113 -120
  106. package/src/duckdb/src/execution/index/art/node16.cpp +1 -10
  107. package/src/duckdb/src/execution/index/art/node256.cpp +1 -9
  108. package/src/duckdb/src/execution/index/art/node4.cpp +12 -13
  109. package/src/duckdb/src/execution/index/art/node48.cpp +1 -11
  110. package/src/duckdb/src/execution/index/art/prefix.cpp +228 -350
  111. package/src/duckdb/src/execution/join_hashtable.cpp +4 -4
  112. package/src/duckdb/src/execution/operator/aggregate/aggregate_object.cpp +1 -0
  113. package/src/duckdb/src/execution/operator/aggregate/physical_streaming_window.cpp +8 -3
  114. package/src/duckdb/src/execution/operator/aggregate/physical_ungrouped_aggregate.cpp +32 -22
  115. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +512 -300
  116. package/src/duckdb/src/execution/operator/helper/physical_batch_collector.cpp +4 -3
  117. package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +5 -5
  118. package/src/duckdb/src/execution/operator/join/physical_asof_join.cpp +444 -284
  119. package/src/duckdb/src/execution/operator/join/physical_comparison_join.cpp +1 -1
  120. package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +21 -10
  121. package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +28 -12
  122. package/src/duckdb/src/execution/operator/join/physical_join.cpp +1 -1
  123. package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +23 -4
  124. package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +41 -5
  125. package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +100 -13
  126. package/src/duckdb/src/execution/operator/persistent/csv_file_handle.cpp +1 -1
  127. package/src/duckdb/src/execution/operator/persistent/csv_reader_options.cpp +20 -0
  128. package/src/duckdb/src/execution/operator/persistent/csv_rejects_table.cpp +48 -0
  129. package/src/duckdb/src/execution/operator/persistent/parallel_csv_reader.cpp +2 -3
  130. package/src/duckdb/src/execution/operator/persistent/physical_batch_copy_to_file.cpp +6 -4
  131. package/src/duckdb/src/execution/operator/persistent/physical_fixed_batch_copy.cpp +3 -3
  132. package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +1 -1
  133. package/src/duckdb/src/execution/operator/projection/physical_pivot.cpp +2 -1
  134. package/src/duckdb/src/execution/operator/scan/physical_column_data_scan.cpp +19 -0
  135. package/src/duckdb/src/execution/operator/scan/physical_table_scan.cpp +7 -2
  136. package/src/duckdb/src/execution/operator/set/physical_cte.cpp +160 -0
  137. package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +15 -5
  138. package/src/duckdb/src/execution/partitionable_hashtable.cpp +41 -6
  139. package/src/duckdb/src/execution/perfect_aggregate_hashtable.cpp +30 -5
  140. package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +43 -10
  141. package/src/duckdb/src/execution/physical_plan/plan_asof_join.cpp +56 -33
  142. package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +17 -13
  143. package/src/duckdb/src/execution/physical_plan/plan_cte.cpp +33 -0
  144. package/src/duckdb/src/execution/physical_plan/plan_get.cpp +2 -2
  145. package/src/duckdb/src/execution/physical_plan/plan_recursive_cte.cpp +25 -4
  146. package/src/duckdb/src/execution/physical_plan_generator.cpp +4 -0
  147. package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +290 -43
  148. package/src/duckdb/src/execution/window_segment_tree.cpp +286 -129
  149. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +2 -1
  150. package/src/duckdb/src/function/cast/bit_cast.cpp +34 -2
  151. package/src/duckdb/src/function/cast/blob_cast.cpp +3 -0
  152. package/src/duckdb/src/function/cast/numeric_casts.cpp +2 -0
  153. package/src/duckdb/src/function/function.cpp +3 -1
  154. package/src/duckdb/src/function/pragma/pragma_queries.cpp +5 -0
  155. package/src/duckdb/src/function/scalar/compressed_materialization/compress_integral.cpp +212 -0
  156. package/src/duckdb/src/function/scalar/compressed_materialization/compress_string.cpp +249 -0
  157. package/src/duckdb/src/function/scalar/compressed_materialization_functions.cpp +29 -0
  158. package/src/duckdb/src/function/scalar/list/list_resize.cpp +162 -0
  159. package/src/duckdb/src/function/scalar/nested_functions.cpp +1 -0
  160. package/src/duckdb/src/function/scalar/string/like.cpp +12 -4
  161. package/src/duckdb/src/function/scalar/system/aggregate_export.cpp +12 -5
  162. package/src/duckdb/src/function/table/copy_csv.cpp +8 -1
  163. package/src/duckdb/src/function/table/read_csv.cpp +100 -17
  164. package/src/duckdb/src/function/table/system_functions.cpp +1 -0
  165. package/src/duckdb/src/function/table/table_scan.cpp +9 -0
  166. package/src/duckdb/src/function/table/version/pragma_version.cpp +46 -2
  167. package/src/duckdb/src/include/duckdb/common/adbc/adbc.hpp +1 -0
  168. package/src/duckdb/src/include/duckdb/common/allocator.hpp +2 -0
  169. package/src/duckdb/src/include/duckdb/common/bswap.hpp +42 -0
  170. package/src/duckdb/src/include/duckdb/common/dl.hpp +3 -1
  171. package/src/duckdb/src/include/duckdb/common/enum_util.hpp +616 -584
  172. package/src/duckdb/src/include/duckdb/common/enums/cte_materialize.hpp +21 -0
  173. package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +2 -1
  174. package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +2 -0
  175. package/src/duckdb/src/include/duckdb/common/enums/optimizer_type.hpp +2 -0
  176. package/src/duckdb/src/include/duckdb/common/enums/physical_operator_type.hpp +2 -0
  177. package/src/duckdb/src/include/duckdb/common/extra_operator_info.hpp +27 -0
  178. package/src/duckdb/src/include/duckdb/common/extra_type_info.hpp +219 -0
  179. package/src/duckdb/src/include/duckdb/common/file_system.hpp +2 -0
  180. package/src/duckdb/src/include/duckdb/common/hive_partitioning.hpp +1 -1
  181. package/src/duckdb/src/include/duckdb/common/multi_file_reader.hpp +6 -4
  182. package/src/duckdb/src/include/duckdb/common/multi_file_reader_options.hpp +10 -42
  183. package/src/duckdb/src/include/duckdb/common/mutex.hpp +3 -0
  184. package/src/duckdb/src/include/duckdb/common/operator/cast_operators.hpp +43 -3
  185. package/src/duckdb/src/include/duckdb/common/operator/numeric_cast.hpp +10 -0
  186. package/src/duckdb/src/include/duckdb/common/radix.hpp +9 -20
  187. package/src/duckdb/src/include/duckdb/common/radix_partitioning.hpp +6 -21
  188. package/src/duckdb/src/include/duckdb/common/row_operations/row_operations.hpp +3 -3
  189. package/src/duckdb/src/include/duckdb/common/sort/partition_state.hpp +13 -0
  190. package/src/duckdb/src/include/duckdb/common/string_util.hpp +11 -0
  191. package/src/duckdb/src/include/duckdb/common/types/batched_data_collection.hpp +3 -1
  192. package/src/duckdb/src/include/duckdb/common/types/bit.hpp +81 -0
  193. package/src/duckdb/src/include/duckdb/common/types/column/column_data_allocator.hpp +1 -1
  194. package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection.hpp +6 -1
  195. package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection_segment.hpp +1 -1
  196. package/src/duckdb/src/include/duckdb/common/types/column/column_data_scan_states.hpp +3 -1
  197. package/src/duckdb/src/include/duckdb/common/types/data_chunk.hpp +1 -1
  198. package/src/duckdb/src/include/duckdb/common/types/date.hpp +7 -5
  199. package/src/duckdb/src/include/duckdb/common/types/list_segment.hpp +6 -8
  200. package/src/duckdb/src/include/duckdb/common/types/row/partitioned_tuple_data.hpp +0 -1
  201. package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_collection.hpp +1 -0
  202. package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_states.hpp +3 -0
  203. package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +9 -0
  204. package/src/duckdb/src/include/duckdb/common/types.hpp +1 -15
  205. package/src/duckdb/src/include/duckdb/common/virtual_file_system.hpp +38 -97
  206. package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/corr.hpp +4 -4
  207. package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/covar.hpp +3 -1
  208. package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic_functions.hpp +3 -1
  209. package/src/duckdb/src/include/duckdb/core_functions/aggregate/distributive_functions.hpp +3 -1
  210. package/src/duckdb/src/include/duckdb/core_functions/aggregate/holistic_functions.hpp +3 -1
  211. package/src/duckdb/src/include/duckdb/core_functions/aggregate/nested_functions.hpp +3 -1
  212. package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_count.hpp +1 -0
  213. package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_slope.hpp +3 -3
  214. package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression_functions.hpp +3 -1
  215. package/src/duckdb/src/include/duckdb/core_functions/scalar/bit_functions.hpp +3 -1
  216. package/src/duckdb/src/include/duckdb/core_functions/scalar/blob_functions.hpp +3 -1
  217. package/src/duckdb/src/include/duckdb/core_functions/scalar/date_functions.hpp +31 -11
  218. package/src/duckdb/src/include/duckdb/core_functions/scalar/enum_functions.hpp +3 -1
  219. package/src/duckdb/src/include/duckdb/core_functions/scalar/generic_functions.hpp +3 -1
  220. package/src/duckdb/src/include/duckdb/core_functions/scalar/list_functions.hpp +3 -1
  221. package/src/duckdb/src/include/duckdb/core_functions/scalar/map_functions.hpp +3 -1
  222. package/src/duckdb/src/include/duckdb/core_functions/scalar/math_functions.hpp +3 -1
  223. package/src/duckdb/src/include/duckdb/core_functions/scalar/operators_functions.hpp +3 -1
  224. package/src/duckdb/src/include/duckdb/core_functions/scalar/random_functions.hpp +3 -1
  225. package/src/duckdb/src/include/duckdb/core_functions/scalar/string_functions.hpp +3 -1
  226. package/src/duckdb/src/include/duckdb/core_functions/scalar/struct_functions.hpp +3 -1
  227. package/src/duckdb/src/include/duckdb/core_functions/scalar/union_functions.hpp +3 -1
  228. package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +21 -3
  229. package/src/duckdb/src/include/duckdb/execution/executor.hpp +3 -0
  230. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +4 -5
  231. package/src/duckdb/src/include/duckdb/execution/index/art/iterator.hpp +31 -27
  232. package/src/duckdb/src/include/duckdb/execution/index/art/leaf.hpp +6 -14
  233. package/src/duckdb/src/include/duckdb/execution/index/art/node.hpp +4 -10
  234. package/src/duckdb/src/include/duckdb/execution/index/art/node16.hpp +3 -6
  235. package/src/duckdb/src/include/duckdb/execution/index/art/node256.hpp +3 -6
  236. package/src/duckdb/src/include/duckdb/execution/index/art/node4.hpp +5 -8
  237. package/src/duckdb/src/include/duckdb/execution/index/art/node48.hpp +3 -6
  238. package/src/duckdb/src/include/duckdb/execution/index/art/prefix.hpp +63 -52
  239. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_asof_join.hpp +3 -10
  240. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_iejoin.hpp +1 -1
  241. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_piecewise_merge_join.hpp +1 -1
  242. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_range_join.hpp +12 -1
  243. package/src/duckdb/src/include/duckdb/execution/operator/persistent/base_csv_reader.hpp +2 -2
  244. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_line_info.hpp +4 -3
  245. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +8 -1
  246. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_rejects_table.hpp +36 -0
  247. package/src/duckdb/src/include/duckdb/execution/operator/persistent/parallel_csv_reader.hpp +1 -1
  248. package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_column_data_scan.hpp +10 -0
  249. package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_table_scan.hpp +5 -1
  250. package/src/duckdb/src/include/duckdb/execution/operator/set/physical_cte.hpp +62 -0
  251. package/src/duckdb/src/include/duckdb/execution/operator/set/physical_recursive_cte.hpp +8 -2
  252. package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +5 -1
  253. package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +3 -0
  254. package/src/duckdb/src/include/duckdb/execution/radix_partitioned_hashtable.hpp +10 -3
  255. package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +51 -40
  256. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +1 -1
  257. package/src/duckdb/src/include/duckdb/function/aggregate_state.hpp +2 -2
  258. package/src/duckdb/src/include/duckdb/function/built_in_functions.hpp +1 -0
  259. package/src/duckdb/src/include/duckdb/function/scalar/compressed_materialization_functions.hpp +49 -0
  260. package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +1 -1
  261. package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +5 -0
  262. package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +2 -0
  263. package/src/duckdb/src/include/duckdb/function/table/system_functions.hpp +4 -0
  264. package/src/duckdb/src/include/duckdb/main/client_config.hpp +5 -0
  265. package/src/duckdb/src/include/duckdb/main/config.hpp +2 -0
  266. package/src/duckdb/src/include/duckdb/main/connection.hpp +1 -2
  267. package/src/duckdb/src/include/duckdb/main/relation/cross_product_relation.hpp +4 -1
  268. package/src/duckdb/src/include/duckdb/main/relation/join_relation.hpp +5 -2
  269. package/src/duckdb/src/include/duckdb/main/relation.hpp +4 -2
  270. package/src/duckdb/src/include/duckdb/main/settings.hpp +39 -1
  271. package/src/duckdb/src/include/duckdb/optimizer/column_binding_replacer.hpp +47 -0
  272. package/src/duckdb/src/include/duckdb/optimizer/compressed_materialization.hpp +132 -0
  273. package/src/duckdb/src/include/duckdb/optimizer/deliminator.hpp +13 -16
  274. package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +3 -0
  275. package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +1 -1
  276. package/src/duckdb/src/include/duckdb/optimizer/join_order/estimated_properties.hpp +10 -1
  277. package/src/duckdb/src/include/duckdb/optimizer/join_order/join_order_optimizer.hpp +1 -1
  278. package/src/duckdb/src/include/duckdb/optimizer/join_order/join_relation.hpp +1 -1
  279. package/src/duckdb/src/include/duckdb/optimizer/join_order/query_graph.hpp +3 -0
  280. package/src/duckdb/src/include/duckdb/optimizer/matcher/set_matcher.hpp +13 -0
  281. package/src/duckdb/src/include/duckdb/optimizer/optimizer.hpp +3 -0
  282. package/src/duckdb/src/include/duckdb/optimizer/remove_duplicate_groups.hpp +40 -0
  283. package/src/duckdb/src/include/duckdb/optimizer/statistics_propagator.hpp +11 -3
  284. package/src/duckdb/src/include/duckdb/optimizer/topn_optimizer.hpp +2 -0
  285. package/src/duckdb/src/include/duckdb/parallel/pipeline.hpp +2 -0
  286. package/src/duckdb/src/include/duckdb/parallel/task_scheduler.hpp +5 -0
  287. package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +2 -0
  288. package/src/duckdb/src/include/duckdb/parser/expression/between_expression.hpp +3 -0
  289. package/src/duckdb/src/include/duckdb/parser/expression/cast_expression.hpp +3 -0
  290. package/src/duckdb/src/include/duckdb/parser/expression/collate_expression.hpp +3 -0
  291. package/src/duckdb/src/include/duckdb/parser/expression/columnref_expression.hpp +3 -0
  292. package/src/duckdb/src/include/duckdb/parser/expression/comparison_expression.hpp +3 -0
  293. package/src/duckdb/src/include/duckdb/parser/expression/constant_expression.hpp +3 -0
  294. package/src/duckdb/src/include/duckdb/parser/expression/default_expression.hpp +1 -0
  295. package/src/duckdb/src/include/duckdb/parser/expression/function_expression.hpp +3 -0
  296. package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +3 -0
  297. package/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +3 -0
  298. package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +3 -0
  299. package/src/duckdb/src/include/duckdb/parser/query_node/cte_node.hpp +54 -0
  300. package/src/duckdb/src/include/duckdb/parser/query_node/list.hpp +1 -0
  301. package/src/duckdb/src/include/duckdb/parser/query_node.hpp +2 -1
  302. package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +1 -0
  303. package/src/duckdb/src/include/duckdb/parser/tableref/joinref.hpp +1 -1
  304. package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +3 -0
  305. package/src/duckdb/src/include/duckdb/parser/tokens.hpp +1 -0
  306. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +15 -8
  307. package/src/duckdb/src/include/duckdb/planner/binder.hpp +12 -5
  308. package/src/duckdb/src/include/duckdb/planner/bound_tokens.hpp +1 -0
  309. package/src/duckdb/src/include/duckdb/planner/column_binding.hpp +4 -0
  310. package/src/duckdb/src/include/duckdb/planner/constraints/bound_unique_constraint.hpp +3 -3
  311. package/src/duckdb/src/include/duckdb/planner/expression_binder/lateral_binder.hpp +0 -2
  312. package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +1 -0
  313. package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +2 -1
  314. package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +5 -5
  315. package/src/duckdb/src/include/duckdb/planner/operator/logical_cteref.hpp +7 -2
  316. package/src/duckdb/src/include/duckdb/planner/operator/logical_dependent_join.hpp +43 -0
  317. package/src/duckdb/src/include/duckdb/planner/operator/logical_get.hpp +4 -0
  318. package/src/duckdb/src/include/duckdb/planner/operator/logical_materialized_cte.hpp +49 -0
  319. package/src/duckdb/src/include/duckdb/planner/operator/logical_recursive_cte.hpp +5 -4
  320. package/src/duckdb/src/include/duckdb/planner/query_node/bound_cte_node.hpp +44 -0
  321. package/src/duckdb/src/include/duckdb/planner/query_node/list.hpp +1 -0
  322. package/src/duckdb/src/include/duckdb/planner/subquery/flatten_dependent_join.hpp +2 -2
  323. package/src/duckdb/src/include/duckdb/planner/subquery/has_correlated_expressions.hpp +4 -1
  324. package/src/duckdb/src/include/duckdb/planner/subquery/recursive_dependent_join_planner.hpp +31 -0
  325. package/src/duckdb/src/include/duckdb/planner/subquery/rewrite_correlated_expressions.hpp +8 -2
  326. package/src/duckdb/src/include/duckdb/planner/tableref/bound_cteref.hpp +5 -2
  327. package/src/duckdb/src/include/duckdb/storage/arena_allocator.hpp +1 -1
  328. package/src/duckdb/src/include/duckdb/storage/block_manager.hpp +3 -3
  329. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +1 -1
  330. package/src/duckdb/src/include/duckdb/storage/object_cache.hpp +22 -0
  331. package/src/duckdb/src/include/duckdb/storage/single_file_block_manager.hpp +2 -0
  332. package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +4 -0
  333. package/src/duckdb/src/include/duckdb/storage/table/chunk_info.hpp +3 -0
  334. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +3 -2
  335. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +1 -3
  336. package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +2 -3
  337. package/src/duckdb/src/include/duckdb.h +28 -0
  338. package/src/duckdb/src/main/capi/arrow-c.cpp +155 -1
  339. package/src/duckdb/src/main/capi/duckdb_value-c.cpp +1 -1
  340. package/src/duckdb/src/main/config.cpp +4 -0
  341. package/src/duckdb/src/main/database.cpp +1 -1
  342. package/src/duckdb/src/main/extension/extension_helper.cpp +96 -89
  343. package/src/duckdb/src/main/extension/extension_install.cpp +9 -0
  344. package/src/duckdb/src/main/extension/extension_load.cpp +10 -1
  345. package/src/duckdb/src/main/relation/cross_product_relation.cpp +4 -3
  346. package/src/duckdb/src/main/relation/join_relation.cpp +5 -5
  347. package/src/duckdb/src/main/relation.cpp +6 -5
  348. package/src/duckdb/src/main/settings/settings.cpp +79 -18
  349. package/src/duckdb/src/optimizer/column_binding_replacer.cpp +43 -0
  350. package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +1 -2
  351. package/src/duckdb/src/optimizer/compressed_materialization/compress_aggregate.cpp +140 -0
  352. package/src/duckdb/src/optimizer/compressed_materialization/compress_distinct.cpp +42 -0
  353. package/src/duckdb/src/optimizer/compressed_materialization/compress_order.cpp +65 -0
  354. package/src/duckdb/src/optimizer/compressed_materialization.cpp +478 -0
  355. package/src/duckdb/src/optimizer/deliminator.cpp +176 -321
  356. package/src/duckdb/src/optimizer/filter_pushdown.cpp +9 -0
  357. package/src/duckdb/src/optimizer/join_order/estimated_properties.cpp +7 -0
  358. package/src/duckdb/src/optimizer/join_order/join_node.cpp +2 -2
  359. package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +113 -82
  360. package/src/duckdb/src/optimizer/join_order/join_relation_set.cpp +2 -6
  361. package/src/duckdb/src/optimizer/join_order/query_graph.cpp +22 -14
  362. package/src/duckdb/src/optimizer/optimizer.cpp +51 -14
  363. package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +5 -5
  364. package/src/duckdb/src/optimizer/pushdown/pushdown_get.cpp +0 -1
  365. package/src/duckdb/src/optimizer/remove_duplicate_groups.cpp +127 -0
  366. package/src/duckdb/src/optimizer/remove_unused_columns.cpp +4 -0
  367. package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +154 -15
  368. package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +65 -8
  369. package/src/duckdb/src/optimizer/statistics/operator/propagate_order.cpp +1 -1
  370. package/src/duckdb/src/optimizer/statistics_propagator.cpp +7 -5
  371. package/src/duckdb/src/optimizer/topn_optimizer.cpp +20 -10
  372. package/src/duckdb/src/parallel/executor.cpp +15 -0
  373. package/src/duckdb/src/parallel/task_scheduler.cpp +11 -2
  374. package/src/duckdb/src/parser/common_table_expression_info.cpp +2 -0
  375. package/src/duckdb/src/parser/expression/between_expression.cpp +3 -15
  376. package/src/duckdb/src/parser/expression/case_expression.cpp +0 -13
  377. package/src/duckdb/src/parser/expression/cast_expression.cpp +3 -14
  378. package/src/duckdb/src/parser/expression/collate_expression.cpp +3 -13
  379. package/src/duckdb/src/parser/expression/columnref_expression.cpp +3 -12
  380. package/src/duckdb/src/parser/expression/comparison_expression.cpp +3 -13
  381. package/src/duckdb/src/parser/expression/conjunction_expression.cpp +0 -12
  382. package/src/duckdb/src/parser/expression/constant_expression.cpp +3 -11
  383. package/src/duckdb/src/parser/expression/default_expression.cpp +0 -4
  384. package/src/duckdb/src/parser/expression/function_expression.cpp +3 -32
  385. package/src/duckdb/src/parser/expression/lambda_expression.cpp +4 -14
  386. package/src/duckdb/src/parser/expression/operator_expression.cpp +0 -12
  387. package/src/duckdb/src/parser/expression/parameter_expression.cpp +0 -12
  388. package/src/duckdb/src/parser/expression/positional_reference_expression.cpp +4 -11
  389. package/src/duckdb/src/parser/expression/star_expression.cpp +0 -19
  390. package/src/duckdb/src/parser/expression/subquery_expression.cpp +0 -18
  391. package/src/duckdb/src/parser/expression/window_expression.cpp +3 -39
  392. package/src/duckdb/src/parser/parsed_expression.cpp +0 -70
  393. package/src/duckdb/src/parser/parsed_expression_iterator.cpp +7 -0
  394. package/src/duckdb/src/parser/parser.cpp +8 -2
  395. package/src/duckdb/src/parser/query_node/cte_node.cpp +58 -0
  396. package/src/duckdb/src/parser/query_node/recursive_cte_node.cpp +0 -19
  397. package/src/duckdb/src/parser/query_node/select_node.cpp +0 -29
  398. package/src/duckdb/src/parser/query_node/set_operation_node.cpp +0 -15
  399. package/src/duckdb/src/parser/query_node.cpp +15 -37
  400. package/src/duckdb/src/parser/result_modifier.cpp +0 -74
  401. package/src/duckdb/src/parser/tableref/basetableref.cpp +0 -19
  402. package/src/duckdb/src/parser/tableref/emptytableref.cpp +0 -4
  403. package/src/duckdb/src/parser/tableref/expressionlistref.cpp +0 -15
  404. package/src/duckdb/src/parser/tableref/joinref.cpp +3 -23
  405. package/src/duckdb/src/parser/tableref/pivotref.cpp +0 -23
  406. package/src/duckdb/src/parser/tableref/subqueryref.cpp +3 -13
  407. package/src/duckdb/src/parser/tableref/table_function.cpp +0 -15
  408. package/src/duckdb/src/parser/tableref.cpp +0 -44
  409. package/src/duckdb/src/parser/transform/expression/transform_constant.cpp +55 -3
  410. package/src/duckdb/src/parser/transform/expression/transform_expression.cpp +2 -0
  411. package/src/duckdb/src/parser/transform/expression/transform_multi_assign_reference.cpp +44 -0
  412. package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +19 -1
  413. package/src/duckdb/src/parser/transform/statement/transform_copy.cpp +13 -0
  414. package/src/duckdb/src/parser/transform/statement/transform_delete.cpp +6 -1
  415. package/src/duckdb/src/parser/transform/statement/transform_insert.cpp +6 -1
  416. package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +7 -2
  417. package/src/duckdb/src/parser/transform/statement/transform_pragma.cpp +14 -11
  418. package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +11 -2
  419. package/src/duckdb/src/parser/transform/statement/transform_update.cpp +6 -1
  420. package/src/duckdb/src/parser/transformer.cpp +15 -0
  421. package/src/duckdb/src/planner/binder/query_node/bind_cte_node.cpp +64 -0
  422. package/src/duckdb/src/planner/binder/query_node/plan_cte_node.cpp +26 -0
  423. package/src/duckdb/src/planner/binder/query_node/plan_recursive_cte_node.cpp +5 -5
  424. package/src/duckdb/src/planner/binder/query_node/plan_setop.cpp +4 -4
  425. package/src/duckdb/src/planner/binder/query_node/plan_subquery.cpp +32 -29
  426. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +5 -4
  427. package/src/duckdb/src/planner/binder/tableref/bind_basetableref.cpp +11 -2
  428. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +32 -5
  429. package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +116 -49
  430. package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -1
  431. package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +64 -26
  432. package/src/duckdb/src/planner/binder/tableref/plan_subqueryref.cpp +3 -3
  433. package/src/duckdb/src/planner/binder.cpp +44 -31
  434. package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +1 -1
  435. package/src/duckdb/src/planner/expression_binder/lateral_binder.cpp +4 -31
  436. package/src/duckdb/src/planner/expression_binder.cpp +3 -0
  437. package/src/duckdb/src/planner/expression_iterator.cpp +6 -0
  438. package/src/duckdb/src/planner/logical_operator.cpp +5 -0
  439. package/src/duckdb/src/planner/logical_operator_visitor.cpp +2 -0
  440. package/src/duckdb/src/planner/operator/logical_cteref.cpp +3 -1
  441. package/src/duckdb/src/planner/operator/logical_dependent_join.cpp +26 -0
  442. package/src/duckdb/src/planner/operator/logical_get.cpp +9 -4
  443. package/src/duckdb/src/planner/operator/logical_materialized_cte.cpp +21 -0
  444. package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +90 -38
  445. package/src/duckdb/src/planner/subquery/has_correlated_expressions.cpp +22 -7
  446. package/src/duckdb/src/planner/subquery/rewrite_correlated_expressions.cpp +65 -7
  447. package/src/duckdb/src/storage/arena_allocator.cpp +1 -2
  448. package/src/duckdb/src/storage/buffer/block_manager.cpp +3 -0
  449. package/src/duckdb/src/storage/checkpoint_manager.cpp +3 -0
  450. package/src/duckdb/src/storage/compression/rle.cpp +0 -1
  451. package/src/duckdb/src/storage/data_table.cpp +1 -1
  452. package/src/duckdb/src/storage/local_storage.cpp +3 -3
  453. package/src/duckdb/src/storage/serialization/serialize_parsed_expression.cpp +340 -0
  454. package/src/duckdb/src/storage/serialization/serialize_query_node.cpp +122 -0
  455. package/src/duckdb/src/storage/serialization/serialize_result_modifier.cpp +86 -0
  456. package/src/duckdb/src/storage/serialization/serialize_tableref.cpp +166 -0
  457. package/src/duckdb/src/storage/serialization/serialize_types.cpp +127 -0
  458. package/src/duckdb/src/storage/single_file_block_manager.cpp +23 -0
  459. package/src/duckdb/src/storage/statistics/string_stats.cpp +21 -2
  460. package/src/duckdb/src/storage/storage_info.cpp +1 -1
  461. package/src/duckdb/src/storage/table/chunk_info.cpp +17 -0
  462. package/src/duckdb/src/storage/table/row_group.cpp +25 -9
  463. package/src/duckdb/src/storage/table/row_group_collection.cpp +19 -18
  464. package/src/duckdb/third_party/concurrentqueue/concurrentqueue.h +2 -2
  465. package/src/duckdb/third_party/concurrentqueue/lightweightsemaphore.h +76 -0
  466. package/src/duckdb/third_party/fast_float/fast_float/fast_float.h +2 -0
  467. package/src/duckdb/third_party/httplib/httplib.hpp +10 -1
  468. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +9 -0
  469. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +2 -1
  470. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +12487 -12331
  471. package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +6 -6
  472. package/src/duckdb/ub_src_common.cpp +2 -0
  473. package/src/duckdb/ub_src_execution_index_art.cpp +0 -2
  474. package/src/duckdb/ub_src_execution_operator_persistent.cpp +2 -0
  475. package/src/duckdb/ub_src_execution_operator_set.cpp +2 -0
  476. package/src/duckdb/ub_src_execution_physical_plan.cpp +2 -0
  477. package/src/duckdb/ub_src_function_scalar.cpp +2 -0
  478. package/src/duckdb/ub_src_function_scalar_compressed_materialization.cpp +4 -0
  479. package/src/duckdb/ub_src_function_scalar_list.cpp +2 -0
  480. package/src/duckdb/ub_src_optimizer.cpp +6 -0
  481. package/src/duckdb/ub_src_optimizer_compressed_materialization.cpp +6 -0
  482. package/src/duckdb/ub_src_optimizer_statistics_expression.cpp +0 -2
  483. package/src/duckdb/ub_src_parser_query_node.cpp +2 -0
  484. package/src/duckdb/ub_src_parser_transform_expression.cpp +2 -0
  485. package/src/duckdb/ub_src_planner_binder_query_node.cpp +4 -0
  486. package/src/duckdb/ub_src_planner_operator.cpp +4 -0
  487. package/src/duckdb/ub_src_storage_serialization.cpp +10 -0
  488. package/src/statement.cpp +10 -3
  489. package/test/test_all_types.test.ts +233 -0
  490. package/tsconfig.json +1 -0
  491. package/src/duckdb/src/execution/index/art/prefix_segment.cpp +0 -42
  492. package/src/duckdb/src/include/duckdb/execution/index/art/prefix_segment.hpp +0 -40
  493. package/src/duckdb/src/optimizer/statistics/expression/propagate_and_compress.cpp +0 -118
@@ -1,20 +1,23 @@
1
1
  #include "duckdb/execution/window_segment_tree.hpp"
2
2
 
3
- #include "duckdb/common/vector_operations/vector_operations.hpp"
4
3
  #include "duckdb/common/algorithm.hpp"
5
4
  #include "duckdb/common/helper.hpp"
5
+ #include "duckdb/common/vector_operations/vector_operations.hpp"
6
+
7
+ #include <utility>
6
8
 
7
9
  namespace duckdb {
8
10
 
9
11
  //===--------------------------------------------------------------------===//
10
12
  // WindowAggregateState
11
13
  //===--------------------------------------------------------------------===//
12
-
13
- WindowAggregateState::WindowAggregateState(AggregateObject aggr, const LogicalType &result_type_p)
14
- : aggr(std::move(aggr)), result_type(result_type_p), state(aggr.function.state_size()),
15
- statev(Value::POINTER(CastPointerToValue(state.data()))),
16
- statep(Value::POINTER(CastPointerToValue(state.data()))) {
17
- statev.SetVectorType(VectorType::FLAT_VECTOR); // Prevent conversion of results to constants
14
+ WindowAggregateState::WindowAggregateState(AggregateObject aggr, const LogicalType &result_type_p,
15
+ idx_t partition_count_p)
16
+ : aggr(std::move(aggr)), result_type(result_type_p), partition_count(partition_count_p),
17
+ state_size(this->aggr.function.state_size()), state(state_size),
18
+ statef(Value::POINTER(CastPointerToValue(state.data()))), filter_pos(0),
19
+ allocator(Allocator::DefaultAllocator()) {
20
+ statef.SetVectorType(VectorType::FLAT_VECTOR); // Prevent conversion of results to constants
18
21
  }
19
22
 
20
23
  WindowAggregateState::~WindowAggregateState() {
@@ -25,15 +28,33 @@ void WindowAggregateState::AggregateInit() {
25
28
  }
26
29
 
27
30
  void WindowAggregateState::AggegateFinal(Vector &result, idx_t rid) {
28
- AggregateInputData aggr_input_data(aggr.GetFunctionData(), Allocator::DefaultAllocator());
29
- aggr.function.finalize(statev, aggr_input_data, result, 1, rid);
31
+ AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator);
32
+ aggr.function.finalize(statef, aggr_input_data, result, 1, rid);
30
33
 
31
34
  if (aggr.function.destructor) {
32
- aggr.function.destructor(statev, aggr_input_data, 1);
35
+ aggr.function.destructor(statef, aggr_input_data, 1);
33
36
  }
34
37
  }
35
38
 
36
39
  void WindowAggregateState::Sink(DataChunk &payload_chunk, SelectionVector *filter_sel, idx_t filtered) {
40
+ if (!inputs.ColumnCount() && payload_chunk.ColumnCount()) {
41
+ inputs.Initialize(Allocator::DefaultAllocator(), payload_chunk.GetTypes());
42
+ }
43
+ if (inputs.ColumnCount()) {
44
+ inputs.Append(payload_chunk, true);
45
+ }
46
+ if (filter_sel) {
47
+ // Lazy instantiation
48
+ if (!filter_mask.IsMaskSet()) {
49
+ // Start with all invalid and set the ones that pass
50
+ filter_bits.resize(ValidityMask::ValidityMaskSize(partition_count), 0);
51
+ filter_mask.Initialize(filter_bits.data());
52
+ }
53
+ for (idx_t f = 0; f < filtered; ++f) {
54
+ filter_mask.SetValid(filter_pos + filter_sel->get_index(f));
55
+ }
56
+ filter_pos += payload_chunk.size();
57
+ }
37
58
  }
38
59
 
39
60
  void WindowAggregateState::Finalize() {
@@ -42,22 +63,36 @@ void WindowAggregateState::Finalize() {
42
63
  void WindowAggregateState::Compute(Vector &result, idx_t rid, idx_t start, idx_t end) {
43
64
  }
44
65
 
66
+ void WindowAggregateState::Evaluate(const idx_t *begins, const idx_t *ends, Vector &result, idx_t count) {
67
+ auto &rmask = FlatVector::Validity(result);
68
+ for (idx_t i = 0; i < count; ++i) {
69
+ const auto begin = begins[i];
70
+ const auto end = ends[i];
71
+ if (begin >= end) {
72
+ rmask.SetInvalid(i);
73
+ continue;
74
+ }
75
+ Compute(result, i, begin, end);
76
+ }
77
+ }
78
+
45
79
  //===--------------------------------------------------------------------===//
46
80
  // WindowConstantAggregate
47
81
  //===--------------------------------------------------------------------===//
48
82
 
49
83
  WindowConstantAggregate::WindowConstantAggregate(AggregateObject aggr, const LogicalType &result_type,
50
84
  const ValidityMask &partition_mask, const idx_t count)
51
- : WindowAggregateState(std::move(aggr), result_type), partition(0), row(0) {
85
+ : WindowAggregateState(std::move(aggr), result_type, count), partition(0), row(0),
86
+ statep(Value::POINTER(CastPointerToValue(state.data()))) {
87
+ matches.Initialize();
52
88
 
53
89
  // Locate the partition boundaries
54
- idx_t start = 0;
55
90
  if (partition_mask.AllValid()) {
56
91
  partition_offsets.emplace_back(0);
57
92
  } else {
58
93
  idx_t entry_idx;
59
94
  idx_t shift;
60
- while (start < count) {
95
+ for (idx_t start = 0; start < count;) {
61
96
  partition_mask.GetEntryIndex(start, entry_idx, shift);
62
97
 
63
98
  // If start is aligned with the start of a block,
@@ -93,7 +128,7 @@ void WindowConstantAggregate::Sink(DataChunk &payload_chunk, SelectionVector *fi
93
128
  inputs.Initialize(Allocator::DefaultAllocator(), payload_chunk.GetTypes());
94
129
  }
95
130
 
96
- AggregateInputData aggr_input_data(aggr.GetFunctionData(), Allocator::DefaultAllocator());
131
+ AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator);
97
132
  idx_t begin = 0;
98
133
  idx_t filter_idx = 0;
99
134
  auto partition_end = partition_offsets[partition + 1];
@@ -165,43 +200,88 @@ void WindowConstantAggregate::Finalize() {
165
200
  row = 0;
166
201
  }
167
202
 
168
- void WindowConstantAggregate::Compute(Vector &target, idx_t rid, idx_t start, idx_t end) {
169
- // Find the partition containing [start, end)
170
- while (start < partition_offsets[partition] || partition_offsets[partition + 1] <= start) {
171
- ++partition;
203
+ void WindowConstantAggregate::Evaluate(const idx_t *begins, const idx_t *ends, Vector &target, idx_t count) {
204
+ // Chunk up the constants and copy them one at a time
205
+ idx_t matched = 0;
206
+ idx_t target_offset = 0;
207
+ for (idx_t i = 0; i < count; ++i) {
208
+ const auto begin = begins[i];
209
+ // Find the partition containing [begin, end)
210
+ while (partition_offsets[partition + 1] <= begin) {
211
+ // Flush the previous partition's data
212
+ if (matched) {
213
+ VectorOperations::Copy(*results, target, matches, matched, 0, target_offset);
214
+ target_offset += matched;
215
+ matched = 0;
216
+ }
217
+ ++partition;
218
+ }
219
+
220
+ matches.set_index(matched++, partition);
221
+ }
222
+
223
+ // Flush the last partition
224
+ if (matched) {
225
+ VectorOperations::Copy(*results, target, matches, matched, 0, target_offset);
226
+ }
227
+ }
228
+
229
+ //===--------------------------------------------------------------------===//
230
+ // WindowCustomAggregate
231
+ //===--------------------------------------------------------------------===//
232
+ WindowCustomAggregate::WindowCustomAggregate(AggregateObject aggr, const LogicalType &result_type, idx_t count)
233
+ : WindowAggregateState(std::move(aggr), result_type, count) {
234
+ // if we have a frame-by-frame method, share the single state
235
+ AggregateInit();
236
+ }
237
+
238
+ WindowCustomAggregate::~WindowCustomAggregate() {
239
+ if (aggr.function.destructor) {
240
+ AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator);
241
+ aggr.function.destructor(statef, aggr_input_data, 1);
172
242
  }
173
- D_ASSERT(partition_offsets[partition] <= start);
174
- D_ASSERT(partition + 1 < partition_offsets.size());
175
- D_ASSERT(end <= partition_offsets[partition + 1]);
243
+ }
244
+
245
+ void WindowCustomAggregate::Compute(Vector &result, idx_t rid, idx_t begin, idx_t end) {
246
+ // Frame boundaries
247
+ auto prev = frame;
248
+ frame = FrameBounds(begin, end);
176
249
 
177
- // Copy the value
178
- VectorOperations::Copy(*results, target, partition + 1, partition, rid);
250
+ // Extract the range
251
+ AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator);
252
+ aggr.function.window(inputs.data.data(), filter_mask, aggr_input_data, inputs.ColumnCount(), state.data(), frame,
253
+ prev, result, rid, 0);
179
254
  }
180
255
 
181
256
  //===--------------------------------------------------------------------===//
182
257
  // WindowSegmentTree
183
258
  //===--------------------------------------------------------------------===//
184
- WindowSegmentTree::WindowSegmentTree(AggregateObject aggr_p, const LogicalType &result_type_p, DataChunk *input,
185
- const ValidityMask &filter_mask_p, WindowAggregationMode mode_p)
186
- : aggr(std::move(aggr_p)), result_type(result_type_p), state(aggr.function.state_size()),
187
- statep(Value::POINTER(CastPointerToValue(state.data()))), frame(0, 0),
188
- statev(Value::POINTER(CastPointerToValue(state.data()))), internal_nodes(0), input_ref(input),
189
- filter_mask(filter_mask_p), mode(mode_p) {
190
- statep.Flatten(input->size());
191
- statev.SetVectorType(VectorType::FLAT_VECTOR); // Prevent conversion of results to constants
192
-
193
- if (input_ref && input_ref->ColumnCount() > 0) {
194
- filter_sel.Initialize(input->size());
195
- inputs.Initialize(Allocator::DefaultAllocator(), input_ref->GetTypes());
196
- // if we have a frame-by-frame method, share the single state
197
- if (aggr.function.window && UseWindowAPI()) {
198
- AggregateInit();
199
- inputs.Reference(*input_ref);
200
- } else {
201
- inputs.SetCapacity(*input_ref);
202
- if (aggr.function.combine && UseCombineAPI()) {
203
- ConstructTree();
204
- }
259
+ WindowSegmentTree::WindowSegmentTree(AggregateObject aggr, const LogicalType &result_type, idx_t count,
260
+ WindowAggregationMode mode_p)
261
+ : WindowAggregateState(std::move(aggr), result_type, count),
262
+ statep(Value::POINTER(CastPointerToValue(state.data()))), frame(0, 0), statel(LogicalType::POINTER),
263
+ flush_count(0), internal_nodes(0), mode(mode_p), allocator(Allocator::DefaultAllocator()) {
264
+ state.resize(state_size * STANDARD_VECTOR_SIZE);
265
+ statep.Flatten(STANDARD_VECTOR_SIZE);
266
+
267
+ // Build the finalise vector that just points to the result states
268
+ data_ptr_t state_ptr = state.data();
269
+ D_ASSERT(statef.GetVectorType() == VectorType::FLAT_VECTOR);
270
+ statef.SetVectorType(VectorType::CONSTANT_VECTOR);
271
+ statef.Flatten(STANDARD_VECTOR_SIZE);
272
+ auto fdata = FlatVector::GetData<data_ptr_t>(statef);
273
+ for (idx_t i = 0; i < STANDARD_VECTOR_SIZE; ++i) {
274
+ fdata[i] = state_ptr;
275
+ state_ptr += state_size;
276
+ }
277
+ }
278
+
279
+ void WindowSegmentTree::Finalize() {
280
+ if (inputs.ColumnCount() > 0) {
281
+ leaves.Initialize(Allocator::DefaultAllocator(), inputs.GetTypes());
282
+ filter_sel.Initialize();
283
+ if (aggr.function.combine && UseCombineAPI()) {
284
+ ConstructTree();
205
285
  }
206
286
  }
207
287
  }
@@ -211,13 +291,13 @@ WindowSegmentTree::~WindowSegmentTree() {
211
291
  // nothing to destroy
212
292
  return;
213
293
  }
214
- AggregateInputData aggr_input_data(aggr.GetFunctionData(), Allocator::DefaultAllocator());
294
+ AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator);
215
295
  // call the destructor for all the intermediate states
216
296
  data_ptr_t address_data[STANDARD_VECTOR_SIZE];
217
297
  Vector addresses(LogicalType::POINTER, data_ptr_cast(address_data));
218
298
  idx_t count = 0;
219
299
  for (idx_t i = 0; i < internal_nodes; i++) {
220
- address_data[count++] = data_ptr_t(levels_flat_native.get() + i * state.size());
300
+ address_data[count++] = data_ptr_t(levels_flat_native.get() + i * state_size);
221
301
  if (count == STANDARD_VECTOR_SIZE) {
222
302
  aggr.function.destructor(addresses, aggr_input_data, count);
223
303
  count = 0;
@@ -226,92 +306,92 @@ WindowSegmentTree::~WindowSegmentTree() {
226
306
  if (count > 0) {
227
307
  aggr.function.destructor(addresses, aggr_input_data, count);
228
308
  }
229
-
230
- if (aggr.function.window && UseWindowAPI()) {
231
- aggr.function.destructor(statev, aggr_input_data, 1);
232
- }
233
- }
234
-
235
- void WindowSegmentTree::AggregateInit() {
236
- aggr.function.initialize(state.data());
237
309
  }
238
310
 
239
- void WindowSegmentTree::AggegateFinal(Vector &result, idx_t rid) {
240
- AggregateInputData aggr_input_data(aggr.GetFunctionData(), Allocator::DefaultAllocator());
241
- aggr.function.finalize(statev, aggr_input_data, result, 1, rid);
242
-
243
- if (aggr.function.destructor) {
244
- aggr.function.destructor(statev, aggr_input_data, 1);
311
+ void WindowSegmentTree::FlushStates(bool combining) {
312
+ if (!flush_count) {
313
+ return;
245
314
  }
246
- }
247
315
 
248
- void WindowSegmentTree::ExtractFrame(idx_t begin, idx_t end) {
249
- const auto size = end - begin;
250
-
251
- auto &chunk = *input_ref;
252
- const auto input_count = input_ref->ColumnCount();
253
- inputs.SetCardinality(size);
254
- for (idx_t i = 0; i < input_count; ++i) {
255
- auto &v = inputs.data[i];
256
- auto &vec = chunk.data[i];
257
- v.Slice(vec, begin, end);
258
- v.Verify(size);
316
+ AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator);
317
+ if (combining) {
318
+ statel.Verify(flush_count);
319
+ aggr.function.combine(statel, statep, aggr_input_data, flush_count);
320
+ } else {
321
+ leaves.Reference(inputs);
322
+ leaves.Slice(filter_sel, flush_count);
323
+ aggr.function.update(&leaves.data[0], aggr_input_data, leaves.ColumnCount(), statep, flush_count);
259
324
  }
260
325
 
261
- // Slice to any filtered rows
262
- if (!filter_mask.AllValid()) {
263
- idx_t filtered = 0;
326
+ flush_count = 0;
327
+ }
328
+
329
+ void WindowSegmentTree::ExtractFrame(idx_t begin, idx_t end, data_ptr_t state_ptr) {
330
+ const auto count = end - begin;
331
+ D_ASSERT(count <= TREE_FANOUT);
332
+
333
+ // If we are not filtering,
334
+ // just update the shared dictionary selection to the range
335
+ // Otherwise set it to the input rows that pass the filter
336
+ auto states = FlatVector::GetData<data_ptr_t>(statep);
337
+ if (filter_mask.AllValid()) {
338
+ for (idx_t i = 0; i < count; ++i) {
339
+ states[flush_count] = state_ptr;
340
+ filter_sel.set_index(flush_count++, begin + i);
341
+ if (flush_count >= STANDARD_VECTOR_SIZE) {
342
+ FlushStates(false);
343
+ }
344
+ }
345
+ } else {
264
346
  for (idx_t i = begin; i < end; ++i) {
265
347
  if (filter_mask.RowIsValid(i)) {
266
- filter_sel.set_index(filtered++, i - begin);
348
+ states[flush_count] = state_ptr;
349
+ filter_sel.set_index(flush_count++, i);
350
+ if (flush_count >= STANDARD_VECTOR_SIZE) {
351
+ FlushStates(false);
352
+ }
267
353
  }
268
354
  }
269
- if (filtered != inputs.size()) {
270
- inputs.Slice(filter_sel, filtered);
271
- }
272
355
  }
273
356
  }
274
357
 
275
- void WindowSegmentTree::WindowSegmentValue(idx_t l_idx, idx_t begin, idx_t end) {
358
+ void WindowSegmentTree::WindowSegmentValue(idx_t l_idx, idx_t begin, idx_t end, data_ptr_t state_ptr) {
276
359
  D_ASSERT(begin <= end);
277
360
  if (begin == end || inputs.ColumnCount() == 0) {
278
361
  return;
279
362
  }
280
363
 
281
364
  const auto count = end - begin;
282
- Vector s(statep, 0, count);
283
365
  if (l_idx == 0) {
284
- ExtractFrame(begin, end);
285
- AggregateInputData aggr_input_data(aggr.GetFunctionData(), Allocator::DefaultAllocator());
286
- D_ASSERT(!inputs.data.empty());
287
- aggr.function.update(&inputs.data[0], aggr_input_data, input_ref->ColumnCount(), s, inputs.size());
366
+ ExtractFrame(begin, end, state_ptr);
288
367
  } else {
289
368
  // find out where the states begin
290
- data_ptr_t begin_ptr = levels_flat_native.get() + state.size() * (begin + levels_flat_start[l_idx - 1]);
369
+ data_ptr_t begin_ptr = levels_flat_native.get() + state_size * (begin + levels_flat_start[l_idx - 1]);
291
370
  // set up a vector of pointers that point towards the set of states
292
- Vector v(LogicalType::POINTER, count);
293
- auto pdata = FlatVector::GetData<data_ptr_t>(v);
371
+ auto ldata = FlatVector::GetData<data_ptr_t>(statel);
372
+ auto pdata = FlatVector::GetData<data_ptr_t>(statep);
294
373
  for (idx_t i = 0; i < count; i++) {
295
- pdata[i] = begin_ptr + i * state.size();
374
+ pdata[flush_count] = state_ptr;
375
+ ldata[flush_count++] = begin_ptr;
376
+ begin_ptr += state_size;
377
+ if (flush_count >= STANDARD_VECTOR_SIZE) {
378
+ FlushStates(true);
379
+ }
296
380
  }
297
- v.Verify(count);
298
- AggregateInputData aggr_input_data(aggr.GetFunctionData(), Allocator::DefaultAllocator());
299
- aggr.function.combine(v, s, aggr_input_data, count);
300
381
  }
301
382
  }
302
383
 
303
384
  void WindowSegmentTree::ConstructTree() {
304
- D_ASSERT(input_ref);
305
385
  D_ASSERT(inputs.ColumnCount() > 0);
306
386
 
307
387
  // compute space required to store internal nodes of segment tree
308
388
  internal_nodes = 0;
309
- idx_t level_nodes = input_ref->size();
389
+ idx_t level_nodes = inputs.size();
310
390
  do {
311
391
  level_nodes = (level_nodes + (TREE_FANOUT - 1)) / TREE_FANOUT;
312
392
  internal_nodes += level_nodes;
313
393
  } while (level_nodes > 1);
314
- levels_flat_native = make_unsafe_uniq_array<data_t>(internal_nodes * state.size());
394
+ levels_flat_native = make_unsafe_uniq_array<data_t>(internal_nodes * state_size);
315
395
  levels_flat_start.push_back(0);
316
396
 
317
397
  idx_t levels_flat_offset = 0;
@@ -319,14 +399,14 @@ void WindowSegmentTree::ConstructTree() {
319
399
  // level 0 is data itself
320
400
  idx_t level_size;
321
401
  // iterate over the levels of the segment tree
322
- while ((level_size = (level_current == 0 ? input_ref->size()
323
- : levels_flat_offset - levels_flat_start[level_current - 1])) > 1) {
402
+ while ((level_size =
403
+ (level_current == 0 ? inputs.size() : levels_flat_offset - levels_flat_start[level_current - 1])) > 1) {
324
404
  for (idx_t pos = 0; pos < level_size; pos += TREE_FANOUT) {
325
405
  // compute the aggregate for this entry in the segment tree
326
- AggregateInit();
327
- WindowSegmentValue(level_current, pos, MinValue(level_size, pos + TREE_FANOUT));
328
-
329
- memcpy(levels_flat_native.get() + (levels_flat_offset * state.size()), state.data(), state.size());
406
+ data_ptr_t state_ptr = levels_flat_native.get() + (levels_flat_offset * state_size);
407
+ aggr.function.initialize(state_ptr);
408
+ WindowSegmentValue(level_current, pos, MinValue(level_size, pos + TREE_FANOUT), state_ptr);
409
+ FlushStates(level_current > 0);
330
410
 
331
411
  levels_flat_offset++;
332
412
  }
@@ -341,52 +421,129 @@ void WindowSegmentTree::ConstructTree() {
341
421
  }
342
422
  }
343
423
 
344
- void WindowSegmentTree::Compute(Vector &result, idx_t rid, idx_t begin, idx_t end) {
345
- D_ASSERT(input_ref);
424
+ void WindowSegmentTree::Evaluate(const idx_t *begins, const idx_t *ends, Vector &result, idx_t count) {
425
+ const auto cant_combine = (!aggr.function.combine || !UseCombineAPI());
426
+ auto fdata = FlatVector::GetData<data_ptr_t>(statef);
427
+
428
+ // First pass: aggregate the segment tree nodes
429
+ // Share adjacent identical states
430
+ // We do this first because we want to share only tree aggregations
431
+ idx_t prev_begin = 1;
432
+ idx_t prev_end = 0;
433
+ auto ldata = FlatVector::GetData<data_ptr_t>(statel);
434
+ auto pdata = FlatVector::GetData<data_ptr_t>(statep);
435
+ data_ptr_t prev_state = nullptr;
436
+ for (idx_t rid = 0; rid < count; ++rid) {
437
+ auto state_ptr = fdata[rid];
438
+ aggr.function.initialize(state_ptr);
439
+
440
+ if (cant_combine) {
441
+ // Make sure we initialise all states
442
+ continue;
443
+ }
346
444
 
347
- // If we have a window function, use that
348
- if (aggr.function.window && UseWindowAPI()) {
349
- // Frame boundaries
350
- auto prev = frame;
351
- frame = FrameBounds(begin, end);
445
+ auto begin = begins[rid];
446
+ auto end = ends[rid];
447
+ if (begin >= end) {
448
+ continue;
449
+ }
352
450
 
353
- // Extract the range
354
- AggregateInputData aggr_input_data(aggr.GetFunctionData(), Allocator::DefaultAllocator());
355
- aggr.function.window(input_ref->data.data(), filter_mask, aggr_input_data, inputs.ColumnCount(), state.data(),
356
- frame, prev, result, rid, 0);
357
- return;
358
- }
451
+ // Skip level 0
452
+ idx_t l_idx = 0;
453
+ for (; l_idx < levels_flat_start.size() + 1; l_idx++) {
454
+ idx_t parent_begin = begin / TREE_FANOUT;
455
+ idx_t parent_end = end / TREE_FANOUT;
456
+ if (prev_state && l_idx == 1 && begin == prev_begin && end == prev_end) {
457
+ // Just combine the previous top level result
458
+ ldata[flush_count] = prev_state;
459
+ pdata[flush_count] = state_ptr;
460
+ if (++flush_count >= STANDARD_VECTOR_SIZE) {
461
+ FlushStates(true);
462
+ }
463
+ break;
464
+ }
359
465
 
360
- AggregateInit();
466
+ if (l_idx == 1) {
467
+ prev_state = state_ptr;
468
+ prev_begin = begin;
469
+ prev_end = end;
470
+ }
361
471
 
362
- // Aggregate everything at once if we can't combine states
363
- if (!aggr.function.combine || !UseCombineAPI()) {
364
- WindowSegmentValue(0, begin, end);
365
- AggegateFinal(result, rid);
366
- return;
472
+ if (parent_begin == parent_end) {
473
+ if (l_idx) {
474
+ WindowSegmentValue(l_idx, begin, end, state_ptr);
475
+ }
476
+ break;
477
+ }
478
+ idx_t group_begin = parent_begin * TREE_FANOUT;
479
+ if (begin != group_begin) {
480
+ if (l_idx) {
481
+ WindowSegmentValue(l_idx, begin, group_begin + TREE_FANOUT, state_ptr);
482
+ }
483
+ parent_begin++;
484
+ }
485
+ idx_t group_end = parent_end * TREE_FANOUT;
486
+ if (end != group_end) {
487
+ if (l_idx) {
488
+ WindowSegmentValue(l_idx, group_end, end, state_ptr);
489
+ }
490
+ }
491
+ begin = parent_begin;
492
+ end = parent_end;
493
+ }
367
494
  }
495
+ FlushStates(true);
496
+
497
+ // Second pass: aggregate the ragged leaves
498
+ // (or everything if we can't combine)
499
+ for (idx_t rid = 0; rid < count; ++rid) {
500
+ auto state_ptr = fdata[rid];
368
501
 
369
- for (idx_t l_idx = 0; l_idx < levels_flat_start.size() + 1; l_idx++) {
502
+ const auto begin = begins[rid];
503
+ const auto end = ends[rid];
504
+ if (begin >= end) {
505
+ continue;
506
+ }
507
+
508
+ // Aggregate everything at once if we can't combine states
370
509
  idx_t parent_begin = begin / TREE_FANOUT;
371
510
  idx_t parent_end = end / TREE_FANOUT;
372
- if (parent_begin == parent_end) {
373
- WindowSegmentValue(l_idx, begin, end);
374
- break;
511
+ if (parent_begin == parent_end || cant_combine) {
512
+ WindowSegmentValue(0, begin, end, state_ptr);
513
+ continue;
375
514
  }
515
+
376
516
  idx_t group_begin = parent_begin * TREE_FANOUT;
377
517
  if (begin != group_begin) {
378
- WindowSegmentValue(l_idx, begin, group_begin + TREE_FANOUT);
518
+ WindowSegmentValue(0, begin, group_begin + TREE_FANOUT, state_ptr);
379
519
  parent_begin++;
380
520
  }
381
521
  idx_t group_end = parent_end * TREE_FANOUT;
382
522
  if (end != group_end) {
383
- WindowSegmentValue(l_idx, group_end, end);
523
+ WindowSegmentValue(0, group_end, end, state_ptr);
384
524
  }
385
- begin = parent_begin;
386
- end = parent_end;
387
525
  }
526
+ FlushStates(false);
527
+
528
+ // Finalise the result aggregates
529
+ AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator);
530
+ aggr.function.finalize(statef, aggr_input_data, result, count, 0);
531
+
532
+ // Destruct the result aggregates
533
+ if (aggr.function.destructor) {
534
+ aggr.function.destructor(statef, aggr_input_data, count);
535
+ }
536
+
537
+ // Set the validity mask on the invalid rows
538
+ auto &rmask = FlatVector::Validity(result);
539
+ for (idx_t rid = 0; rid < count; ++rid) {
540
+ const auto begin = begins[rid];
541
+ const auto end = ends[rid];
388
542
 
389
- AggegateFinal(result, rid);
543
+ if (begin >= end) {
544
+ rmask.SetInvalid(rid);
545
+ }
546
+ }
390
547
  }
391
548
 
392
549
  } // namespace duckdb
@@ -374,7 +374,8 @@ struct SortedAggregateFunction {
374
374
 
375
375
  // State variables
376
376
  auto bind_info = order_bind.bind_info.get();
377
- AggregateInputData aggr_bind_info(bind_info, Allocator::DefaultAllocator());
377
+ ArenaAllocator allocator(Allocator::DefaultAllocator());
378
+ AggregateInputData aggr_bind_info(bind_info, allocator);
378
379
 
379
380
  // Inner aggregate APIs
380
381
  auto initialize = order_bind.function.initialize;
@@ -1,3 +1,6 @@
1
+ #include "duckdb/common/hugeint.hpp"
2
+ #include "duckdb/common/operator/cast_operators.hpp"
3
+ #include "duckdb/common/types.hpp"
1
4
  #include "duckdb/function/cast/default_casts.hpp"
2
5
  #include "duckdb/function/cast/vector_cast_helpers.hpp"
3
6
 
@@ -6,9 +9,38 @@ namespace duckdb {
6
9
  BoundCastInfo DefaultCasts::BitCastSwitch(BindCastInput &input, const LogicalType &source, const LogicalType &target) {
7
10
  // now switch on the result type
8
11
  switch (target.id()) {
12
+ // Numerics
13
+ case LogicalTypeId::BOOLEAN:
14
+ return BoundCastInfo(&VectorCastHelpers::TryCastLoop<string_t, bool, CastFromBitToNumeric>);
15
+ case LogicalTypeId::TINYINT:
16
+ return BoundCastInfo(&VectorCastHelpers::TryCastLoop<string_t, int8_t, CastFromBitToNumeric>);
17
+ case LogicalTypeId::SMALLINT:
18
+ return BoundCastInfo(&VectorCastHelpers::TryCastLoop<string_t, int16_t, CastFromBitToNumeric>);
19
+ case LogicalTypeId::INTEGER:
20
+ return BoundCastInfo(&VectorCastHelpers::TryCastLoop<string_t, int32_t, CastFromBitToNumeric>);
21
+ case LogicalTypeId::BIGINT:
22
+ return BoundCastInfo(&VectorCastHelpers::TryCastLoop<string_t, int64_t, CastFromBitToNumeric>);
23
+ case LogicalTypeId::UTINYINT:
24
+ return BoundCastInfo(&VectorCastHelpers::TryCastLoop<string_t, uint8_t, CastFromBitToNumeric>);
25
+ case LogicalTypeId::USMALLINT:
26
+ return BoundCastInfo(&VectorCastHelpers::TryCastLoop<string_t, uint16_t, CastFromBitToNumeric>);
27
+ case LogicalTypeId::UINTEGER:
28
+ return BoundCastInfo(&VectorCastHelpers::TryCastLoop<string_t, uint32_t, CastFromBitToNumeric>);
29
+ case LogicalTypeId::UBIGINT:
30
+ return BoundCastInfo(&VectorCastHelpers::TryCastLoop<string_t, uint64_t, CastFromBitToNumeric>);
31
+ case LogicalTypeId::HUGEINT:
32
+ return BoundCastInfo(&VectorCastHelpers::TryCastLoop<string_t, hugeint_t, CastFromBitToNumeric>);
33
+ case LogicalTypeId::FLOAT:
34
+ return BoundCastInfo(&VectorCastHelpers::TryCastLoop<string_t, float, CastFromBitToNumeric>);
35
+ case LogicalTypeId::DOUBLE:
36
+ return BoundCastInfo(&VectorCastHelpers::TryCastLoop<string_t, double, CastFromBitToNumeric>);
37
+
38
+ case LogicalTypeId::BLOB:
39
+ return BoundCastInfo(&VectorCastHelpers::StringCast<string_t, CastFromBitToBlob>);
40
+
9
41
  case LogicalTypeId::VARCHAR:
10
- // bit to varchar
11
- return BoundCastInfo(&VectorCastHelpers::StringCast<string_t, duckdb::CastFromBit>);
42
+ return BoundCastInfo(&VectorCastHelpers::StringCast<string_t, CastFromBitToString>);
43
+
12
44
  default:
13
45
  return DefaultCasts::TryVectorNullCast;
14
46
  }
@@ -11,6 +11,9 @@ BoundCastInfo DefaultCasts::BlobCastSwitch(BindCastInput &input, const LogicalTy
11
11
  return BoundCastInfo(&VectorCastHelpers::StringCast<string_t, duckdb::CastFromBlob>);
12
12
  case LogicalTypeId::AGGREGATE_STATE:
13
13
  return DefaultCasts::ReinterpretCast;
14
+ case LogicalTypeId::BIT:
15
+ return BoundCastInfo(&VectorCastHelpers::StringCast<string_t, duckdb::CastFromBlobToBit>);
16
+
14
17
  default:
15
18
  return DefaultCasts::TryVectorNullCast;
16
19
  }
@@ -37,6 +37,8 @@ static BoundCastInfo InternalNumericCastSwitch(const LogicalType &source, const
37
37
  return BoundCastInfo(&VectorCastHelpers::ToDecimalCast<SRC>);
38
38
  case LogicalTypeId::VARCHAR:
39
39
  return BoundCastInfo(&VectorCastHelpers::StringCast<SRC, duckdb::StringCast>);
40
+ case LogicalTypeId::BIT:
41
+ return BoundCastInfo(&VectorCastHelpers::StringCast<SRC, duckdb::NumericTryCastToBit>);
40
42
  default:
41
43
  return DefaultCasts::TryVectorNullCast;
42
44
  }
@@ -94,6 +94,8 @@ void BuiltinFunctions::Initialize() {
94
94
 
95
95
  RegisterDistributiveAggregates();
96
96
 
97
+ RegisterCompressedMaterializationFunctions();
98
+
97
99
  RegisterGenericFunctions();
98
100
  RegisterOperators();
99
101
  RegisterSequenceFunctions();
@@ -111,7 +113,7 @@ void BuiltinFunctions::Initialize() {
111
113
  hash_t BaseScalarFunction::Hash() const {
112
114
  hash_t hash = return_type.Hash();
113
115
  for (auto &arg : arguments) {
114
- duckdb::CombineHash(hash, arg.Hash());
116
+ hash = duckdb::CombineHash(hash, arg.Hash());
115
117
  }
116
118
  return hash;
117
119
  }