duckdb 0.8.2-dev145.0 → 0.8.2-dev1493.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (476) hide show
  1. package/binding.gyp +15 -12
  2. package/binding.gyp.in +1 -1
  3. package/configure.py +1 -1
  4. package/duckdb_extension_config.cmake +10 -0
  5. package/package.json +1 -1
  6. package/src/duckdb/extension/icu/icu-dateadd.cpp +2 -2
  7. package/src/duckdb/extension/icu/icu-datefunc.cpp +1 -1
  8. package/src/duckdb/extension/icu/icu-datepart.cpp +2 -2
  9. package/src/duckdb/extension/icu/icu-datesub.cpp +2 -2
  10. package/src/duckdb/extension/icu/icu-datetrunc.cpp +1 -1
  11. package/src/duckdb/extension/icu/icu-list-range.cpp +1 -1
  12. package/src/duckdb/extension/icu/icu-makedate.cpp +7 -0
  13. package/src/duckdb/extension/icu/icu-strptime.cpp +4 -4
  14. package/src/duckdb/extension/icu/icu-table-range.cpp +5 -5
  15. package/src/duckdb/extension/icu/icu-timebucket.cpp +16 -16
  16. package/src/duckdb/extension/icu/icu-timezone.cpp +8 -8
  17. package/src/duckdb/extension/icu/icu_extension.cpp +3 -3
  18. package/src/duckdb/extension/json/include/json_common.hpp +47 -231
  19. package/src/duckdb/extension/json/include/json_executors.hpp +49 -13
  20. package/src/duckdb/extension/json/include/json_functions.hpp +2 -1
  21. package/src/duckdb/extension/json/json_common.cpp +272 -40
  22. package/src/duckdb/extension/json/json_functions/json_structure.cpp +1 -1
  23. package/src/duckdb/extension/json/json_functions/json_transform.cpp +17 -37
  24. package/src/duckdb/extension/json/json_functions/json_type.cpp +1 -1
  25. package/src/duckdb/extension/json/json_functions.cpp +24 -24
  26. package/src/duckdb/extension/json/json_scan.cpp +3 -6
  27. package/src/duckdb/extension/parquet/column_reader.cpp +19 -21
  28. package/src/duckdb/extension/parquet/column_writer.cpp +77 -61
  29. package/src/duckdb/extension/parquet/include/cast_column_reader.hpp +2 -2
  30. package/src/duckdb/extension/parquet/include/column_reader.hpp +14 -16
  31. package/src/duckdb/extension/parquet/include/column_writer.hpp +9 -7
  32. package/src/duckdb/extension/parquet/include/list_column_reader.hpp +2 -2
  33. package/src/duckdb/extension/parquet/include/parquet_dbp_decoder.hpp +3 -3
  34. package/src/duckdb/extension/parquet/include/parquet_decimal_utils.hpp +3 -3
  35. package/src/duckdb/extension/parquet/include/parquet_file_metadata_cache.hpp +2 -2
  36. package/src/duckdb/extension/parquet/include/parquet_statistics.hpp +2 -2
  37. package/src/duckdb/extension/parquet/include/parquet_support.hpp +9 -11
  38. package/src/duckdb/extension/parquet/include/parquet_writer.hpp +24 -5
  39. package/src/duckdb/extension/parquet/include/string_column_reader.hpp +1 -1
  40. package/src/duckdb/extension/parquet/include/struct_column_reader.hpp +2 -3
  41. package/src/duckdb/extension/parquet/include/zstd_file_system.hpp +2 -2
  42. package/src/duckdb/extension/parquet/parquet_extension.cpp +192 -20
  43. package/src/duckdb/extension/parquet/parquet_reader.cpp +6 -6
  44. package/src/duckdb/extension/parquet/parquet_statistics.cpp +7 -6
  45. package/src/duckdb/extension/parquet/parquet_writer.cpp +79 -16
  46. package/src/duckdb/extension/parquet/zstd_file_system.cpp +2 -2
  47. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +1 -1
  48. package/src/duckdb/src/catalog/catalog_search_path.cpp +5 -4
  49. package/src/duckdb/src/catalog/default/default_functions.cpp +16 -0
  50. package/src/duckdb/src/common/adbc/adbc.cpp +75 -10
  51. package/src/duckdb/src/common/adbc/driver_manager.cpp +6 -11
  52. package/src/duckdb/src/common/allocator.cpp +14 -2
  53. package/src/duckdb/src/common/arrow/arrow_appender.cpp +5 -11
  54. package/src/duckdb/src/common/assert.cpp +3 -0
  55. package/src/duckdb/src/common/enum_util.cpp +42 -5
  56. package/src/duckdb/src/common/enums/logical_operator_type.cpp +4 -0
  57. package/src/duckdb/src/common/enums/optimizer_type.cpp +2 -0
  58. package/src/duckdb/src/common/enums/physical_operator_type.cpp +4 -0
  59. package/src/duckdb/src/common/exception.cpp +2 -2
  60. package/src/duckdb/src/common/file_system.cpp +19 -0
  61. package/src/duckdb/src/common/hive_partitioning.cpp +10 -6
  62. package/src/duckdb/src/common/local_file_system.cpp +2 -2
  63. package/src/duckdb/src/common/multi_file_reader.cpp +184 -20
  64. package/src/duckdb/src/common/operator/cast_operators.cpp +35 -1
  65. package/src/duckdb/src/common/radix_partitioning.cpp +26 -8
  66. package/src/duckdb/src/common/re2_regex.cpp +1 -1
  67. package/src/duckdb/src/common/row_operations/row_external.cpp +1 -1
  68. package/src/duckdb/src/common/sort/merge_sorter.cpp +9 -16
  69. package/src/duckdb/src/common/sort/partition_state.cpp +44 -11
  70. package/src/duckdb/src/common/types/batched_data_collection.cpp +7 -2
  71. package/src/duckdb/src/common/types/bit.cpp +51 -0
  72. package/src/duckdb/src/common/types/column/column_data_allocator.cpp +9 -6
  73. package/src/duckdb/src/common/types/column/column_data_collection.cpp +17 -2
  74. package/src/duckdb/src/common/types/column/column_data_collection_segment.cpp +15 -6
  75. package/src/duckdb/src/common/types/column/partitioned_column_data.cpp +2 -2
  76. package/src/duckdb/src/common/types/data_chunk.cpp +2 -2
  77. package/src/duckdb/src/common/types/date.cpp +9 -0
  78. package/src/duckdb/src/common/types/list_segment.cpp +24 -74
  79. package/src/duckdb/src/common/types/row/partitioned_tuple_data.cpp +3 -9
  80. package/src/duckdb/src/common/types/row/tuple_data_collection.cpp +2 -0
  81. package/src/duckdb/src/common/types/row/tuple_data_scatter_gather.cpp +2 -2
  82. package/src/duckdb/src/common/types/uuid.cpp +2 -2
  83. package/src/duckdb/src/common/types/validity_mask.cpp +33 -0
  84. package/src/duckdb/src/common/virtual_file_system.cpp +138 -1
  85. package/src/duckdb/src/core_functions/aggregate/holistic/reservoir_quantile.cpp +2 -0
  86. package/src/duckdb/src/core_functions/aggregate/nested/list.cpp +2 -2
  87. package/src/duckdb/src/core_functions/aggregate/regression/regr_avg.cpp +4 -4
  88. package/src/duckdb/src/core_functions/aggregate/regression/regr_intercept.cpp +4 -4
  89. package/src/duckdb/src/core_functions/aggregate/regression/regr_r2.cpp +5 -4
  90. package/src/duckdb/src/core_functions/aggregate/regression/regr_sxx_syy.cpp +8 -8
  91. package/src/duckdb/src/core_functions/aggregate/regression/regr_sxy.cpp +4 -3
  92. package/src/duckdb/src/core_functions/function_list.cpp +4 -2
  93. package/src/duckdb/src/core_functions/scalar/date/date_part.cpp +208 -42
  94. package/src/duckdb/src/core_functions/scalar/date/epoch.cpp +10 -24
  95. package/src/duckdb/src/core_functions/scalar/date/make_date.cpp +19 -4
  96. package/src/duckdb/src/core_functions/scalar/list/list_aggregates.cpp +4 -2
  97. package/src/duckdb/src/execution/aggregate_hashtable.cpp +34 -18
  98. package/src/duckdb/src/execution/expression_executor.cpp +1 -1
  99. package/src/duckdb/src/execution/index/art/art.cpp +149 -139
  100. package/src/duckdb/src/execution/index/art/fixed_size_allocator.cpp +1 -1
  101. package/src/duckdb/src/execution/index/art/iterator.cpp +129 -207
  102. package/src/duckdb/src/execution/index/art/leaf.cpp +8 -37
  103. package/src/duckdb/src/execution/index/art/node.cpp +113 -120
  104. package/src/duckdb/src/execution/index/art/node16.cpp +1 -10
  105. package/src/duckdb/src/execution/index/art/node256.cpp +1 -9
  106. package/src/duckdb/src/execution/index/art/node4.cpp +12 -13
  107. package/src/duckdb/src/execution/index/art/node48.cpp +1 -11
  108. package/src/duckdb/src/execution/index/art/prefix.cpp +228 -350
  109. package/src/duckdb/src/execution/join_hashtable.cpp +4 -4
  110. package/src/duckdb/src/execution/operator/aggregate/aggregate_object.cpp +1 -0
  111. package/src/duckdb/src/execution/operator/aggregate/physical_streaming_window.cpp +8 -3
  112. package/src/duckdb/src/execution/operator/aggregate/physical_ungrouped_aggregate.cpp +32 -22
  113. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +512 -300
  114. package/src/duckdb/src/execution/operator/helper/physical_batch_collector.cpp +4 -3
  115. package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +5 -5
  116. package/src/duckdb/src/execution/operator/join/physical_asof_join.cpp +414 -283
  117. package/src/duckdb/src/execution/operator/join/physical_comparison_join.cpp +1 -1
  118. package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +21 -10
  119. package/src/duckdb/src/execution/operator/join/physical_join.cpp +1 -1
  120. package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +22 -3
  121. package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +2 -2
  122. package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +100 -13
  123. package/src/duckdb/src/execution/operator/persistent/csv_file_handle.cpp +1 -1
  124. package/src/duckdb/src/execution/operator/persistent/csv_reader_options.cpp +20 -0
  125. package/src/duckdb/src/execution/operator/persistent/csv_rejects_table.cpp +48 -0
  126. package/src/duckdb/src/execution/operator/persistent/parallel_csv_reader.cpp +2 -3
  127. package/src/duckdb/src/execution/operator/persistent/physical_batch_copy_to_file.cpp +6 -4
  128. package/src/duckdb/src/execution/operator/persistent/physical_fixed_batch_copy.cpp +3 -3
  129. package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +1 -1
  130. package/src/duckdb/src/execution/operator/projection/physical_pivot.cpp +2 -1
  131. package/src/duckdb/src/execution/operator/scan/physical_column_data_scan.cpp +19 -0
  132. package/src/duckdb/src/execution/operator/scan/physical_table_scan.cpp +7 -2
  133. package/src/duckdb/src/execution/operator/set/physical_cte.cpp +160 -0
  134. package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +15 -5
  135. package/src/duckdb/src/execution/partitionable_hashtable.cpp +41 -6
  136. package/src/duckdb/src/execution/perfect_aggregate_hashtable.cpp +30 -5
  137. package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +43 -10
  138. package/src/duckdb/src/execution/physical_plan/plan_cte.cpp +33 -0
  139. package/src/duckdb/src/execution/physical_plan/plan_get.cpp +2 -2
  140. package/src/duckdb/src/execution/physical_plan/plan_recursive_cte.cpp +25 -4
  141. package/src/duckdb/src/execution/physical_plan_generator.cpp +4 -0
  142. package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +290 -43
  143. package/src/duckdb/src/execution/window_segment_tree.cpp +286 -129
  144. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +2 -1
  145. package/src/duckdb/src/function/cast/bit_cast.cpp +34 -2
  146. package/src/duckdb/src/function/cast/blob_cast.cpp +3 -0
  147. package/src/duckdb/src/function/cast/numeric_casts.cpp +2 -0
  148. package/src/duckdb/src/function/function.cpp +3 -1
  149. package/src/duckdb/src/function/scalar/compressed_materialization/compress_integral.cpp +212 -0
  150. package/src/duckdb/src/function/scalar/compressed_materialization/compress_string.cpp +249 -0
  151. package/src/duckdb/src/function/scalar/compressed_materialization_functions.cpp +29 -0
  152. package/src/duckdb/src/function/scalar/list/list_resize.cpp +162 -0
  153. package/src/duckdb/src/function/scalar/nested_functions.cpp +1 -0
  154. package/src/duckdb/src/function/scalar/string/like.cpp +12 -4
  155. package/src/duckdb/src/function/scalar/system/aggregate_export.cpp +12 -5
  156. package/src/duckdb/src/function/table/copy_csv.cpp +8 -1
  157. package/src/duckdb/src/function/table/read_csv.cpp +100 -17
  158. package/src/duckdb/src/function/table/table_scan.cpp +9 -0
  159. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  160. package/src/duckdb/src/include/duckdb/common/adbc/adbc.hpp +1 -0
  161. package/src/duckdb/src/include/duckdb/common/allocator.hpp +2 -0
  162. package/src/duckdb/src/include/duckdb/common/bswap.hpp +42 -0
  163. package/src/duckdb/src/include/duckdb/common/enum_util.hpp +8 -0
  164. package/src/duckdb/src/include/duckdb/common/enums/cte_materialize.hpp +21 -0
  165. package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +2 -1
  166. package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +2 -0
  167. package/src/duckdb/src/include/duckdb/common/enums/optimizer_type.hpp +2 -0
  168. package/src/duckdb/src/include/duckdb/common/enums/physical_operator_type.hpp +2 -0
  169. package/src/duckdb/src/include/duckdb/common/extra_operator_info.hpp +27 -0
  170. package/src/duckdb/src/include/duckdb/common/file_system.hpp +2 -0
  171. package/src/duckdb/src/include/duckdb/common/hive_partitioning.hpp +1 -1
  172. package/src/duckdb/src/include/duckdb/common/multi_file_reader.hpp +6 -4
  173. package/src/duckdb/src/include/duckdb/common/multi_file_reader_options.hpp +10 -42
  174. package/src/duckdb/src/include/duckdb/common/mutex.hpp +3 -0
  175. package/src/duckdb/src/include/duckdb/common/operator/cast_operators.hpp +43 -3
  176. package/src/duckdb/src/include/duckdb/common/operator/numeric_cast.hpp +10 -0
  177. package/src/duckdb/src/include/duckdb/common/radix.hpp +9 -20
  178. package/src/duckdb/src/include/duckdb/common/radix_partitioning.hpp +6 -21
  179. package/src/duckdb/src/include/duckdb/common/row_operations/row_operations.hpp +3 -3
  180. package/src/duckdb/src/include/duckdb/common/sort/partition_state.hpp +13 -0
  181. package/src/duckdb/src/include/duckdb/common/types/batched_data_collection.hpp +3 -1
  182. package/src/duckdb/src/include/duckdb/common/types/bit.hpp +81 -0
  183. package/src/duckdb/src/include/duckdb/common/types/column/column_data_allocator.hpp +1 -1
  184. package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection.hpp +6 -1
  185. package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection_segment.hpp +1 -1
  186. package/src/duckdb/src/include/duckdb/common/types/column/column_data_scan_states.hpp +3 -1
  187. package/src/duckdb/src/include/duckdb/common/types/data_chunk.hpp +1 -1
  188. package/src/duckdb/src/include/duckdb/common/types/date.hpp +7 -5
  189. package/src/duckdb/src/include/duckdb/common/types/list_segment.hpp +6 -8
  190. package/src/duckdb/src/include/duckdb/common/types/row/partitioned_tuple_data.hpp +0 -1
  191. package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_collection.hpp +1 -0
  192. package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_states.hpp +3 -0
  193. package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +9 -0
  194. package/src/duckdb/src/include/duckdb/common/virtual_file_system.hpp +38 -97
  195. package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/corr.hpp +4 -4
  196. package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/covar.hpp +3 -1
  197. package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic_functions.hpp +3 -1
  198. package/src/duckdb/src/include/duckdb/core_functions/aggregate/distributive_functions.hpp +3 -1
  199. package/src/duckdb/src/include/duckdb/core_functions/aggregate/holistic_functions.hpp +3 -1
  200. package/src/duckdb/src/include/duckdb/core_functions/aggregate/nested_functions.hpp +3 -1
  201. package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_count.hpp +1 -0
  202. package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_slope.hpp +3 -3
  203. package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression_functions.hpp +3 -1
  204. package/src/duckdb/src/include/duckdb/core_functions/scalar/bit_functions.hpp +3 -1
  205. package/src/duckdb/src/include/duckdb/core_functions/scalar/blob_functions.hpp +3 -1
  206. package/src/duckdb/src/include/duckdb/core_functions/scalar/date_functions.hpp +31 -11
  207. package/src/duckdb/src/include/duckdb/core_functions/scalar/enum_functions.hpp +3 -1
  208. package/src/duckdb/src/include/duckdb/core_functions/scalar/generic_functions.hpp +3 -1
  209. package/src/duckdb/src/include/duckdb/core_functions/scalar/list_functions.hpp +3 -1
  210. package/src/duckdb/src/include/duckdb/core_functions/scalar/map_functions.hpp +3 -1
  211. package/src/duckdb/src/include/duckdb/core_functions/scalar/math_functions.hpp +3 -1
  212. package/src/duckdb/src/include/duckdb/core_functions/scalar/operators_functions.hpp +3 -1
  213. package/src/duckdb/src/include/duckdb/core_functions/scalar/random_functions.hpp +3 -1
  214. package/src/duckdb/src/include/duckdb/core_functions/scalar/string_functions.hpp +3 -1
  215. package/src/duckdb/src/include/duckdb/core_functions/scalar/struct_functions.hpp +3 -1
  216. package/src/duckdb/src/include/duckdb/core_functions/scalar/union_functions.hpp +3 -1
  217. package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +21 -3
  218. package/src/duckdb/src/include/duckdb/execution/executor.hpp +3 -0
  219. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +4 -5
  220. package/src/duckdb/src/include/duckdb/execution/index/art/iterator.hpp +31 -27
  221. package/src/duckdb/src/include/duckdb/execution/index/art/leaf.hpp +6 -14
  222. package/src/duckdb/src/include/duckdb/execution/index/art/node.hpp +4 -10
  223. package/src/duckdb/src/include/duckdb/execution/index/art/node16.hpp +3 -6
  224. package/src/duckdb/src/include/duckdb/execution/index/art/node256.hpp +3 -6
  225. package/src/duckdb/src/include/duckdb/execution/index/art/node4.hpp +5 -8
  226. package/src/duckdb/src/include/duckdb/execution/index/art/node48.hpp +3 -6
  227. package/src/duckdb/src/include/duckdb/execution/index/art/prefix.hpp +63 -52
  228. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_asof_join.hpp +2 -10
  229. package/src/duckdb/src/include/duckdb/execution/operator/persistent/base_csv_reader.hpp +2 -2
  230. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_line_info.hpp +4 -3
  231. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +8 -1
  232. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_rejects_table.hpp +36 -0
  233. package/src/duckdb/src/include/duckdb/execution/operator/persistent/parallel_csv_reader.hpp +1 -1
  234. package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_column_data_scan.hpp +10 -0
  235. package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_table_scan.hpp +5 -1
  236. package/src/duckdb/src/include/duckdb/execution/operator/set/physical_cte.hpp +62 -0
  237. package/src/duckdb/src/include/duckdb/execution/operator/set/physical_recursive_cte.hpp +8 -2
  238. package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +5 -1
  239. package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +3 -0
  240. package/src/duckdb/src/include/duckdb/execution/radix_partitioned_hashtable.hpp +10 -3
  241. package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +51 -40
  242. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +1 -1
  243. package/src/duckdb/src/include/duckdb/function/aggregate_state.hpp +2 -2
  244. package/src/duckdb/src/include/duckdb/function/built_in_functions.hpp +1 -0
  245. package/src/duckdb/src/include/duckdb/function/scalar/compressed_materialization_functions.hpp +49 -0
  246. package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +1 -1
  247. package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +5 -0
  248. package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +2 -0
  249. package/src/duckdb/src/include/duckdb/main/client_config.hpp +3 -0
  250. package/src/duckdb/src/include/duckdb/main/config.hpp +2 -0
  251. package/src/duckdb/src/include/duckdb/main/connection.hpp +1 -2
  252. package/src/duckdb/src/include/duckdb/main/relation/cross_product_relation.hpp +4 -1
  253. package/src/duckdb/src/include/duckdb/main/relation/join_relation.hpp +5 -2
  254. package/src/duckdb/src/include/duckdb/main/relation.hpp +4 -2
  255. package/src/duckdb/src/include/duckdb/main/settings.hpp +30 -1
  256. package/src/duckdb/src/include/duckdb/optimizer/column_binding_replacer.hpp +47 -0
  257. package/src/duckdb/src/include/duckdb/optimizer/compressed_materialization.hpp +132 -0
  258. package/src/duckdb/src/include/duckdb/optimizer/deliminator.hpp +13 -16
  259. package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +3 -0
  260. package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +1 -1
  261. package/src/duckdb/src/include/duckdb/optimizer/join_order/estimated_properties.hpp +10 -1
  262. package/src/duckdb/src/include/duckdb/optimizer/join_order/join_order_optimizer.hpp +1 -1
  263. package/src/duckdb/src/include/duckdb/optimizer/join_order/join_relation.hpp +1 -1
  264. package/src/duckdb/src/include/duckdb/optimizer/join_order/query_graph.hpp +3 -0
  265. package/src/duckdb/src/include/duckdb/optimizer/matcher/set_matcher.hpp +13 -0
  266. package/src/duckdb/src/include/duckdb/optimizer/optimizer.hpp +3 -0
  267. package/src/duckdb/src/include/duckdb/optimizer/remove_duplicate_groups.hpp +40 -0
  268. package/src/duckdb/src/include/duckdb/optimizer/statistics_propagator.hpp +11 -3
  269. package/src/duckdb/src/include/duckdb/optimizer/topn_optimizer.hpp +2 -0
  270. package/src/duckdb/src/include/duckdb/parallel/pipeline.hpp +2 -0
  271. package/src/duckdb/src/include/duckdb/parallel/task_scheduler.hpp +5 -0
  272. package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +2 -0
  273. package/src/duckdb/src/include/duckdb/parser/expression/between_expression.hpp +3 -0
  274. package/src/duckdb/src/include/duckdb/parser/expression/cast_expression.hpp +3 -0
  275. package/src/duckdb/src/include/duckdb/parser/expression/collate_expression.hpp +3 -0
  276. package/src/duckdb/src/include/duckdb/parser/expression/columnref_expression.hpp +3 -0
  277. package/src/duckdb/src/include/duckdb/parser/expression/comparison_expression.hpp +3 -0
  278. package/src/duckdb/src/include/duckdb/parser/expression/constant_expression.hpp +3 -0
  279. package/src/duckdb/src/include/duckdb/parser/expression/default_expression.hpp +1 -0
  280. package/src/duckdb/src/include/duckdb/parser/expression/function_expression.hpp +3 -0
  281. package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +3 -0
  282. package/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +3 -0
  283. package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +3 -0
  284. package/src/duckdb/src/include/duckdb/parser/query_node/cte_node.hpp +54 -0
  285. package/src/duckdb/src/include/duckdb/parser/query_node/list.hpp +1 -0
  286. package/src/duckdb/src/include/duckdb/parser/query_node.hpp +2 -1
  287. package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +1 -0
  288. package/src/duckdb/src/include/duckdb/parser/tableref/joinref.hpp +1 -1
  289. package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +3 -0
  290. package/src/duckdb/src/include/duckdb/parser/tokens.hpp +1 -0
  291. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +15 -8
  292. package/src/duckdb/src/include/duckdb/planner/binder.hpp +8 -5
  293. package/src/duckdb/src/include/duckdb/planner/bound_tokens.hpp +1 -0
  294. package/src/duckdb/src/include/duckdb/planner/column_binding.hpp +4 -0
  295. package/src/duckdb/src/include/duckdb/planner/constraints/bound_unique_constraint.hpp +3 -3
  296. package/src/duckdb/src/include/duckdb/planner/expression_binder/lateral_binder.hpp +0 -2
  297. package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +1 -0
  298. package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +2 -1
  299. package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +5 -5
  300. package/src/duckdb/src/include/duckdb/planner/operator/logical_cteref.hpp +7 -2
  301. package/src/duckdb/src/include/duckdb/planner/operator/logical_dependent_join.hpp +43 -0
  302. package/src/duckdb/src/include/duckdb/planner/operator/logical_get.hpp +4 -0
  303. package/src/duckdb/src/include/duckdb/planner/operator/logical_materialized_cte.hpp +49 -0
  304. package/src/duckdb/src/include/duckdb/planner/operator/logical_recursive_cte.hpp +5 -4
  305. package/src/duckdb/src/include/duckdb/planner/query_node/bound_cte_node.hpp +44 -0
  306. package/src/duckdb/src/include/duckdb/planner/query_node/list.hpp +1 -0
  307. package/src/duckdb/src/include/duckdb/planner/subquery/flatten_dependent_join.hpp +2 -2
  308. package/src/duckdb/src/include/duckdb/planner/subquery/has_correlated_expressions.hpp +4 -1
  309. package/src/duckdb/src/include/duckdb/planner/subquery/recursive_dependent_join_planner.hpp +31 -0
  310. package/src/duckdb/src/include/duckdb/planner/subquery/rewrite_correlated_expressions.hpp +8 -2
  311. package/src/duckdb/src/include/duckdb/planner/tableref/bound_cteref.hpp +5 -2
  312. package/src/duckdb/src/include/duckdb/storage/arena_allocator.hpp +1 -1
  313. package/src/duckdb/src/include/duckdb/storage/block_manager.hpp +3 -3
  314. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +1 -1
  315. package/src/duckdb/src/include/duckdb/storage/object_cache.hpp +22 -0
  316. package/src/duckdb/src/include/duckdb/storage/single_file_block_manager.hpp +2 -0
  317. package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +4 -0
  318. package/src/duckdb/src/include/duckdb/storage/table/chunk_info.hpp +3 -0
  319. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +3 -2
  320. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +1 -3
  321. package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +2 -3
  322. package/src/duckdb/src/include/duckdb.h +28 -0
  323. package/src/duckdb/src/main/capi/arrow-c.cpp +155 -1
  324. package/src/duckdb/src/main/capi/duckdb_value-c.cpp +1 -1
  325. package/src/duckdb/src/main/config.cpp +3 -0
  326. package/src/duckdb/src/main/database.cpp +1 -1
  327. package/src/duckdb/src/main/extension/extension_helper.cpp +96 -89
  328. package/src/duckdb/src/main/extension/extension_install.cpp +6 -0
  329. package/src/duckdb/src/main/extension/extension_load.cpp +10 -1
  330. package/src/duckdb/src/main/relation/cross_product_relation.cpp +4 -3
  331. package/src/duckdb/src/main/relation/join_relation.cpp +5 -5
  332. package/src/duckdb/src/main/relation.cpp +6 -5
  333. package/src/duckdb/src/main/settings/settings.cpp +64 -18
  334. package/src/duckdb/src/optimizer/column_binding_replacer.cpp +43 -0
  335. package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +1 -2
  336. package/src/duckdb/src/optimizer/compressed_materialization/compress_aggregate.cpp +140 -0
  337. package/src/duckdb/src/optimizer/compressed_materialization/compress_distinct.cpp +42 -0
  338. package/src/duckdb/src/optimizer/compressed_materialization/compress_order.cpp +65 -0
  339. package/src/duckdb/src/optimizer/compressed_materialization.cpp +478 -0
  340. package/src/duckdb/src/optimizer/deliminator.cpp +176 -321
  341. package/src/duckdb/src/optimizer/filter_pushdown.cpp +9 -0
  342. package/src/duckdb/src/optimizer/join_order/estimated_properties.cpp +7 -0
  343. package/src/duckdb/src/optimizer/join_order/join_node.cpp +2 -2
  344. package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +113 -82
  345. package/src/duckdb/src/optimizer/join_order/join_relation_set.cpp +2 -6
  346. package/src/duckdb/src/optimizer/join_order/query_graph.cpp +22 -14
  347. package/src/duckdb/src/optimizer/optimizer.cpp +51 -14
  348. package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +5 -5
  349. package/src/duckdb/src/optimizer/pushdown/pushdown_get.cpp +0 -1
  350. package/src/duckdb/src/optimizer/remove_duplicate_groups.cpp +127 -0
  351. package/src/duckdb/src/optimizer/remove_unused_columns.cpp +4 -0
  352. package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +154 -15
  353. package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +65 -8
  354. package/src/duckdb/src/optimizer/statistics/operator/propagate_order.cpp +1 -1
  355. package/src/duckdb/src/optimizer/statistics_propagator.cpp +7 -5
  356. package/src/duckdb/src/optimizer/topn_optimizer.cpp +20 -10
  357. package/src/duckdb/src/parallel/executor.cpp +15 -0
  358. package/src/duckdb/src/parallel/task_scheduler.cpp +11 -2
  359. package/src/duckdb/src/parser/common_table_expression_info.cpp +2 -0
  360. package/src/duckdb/src/parser/expression/between_expression.cpp +3 -15
  361. package/src/duckdb/src/parser/expression/case_expression.cpp +0 -13
  362. package/src/duckdb/src/parser/expression/cast_expression.cpp +3 -14
  363. package/src/duckdb/src/parser/expression/collate_expression.cpp +3 -13
  364. package/src/duckdb/src/parser/expression/columnref_expression.cpp +3 -12
  365. package/src/duckdb/src/parser/expression/comparison_expression.cpp +3 -13
  366. package/src/duckdb/src/parser/expression/conjunction_expression.cpp +0 -12
  367. package/src/duckdb/src/parser/expression/constant_expression.cpp +3 -11
  368. package/src/duckdb/src/parser/expression/default_expression.cpp +0 -4
  369. package/src/duckdb/src/parser/expression/function_expression.cpp +3 -32
  370. package/src/duckdb/src/parser/expression/lambda_expression.cpp +4 -14
  371. package/src/duckdb/src/parser/expression/operator_expression.cpp +0 -12
  372. package/src/duckdb/src/parser/expression/parameter_expression.cpp +0 -12
  373. package/src/duckdb/src/parser/expression/positional_reference_expression.cpp +4 -11
  374. package/src/duckdb/src/parser/expression/star_expression.cpp +0 -19
  375. package/src/duckdb/src/parser/expression/subquery_expression.cpp +0 -18
  376. package/src/duckdb/src/parser/expression/window_expression.cpp +3 -39
  377. package/src/duckdb/src/parser/parsed_expression.cpp +0 -70
  378. package/src/duckdb/src/parser/parsed_expression_iterator.cpp +7 -0
  379. package/src/duckdb/src/parser/parser.cpp +8 -2
  380. package/src/duckdb/src/parser/query_node/cte_node.cpp +58 -0
  381. package/src/duckdb/src/parser/query_node/recursive_cte_node.cpp +0 -19
  382. package/src/duckdb/src/parser/query_node/select_node.cpp +0 -29
  383. package/src/duckdb/src/parser/query_node/set_operation_node.cpp +0 -15
  384. package/src/duckdb/src/parser/query_node.cpp +15 -37
  385. package/src/duckdb/src/parser/result_modifier.cpp +0 -74
  386. package/src/duckdb/src/parser/tableref/basetableref.cpp +0 -19
  387. package/src/duckdb/src/parser/tableref/emptytableref.cpp +0 -4
  388. package/src/duckdb/src/parser/tableref/expressionlistref.cpp +0 -15
  389. package/src/duckdb/src/parser/tableref/joinref.cpp +3 -23
  390. package/src/duckdb/src/parser/tableref/pivotref.cpp +0 -23
  391. package/src/duckdb/src/parser/tableref/subqueryref.cpp +3 -13
  392. package/src/duckdb/src/parser/tableref/table_function.cpp +0 -15
  393. package/src/duckdb/src/parser/tableref.cpp +0 -44
  394. package/src/duckdb/src/parser/transform/expression/transform_constant.cpp +55 -3
  395. package/src/duckdb/src/parser/transform/expression/transform_expression.cpp +2 -0
  396. package/src/duckdb/src/parser/transform/expression/transform_multi_assign_reference.cpp +44 -0
  397. package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +19 -1
  398. package/src/duckdb/src/parser/transform/statement/transform_copy.cpp +13 -0
  399. package/src/duckdb/src/parser/transform/statement/transform_delete.cpp +6 -1
  400. package/src/duckdb/src/parser/transform/statement/transform_insert.cpp +6 -1
  401. package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +7 -2
  402. package/src/duckdb/src/parser/transform/statement/transform_pragma.cpp +14 -11
  403. package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +11 -2
  404. package/src/duckdb/src/parser/transform/statement/transform_update.cpp +6 -1
  405. package/src/duckdb/src/parser/transformer.cpp +15 -0
  406. package/src/duckdb/src/planner/binder/query_node/bind_cte_node.cpp +64 -0
  407. package/src/duckdb/src/planner/binder/query_node/plan_cte_node.cpp +26 -0
  408. package/src/duckdb/src/planner/binder/query_node/plan_recursive_cte_node.cpp +5 -5
  409. package/src/duckdb/src/planner/binder/query_node/plan_setop.cpp +4 -4
  410. package/src/duckdb/src/planner/binder/query_node/plan_subquery.cpp +32 -29
  411. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +5 -4
  412. package/src/duckdb/src/planner/binder/tableref/bind_basetableref.cpp +11 -2
  413. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +32 -5
  414. package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +116 -49
  415. package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -1
  416. package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +61 -26
  417. package/src/duckdb/src/planner/binder/tableref/plan_subqueryref.cpp +3 -3
  418. package/src/duckdb/src/planner/binder.cpp +5 -0
  419. package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +1 -1
  420. package/src/duckdb/src/planner/expression_binder/lateral_binder.cpp +4 -31
  421. package/src/duckdb/src/planner/expression_binder.cpp +3 -0
  422. package/src/duckdb/src/planner/expression_iterator.cpp +6 -0
  423. package/src/duckdb/src/planner/logical_operator.cpp +5 -0
  424. package/src/duckdb/src/planner/logical_operator_visitor.cpp +2 -0
  425. package/src/duckdb/src/planner/operator/logical_cteref.cpp +3 -1
  426. package/src/duckdb/src/planner/operator/logical_dependent_join.cpp +26 -0
  427. package/src/duckdb/src/planner/operator/logical_get.cpp +9 -4
  428. package/src/duckdb/src/planner/operator/logical_materialized_cte.cpp +21 -0
  429. package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +90 -38
  430. package/src/duckdb/src/planner/subquery/has_correlated_expressions.cpp +22 -7
  431. package/src/duckdb/src/planner/subquery/rewrite_correlated_expressions.cpp +65 -7
  432. package/src/duckdb/src/storage/arena_allocator.cpp +1 -2
  433. package/src/duckdb/src/storage/buffer/block_manager.cpp +3 -0
  434. package/src/duckdb/src/storage/checkpoint_manager.cpp +3 -0
  435. package/src/duckdb/src/storage/compression/rle.cpp +0 -1
  436. package/src/duckdb/src/storage/data_table.cpp +1 -1
  437. package/src/duckdb/src/storage/local_storage.cpp +3 -3
  438. package/src/duckdb/src/storage/serialization/serialize_parsed_expression.cpp +340 -0
  439. package/src/duckdb/src/storage/serialization/serialize_query_node.cpp +122 -0
  440. package/src/duckdb/src/storage/serialization/serialize_result_modifier.cpp +86 -0
  441. package/src/duckdb/src/storage/serialization/serialize_tableref.cpp +166 -0
  442. package/src/duckdb/src/storage/single_file_block_manager.cpp +23 -0
  443. package/src/duckdb/src/storage/statistics/string_stats.cpp +21 -2
  444. package/src/duckdb/src/storage/storage_info.cpp +1 -1
  445. package/src/duckdb/src/storage/table/chunk_info.cpp +17 -0
  446. package/src/duckdb/src/storage/table/row_group.cpp +25 -9
  447. package/src/duckdb/src/storage/table/row_group_collection.cpp +19 -18
  448. package/src/duckdb/third_party/concurrentqueue/concurrentqueue.h +2 -2
  449. package/src/duckdb/third_party/concurrentqueue/lightweightsemaphore.h +76 -0
  450. package/src/duckdb/third_party/fast_float/fast_float/fast_float.h +2 -0
  451. package/src/duckdb/third_party/httplib/httplib.hpp +10 -1
  452. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +9 -0
  453. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +2 -1
  454. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +12487 -12331
  455. package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +6 -6
  456. package/src/duckdb/ub_src_execution_index_art.cpp +0 -2
  457. package/src/duckdb/ub_src_execution_operator_persistent.cpp +2 -0
  458. package/src/duckdb/ub_src_execution_operator_set.cpp +2 -0
  459. package/src/duckdb/ub_src_execution_physical_plan.cpp +2 -0
  460. package/src/duckdb/ub_src_function_scalar.cpp +2 -0
  461. package/src/duckdb/ub_src_function_scalar_compressed_materialization.cpp +4 -0
  462. package/src/duckdb/ub_src_function_scalar_list.cpp +2 -0
  463. package/src/duckdb/ub_src_optimizer.cpp +6 -0
  464. package/src/duckdb/ub_src_optimizer_compressed_materialization.cpp +6 -0
  465. package/src/duckdb/ub_src_optimizer_statistics_expression.cpp +0 -2
  466. package/src/duckdb/ub_src_parser_query_node.cpp +2 -0
  467. package/src/duckdb/ub_src_parser_transform_expression.cpp +2 -0
  468. package/src/duckdb/ub_src_planner_binder_query_node.cpp +4 -0
  469. package/src/duckdb/ub_src_planner_operator.cpp +4 -0
  470. package/src/duckdb/ub_src_storage_serialization.cpp +8 -0
  471. package/src/statement.cpp +10 -3
  472. package/test/test_all_types.test.ts +233 -0
  473. package/tsconfig.json +1 -0
  474. package/src/duckdb/src/execution/index/art/prefix_segment.cpp +0 -42
  475. package/src/duckdb/src/include/duckdb/execution/index/art/prefix_segment.hpp +0 -40
  476. package/src/duckdb/src/optimizer/statistics/expression/propagate_and_compress.cpp +0 -118
@@ -87,7 +87,8 @@ struct MultiFileReader {
87
87
  DUCKDB_API static vector<string> GetFileList(ClientContext &context, const Value &input, const string &name,
88
88
  FileGlobOptions options = FileGlobOptions::DISALLOW_EMPTY);
89
89
  //! Parse the named parameters of a multi-file reader
90
- DUCKDB_API static bool ParseOption(const string &key, const Value &val, MultiFileReaderOptions &options);
90
+ DUCKDB_API static bool ParseOption(const string &key, const Value &val, MultiFileReaderOptions &options,
91
+ ClientContext &context);
91
92
  //! Perform complex filter pushdown into the multi-file reader, potentially filtering out files that should be read
92
93
  //! If "true" the first file has been eliminated
93
94
  DUCKDB_API static bool ComplexFilterPushdown(ClientContext &context, vector<string> &files,
@@ -102,7 +103,7 @@ struct MultiFileReader {
102
103
  const MultiFileReaderBindData &options, const string &filename,
103
104
  const vector<string> &local_names, const vector<LogicalType> &global_types,
104
105
  const vector<string> &global_names, const vector<column_t> &global_column_ids,
105
- MultiFileReaderData &reader_data);
106
+ MultiFileReaderData &reader_data, ClientContext &context);
106
107
  //! Create all required mappings from the global types/names to the file-local types/names
107
108
  DUCKDB_API static void CreateMapping(const string &file_name, const vector<LogicalType> &local_types,
108
109
  const vector<string> &local_names, const vector<LogicalType> &global_types,
@@ -157,9 +158,10 @@ struct MultiFileReader {
157
158
  static void InitializeReader(READER_CLASS &reader, const MultiFileReaderOptions &options,
158
159
  const MultiFileReaderBindData &bind_data, const vector<LogicalType> &global_types,
159
160
  const vector<string> &global_names, const vector<column_t> &global_column_ids,
160
- optional_ptr<TableFilterSet> table_filters, const string &initial_file) {
161
+ optional_ptr<TableFilterSet> table_filters, const string &initial_file,
162
+ ClientContext &context) {
161
163
  FinalizeBind(options, bind_data, reader.GetFileName(), reader.GetNames(), global_types, global_names,
162
- global_column_ids, reader.reader_data);
164
+ global_column_ids, reader.reader_data, context);
163
165
  CreateMapping(reader.GetFileName(), reader.GetTypes(), reader.GetNames(), global_types, global_names,
164
166
  global_column_ids, table_filters, reader.reader_data, initial_file);
165
167
  reader.reader_data.filters = table_filters;
@@ -9,8 +9,9 @@
9
9
  #pragma once
10
10
 
11
11
  #include "duckdb/common/types.hpp"
12
+ #include "duckdb/common/case_insensitive_map.hpp"
12
13
  #include "duckdb/common/hive_partitioning.hpp"
13
- #include "re2/re2.h"
14
+ #include "duckdb/main/client_context.hpp"
14
15
 
15
16
  namespace duckdb {
16
17
  class Serializer;
@@ -22,51 +23,18 @@ struct MultiFileReaderOptions {
22
23
  bool hive_partitioning = false;
23
24
  bool auto_detect_hive_partitioning = true;
24
25
  bool union_by_name = false;
26
+ bool hive_types_autocast = true;
27
+ case_insensitive_map_t<LogicalType> hive_types_schema;
25
28
 
26
29
  DUCKDB_API void Serialize(Serializer &serializer) const;
27
30
  DUCKDB_API static MultiFileReaderOptions Deserialize(Deserializer &source);
28
31
  DUCKDB_API void AddBatchInfo(BindInfo &bind_info) const;
29
-
30
- static bool AutoDetectHivePartitioning(const vector<string> &files) {
31
- if (files.empty()) {
32
- return false;
33
- }
34
-
35
- std::unordered_set<string> uset;
36
- idx_t splits_size;
37
- {
38
- // front file
39
- auto splits = StringUtil::Split(files.front(), FileSystem::PathSeparator());
40
- splits_size = splits.size();
41
- if (splits.size() < 2) {
42
- return false;
43
- }
44
- for (auto it = splits.begin(); it != std::prev(splits.end()); it++) {
45
- auto part = StringUtil::Split(*it, "=");
46
- if (part.size() == 2) {
47
- uset.insert(part.front());
48
- }
49
- }
50
- }
51
- if (uset.empty()) {
52
- return false;
53
- }
54
- for (auto &file : files) {
55
- auto splits = StringUtil::Split(file, FileSystem::PathSeparator());
56
- if (splits.size() != splits_size) {
57
- return false;
58
- }
59
- for (auto it = splits.begin(); it != std::prev(splits.end()); it++) {
60
- auto part = StringUtil::Split(*it, "=");
61
- if (part.size() == 2) {
62
- if (uset.find(part.front()) == uset.end()) {
63
- return false;
64
- }
65
- }
66
- }
67
- }
68
- return true;
69
- }
32
+ DUCKDB_API void AutoDetectHivePartitioning(const vector<string> &files, ClientContext &context);
33
+ DUCKDB_API static bool AutoDetectHivePartitioningInternal(const vector<string> &files);
34
+ DUCKDB_API void AutoDetectHiveTypesInternal(const string &file, ClientContext &context);
35
+ DUCKDB_API void VerifyHiveTypesArePartitions(const std::map<string, string> &partitions) const;
36
+ DUCKDB_API LogicalType GetHiveLogicalType(const string &hive_partition_column) const;
37
+ DUCKDB_API Value GetHivePartitionValue(const string &base, const string &entry, ClientContext &context) const;
70
38
  };
71
39
 
72
40
  } // namespace duckdb
@@ -8,6 +8,9 @@
8
8
 
9
9
  #pragma once
10
10
 
11
+ #ifdef __MVS__
12
+ #include <time.h>
13
+ #endif
11
14
  #include <mutex>
12
15
 
13
16
  namespace duckdb {
@@ -8,13 +8,18 @@
8
8
 
9
9
  #pragma once
10
10
 
11
+ #include "duckdb/common/assert.hpp"
11
12
  #include "duckdb/common/constants.hpp"
13
+ #include "duckdb/common/hugeint.hpp"
12
14
  #include "duckdb/common/limits.hpp"
13
15
  #include "duckdb/common/exception.hpp"
16
+ #include "duckdb/common/typedefs.hpp"
14
17
  #include "duckdb/common/types/string_type.hpp"
15
18
  #include "duckdb/common/types.hpp"
16
19
  #include "duckdb/common/operator/convert_to_string.hpp"
17
20
  #include "duckdb/common/types/null_value.hpp"
21
+ #include "duckdb/common/types/bit.hpp"
22
+ #include "duckdb/common/types/vector.hpp"
18
23
 
19
24
  namespace duckdb {
20
25
  struct ValidityMask;
@@ -652,6 +657,15 @@ struct CastFromBlob {
652
657
  template <>
653
658
  duckdb::string_t CastFromBlob::Operation(duckdb::string_t input, Vector &vector);
654
659
 
660
+ struct CastFromBlobToBit {
661
+ template <class SRC>
662
+ static inline string_t Operation(SRC input, Vector &result) {
663
+ throw NotImplementedException("Cast from blob could not be performed!");
664
+ }
665
+ };
666
+ template <>
667
+ string_t CastFromBlobToBit::Operation(string_t input, Vector &result);
668
+
655
669
  struct TryCastToBlob {
656
670
  template <class SRC, class DST>
657
671
  static inline bool Operation(SRC input, DST &result, Vector &result_vector, string *error_message,
@@ -659,7 +673,6 @@ struct TryCastToBlob {
659
673
  throw InternalException("Unsupported type for try cast to blob");
660
674
  }
661
675
  };
662
-
663
676
  template <>
664
677
  bool TryCastToBlob::Operation(string_t input, string_t &result, Vector &result_vector, string *error_message,
665
678
  bool strict);
@@ -667,14 +680,41 @@ bool TryCastToBlob::Operation(string_t input, string_t &result, Vector &result_v
667
680
  //===--------------------------------------------------------------------===//
668
681
  // Bits
669
682
  //===--------------------------------------------------------------------===//
670
- struct CastFromBit {
683
+ struct CastFromBitToString {
671
684
  template <class SRC>
672
685
  static inline string_t Operation(SRC input, Vector &result) {
673
686
  throw duckdb::NotImplementedException("Cast from bit could not be performed!");
674
687
  }
675
688
  };
676
689
  template <>
677
- duckdb::string_t CastFromBit::Operation(duckdb::string_t input, Vector &vector);
690
+ duckdb::string_t CastFromBitToString::Operation(duckdb::string_t input, Vector &vector);
691
+
692
+ struct CastFromBitToNumeric {
693
+ template <class SRC = string_t, class DST>
694
+ static inline bool Operation(SRC input, DST &result, bool strict = false) {
695
+ D_ASSERT(input.GetSize() > 1);
696
+
697
+ // TODO: Allow conversion if the significant bytes of the bitstring can be cast to the target type
698
+ // Currently only allows bitstring -> numeric if the full bitstring fits inside the numeric type
699
+ if (input.GetSize() - 1 > sizeof(DST)) {
700
+ throw ConversionException("Bitstring doesn't fit inside of %s", GetTypeId<DST>());
701
+ }
702
+ Bit::BitToNumeric(input, result);
703
+ return (true);
704
+ }
705
+ };
706
+ template <>
707
+ bool CastFromBitToNumeric::Operation(string_t input, bool &result, bool strict);
708
+ template <>
709
+ bool CastFromBitToNumeric::Operation(string_t input, hugeint_t &result, bool strict);
710
+
711
+ struct CastFromBitToBlob {
712
+ template <class SRC>
713
+ static inline string_t Operation(SRC input, Vector &result) {
714
+ D_ASSERT(input.GetSize() > 1);
715
+ return StringVector::AddStringOrBlob(result, Bit::BitToBlob(input));
716
+ }
717
+ };
678
718
 
679
719
  struct TryCastToBit {
680
720
  template <class SRC, class DST>
@@ -9,8 +9,11 @@
9
9
  #pragma once
10
10
 
11
11
  #include "duckdb/common/operator/cast_operators.hpp"
12
+ #include "duckdb/common/types/bit.hpp"
12
13
  #include "duckdb/common/types/hugeint.hpp"
14
+ #include "duckdb/common/types/string_type.hpp"
13
15
  #include "duckdb/common/types/value.hpp"
16
+ #include "duckdb/common/types/vector.hpp"
14
17
  #include <cmath>
15
18
 
16
19
  namespace duckdb {
@@ -442,6 +445,13 @@ bool TryCastWithOverflowCheck(hugeint_t value, double &result) {
442
445
  return Hugeint::TryCast(value, result);
443
446
  }
444
447
 
448
+ struct NumericTryCastToBit {
449
+ template <class SRC>
450
+ static inline string_t Operation(SRC input, Vector &result) {
451
+ return StringVector::AddStringOrBlob(result, Bit::NumericToBit(input));
452
+ }
453
+ };
454
+
445
455
  struct NumericTryCast {
446
456
  template <class SRC, class DST>
447
457
  static inline bool Operation(SRC input, DST &result, bool strict = false) {
@@ -8,6 +8,7 @@
8
8
 
9
9
  #pragma once
10
10
 
11
+ #include "duckdb/common/bswap.hpp"
11
12
  #include "duckdb/common/common.hpp"
12
13
  #include "duckdb/common/exception.hpp"
13
14
  #include "duckdb/common/types.hpp"
@@ -20,18 +21,6 @@
20
21
 
21
22
  namespace duckdb {
22
23
 
23
- #define BSWAP16(x) ((uint16_t)((((uint16_t)(x)&0xff00) >> 8) | (((uint16_t)(x)&0x00ff) << 8)))
24
-
25
- #define BSWAP32(x) \
26
- ((uint32_t)((((uint32_t)(x)&0xff000000) >> 24) | (((uint32_t)(x)&0x00ff0000) >> 8) | \
27
- (((uint32_t)(x)&0x0000ff00) << 8) | (((uint32_t)(x)&0x000000ff) << 24)))
28
-
29
- #define BSWAP64(x) \
30
- ((uint64_t)((((uint64_t)(x)&0xff00000000000000ull) >> 56) | (((uint64_t)(x)&0x00ff000000000000ull) >> 40) | \
31
- (((uint64_t)(x)&0x0000ff0000000000ull) >> 24) | (((uint64_t)(x)&0x000000ff00000000ull) >> 8) | \
32
- (((uint64_t)(x)&0x00000000ff000000ull) << 8) | (((uint64_t)(x)&0x0000000000ff0000ull) << 24) | \
33
- (((uint64_t)(x)&0x000000000000ff00ull) << 40) | (((uint64_t)(x)&0x00000000000000ffull) << 56)))
34
-
35
24
  struct Radix {
36
25
  public:
37
26
  static inline bool IsLittleEndian() {
@@ -134,19 +123,19 @@ inline void Radix::EncodeData(data_ptr_t dataptr, int8_t value) {
134
123
 
135
124
  template <>
136
125
  inline void Radix::EncodeData(data_ptr_t dataptr, int16_t value) {
137
- Store<uint16_t>(BSWAP16(value), dataptr);
126
+ Store<uint16_t>(BSwap<uint16_t>(value), dataptr);
138
127
  dataptr[0] = FlipSign(dataptr[0]);
139
128
  }
140
129
 
141
130
  template <>
142
131
  inline void Radix::EncodeData(data_ptr_t dataptr, int32_t value) {
143
- Store<uint32_t>(BSWAP32(value), dataptr);
132
+ Store<uint32_t>(BSwap<uint32_t>(value), dataptr);
144
133
  dataptr[0] = FlipSign(dataptr[0]);
145
134
  }
146
135
 
147
136
  template <>
148
137
  inline void Radix::EncodeData(data_ptr_t dataptr, int64_t value) {
149
- Store<uint64_t>(BSWAP64(value), dataptr);
138
+ Store<uint64_t>(BSwap<uint64_t>(value), dataptr);
150
139
  dataptr[0] = FlipSign(dataptr[0]);
151
140
  }
152
141
 
@@ -157,17 +146,17 @@ inline void Radix::EncodeData(data_ptr_t dataptr, uint8_t value) {
157
146
 
158
147
  template <>
159
148
  inline void Radix::EncodeData(data_ptr_t dataptr, uint16_t value) {
160
- Store<uint16_t>(BSWAP16(value), dataptr);
149
+ Store<uint16_t>(BSwap<uint16_t>(value), dataptr);
161
150
  }
162
151
 
163
152
  template <>
164
153
  inline void Radix::EncodeData(data_ptr_t dataptr, uint32_t value) {
165
- Store<uint32_t>(BSWAP32(value), dataptr);
154
+ Store<uint32_t>(BSwap<uint32_t>(value), dataptr);
166
155
  }
167
156
 
168
157
  template <>
169
158
  inline void Radix::EncodeData(data_ptr_t dataptr, uint64_t value) {
170
- Store<uint64_t>(BSWAP64(value), dataptr);
159
+ Store<uint64_t>(BSwap<uint64_t>(value), dataptr);
171
160
  }
172
161
 
173
162
  template <>
@@ -179,13 +168,13 @@ inline void Radix::EncodeData(data_ptr_t dataptr, hugeint_t value) {
179
168
  template <>
180
169
  inline void Radix::EncodeData(data_ptr_t dataptr, float value) {
181
170
  uint32_t converted_value = EncodeFloat(value);
182
- Store<uint32_t>(BSWAP32(converted_value), dataptr);
171
+ Store<uint32_t>(BSwap<uint32_t>(converted_value), dataptr);
183
172
  }
184
173
 
185
174
  template <>
186
175
  inline void Radix::EncodeData(data_ptr_t dataptr, double value) {
187
176
  uint64_t converted_value = EncodeDouble(value);
188
- Store<uint64_t>(BSWAP64(converted_value), dataptr);
177
+ Store<uint64_t>(BSwap<uint64_t>(converted_value), dataptr);
189
178
  }
190
179
 
191
180
  template <>
@@ -22,6 +22,9 @@ struct SelectionVector;
22
22
  //! Generic radix partitioning functions
23
23
  struct RadixPartitioning {
24
24
  public:
25
+ //! 4096 partitions ought to be enough to go out-of-core properly
26
+ static constexpr const idx_t MAX_RADIX_BITS = 12;
27
+
25
28
  //! The number of partitions for a given number of radix bits
26
29
  static inline constexpr idx_t NumberOfPartitions(idx_t radix_bits) {
27
30
  return idx_t(1) << radix_bits;
@@ -38,10 +41,12 @@ public:
38
41
  throw InternalException("RadixPartitioning::RadixBits unable to find partition count!");
39
42
  }
40
43
 
44
+ //! Radix bits begin after uint16_t because these bits are used as salt in the aggregate HT
41
45
  static inline constexpr idx_t Shift(idx_t radix_bits) {
42
- return 48 - radix_bits;
46
+ return (sizeof(hash_t) - sizeof(uint16_t)) * 8 - radix_bits;
43
47
  }
44
48
 
49
+ //! Mask of the radix bits of the hash
45
50
  static inline constexpr hash_t Mask(idx_t radix_bits) {
46
51
  return (hash_t(1 << radix_bits) - 1) << Shift(radix_bits);
47
52
  }
@@ -49,26 +54,6 @@ public:
49
54
  //! Select using a cutoff on the radix bits of the hash
50
55
  static idx_t Select(Vector &hashes, const SelectionVector *sel, idx_t count, idx_t radix_bits, idx_t cutoff,
51
56
  SelectionVector *true_sel, SelectionVector *false_sel);
52
-
53
- //! Convert hashes to bins
54
- static void HashesToBins(Vector &hashes, idx_t radix_bits, Vector &bins, idx_t count);
55
- };
56
-
57
- //! Templated radix partitioning constants, can be templated to the number of radix bits
58
- template <idx_t radix_bits>
59
- struct RadixPartitioningConstants {
60
- public:
61
- //! Bitmask of the upper bits of the 5th byte
62
- static constexpr const idx_t NUM_PARTITIONS = RadixPartitioning::NumberOfPartitions(radix_bits);
63
- static constexpr const idx_t SHIFT = RadixPartitioning::Shift(radix_bits);
64
- static constexpr const hash_t MASK = RadixPartitioning::Mask(radix_bits);
65
-
66
- public:
67
- //! Apply bitmask and right shift to get a number between 0 and NUM_PARTITIONS
68
- static inline hash_t ApplyMask(hash_t hash) {
69
- D_ASSERT((hash & MASK) >> SHIFT < NUM_PARTITIONS);
70
- return (hash & MASK) >> SHIFT;
71
- }
72
57
  };
73
58
 
74
59
  //! RadixPartitionedColumnData is a PartitionedColumnData that partitions input based on the radix of a hash
@@ -13,7 +13,7 @@
13
13
 
14
14
  namespace duckdb {
15
15
 
16
- class Allocator;
16
+ class ArenaAllocator;
17
17
  struct AggregateObject;
18
18
  struct AggregateFilterData;
19
19
  class DataChunk;
@@ -26,10 +26,10 @@ class Vector;
26
26
  struct UnifiedVectorFormat;
27
27
 
28
28
  struct RowOperationsState {
29
- RowOperationsState(Allocator &allocator) : allocator(allocator) {
29
+ explicit RowOperationsState(ArenaAllocator &allocator) : allocator(allocator) {
30
30
  }
31
31
 
32
- Allocator &allocator;
32
+ ArenaAllocator &allocator;
33
33
  };
34
34
 
35
35
  // RowOperations contains a set of operations that operate on data using a RowLayout
@@ -53,9 +53,12 @@ public:
53
53
  const vector<BoundOrderByNode> &order_bys, const Types &payload_types,
54
54
  const vector<unique_ptr<BaseStatistics>> &partitions_stats, idx_t estimated_cardinality);
55
55
 
56
+ void SyncPartitioning(const PartitionGlobalSinkState &other);
57
+
56
58
  void UpdateLocalPartition(GroupingPartition &local_partition, GroupingAppend &local_append);
57
59
  void CombineLocalPartition(GroupingPartition &local_partition, GroupingAppend &local_append);
58
60
 
61
+ void BuildSortState(ColumnDataCollection &group_data, GlobalSortState &global_sort) const;
59
62
  void BuildSortState(ColumnDataCollection &group_data, PartitionGlobalHashGroup &global_sort);
60
63
 
61
64
  ClientContext &context;
@@ -67,6 +70,8 @@ public:
67
70
  unique_ptr<RadixPartitionedColumnData> grouping_data;
68
71
  //! Payload plus hash column
69
72
  Types grouping_types;
73
+ //! The number of radix bits if this partition is being synced with another
74
+ idx_t fixed_bits;
70
75
 
71
76
  // OVER(...) (sorting)
72
77
  Orders partitions;
@@ -175,10 +180,18 @@ public:
175
180
 
176
181
  class PartitionGlobalMergeStates {
177
182
  public:
183
+ struct Callback {
184
+ virtual bool HasError() const {
185
+ return false;
186
+ }
187
+ };
188
+
178
189
  using PartitionGlobalMergeStatePtr = unique_ptr<PartitionGlobalMergeState>;
179
190
 
180
191
  explicit PartitionGlobalMergeStates(PartitionGlobalSinkState &sink);
181
192
 
193
+ bool ExecuteTask(PartitionLocalMergeState &local_state, Callback &callback);
194
+
182
195
  vector<PartitionGlobalMergeStatePtr> states;
183
196
  };
184
197
 
@@ -24,7 +24,7 @@ struct BatchedChunkScanState {
24
24
  //! Scans over a BatchedDataCollection are ordered by batch index
25
25
  class BatchedDataCollection {
26
26
  public:
27
- DUCKDB_API BatchedDataCollection(vector<LogicalType> types);
27
+ DUCKDB_API BatchedDataCollection(ClientContext &context, vector<LogicalType> types, bool buffer_managed = false);
28
28
 
29
29
  //! Appends a datachunk with the given batch index to the batched collection
30
30
  DUCKDB_API void Append(DataChunk &input, idx_t batch_index);
@@ -51,7 +51,9 @@ private:
51
51
  ColumnDataAppendState append_state;
52
52
  };
53
53
 
54
+ ClientContext &context;
54
55
  vector<LogicalType> types;
56
+ bool buffer_managed;
55
57
  //! The data of the batched chunk collection - a set of batch_index -> ColumnDataCollection pointers
56
58
  map<idx_t, unique_ptr<ColumnDataCollection>> data;
57
59
  //! The last batch collection that was inserted into
@@ -8,8 +8,12 @@
8
8
 
9
9
  #pragma once
10
10
 
11
+ #include "duckdb/common/assert.hpp"
11
12
  #include "duckdb/common/common.hpp"
13
+ #include "duckdb/common/hugeint.hpp"
14
+ #include "duckdb/common/limits.hpp"
12
15
  #include "duckdb/common/types.hpp"
16
+ #include "duckdb/common/types/string_type.hpp"
13
17
 
14
18
  namespace duckdb {
15
19
 
@@ -37,7 +41,33 @@ public:
37
41
  //! Convert a string to a bit. This function should ONLY be called after calling GetBitSize, since it does NOT
38
42
  //! perform data validation.
39
43
  DUCKDB_API static void ToBit(string_t str, string_t &output);
44
+
40
45
  DUCKDB_API static string ToBit(string_t str);
46
+
47
+ //! output needs to have enough space allocated before calling this function (blob size + 1)
48
+ DUCKDB_API static void BlobToBit(string_t blob, string_t &output);
49
+
50
+ DUCKDB_API static string BlobToBit(string_t blob);
51
+
52
+ //! output_str needs to have enough space allocated before calling this function (sizeof(T) + 1)
53
+ template <class T>
54
+ static void NumericToBit(T numeric, string_t &output_str);
55
+
56
+ template <class T>
57
+ static string NumericToBit(T numeric);
58
+
59
+ //! bit is expected to fit inside of output num (bit size <= sizeof(T) + 1)
60
+ template <class T>
61
+ static void BitToNumeric(string_t bit, T &output_num);
62
+
63
+ template <class T>
64
+ static T BitToNumeric(string_t bit);
65
+
66
+ //! bit is expected to fit inside of output_blob (bit size = output_blob + 1)
67
+ static void BitToBlob(string_t bit, string_t &output_blob);
68
+
69
+ static string BitToBlob(string_t bit);
70
+
41
71
  //! Creates a new bitstring of determined length
42
72
  DUCKDB_API static void BitString(const string_t &input, const idx_t &len, string_t &result);
43
73
  DUCKDB_API static void SetEmptyBitString(string_t &target, string_t &input);
@@ -58,5 +88,56 @@ private:
58
88
  static idx_t GetBitInternal(string_t bit_string, idx_t n);
59
89
  static void SetBitInternal(string_t &bit_string, idx_t n, idx_t new_value);
60
90
  static idx_t GetBitIndex(idx_t n);
91
+ static uint8_t GetFirstByte(const string_t &str);
61
92
  };
93
+
94
+ //===--------------------------------------------------------------------===//
95
+ // Bit Template definitions
96
+ //===--------------------------------------------------------------------===//
97
+ template <class T>
98
+ void Bit::NumericToBit(T numeric, string_t &output_str) {
99
+ D_ASSERT(output_str.GetSize() >= sizeof(T) + 1);
100
+
101
+ auto output = output_str.GetDataWriteable();
102
+ auto data = const_data_ptr_cast(&numeric);
103
+
104
+ *output = 0; // set padding to 0
105
+ ++output;
106
+ for (idx_t idx = 0; idx < sizeof(T); ++idx) {
107
+ output[idx] = data[sizeof(T) - idx - 1];
108
+ }
109
+ Bit::Finalize(output_str);
110
+ }
111
+
112
+ template <class T>
113
+ string Bit::NumericToBit(T numeric) {
114
+ auto bit_len = sizeof(T) + 1;
115
+ auto buffer = make_unsafe_uniq_array<char>(bit_len);
116
+ string_t output_str(buffer.get(), bit_len);
117
+ Bit::NumericToBit(numeric, output_str);
118
+ return output_str.GetString();
119
+ }
120
+
121
+ template <class T>
122
+ T Bit::BitToNumeric(string_t bit) {
123
+ T output;
124
+ Bit::BitToNumeric(bit, output);
125
+ return (output);
126
+ }
127
+
128
+ template <class T>
129
+ void Bit::BitToNumeric(string_t bit, T &output_num) {
130
+ D_ASSERT(bit.GetSize() <= sizeof(T) + 1);
131
+
132
+ output_num = 0;
133
+ auto data = const_data_ptr_cast(bit.GetData());
134
+ auto output = data_ptr_cast(&output_num);
135
+
136
+ idx_t padded_byte_idx = sizeof(T) - bit.GetSize() + 1;
137
+ output[sizeof(T) - 1 - padded_byte_idx] = GetFirstByte(bit);
138
+ for (idx_t idx = padded_byte_idx + 1; idx < sizeof(T); ++idx) {
139
+ output[sizeof(T) - 1 - idx] = data[1 + idx - padded_byte_idx];
140
+ }
141
+ }
142
+
62
143
  } // namespace duckdb
@@ -53,7 +53,7 @@ public:
53
53
  void Initialize(ColumnDataAllocator &other);
54
54
  void InitializeChunkState(ChunkManagementState &state, ChunkMetaData &meta_data);
55
55
  data_ptr_t GetDataPointer(ChunkManagementState &state, uint32_t block_id, uint32_t offset);
56
- void UnswizzlePointers(ChunkManagementState &state, Vector &result, uint16_t v_offset, uint16_t count,
56
+ void UnswizzlePointers(ChunkManagementState &state, Vector &result, idx_t v_offset, uint16_t count,
57
57
  uint32_t block_id, uint32_t offset);
58
58
 
59
59
  //! Deletes the block with the given id
@@ -143,7 +143,12 @@ public:
143
143
  //! Initialize the column data collection
144
144
  void Initialize(vector<LogicalType> types);
145
145
 
146
- //! Get a vector of references to every chunk (segment, index in segment), and optionally sort by block id
146
+ //! Get references to the string heaps in this ColumnDataCollection
147
+ vector<shared_ptr<StringHeap>> GetHeapReferences();
148
+ //! Get the allocator type of this ColumnDataCollection
149
+ ColumnDataAllocatorType GetAllocatorType() const;
150
+
151
+ //! Get a vector of the segments in this ColumnDataCollection
147
152
  const vector<unique_ptr<ColumnDataCollectionSegment>> &GetSegments() const;
148
153
 
149
154
  private:
@@ -94,7 +94,7 @@ public:
94
94
  //! The set of child indices
95
95
  vector<VectorDataIndex> child_indices;
96
96
  //! The string heap for the column data collection (only used for IN_MEMORY_ALLOCATOR)
97
- StringHeap heap;
97
+ shared_ptr<StringHeap> heap;
98
98
 
99
99
  public:
100
100
  void AllocateNewChunk();
@@ -20,7 +20,9 @@ enum class ColumnDataAllocatorType : uint8_t {
20
20
  BUFFER_MANAGER_ALLOCATOR,
21
21
  //! Use an in-memory allocator, allocating data for every chunk
22
22
  //! This causes the column data collection to allocate blocks that are not tied to a buffer manager
23
- IN_MEMORY_ALLOCATOR
23
+ IN_MEMORY_ALLOCATOR,
24
+ //! Use a buffer manager to allocate vectors, but use a StringHeap for strings
25
+ HYBRID
24
26
  };
25
27
 
26
28
  enum class ColumnDataScanProperties : uint8_t {
@@ -153,7 +153,7 @@ public:
153
153
 
154
154
  //! Converts this DataChunk to a printable string representation
155
155
  DUCKDB_API string ToString() const;
156
- DUCKDB_API void Print();
156
+ DUCKDB_API void Print() const;
157
157
 
158
158
  DataChunk(const DataChunk &) = delete;
159
159
 
@@ -72,13 +72,13 @@ struct date_t { // NOLINT
72
72
  };
73
73
 
74
74
  // special values
75
- static inline date_t infinity() {
75
+ static inline date_t infinity() { // NOLINT
76
76
  return date_t(NumericLimits<int32_t>::Maximum());
77
- } // NOLINT
78
- static inline date_t ninfinity() {
77
+ } // NOLINT
78
+ static inline date_t ninfinity() { // NOLINT
79
79
  return date_t(-NumericLimits<int32_t>::Maximum());
80
- } // NOLINT
81
- static inline date_t epoch() {
80
+ } // NOLINT
81
+ static inline date_t epoch() { // NOLINT
82
82
  return date_t(0);
83
83
  } // NOLINT
84
84
  };
@@ -158,6 +158,8 @@ public:
158
158
  DUCKDB_API static int64_t EpochNanoseconds(date_t date);
159
159
  //! Extract the epoch from the date (microseconds since 1970-01-01)
160
160
  DUCKDB_API static int64_t EpochMicroseconds(date_t date);
161
+ //! Extract the epoch from the date (milliseconds since 1970-01-01)
162
+ DUCKDB_API static int64_t EpochMilliseconds(date_t date);
161
163
  //! Convert the epoch (seconds since 1970-01-01) to a date_t
162
164
  DUCKDB_API static date_t EpochToDate(int64_t epoch);
163
165