duckdb 0.7.2-dev12.0 → 0.7.2-dev1244.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 (631) hide show
  1. package/binding.gyp +12 -7
  2. package/lib/duckdb.d.ts +55 -2
  3. package/lib/duckdb.js +20 -1
  4. package/package.json +1 -1
  5. package/src/connection.cpp +1 -2
  6. package/src/database.cpp +1 -1
  7. package/src/duckdb/extension/icu/icu-extension.cpp +4 -0
  8. package/src/duckdb/extension/icu/icu-list-range.cpp +207 -0
  9. package/src/duckdb/extension/icu/icu-table-range.cpp +194 -0
  10. package/src/duckdb/extension/icu/include/icu-list-range.hpp +17 -0
  11. package/src/duckdb/extension/icu/include/icu-table-range.hpp +17 -0
  12. package/src/duckdb/extension/icu/third_party/icu/stubdata/stubdata.cpp +1 -1
  13. package/src/duckdb/extension/json/include/json_common.hpp +1 -0
  14. package/src/duckdb/extension/json/include/json_functions.hpp +2 -0
  15. package/src/duckdb/extension/json/include/json_serializer.hpp +77 -0
  16. package/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp +147 -0
  17. package/src/duckdb/extension/json/json_functions/read_json.cpp +6 -5
  18. package/src/duckdb/extension/json/json_functions.cpp +12 -4
  19. package/src/duckdb/extension/json/json_scan.cpp +2 -2
  20. package/src/duckdb/extension/json/json_serializer.cpp +217 -0
  21. package/src/duckdb/extension/parquet/column_reader.cpp +94 -15
  22. package/src/duckdb/extension/parquet/column_writer.cpp +0 -1
  23. package/src/duckdb/extension/parquet/include/column_reader.hpp +1 -2
  24. package/src/duckdb/extension/parquet/include/decode_utils.hpp +5 -4
  25. package/src/duckdb/extension/parquet/include/generated_column_reader.hpp +1 -11
  26. package/src/duckdb/extension/parquet/include/parquet_timestamp.hpp +2 -1
  27. package/src/duckdb/extension/parquet/parquet-extension.cpp +14 -3
  28. package/src/duckdb/extension/parquet/parquet_reader.cpp +6 -1
  29. package/src/duckdb/extension/parquet/parquet_statistics.cpp +49 -36
  30. package/src/duckdb/extension/parquet/parquet_timestamp.cpp +16 -6
  31. package/src/duckdb/src/catalog/catalog.cpp +34 -5
  32. package/src/duckdb/src/catalog/catalog_entry/duck_schema_entry.cpp +4 -0
  33. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +2 -21
  34. package/src/duckdb/src/catalog/catalog_entry/scalar_function_catalog_entry.cpp +7 -6
  35. package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +3 -3
  36. package/src/duckdb/src/catalog/catalog_entry/table_function_catalog_entry.cpp +20 -1
  37. package/src/duckdb/src/catalog/catalog_entry/type_catalog_entry.cpp +8 -2
  38. package/src/duckdb/src/catalog/catalog_set.cpp +1 -0
  39. package/src/duckdb/src/catalog/default/default_functions.cpp +3 -0
  40. package/src/duckdb/src/catalog/dependency_list.cpp +12 -0
  41. package/src/duckdb/src/catalog/duck_catalog.cpp +34 -7
  42. package/src/duckdb/src/common/arrow/arrow_appender.cpp +48 -4
  43. package/src/duckdb/src/common/arrow/arrow_converter.cpp +1 -1
  44. package/src/duckdb/src/common/box_renderer.cpp +109 -23
  45. package/src/duckdb/src/common/enums/expression_type.cpp +8 -222
  46. package/src/duckdb/src/common/enums/join_type.cpp +3 -22
  47. package/src/duckdb/src/common/enums/logical_operator_type.cpp +2 -0
  48. package/src/duckdb/src/common/enums/statement_type.cpp +2 -0
  49. package/src/duckdb/src/common/exception.cpp +15 -1
  50. package/src/duckdb/src/common/field_writer.cpp +1 -0
  51. package/src/duckdb/src/common/hive_partitioning.cpp +3 -1
  52. package/src/duckdb/src/common/local_file_system.cpp +64 -7
  53. package/src/duckdb/src/common/operator/cast_operators.cpp +1 -1
  54. package/src/duckdb/src/common/preserved_error.cpp +7 -5
  55. package/src/duckdb/src/common/progress_bar/progress_bar.cpp +7 -0
  56. package/src/duckdb/src/common/serializer/buffered_deserializer.cpp +4 -0
  57. package/src/duckdb/src/common/serializer/buffered_file_reader.cpp +15 -2
  58. package/src/duckdb/src/common/serializer/enum_serializer.cpp +1176 -0
  59. package/src/duckdb/src/common/sort/comparators.cpp +14 -5
  60. package/src/duckdb/src/common/sort/sort_state.cpp +5 -7
  61. package/src/duckdb/src/common/sort/sorted_block.cpp +0 -1
  62. package/src/duckdb/src/common/string_util.cpp +18 -1
  63. package/src/duckdb/src/common/types/bit.cpp +166 -87
  64. package/src/duckdb/src/common/types/blob.cpp +1 -1
  65. package/src/duckdb/src/common/types/chunk_collection.cpp +2 -2
  66. package/src/duckdb/src/common/types/column_data_collection.cpp +39 -2
  67. package/src/duckdb/src/common/types/column_data_collection_segment.cpp +12 -10
  68. package/src/duckdb/src/common/types/data_chunk.cpp +1 -1
  69. package/src/duckdb/src/common/types/interval.cpp +0 -41
  70. package/src/duckdb/src/common/types/list_segment.cpp +658 -0
  71. package/src/duckdb/src/common/types/string_heap.cpp +1 -1
  72. package/src/duckdb/src/common/types/string_type.cpp +1 -1
  73. package/src/duckdb/src/common/types/time.cpp +13 -0
  74. package/src/duckdb/src/common/types/validity_mask.cpp +24 -7
  75. package/src/duckdb/src/common/types/value.cpp +320 -154
  76. package/src/duckdb/src/common/types/vector.cpp +158 -134
  77. package/src/duckdb/src/common/types.cpp +313 -153
  78. package/src/duckdb/src/common/value_operations/comparison_operations.cpp +14 -22
  79. package/src/duckdb/src/common/vector_operations/comparison_operators.cpp +10 -10
  80. package/src/duckdb/src/common/vector_operations/is_distinct_from.cpp +11 -10
  81. package/src/duckdb/src/common/vector_operations/vector_cast.cpp +2 -1
  82. package/src/duckdb/src/execution/aggregate_hashtable.cpp +98 -74
  83. package/src/duckdb/src/execution/column_binding_resolver.cpp +21 -5
  84. package/src/duckdb/src/execution/expression_executor/execute_cast.cpp +2 -1
  85. package/src/duckdb/src/execution/expression_executor/execute_comparison.cpp +2 -2
  86. package/src/duckdb/src/execution/index/art/art.cpp +19 -5
  87. package/src/duckdb/src/execution/join_hashtable.cpp +3 -1
  88. package/src/duckdb/src/execution/operator/aggregate/physical_hash_aggregate.cpp +1 -1
  89. package/src/duckdb/src/execution/operator/aggregate/physical_perfecthash_aggregate.cpp +4 -5
  90. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +117 -26
  91. package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +3 -0
  92. package/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp +5 -3
  93. package/src/duckdb/src/execution/operator/join/physical_blockwise_nl_join.cpp +64 -17
  94. package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +2 -0
  95. package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +2 -2
  96. package/src/duckdb/src/execution/operator/join/physical_index_join.cpp +13 -4
  97. package/src/duckdb/src/execution/operator/join/physical_join.cpp +0 -3
  98. package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +6 -11
  99. package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +3 -1
  100. package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +11 -4
  101. package/src/duckdb/src/execution/operator/persistent/buffered_csv_reader.cpp +24 -19
  102. package/src/duckdb/src/execution/operator/persistent/csv_reader_options.cpp +3 -0
  103. package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +2 -1
  104. package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +2 -2
  105. package/src/duckdb/src/execution/operator/persistent/physical_delete.cpp +1 -3
  106. package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +1 -0
  107. package/src/duckdb/src/execution/operator/projection/physical_projection.cpp +34 -0
  108. package/src/duckdb/src/execution/operator/scan/physical_positional_scan.cpp +20 -5
  109. package/src/duckdb/src/execution/operator/schema/physical_create_type.cpp +20 -40
  110. package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +2 -5
  111. package/src/duckdb/src/execution/partitionable_hashtable.cpp +20 -5
  112. package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +22 -16
  113. package/src/duckdb/src/execution/physical_plan/plan_asof_join.cpp +97 -0
  114. package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +95 -47
  115. package/src/duckdb/src/execution/physical_plan/plan_create_index.cpp +2 -1
  116. package/src/duckdb/src/execution/physical_plan/plan_distinct.cpp +5 -8
  117. package/src/duckdb/src/execution/physical_plan/plan_positional_join.cpp +14 -5
  118. package/src/duckdb/src/execution/physical_plan_generator.cpp +3 -0
  119. package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +23 -15
  120. package/src/duckdb/src/execution/window_segment_tree.cpp +173 -1
  121. package/src/duckdb/src/function/aggregate/algebraic/avg.cpp +0 -6
  122. package/src/duckdb/src/function/aggregate/distributive/bitagg.cpp +99 -95
  123. package/src/duckdb/src/function/aggregate/distributive/bitstring_agg.cpp +269 -0
  124. package/src/duckdb/src/function/aggregate/distributive/bool.cpp +2 -0
  125. package/src/duckdb/src/function/aggregate/distributive/count.cpp +3 -4
  126. package/src/duckdb/src/function/aggregate/distributive/first.cpp +1 -0
  127. package/src/duckdb/src/function/aggregate/distributive/minmax.cpp +2 -0
  128. package/src/duckdb/src/function/aggregate/distributive/sum.cpp +19 -16
  129. package/src/duckdb/src/function/aggregate/distributive_functions.cpp +1 -0
  130. package/src/duckdb/src/function/aggregate/holistic/approximate_quantile.cpp +5 -2
  131. package/src/duckdb/src/function/aggregate/holistic/mode.cpp +1 -1
  132. package/src/duckdb/src/function/aggregate/holistic/quantile.cpp +16 -1
  133. package/src/duckdb/src/function/aggregate/nested/list.cpp +6 -712
  134. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +138 -45
  135. package/src/duckdb/src/function/cast/bit_cast.cpp +0 -2
  136. package/src/duckdb/src/function/cast/blob_cast.cpp +0 -1
  137. package/src/duckdb/src/function/cast/cast_function_set.cpp +1 -1
  138. package/src/duckdb/src/function/cast/enum_casts.cpp +25 -3
  139. package/src/duckdb/src/function/cast/list_casts.cpp +17 -4
  140. package/src/duckdb/src/function/cast/map_cast.cpp +5 -2
  141. package/src/duckdb/src/function/cast/string_cast.cpp +36 -10
  142. package/src/duckdb/src/function/cast/struct_cast.cpp +24 -4
  143. package/src/duckdb/src/function/cast/time_casts.cpp +2 -2
  144. package/src/duckdb/src/function/cast/union_casts.cpp +33 -7
  145. package/src/duckdb/src/function/cast_rules.cpp +9 -4
  146. package/src/duckdb/src/function/function_binder.cpp +1 -8
  147. package/src/duckdb/src/function/pragma/pragma_queries.cpp +24 -1
  148. package/src/duckdb/src/function/scalar/bit/bitstring.cpp +100 -0
  149. package/src/duckdb/src/function/scalar/date/current.cpp +0 -2
  150. package/src/duckdb/src/function/scalar/date/date_diff.cpp +0 -1
  151. package/src/duckdb/src/function/scalar/date/date_part.cpp +18 -26
  152. package/src/duckdb/src/function/scalar/date/date_sub.cpp +0 -1
  153. package/src/duckdb/src/function/scalar/date/date_trunc.cpp +10 -14
  154. package/src/duckdb/src/function/scalar/generic/stats.cpp +2 -4
  155. package/src/duckdb/src/function/scalar/list/contains_or_position.cpp +4 -146
  156. package/src/duckdb/src/function/scalar/list/flatten.cpp +5 -12
  157. package/src/duckdb/src/function/scalar/list/list_aggregates.cpp +1 -1
  158. package/src/duckdb/src/function/scalar/list/list_concat.cpp +8 -12
  159. package/src/duckdb/src/function/scalar/list/list_extract.cpp +5 -12
  160. package/src/duckdb/src/function/scalar/list/list_lambdas.cpp +7 -3
  161. package/src/duckdb/src/function/scalar/list/list_sort.cpp +25 -18
  162. package/src/duckdb/src/function/scalar/list/list_value.cpp +6 -10
  163. package/src/duckdb/src/function/scalar/map/map.cpp +47 -1
  164. package/src/duckdb/src/function/scalar/map/map_entries.cpp +61 -0
  165. package/src/duckdb/src/function/scalar/map/map_extract.cpp +68 -26
  166. package/src/duckdb/src/function/scalar/map/map_keys_values.cpp +97 -0
  167. package/src/duckdb/src/function/scalar/math/numeric.cpp +101 -17
  168. package/src/duckdb/src/function/scalar/math_functions.cpp +3 -0
  169. package/src/duckdb/src/function/scalar/nested_functions.cpp +3 -0
  170. package/src/duckdb/src/function/scalar/operators/add.cpp +0 -9
  171. package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +29 -48
  172. package/src/duckdb/src/function/scalar/operators/bitwise.cpp +0 -63
  173. package/src/duckdb/src/function/scalar/operators/multiply.cpp +5 -6
  174. package/src/duckdb/src/function/scalar/operators/subtract.cpp +0 -6
  175. package/src/duckdb/src/function/scalar/string/caseconvert.cpp +2 -6
  176. package/src/duckdb/src/function/scalar/string/hex.cpp +201 -0
  177. package/src/duckdb/src/function/scalar/string/instr.cpp +2 -6
  178. package/src/duckdb/src/function/scalar/string/length.cpp +2 -6
  179. package/src/duckdb/src/function/scalar/string/like.cpp +2 -6
  180. package/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp +243 -0
  181. package/src/duckdb/src/function/scalar/string/regexp/regexp_util.cpp +79 -0
  182. package/src/duckdb/src/function/scalar/string/regexp.cpp +21 -80
  183. package/src/duckdb/src/function/scalar/string/substring.cpp +2 -6
  184. package/src/duckdb/src/function/scalar/string_functions.cpp +2 -0
  185. package/src/duckdb/src/function/scalar/struct/struct_extract.cpp +5 -10
  186. package/src/duckdb/src/function/scalar/struct/struct_insert.cpp +11 -14
  187. package/src/duckdb/src/function/scalar/struct/struct_pack.cpp +6 -7
  188. package/src/duckdb/src/function/table/arrow.cpp +5 -2
  189. package/src/duckdb/src/function/table/arrow_conversion.cpp +25 -1
  190. package/src/duckdb/src/function/table/checkpoint.cpp +5 -1
  191. package/src/duckdb/src/function/table/read_csv.cpp +60 -0
  192. package/src/duckdb/src/function/table/system/duckdb_constraints.cpp +2 -2
  193. package/src/duckdb/src/function/table/system/test_all_types.cpp +2 -2
  194. package/src/duckdb/src/function/table/table_scan.cpp +9 -12
  195. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  196. package/src/duckdb/src/function/table_function.cpp +30 -11
  197. package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +6 -0
  198. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_table_entry.hpp +1 -1
  199. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_function_catalog_entry.hpp +6 -8
  200. package/src/duckdb/src/include/duckdb/catalog/dependency_list.hpp +3 -0
  201. package/src/duckdb/src/include/duckdb/catalog/duck_catalog.hpp +2 -1
  202. package/src/duckdb/src/include/duckdb/common/box_renderer.hpp +8 -2
  203. package/src/duckdb/src/include/duckdb/common/constants.hpp +0 -19
  204. package/src/duckdb/src/include/duckdb/common/enums/aggregate_handling.hpp +2 -0
  205. package/src/duckdb/src/include/duckdb/common/enums/expression_type.hpp +2 -3
  206. package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +7 -4
  207. package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +1 -0
  208. package/src/duckdb/src/include/duckdb/common/enums/order_type.hpp +2 -0
  209. package/src/duckdb/src/include/duckdb/common/enums/set_operation_type.hpp +2 -1
  210. package/src/duckdb/src/include/duckdb/common/enums/statement_type.hpp +2 -1
  211. package/src/duckdb/src/include/duckdb/common/enums/tableref_type.hpp +2 -1
  212. package/src/duckdb/src/include/duckdb/common/exception.hpp +69 -2
  213. package/src/duckdb/src/include/duckdb/common/field_writer.hpp +12 -4
  214. package/src/duckdb/src/include/duckdb/common/helper.hpp +1 -1
  215. package/src/duckdb/src/include/duckdb/common/{http_stats.hpp → http_state.hpp} +18 -4
  216. package/src/duckdb/src/include/duckdb/common/operator/comparison_operators.hpp +45 -149
  217. package/src/duckdb/src/include/duckdb/common/operator/multiply.hpp +2 -0
  218. package/src/duckdb/src/include/duckdb/common/optional_ptr.hpp +45 -0
  219. package/src/duckdb/src/include/duckdb/common/preserved_error.hpp +6 -1
  220. package/src/duckdb/src/include/duckdb/common/progress_bar/progress_bar.hpp +2 -0
  221. package/src/duckdb/src/include/duckdb/common/serializer/buffered_deserializer.hpp +4 -2
  222. package/src/duckdb/src/include/duckdb/common/serializer/buffered_file_reader.hpp +8 -2
  223. package/src/duckdb/src/include/duckdb/common/serializer/enum_serializer.hpp +113 -0
  224. package/src/duckdb/src/include/duckdb/common/serializer/format_deserializer.hpp +336 -0
  225. package/src/duckdb/src/include/duckdb/common/serializer/format_serializer.hpp +268 -0
  226. package/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp +126 -0
  227. package/src/duckdb/src/include/duckdb/common/serializer.hpp +13 -0
  228. package/src/duckdb/src/include/duckdb/common/string_util.hpp +27 -0
  229. package/src/duckdb/src/include/duckdb/common/types/bit.hpp +12 -7
  230. package/src/duckdb/src/include/duckdb/common/types/interval.hpp +39 -3
  231. package/src/duckdb/src/include/duckdb/common/types/list_segment.hpp +70 -0
  232. package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +73 -3
  233. package/src/duckdb/src/include/duckdb/common/types/time.hpp +3 -0
  234. package/src/duckdb/src/include/duckdb/common/types/validity_mask.hpp +4 -1
  235. package/src/duckdb/src/include/duckdb/common/types/value.hpp +17 -48
  236. package/src/duckdb/src/include/duckdb/common/types/value_map.hpp +1 -1
  237. package/src/duckdb/src/include/duckdb/common/types/vector.hpp +3 -1
  238. package/src/duckdb/src/include/duckdb/common/types.hpp +45 -8
  239. package/src/duckdb/src/include/duckdb/common/vector_operations/unary_executor.hpp +2 -2
  240. package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +35 -20
  241. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +3 -14
  242. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_perfecthash_aggregate.hpp +1 -1
  243. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_cross_product.hpp +2 -0
  244. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_file_handle.hpp +1 -0
  245. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +10 -0
  246. package/src/duckdb/src/include/duckdb/execution/operator/projection/physical_projection.hpp +5 -0
  247. package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +5 -1
  248. package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +1 -3
  249. package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +54 -0
  250. package/src/duckdb/src/include/duckdb/function/aggregate/distributive_functions.hpp +5 -0
  251. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +18 -6
  252. package/src/duckdb/src/include/duckdb/function/cast/bound_cast_data.hpp +84 -0
  253. package/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp +2 -2
  254. package/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp +28 -64
  255. package/src/duckdb/src/include/duckdb/function/function_binder.hpp +3 -6
  256. package/src/duckdb/src/include/duckdb/function/scalar/bit_functions.hpp +4 -0
  257. package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +138 -0
  258. package/src/duckdb/src/include/duckdb/function/scalar/math_functions.hpp +8 -0
  259. package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +59 -0
  260. package/src/duckdb/src/include/duckdb/function/scalar/regexp.hpp +81 -1
  261. package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +4 -0
  262. package/src/duckdb/src/include/duckdb/function/scalar_function.hpp +2 -2
  263. package/src/duckdb/src/include/duckdb/function/table/arrow.hpp +12 -1
  264. package/src/duckdb/src/include/duckdb/function/table_function.hpp +10 -0
  265. package/src/duckdb/src/include/duckdb/main/capi/capi_internal.hpp +2 -0
  266. package/src/duckdb/src/include/duckdb/main/client_config.hpp +2 -0
  267. package/src/duckdb/src/include/duckdb/main/client_data.hpp +3 -3
  268. package/src/duckdb/src/include/duckdb/main/config.hpp +3 -0
  269. package/src/duckdb/src/include/duckdb/main/connection_manager.hpp +2 -0
  270. package/src/duckdb/src/include/duckdb/main/database.hpp +1 -0
  271. package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +2 -0
  272. package/src/duckdb/src/include/duckdb/main/prepared_statement.hpp +2 -0
  273. package/src/duckdb/src/include/duckdb/main/relation/explain_relation.hpp +2 -1
  274. package/src/duckdb/src/include/duckdb/main/relation.hpp +2 -1
  275. package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +2 -0
  276. package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +2 -2
  277. package/src/duckdb/src/include/duckdb/optimizer/rule/list.hpp +1 -0
  278. package/src/duckdb/src/include/duckdb/optimizer/rule/ordered_aggregate_optimizer.hpp +24 -0
  279. package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +4 -0
  280. package/src/duckdb/src/include/duckdb/parser/expression/between_expression.hpp +3 -0
  281. package/src/duckdb/src/include/duckdb/parser/expression/bound_expression.hpp +2 -0
  282. package/src/duckdb/src/include/duckdb/parser/expression/case_expression.hpp +5 -0
  283. package/src/duckdb/src/include/duckdb/parser/expression/cast_expression.hpp +2 -0
  284. package/src/duckdb/src/include/duckdb/parser/expression/collate_expression.hpp +2 -0
  285. package/src/duckdb/src/include/duckdb/parser/expression/columnref_expression.hpp +2 -0
  286. package/src/duckdb/src/include/duckdb/parser/expression/comparison_expression.hpp +2 -0
  287. package/src/duckdb/src/include/duckdb/parser/expression/conjunction_expression.hpp +2 -0
  288. package/src/duckdb/src/include/duckdb/parser/expression/constant_expression.hpp +3 -0
  289. package/src/duckdb/src/include/duckdb/parser/expression/default_expression.hpp +1 -0
  290. package/src/duckdb/src/include/duckdb/parser/expression/function_expression.hpp +4 -2
  291. package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +2 -0
  292. package/src/duckdb/src/include/duckdb/parser/expression/operator_expression.hpp +2 -0
  293. package/src/duckdb/src/include/duckdb/parser/expression/parameter_expression.hpp +2 -0
  294. package/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +2 -0
  295. package/src/duckdb/src/include/duckdb/parser/expression/star_expression.hpp +4 -2
  296. package/src/duckdb/src/include/duckdb/parser/expression/subquery_expression.hpp +2 -0
  297. package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +5 -0
  298. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_info.hpp +5 -1
  299. package/src/duckdb/src/include/duckdb/parser/parsed_data/{alter_function_info.hpp → alter_scalar_function_info.hpp} +13 -13
  300. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_function_info.hpp +47 -0
  301. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp +6 -0
  302. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_table_function_info.hpp +2 -1
  303. package/src/duckdb/src/include/duckdb/parser/parsed_data/sample_options.hpp +2 -0
  304. package/src/duckdb/src/include/duckdb/parser/parsed_expression.hpp +5 -0
  305. package/src/duckdb/src/include/duckdb/parser/query_node/recursive_cte_node.hpp +3 -0
  306. package/src/duckdb/src/include/duckdb/parser/query_node/select_node.hpp +5 -0
  307. package/src/duckdb/src/include/duckdb/parser/query_node/set_operation_node.hpp +3 -0
  308. package/src/duckdb/src/include/duckdb/parser/query_node.hpp +13 -2
  309. package/src/duckdb/src/include/duckdb/parser/result_modifier.hpp +24 -1
  310. package/src/duckdb/src/include/duckdb/parser/sql_statement.hpp +2 -1
  311. package/src/duckdb/src/include/duckdb/parser/statement/multi_statement.hpp +28 -0
  312. package/src/duckdb/src/include/duckdb/parser/statement/select_statement.hpp +6 -1
  313. package/src/duckdb/src/include/duckdb/parser/tableref/basetableref.hpp +4 -0
  314. package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +2 -0
  315. package/src/duckdb/src/include/duckdb/parser/tableref/expressionlistref.hpp +3 -0
  316. package/src/duckdb/src/include/duckdb/parser/tableref/joinref.hpp +3 -0
  317. package/src/duckdb/src/include/duckdb/parser/tableref/list.hpp +1 -0
  318. package/src/duckdb/src/include/duckdb/parser/tableref/pivotref.hpp +87 -0
  319. package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +3 -0
  320. package/src/duckdb/src/include/duckdb/parser/tableref/table_function_ref.hpp +3 -0
  321. package/src/duckdb/src/include/duckdb/parser/tableref.hpp +3 -1
  322. package/src/duckdb/src/include/duckdb/parser/tokens.hpp +2 -0
  323. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +33 -0
  324. package/src/duckdb/src/include/duckdb/planner/bind_context.hpp +2 -0
  325. package/src/duckdb/src/include/duckdb/planner/binder.hpp +15 -4
  326. package/src/duckdb/src/include/duckdb/planner/bound_result_modifier.hpp +3 -0
  327. package/src/duckdb/src/include/duckdb/planner/expression/bound_aggregate_expression.hpp +3 -0
  328. package/src/duckdb/src/include/duckdb/planner/expression_binder/base_select_binder.hpp +64 -0
  329. package/src/duckdb/src/include/duckdb/planner/expression_binder/having_binder.hpp +2 -2
  330. package/src/duckdb/src/include/duckdb/planner/expression_binder/order_binder.hpp +4 -1
  331. package/src/duckdb/src/include/duckdb/planner/expression_binder/qualify_binder.hpp +2 -2
  332. package/src/duckdb/src/include/duckdb/planner/expression_binder/select_binder.hpp +9 -38
  333. package/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +1 -1
  334. package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +1 -0
  335. package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +1 -0
  336. package/src/duckdb/src/include/duckdb/planner/operator/logical_asof_join.hpp +22 -0
  337. package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +5 -2
  338. package/src/duckdb/src/include/duckdb/planner/operator/logical_distinct.hpp +3 -0
  339. package/src/duckdb/src/include/duckdb/planner/query_node/bound_select_node.hpp +8 -2
  340. package/src/duckdb/src/include/duckdb/storage/buffer/block_handle.hpp +2 -0
  341. package/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp +76 -44
  342. package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp +3 -2
  343. package/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp +1 -1
  344. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_compress.hpp +2 -2
  345. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_fetch.hpp +1 -1
  346. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_scan.hpp +2 -1
  347. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_compress.hpp +2 -2
  348. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_fetch.hpp +1 -1
  349. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_scan.hpp +2 -1
  350. package/src/duckdb/src/include/duckdb/storage/data_pointer.hpp +4 -3
  351. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +4 -3
  352. package/src/duckdb/src/include/duckdb/storage/index.hpp +5 -4
  353. package/src/duckdb/src/include/duckdb/storage/meta_block_reader.hpp +7 -0
  354. package/src/duckdb/src/include/duckdb/storage/statistics/base_statistics.hpp +93 -29
  355. package/src/duckdb/src/include/duckdb/storage/statistics/column_statistics.hpp +22 -3
  356. package/src/duckdb/src/include/duckdb/storage/statistics/distinct_statistics.hpp +8 -6
  357. package/src/duckdb/src/include/duckdb/storage/statistics/list_stats.hpp +41 -0
  358. package/src/duckdb/src/include/duckdb/storage/statistics/node_statistics.hpp +26 -0
  359. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats.hpp +114 -0
  360. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats_union.hpp +62 -0
  361. package/src/duckdb/src/include/duckdb/storage/statistics/segment_statistics.hpp +2 -7
  362. package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +74 -0
  363. package/src/duckdb/src/include/duckdb/storage/statistics/struct_stats.hpp +42 -0
  364. package/src/duckdb/src/include/duckdb/storage/string_uncompressed.hpp +2 -3
  365. package/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp +2 -1
  366. package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +21 -7
  367. package/src/duckdb/src/include/duckdb/storage/table/column_data_checkpointer.hpp +3 -2
  368. package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +5 -6
  369. package/src/duckdb/src/include/duckdb/storage/table/column_segment_tree.hpp +18 -0
  370. package/src/duckdb/src/include/duckdb/storage/table/list_column_data.hpp +1 -1
  371. package/src/duckdb/src/include/duckdb/storage/table/persistent_table_data.hpp +6 -3
  372. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +41 -45
  373. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +23 -7
  374. package/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp +35 -0
  375. package/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp +21 -29
  376. package/src/duckdb/src/include/duckdb/storage/table/segment_base.hpp +6 -6
  377. package/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +281 -26
  378. package/src/duckdb/src/include/duckdb/storage/table/standard_column_data.hpp +0 -4
  379. package/src/duckdb/src/include/duckdb/storage/table/table_statistics.hpp +5 -0
  380. package/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +0 -1
  381. package/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +1 -1
  382. package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +6 -3
  383. package/src/duckdb/src/include/duckdb.h +71 -2
  384. package/src/duckdb/src/include/duckdb.hpp +0 -1
  385. package/src/duckdb/src/main/capi/pending-c.cpp +16 -3
  386. package/src/duckdb/src/main/capi/result-c.cpp +27 -1
  387. package/src/duckdb/src/main/capi/stream-c.cpp +25 -0
  388. package/src/duckdb/src/main/capi/table_function-c.cpp +23 -0
  389. package/src/duckdb/src/main/client_context.cpp +38 -34
  390. package/src/duckdb/src/main/client_data.cpp +7 -6
  391. package/src/duckdb/src/main/config.cpp +70 -1
  392. package/src/duckdb/src/main/database.cpp +19 -2
  393. package/src/duckdb/src/main/extension/extension_install.cpp +7 -2
  394. package/src/duckdb/src/main/prepared_statement.cpp +4 -0
  395. package/src/duckdb/src/main/query_profiler.cpp +17 -15
  396. package/src/duckdb/src/main/relation/explain_relation.cpp +3 -3
  397. package/src/duckdb/src/main/relation.cpp +3 -2
  398. package/src/duckdb/src/main/settings/settings.cpp +20 -8
  399. package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +1 -0
  400. package/src/duckdb/src/optimizer/deliminator.cpp +1 -1
  401. package/src/duckdb/src/optimizer/filter_combiner.cpp +3 -6
  402. package/src/duckdb/src/optimizer/filter_pullup.cpp +3 -1
  403. package/src/duckdb/src/optimizer/filter_pushdown.cpp +14 -8
  404. package/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp +107 -71
  405. package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +32 -12
  406. package/src/duckdb/src/optimizer/optimizer.cpp +1 -0
  407. package/src/duckdb/src/optimizer/pullup/pullup_from_left.cpp +2 -2
  408. package/src/duckdb/src/optimizer/pushdown/pushdown_aggregate.cpp +33 -5
  409. package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +1 -1
  410. package/src/duckdb/src/optimizer/pushdown/pushdown_inner_join.cpp +3 -0
  411. package/src/duckdb/src/optimizer/pushdown/pushdown_left_join.cpp +5 -12
  412. package/src/duckdb/src/optimizer/pushdown/pushdown_mark_join.cpp +2 -2
  413. package/src/duckdb/src/optimizer/pushdown/pushdown_single_join.cpp +1 -1
  414. package/src/duckdb/src/optimizer/remove_unused_columns.cpp +1 -0
  415. package/src/duckdb/src/optimizer/rule/move_constants.cpp +10 -4
  416. package/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp +30 -0
  417. package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +9 -2
  418. package/src/duckdb/src/optimizer/statistics/expression/propagate_aggregate.cpp +9 -3
  419. package/src/duckdb/src/optimizer/statistics/expression/propagate_and_compress.cpp +6 -7
  420. package/src/duckdb/src/optimizer/statistics/expression/propagate_cast.cpp +14 -11
  421. package/src/duckdb/src/optimizer/statistics/expression/propagate_columnref.cpp +1 -1
  422. package/src/duckdb/src/optimizer/statistics/expression/propagate_comparison.cpp +13 -15
  423. package/src/duckdb/src/optimizer/statistics/expression/propagate_conjunction.cpp +0 -1
  424. package/src/duckdb/src/optimizer/statistics/expression/propagate_constant.cpp +3 -75
  425. package/src/duckdb/src/optimizer/statistics/expression/propagate_function.cpp +7 -2
  426. package/src/duckdb/src/optimizer/statistics/expression/propagate_operator.cpp +10 -0
  427. package/src/duckdb/src/optimizer/statistics/operator/propagate_aggregate.cpp +2 -3
  428. package/src/duckdb/src/optimizer/statistics/operator/propagate_filter.cpp +29 -32
  429. package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +5 -5
  430. package/src/duckdb/src/optimizer/statistics/operator/propagate_set_operation.cpp +3 -3
  431. package/src/duckdb/src/optimizer/statistics_propagator.cpp +2 -1
  432. package/src/duckdb/src/optimizer/unnest_rewriter.cpp +2 -2
  433. package/src/duckdb/src/parallel/meta_pipeline.cpp +0 -7
  434. package/src/duckdb/src/parser/common_table_expression_info.cpp +19 -0
  435. package/src/duckdb/src/parser/expression/between_expression.cpp +17 -0
  436. package/src/duckdb/src/parser/expression/case_expression.cpp +28 -0
  437. package/src/duckdb/src/parser/expression/cast_expression.cpp +17 -0
  438. package/src/duckdb/src/parser/expression/collate_expression.cpp +16 -0
  439. package/src/duckdb/src/parser/expression/columnref_expression.cpp +15 -0
  440. package/src/duckdb/src/parser/expression/comparison_expression.cpp +16 -0
  441. package/src/duckdb/src/parser/expression/conjunction_expression.cpp +17 -0
  442. package/src/duckdb/src/parser/expression/constant_expression.cpp +14 -0
  443. package/src/duckdb/src/parser/expression/default_expression.cpp +7 -0
  444. package/src/duckdb/src/parser/expression/function_expression.cpp +35 -0
  445. package/src/duckdb/src/parser/expression/lambda_expression.cpp +16 -0
  446. package/src/duckdb/src/parser/expression/operator_expression.cpp +15 -0
  447. package/src/duckdb/src/parser/expression/parameter_expression.cpp +15 -0
  448. package/src/duckdb/src/parser/expression/positional_reference_expression.cpp +14 -0
  449. package/src/duckdb/src/parser/expression/star_expression.cpp +26 -6
  450. package/src/duckdb/src/parser/expression/subquery_expression.cpp +20 -0
  451. package/src/duckdb/src/parser/expression/window_expression.cpp +43 -0
  452. package/src/duckdb/src/parser/parsed_data/alter_info.cpp +7 -3
  453. package/src/duckdb/src/parser/parsed_data/alter_scalar_function_info.cpp +56 -0
  454. package/src/duckdb/src/parser/parsed_data/alter_table_function_info.cpp +51 -0
  455. package/src/duckdb/src/parser/parsed_data/create_scalar_function_info.cpp +3 -2
  456. package/src/duckdb/src/parser/parsed_data/create_table_function_info.cpp +6 -0
  457. package/src/duckdb/src/parser/parsed_data/sample_options.cpp +22 -10
  458. package/src/duckdb/src/parser/parsed_expression.cpp +72 -0
  459. package/src/duckdb/src/parser/parsed_expression_iterator.cpp +15 -1
  460. package/src/duckdb/src/parser/query_node/recursive_cte_node.cpp +21 -0
  461. package/src/duckdb/src/parser/query_node/select_node.cpp +31 -0
  462. package/src/duckdb/src/parser/query_node/set_operation_node.cpp +17 -0
  463. package/src/duckdb/src/parser/query_node.cpp +51 -1
  464. package/src/duckdb/src/parser/result_modifier.cpp +78 -0
  465. package/src/duckdb/src/parser/statement/multi_statement.cpp +18 -0
  466. package/src/duckdb/src/parser/statement/select_statement.cpp +12 -0
  467. package/src/duckdb/src/parser/tableref/basetableref.cpp +21 -0
  468. package/src/duckdb/src/parser/tableref/emptytableref.cpp +4 -0
  469. package/src/duckdb/src/parser/tableref/expressionlistref.cpp +17 -0
  470. package/src/duckdb/src/parser/tableref/joinref.cpp +29 -0
  471. package/src/duckdb/src/parser/tableref/pivotref.cpp +373 -0
  472. package/src/duckdb/src/parser/tableref/subqueryref.cpp +15 -0
  473. package/src/duckdb/src/parser/tableref/table_function.cpp +17 -0
  474. package/src/duckdb/src/parser/tableref.cpp +49 -0
  475. package/src/duckdb/src/parser/transform/expression/transform_array_access.cpp +11 -0
  476. package/src/duckdb/src/parser/transform/expression/transform_bool_expr.cpp +1 -1
  477. package/src/duckdb/src/parser/transform/expression/transform_columnref.cpp +17 -2
  478. package/src/duckdb/src/parser/transform/expression/transform_function.cpp +85 -42
  479. package/src/duckdb/src/parser/transform/expression/transform_operator.cpp +1 -1
  480. package/src/duckdb/src/parser/transform/expression/transform_subquery.cpp +1 -1
  481. package/src/duckdb/src/parser/transform/helpers/transform_alias.cpp +12 -6
  482. package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +24 -0
  483. package/src/duckdb/src/parser/transform/helpers/transform_groupby.cpp +7 -0
  484. package/src/duckdb/src/parser/transform/helpers/transform_orderby.cpp +0 -7
  485. package/src/duckdb/src/parser/transform/helpers/transform_typename.cpp +3 -2
  486. package/src/duckdb/src/parser/transform/statement/transform_create_function.cpp +4 -0
  487. package/src/duckdb/src/parser/transform/statement/transform_create_view.cpp +4 -0
  488. package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +179 -0
  489. package/src/duckdb/src/parser/transform/statement/transform_rename.cpp +3 -4
  490. package/src/duckdb/src/parser/transform/statement/transform_select.cpp +8 -0
  491. package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +2 -3
  492. package/src/duckdb/src/parser/transform/tableref/transform_join.cpp +12 -1
  493. package/src/duckdb/src/parser/transform/tableref/transform_pivot.cpp +121 -0
  494. package/src/duckdb/src/parser/transform/tableref/transform_tableref.cpp +2 -0
  495. package/src/duckdb/src/parser/transformer.cpp +15 -3
  496. package/src/duckdb/src/planner/bind_context.cpp +18 -25
  497. package/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp +9 -7
  498. package/src/duckdb/src/planner/binder/expression/bind_columnref_expression.cpp +4 -3
  499. package/src/duckdb/src/planner/binder/expression/bind_function_expression.cpp +23 -12
  500. package/src/duckdb/src/planner/binder/expression/bind_lambda.cpp +3 -2
  501. package/src/duckdb/src/planner/binder/expression/bind_star_expression.cpp +176 -0
  502. package/src/duckdb/src/planner/binder/expression/bind_subquery_expression.cpp +4 -0
  503. package/src/duckdb/src/planner/binder/expression/bind_unnest_expression.cpp +163 -24
  504. package/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp +2 -2
  505. package/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +109 -94
  506. package/src/duckdb/src/planner/binder/query_node/plan_query_node.cpp +11 -0
  507. package/src/duckdb/src/planner/binder/query_node/plan_select_node.cpp +9 -4
  508. package/src/duckdb/src/planner/binder/statement/bind_copy.cpp +5 -3
  509. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +3 -2
  510. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +10 -1
  511. package/src/duckdb/src/planner/binder/statement/bind_delete.cpp +1 -1
  512. package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +12 -8
  513. package/src/duckdb/src/planner/binder/statement/bind_logical_plan.cpp +17 -0
  514. package/src/duckdb/src/planner/binder/statement/bind_update.cpp +4 -2
  515. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +19 -3
  516. package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +366 -0
  517. package/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp +11 -1
  518. package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -0
  519. package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +61 -13
  520. package/src/duckdb/src/planner/binder.cpp +19 -24
  521. package/src/duckdb/src/planner/bound_result_modifier.cpp +27 -1
  522. package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +9 -2
  523. package/src/duckdb/src/planner/expression/bound_expression.cpp +4 -0
  524. package/src/duckdb/src/planner/expression/bound_window_expression.cpp +1 -1
  525. package/src/duckdb/src/planner/expression_binder/base_select_binder.cpp +146 -0
  526. package/src/duckdb/src/planner/expression_binder/having_binder.cpp +6 -3
  527. package/src/duckdb/src/planner/expression_binder/qualify_binder.cpp +3 -3
  528. package/src/duckdb/src/planner/expression_binder/select_binder.cpp +1 -132
  529. package/src/duckdb/src/planner/expression_binder.cpp +10 -3
  530. package/src/duckdb/src/planner/expression_iterator.cpp +17 -10
  531. package/src/duckdb/src/planner/filter/constant_filter.cpp +4 -6
  532. package/src/duckdb/src/planner/logical_operator.cpp +7 -2
  533. package/src/duckdb/src/planner/logical_operator_visitor.cpp +6 -0
  534. package/src/duckdb/src/planner/operator/logical_asof_join.cpp +8 -0
  535. package/src/duckdb/src/planner/operator/logical_distinct.cpp +3 -0
  536. package/src/duckdb/src/planner/planner.cpp +2 -1
  537. package/src/duckdb/src/planner/pragma_handler.cpp +10 -2
  538. package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +3 -1
  539. package/src/duckdb/src/storage/buffer_manager.cpp +44 -46
  540. package/src/duckdb/src/storage/checkpoint/row_group_writer.cpp +1 -1
  541. package/src/duckdb/src/storage/checkpoint/table_data_reader.cpp +4 -15
  542. package/src/duckdb/src/storage/checkpoint/table_data_writer.cpp +10 -4
  543. package/src/duckdb/src/storage/checkpoint_manager.cpp +9 -3
  544. package/src/duckdb/src/storage/compression/bitpacking.cpp +29 -25
  545. package/src/duckdb/src/storage/compression/fixed_size_uncompressed.cpp +45 -46
  546. package/src/duckdb/src/storage/compression/numeric_constant.cpp +10 -11
  547. package/src/duckdb/src/storage/compression/patas.cpp +1 -1
  548. package/src/duckdb/src/storage/compression/rle.cpp +20 -15
  549. package/src/duckdb/src/storage/compression/validity_uncompressed.cpp +6 -6
  550. package/src/duckdb/src/storage/data_table.cpp +23 -23
  551. package/src/duckdb/src/storage/index.cpp +12 -1
  552. package/src/duckdb/src/storage/local_storage.cpp +27 -23
  553. package/src/duckdb/src/storage/meta_block_reader.cpp +22 -0
  554. package/src/duckdb/src/storage/statistics/base_statistics.cpp +373 -128
  555. package/src/duckdb/src/storage/statistics/column_statistics.cpp +57 -3
  556. package/src/duckdb/src/storage/statistics/distinct_statistics.cpp +8 -9
  557. package/src/duckdb/src/storage/statistics/list_stats.cpp +121 -0
  558. package/src/duckdb/src/storage/statistics/numeric_stats.cpp +591 -0
  559. package/src/duckdb/src/storage/statistics/numeric_stats_union.cpp +65 -0
  560. package/src/duckdb/src/storage/statistics/segment_statistics.cpp +2 -11
  561. package/src/duckdb/src/storage/statistics/string_stats.cpp +273 -0
  562. package/src/duckdb/src/storage/statistics/struct_stats.cpp +133 -0
  563. package/src/duckdb/src/storage/storage_info.cpp +2 -2
  564. package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +4 -10
  565. package/src/duckdb/src/storage/table/column_data.cpp +118 -62
  566. package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +10 -9
  567. package/src/duckdb/src/storage/table/column_segment.cpp +30 -45
  568. package/src/duckdb/src/storage/table/list_column_data.cpp +50 -71
  569. package/src/duckdb/src/storage/table/persistent_table_data.cpp +2 -1
  570. package/src/duckdb/src/storage/table/row_group.cpp +213 -143
  571. package/src/duckdb/src/storage/table/row_group_collection.cpp +151 -105
  572. package/src/duckdb/src/storage/table/scan_state.cpp +45 -33
  573. package/src/duckdb/src/storage/table/standard_column_data.cpp +11 -12
  574. package/src/duckdb/src/storage/table/struct_column_data.cpp +27 -34
  575. package/src/duckdb/src/storage/table/table_statistics.cpp +27 -7
  576. package/src/duckdb/src/storage/table/update_segment.cpp +23 -18
  577. package/src/duckdb/src/storage/wal_replay.cpp +8 -5
  578. package/src/duckdb/src/storage/write_ahead_log.cpp +2 -2
  579. package/src/duckdb/src/transaction/commit_state.cpp +11 -7
  580. package/src/duckdb/src/verification/deserialized_statement_verifier.cpp +0 -1
  581. package/src/duckdb/third_party/libpg_query/include/nodes/nodes.hpp +35 -0
  582. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +36 -2
  583. package/src/duckdb/third_party/libpg_query/include/nodes/primnodes.hpp +3 -3
  584. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +1022 -530
  585. package/src/duckdb/third_party/libpg_query/include/parser/kwlist.hpp +8 -0
  586. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +24462 -22828
  587. package/src/duckdb/third_party/re2/re2/re2.cc +9 -0
  588. package/src/duckdb/third_party/re2/re2/re2.h +2 -0
  589. package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +4 -4
  590. package/src/duckdb/ub_extension_json_json_functions.cpp +2 -0
  591. package/src/duckdb/ub_src_common_serializer.cpp +2 -0
  592. package/src/duckdb/ub_src_common_types.cpp +2 -0
  593. package/src/duckdb/ub_src_execution_physical_plan.cpp +2 -0
  594. package/src/duckdb/ub_src_function_aggregate_distributive.cpp +2 -0
  595. package/src/duckdb/ub_src_function_scalar_bit.cpp +2 -0
  596. package/src/duckdb/ub_src_function_scalar_map.cpp +4 -0
  597. package/src/duckdb/ub_src_function_scalar_string.cpp +2 -0
  598. package/src/duckdb/ub_src_function_scalar_string_regexp.cpp +4 -0
  599. package/src/duckdb/ub_src_main_capi.cpp +2 -0
  600. package/src/duckdb/ub_src_optimizer_rule.cpp +2 -0
  601. package/src/duckdb/ub_src_parser.cpp +2 -0
  602. package/src/duckdb/ub_src_parser_parsed_data.cpp +4 -2
  603. package/src/duckdb/ub_src_parser_statement.cpp +2 -0
  604. package/src/duckdb/ub_src_parser_tableref.cpp +2 -0
  605. package/src/duckdb/ub_src_parser_transform_statement.cpp +2 -0
  606. package/src/duckdb/ub_src_parser_transform_tableref.cpp +2 -0
  607. package/src/duckdb/ub_src_planner_binder_expression.cpp +2 -0
  608. package/src/duckdb/ub_src_planner_binder_tableref.cpp +2 -0
  609. package/src/duckdb/ub_src_planner_expression_binder.cpp +2 -0
  610. package/src/duckdb/ub_src_planner_operator.cpp +2 -0
  611. package/src/duckdb/ub_src_storage_statistics.cpp +6 -6
  612. package/src/duckdb/ub_src_storage_table.cpp +0 -2
  613. package/src/duckdb_node.hpp +2 -1
  614. package/src/statement.cpp +5 -5
  615. package/src/utils.cpp +27 -2
  616. package/test/extension.test.ts +44 -26
  617. package/test/syntax_error.test.ts +3 -1
  618. package/filelist.cache +0 -0
  619. package/src/duckdb/src/include/duckdb/main/loadable_extension.hpp +0 -59
  620. package/src/duckdb/src/include/duckdb/storage/statistics/list_statistics.hpp +0 -36
  621. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_statistics.hpp +0 -75
  622. package/src/duckdb/src/include/duckdb/storage/statistics/string_statistics.hpp +0 -49
  623. package/src/duckdb/src/include/duckdb/storage/statistics/struct_statistics.hpp +0 -36
  624. package/src/duckdb/src/include/duckdb/storage/statistics/validity_statistics.hpp +0 -45
  625. package/src/duckdb/src/parser/parsed_data/alter_function_info.cpp +0 -55
  626. package/src/duckdb/src/storage/statistics/list_statistics.cpp +0 -94
  627. package/src/duckdb/src/storage/statistics/numeric_statistics.cpp +0 -307
  628. package/src/duckdb/src/storage/statistics/string_statistics.cpp +0 -220
  629. package/src/duckdb/src/storage/statistics/struct_statistics.cpp +0 -108
  630. package/src/duckdb/src/storage/statistics/validity_statistics.cpp +0 -91
  631. package/src/duckdb/src/storage/table/segment_tree.cpp +0 -179
@@ -5,19 +5,55 @@
5
5
  #include "duckdb/common/types/data_chunk.hpp"
6
6
 
7
7
  namespace duckdb {
8
- void FillResult(Value &values, Vector &result, idx_t row) {
9
- //! First Initialize List Vector
10
- idx_t current_offset = ListVector::GetListSize(result);
11
- //! Push Values to List Vector
12
- auto &list_values = ListValue::GetChildren(values);
13
- for (idx_t i = 0; i < list_values.size(); i++) {
14
- ListVector::PushBack(result, list_values[i]);
8
+ void FillResult(Vector &map, Vector &offsets, Vector &result, idx_t count) {
9
+ UnifiedVectorFormat map_data;
10
+ map.ToUnifiedFormat(count, map_data);
11
+
12
+ UnifiedVectorFormat offset_data;
13
+ offsets.ToUnifiedFormat(count, offset_data);
14
+
15
+ UnifiedVectorFormat result_data;
16
+ result.ToUnifiedFormat(count, result_data);
17
+
18
+ auto entry_count = ListVector::GetListSize(map);
19
+ auto &values_entries = MapVector::GetValues(map);
20
+ UnifiedVectorFormat values_entry_data;
21
+ // Note: this vector can have a different size than the map
22
+ values_entries.ToUnifiedFormat(entry_count, values_entry_data);
23
+
24
+ for (idx_t row = 0; row < count; row++) {
25
+ idx_t offset_idx = offset_data.sel->get_index(row);
26
+ auto offset = ((int32_t *)offset_data.data)[offset_idx];
27
+
28
+ // Get the current size of the list, for the offset
29
+ idx_t current_offset = ListVector::GetListSize(result);
30
+ if (!offset_data.validity.RowIsValid(offset_idx) || !offset) {
31
+ // Set the entry data for this result row
32
+ idx_t result_index = result_data.sel->get_index(row);
33
+ auto &entry = ((list_entry_t *)result_data.data)[result_index];
34
+ entry.length = 0;
35
+ entry.offset = current_offset;
36
+ continue;
37
+ }
38
+ // All list indices start at 1, reduce by 1 to get the actual index
39
+ offset--;
40
+
41
+ // Get the 'values' list entry corresponding to the offset
42
+ idx_t value_index = map_data.sel->get_index(row);
43
+ auto &value_list_entry = ((list_entry_t *)map_data.data)[value_index];
44
+
45
+ // Add the values to the result
46
+ idx_t list_offset = value_list_entry.offset + offset;
47
+ // All keys are unique, only one will ever match
48
+ idx_t length = 1;
49
+ ListVector::Append(result, values_entries, length + list_offset, list_offset);
50
+
51
+ // Set the entry data for this result row
52
+ idx_t result_index = result_data.sel->get_index(row);
53
+ auto &entry = ((list_entry_t *)result_data.data)[result_index];
54
+ entry.length = length;
55
+ entry.offset = current_offset;
15
56
  }
16
-
17
- //! now set the pointer
18
- auto &entry = ListVector::GetData(result)[row];
19
- entry.length = list_values.size();
20
- entry.offset = current_offset;
21
57
  }
22
58
 
23
59
  static void MapExtractFunction(DataChunk &args, ExpressionState &state, Vector &result) {
@@ -25,6 +61,8 @@ static void MapExtractFunction(DataChunk &args, ExpressionState &state, Vector &
25
61
  D_ASSERT(args.data[0].GetType().id() == LogicalTypeId::MAP);
26
62
  result.SetVectorType(VectorType::FLAT_VECTOR);
27
63
 
64
+ idx_t tuple_count = args.size();
65
+ // Optimization: because keys are not allowed to be NULL, we can early-out
28
66
  if (args.data[1].GetType().id() == LogicalTypeId::SQLNULL) {
29
67
  //! We don't need to look through the map if the 'key' to look for is NULL
30
68
  ListVector::SetListSize(result, 0);
@@ -32,7 +70,7 @@ static void MapExtractFunction(DataChunk &args, ExpressionState &state, Vector &
32
70
  auto list_data = ConstantVector::GetData<list_entry_t>(result);
33
71
  list_data->offset = 0;
34
72
  list_data->length = 0;
35
- result.Verify(args.size());
73
+ result.Verify(tuple_count);
36
74
  return;
37
75
  }
38
76
 
@@ -41,26 +79,30 @@ static void MapExtractFunction(DataChunk &args, ExpressionState &state, Vector &
41
79
 
42
80
  UnifiedVectorFormat map_data;
43
81
 
44
- auto &map_keys = MapVector::GetKeys(map);
45
- auto &map_values = MapVector::GetValues(map);
82
+ // Create the chunk we'll feed to ListPosition
83
+ DataChunk list_position_chunk;
84
+ vector<LogicalType> chunk_types;
85
+ chunk_types.reserve(2);
86
+ chunk_types.push_back(map.GetType());
87
+ chunk_types.push_back(key.GetType());
88
+ list_position_chunk.InitializeEmpty(chunk_types.begin(), chunk_types.end());
46
89
 
47
- map.ToUnifiedFormat(args.size(), map_data);
90
+ // Populate it with the map keys list and the key vector
91
+ list_position_chunk.data[0].Reference(map);
92
+ list_position_chunk.data[1].Reference(key);
93
+ list_position_chunk.SetCardinality(tuple_count);
48
94
 
49
- for (idx_t row = 0; row < args.size(); row++) {
50
- idx_t row_index = map_data.sel->get_index(row);
51
- auto key_value = key.GetValue(row);
95
+ Vector position_vector(LogicalType::LIST(LogicalType::INTEGER), tuple_count);
96
+ // We can pass around state as it's not used by ListPositionFunction anyways
97
+ ListContainsOrPosition<int32_t, PositionFunctor, MapKeyArgFunctor>(list_position_chunk, position_vector);
52
98
 
53
- list_entry_t entry = ListVector::GetData(map)[row_index];
54
- auto offsets = MapVector::Search(map_keys, args.size(), key_value, entry);
55
- auto values = FlatVector::GetValuesFromOffsets(map_values, offsets);
56
- FillResult(values, result, row);
57
- }
99
+ FillResult(map, position_vector, result, tuple_count);
58
100
 
59
- if (args.size() == 1) {
101
+ if (tuple_count == 1) {
60
102
  result.SetVectorType(VectorType::CONSTANT_VECTOR);
61
103
  }
62
104
 
63
- result.Verify(args.size());
105
+ result.Verify(tuple_count);
64
106
  }
65
107
 
66
108
  static unique_ptr<FunctionData> MapExtractBind(ClientContext &context, ScalarFunction &bound_function,
@@ -0,0 +1,97 @@
1
+ #include "duckdb/planner/expression/bound_function_expression.hpp"
2
+ #include "duckdb/common/string_util.hpp"
3
+ #include "duckdb/parser/expression/bound_expression.hpp"
4
+ #include "duckdb/function/scalar/nested_functions.hpp"
5
+ #include "duckdb/common/types/data_chunk.hpp"
6
+ #include "duckdb/common/pair.hpp"
7
+
8
+ namespace duckdb {
9
+
10
+ static void MapKeyValueFunction(DataChunk &args, ExpressionState &state, Vector &result,
11
+ Vector &(*get_child_vector)(Vector &)) {
12
+ D_ASSERT(result.GetType().id() == LogicalTypeId::LIST);
13
+ auto count = args.size();
14
+
15
+ auto &map = args.data[0];
16
+ D_ASSERT(map.GetType().id() == LogicalTypeId::MAP);
17
+ auto child = get_child_vector(map);
18
+
19
+ auto &entries = ListVector::GetEntry(result);
20
+ entries.Reference(child);
21
+
22
+ UnifiedVectorFormat map_data;
23
+ map.ToUnifiedFormat(count, map_data);
24
+
25
+ D_ASSERT(result.GetVectorType() == VectorType::FLAT_VECTOR);
26
+ FlatVector::SetData(result, map_data.data);
27
+ FlatVector::SetValidity(result, map_data.validity);
28
+ auto list_size = ListVector::GetListSize(map);
29
+ ListVector::SetListSize(result, list_size);
30
+ if (map.GetVectorType() == VectorType::DICTIONARY_VECTOR) {
31
+ result.Slice(*map_data.sel, count);
32
+ }
33
+ if (args.AllConstant()) {
34
+ result.SetVectorType(VectorType::CONSTANT_VECTOR);
35
+ }
36
+ result.Verify(count);
37
+ }
38
+
39
+ static void MapKeysFunction(DataChunk &args, ExpressionState &state, Vector &result) {
40
+ MapKeyValueFunction(args, state, result, MapVector::GetKeys);
41
+ }
42
+
43
+ static void MapValuesFunction(DataChunk &args, ExpressionState &state, Vector &result) {
44
+ MapKeyValueFunction(args, state, result, MapVector::GetValues);
45
+ }
46
+
47
+ static unique_ptr<FunctionData> MapKeyValueBind(ClientContext &context, ScalarFunction &bound_function,
48
+ vector<unique_ptr<Expression>> &arguments,
49
+ const LogicalType &(*type_func)(const LogicalType &)) {
50
+ if (arguments.size() != 1) {
51
+ throw InvalidInputException("Too many arguments provided, only expecting a single map");
52
+ }
53
+ auto &map = arguments[0]->return_type;
54
+
55
+ if (map.id() == LogicalTypeId::UNKNOWN) {
56
+ // Prepared statement
57
+ bound_function.arguments.emplace_back(LogicalTypeId::UNKNOWN);
58
+ bound_function.return_type = LogicalType(LogicalTypeId::SQLNULL);
59
+ return nullptr;
60
+ }
61
+
62
+ if (map.id() != LogicalTypeId::MAP) {
63
+ throw InvalidInputException("The provided argument is not a map");
64
+ }
65
+
66
+ auto &type = type_func(map);
67
+
68
+ bound_function.return_type = LogicalType::LIST(type);
69
+ return make_unique<VariableReturnBindData>(bound_function.return_type);
70
+ }
71
+
72
+ static unique_ptr<FunctionData> MapKeysBind(ClientContext &context, ScalarFunction &bound_function,
73
+ vector<unique_ptr<Expression>> &arguments) {
74
+ return MapKeyValueBind(context, bound_function, arguments, MapType::KeyType);
75
+ }
76
+
77
+ static unique_ptr<FunctionData> MapValuesBind(ClientContext &context, ScalarFunction &bound_function,
78
+ vector<unique_ptr<Expression>> &arguments) {
79
+ return MapKeyValueBind(context, bound_function, arguments, MapType::ValueType);
80
+ }
81
+
82
+ void MapKeysFun::RegisterFunction(BuiltinFunctions &set) {
83
+ //! the arguments and return types are actually set in the binder function
84
+ ScalarFunction fun("map_keys", {}, LogicalTypeId::LIST, MapKeysFunction, MapKeysBind);
85
+ fun.null_handling = FunctionNullHandling::DEFAULT_NULL_HANDLING;
86
+ fun.varargs = LogicalType::ANY;
87
+ set.AddFunction(fun);
88
+ }
89
+
90
+ void MapValuesFun::RegisterFunction(BuiltinFunctions &set) {
91
+ ScalarFunction fun("map_values", {}, LogicalTypeId::LIST, MapValuesFunction, MapValuesBind);
92
+ fun.null_handling = FunctionNullHandling::DEFAULT_NULL_HANDLING;
93
+ fun.varargs = LogicalType::ANY;
94
+ set.AddFunction(fun);
95
+ }
96
+
97
+ } // namespace duckdb
@@ -2,13 +2,13 @@
2
2
  #include "duckdb/common/vector_operations/vector_operations.hpp"
3
3
  #include "duckdb/function/scalar/trigonometric_functions.hpp"
4
4
  #include "duckdb/common/operator/abs.hpp"
5
+ #include "duckdb/common/operator/multiply.hpp"
5
6
  #include "duckdb/common/types/hugeint.hpp"
6
7
  #include "duckdb/common/types/cast_helpers.hpp"
7
8
  #include "duckdb/planner/expression/bound_function_expression.hpp"
8
9
  #include "duckdb/common/algorithm.hpp"
9
10
  #include "duckdb/execution/expression_executor.hpp"
10
11
  #include "duckdb/common/likely.hpp"
11
- #include "duckdb/storage/statistics/numeric_statistics.hpp"
12
12
  #include "duckdb/common/types/bit.hpp"
13
13
  #include <cmath>
14
14
  #include <errno.h>
@@ -77,25 +77,22 @@ static unique_ptr<BaseStatistics> PropagateAbsStats(ClientContext &context, Func
77
77
  auto &expr = input.expr;
78
78
  D_ASSERT(child_stats.size() == 1);
79
79
  // can only propagate stats if the children have stats
80
- if (!child_stats[0]) {
81
- return nullptr;
82
- }
83
- auto &lstats = (NumericStatistics &)*child_stats[0];
80
+ auto &lstats = child_stats[0];
84
81
  Value new_min, new_max;
85
82
  bool potential_overflow = true;
86
- if (!lstats.min.IsNull() && !lstats.max.IsNull()) {
83
+ if (NumericStats::HasMinMax(lstats)) {
87
84
  switch (expr.return_type.InternalType()) {
88
85
  case PhysicalType::INT8:
89
- potential_overflow = lstats.min.GetValue<int8_t>() == NumericLimits<int8_t>::Minimum();
86
+ potential_overflow = NumericStats::Min(lstats).GetValue<int8_t>() == NumericLimits<int8_t>::Minimum();
90
87
  break;
91
88
  case PhysicalType::INT16:
92
- potential_overflow = lstats.min.GetValue<int16_t>() == NumericLimits<int16_t>::Minimum();
89
+ potential_overflow = NumericStats::Min(lstats).GetValue<int16_t>() == NumericLimits<int16_t>::Minimum();
93
90
  break;
94
91
  case PhysicalType::INT32:
95
- potential_overflow = lstats.min.GetValue<int32_t>() == NumericLimits<int32_t>::Minimum();
92
+ potential_overflow = NumericStats::Min(lstats).GetValue<int32_t>() == NumericLimits<int32_t>::Minimum();
96
93
  break;
97
94
  case PhysicalType::INT64:
98
- potential_overflow = lstats.min.GetValue<int64_t>() == NumericLimits<int64_t>::Minimum();
95
+ potential_overflow = NumericStats::Min(lstats).GetValue<int64_t>() == NumericLimits<int64_t>::Minimum();
99
96
  break;
100
97
  default:
101
98
  return nullptr;
@@ -108,8 +105,8 @@ static unique_ptr<BaseStatistics> PropagateAbsStats(ClientContext &context, Func
108
105
  // no potential overflow
109
106
 
110
107
  // compute stats
111
- auto current_min = lstats.min.GetValue<int64_t>();
112
- auto current_max = lstats.max.GetValue<int64_t>();
108
+ auto current_min = NumericStats::Min(lstats).GetValue<int64_t>();
109
+ auto current_max = NumericStats::Max(lstats).GetValue<int64_t>();
113
110
 
114
111
  int64_t min_val, max_val;
115
112
 
@@ -125,16 +122,17 @@ static unique_ptr<BaseStatistics> PropagateAbsStats(ClientContext &context, Func
125
122
  } else {
126
123
  // if both current_min and current_max are > 0, then the abs is a no-op and can be removed entirely
127
124
  *input.expr_ptr = std::move(input.expr.children[0]);
128
- return std::move(child_stats[0]);
125
+ return child_stats[0].ToUnique();
129
126
  }
130
127
  new_min = Value::Numeric(expr.return_type, min_val);
131
128
  new_max = Value::Numeric(expr.return_type, max_val);
132
129
  expr.function.function = ScalarFunction::GetScalarUnaryFunction<AbsOperator>(expr.return_type);
133
130
  }
134
- auto stats = make_unique<NumericStatistics>(expr.return_type, std::move(new_min), std::move(new_max),
135
- StatisticsType::LOCAL_STATS);
136
- stats->validity_stats = lstats.validity_stats->Copy();
137
- return std::move(stats);
131
+ auto stats = NumericStats::CreateEmpty(expr.return_type);
132
+ NumericStats::SetMin(stats, new_min);
133
+ NumericStats::SetMax(stats, new_max);
134
+ stats.CopyValidity(lstats);
135
+ return stats.ToUnique();
138
136
  }
139
137
 
140
138
  template <class OP>
@@ -1164,4 +1162,90 @@ void EvenFun::RegisterFunction(BuiltinFunctions &set) {
1164
1162
  ScalarFunction::UnaryFunction<double, double, EvenOperator>));
1165
1163
  }
1166
1164
 
1165
+ //===--------------------------------------------------------------------===//
1166
+ // gcd
1167
+ //===--------------------------------------------------------------------===//
1168
+
1169
+ // should be replaced with std::gcd in a newer C++ standard
1170
+ template <class TA>
1171
+ TA GreatestCommonDivisor(TA left, TA right) {
1172
+ TA a = left;
1173
+ TA b = right;
1174
+
1175
+ // This protects the following modulo operations from a corner case,
1176
+ // where we would get a runtime error due to an integer overflow.
1177
+ if ((left == NumericLimits<TA>::Minimum() && right == -1) ||
1178
+ (left == -1 && right == NumericLimits<TA>::Minimum())) {
1179
+ return 1;
1180
+ }
1181
+
1182
+ while (true) {
1183
+ if (a == 0) {
1184
+ return TryAbsOperator::Operation<TA, TA>(b);
1185
+ }
1186
+ b %= a;
1187
+
1188
+ if (b == 0) {
1189
+ return TryAbsOperator::Operation<TA, TA>(a);
1190
+ }
1191
+ a %= b;
1192
+ }
1193
+ }
1194
+
1195
+ struct GreatestCommonDivisorOperator {
1196
+ template <class TA, class TB, class TR>
1197
+ static inline TR Operation(TA left, TB right) {
1198
+ return GreatestCommonDivisor(left, right);
1199
+ }
1200
+ };
1201
+
1202
+ void GreatestCommonDivisorFun::RegisterFunction(BuiltinFunctions &set) {
1203
+ ScalarFunctionSet funcs("gcd");
1204
+
1205
+ funcs.AddFunction(
1206
+ ScalarFunction({LogicalType::BIGINT, LogicalType::BIGINT}, LogicalType::BIGINT,
1207
+ ScalarFunction::BinaryFunction<int64_t, int64_t, int64_t, GreatestCommonDivisorOperator>));
1208
+ funcs.AddFunction(
1209
+ ScalarFunction({LogicalType::HUGEINT, LogicalType::HUGEINT}, LogicalType::HUGEINT,
1210
+ ScalarFunction::BinaryFunction<hugeint_t, hugeint_t, hugeint_t, GreatestCommonDivisorOperator>));
1211
+
1212
+ set.AddFunction(funcs);
1213
+ funcs.name = "greatest_common_divisor";
1214
+ set.AddFunction(funcs);
1215
+ }
1216
+
1217
+ //===--------------------------------------------------------------------===//
1218
+ // lcm
1219
+ //===--------------------------------------------------------------------===//
1220
+
1221
+ // should be replaced with std::lcm in a newer C++ standard
1222
+ struct LeastCommonMultipleOperator {
1223
+ template <class TA, class TB, class TR>
1224
+ static inline TR Operation(TA left, TB right) {
1225
+ if (left == 0 || right == 0) {
1226
+ return 0;
1227
+ }
1228
+ TR result;
1229
+ if (!TryMultiplyOperator::Operation<TA, TB, TR>(left, right / GreatestCommonDivisor(left, right), result)) {
1230
+ throw OutOfRangeException("lcm value is out of range");
1231
+ }
1232
+ return TryAbsOperator::Operation<TR, TR>(result);
1233
+ }
1234
+ };
1235
+
1236
+ void LeastCommonMultipleFun::RegisterFunction(BuiltinFunctions &set) {
1237
+ ScalarFunctionSet funcs("lcm");
1238
+
1239
+ funcs.AddFunction(
1240
+ ScalarFunction({LogicalType::BIGINT, LogicalType::BIGINT}, LogicalType::BIGINT,
1241
+ ScalarFunction::BinaryFunction<int64_t, int64_t, int64_t, LeastCommonMultipleOperator>));
1242
+ funcs.AddFunction(
1243
+ ScalarFunction({LogicalType::HUGEINT, LogicalType::HUGEINT}, LogicalType::HUGEINT,
1244
+ ScalarFunction::BinaryFunction<hugeint_t, hugeint_t, hugeint_t, LeastCommonMultipleOperator>));
1245
+
1246
+ set.AddFunction(funcs);
1247
+ funcs.name = "least_common_multiple";
1248
+ set.AddFunction(funcs);
1249
+ }
1250
+
1167
1251
  } // namespace duckdb
@@ -41,6 +41,9 @@ void BuiltinFunctions::RegisterMathFunctions() {
41
41
  Register<SignBitFun>();
42
42
  Register<IsInfiniteFun>();
43
43
  Register<IsFiniteFun>();
44
+
45
+ Register<GreatestCommonDivisorFun>();
46
+ Register<LeastCommonMultipleFun>();
44
47
  }
45
48
 
46
49
  } // namespace duckdb
@@ -22,6 +22,9 @@ void BuiltinFunctions::RegisterNestedFunctions() {
22
22
  Register<ListFlattenFun>();
23
23
  Register<MapFun>();
24
24
  Register<MapFromEntriesFun>();
25
+ Register<MapEntriesFun>();
26
+ Register<MapValuesFun>();
27
+ Register<MapKeysFun>();
25
28
  Register<MapExtractFun>();
26
29
  Register<UnionValueFun>();
27
30
  Register<UnionExtractFun>();
@@ -7,9 +7,6 @@
7
7
  #include "duckdb/common/types/interval.hpp"
8
8
  #include "duckdb/common/types/timestamp.hpp"
9
9
  #include "duckdb/common/types/hugeint.hpp"
10
- #include "duckdb/common/windows_undefs.hpp"
11
-
12
- #include <limits>
13
10
 
14
11
  namespace duckdb {
15
12
 
@@ -19,18 +16,12 @@ namespace duckdb {
19
16
  template <>
20
17
  float AddOperator::Operation(float left, float right) {
21
18
  auto result = left + right;
22
- if (!Value::FloatIsFinite(result)) {
23
- throw OutOfRangeException("Overflow in addition of float!");
24
- }
25
19
  return result;
26
20
  }
27
21
 
28
22
  template <>
29
23
  double AddOperator::Operation(double left, double right) {
30
24
  auto result = left + right;
31
- if (!Value::DoubleIsFinite(result)) {
32
- throw OutOfRangeException("Overflow in addition of double!");
33
- }
34
25
  return result;
35
26
  }
36
27
 
@@ -12,7 +12,6 @@
12
12
  #include "duckdb/common/vector_operations/vector_operations.hpp"
13
13
  #include "duckdb/function/scalar/operators.hpp"
14
14
  #include "duckdb/planner/expression/bound_function_expression.hpp"
15
- #include "duckdb/storage/statistics/numeric_statistics.hpp"
16
15
  #include "duckdb/function/scalar/nested_functions.hpp"
17
16
 
18
17
  #include <limits>
@@ -78,15 +77,15 @@ static scalar_function_t GetScalarBinaryFunction(PhysicalType type) {
78
77
  //===--------------------------------------------------------------------===//
79
78
  struct AddPropagateStatistics {
80
79
  template <class T, class OP>
81
- static bool Operation(LogicalType type, NumericStatistics &lstats, NumericStatistics &rstats, Value &new_min,
80
+ static bool Operation(LogicalType type, BaseStatistics &lstats, BaseStatistics &rstats, Value &new_min,
82
81
  Value &new_max) {
83
82
  T min, max;
84
83
  // new min is min+min
85
- if (!OP::Operation(lstats.min.GetValueUnsafe<T>(), rstats.min.GetValueUnsafe<T>(), min)) {
84
+ if (!OP::Operation(NumericStats::GetMin<T>(lstats), NumericStats::GetMin<T>(rstats), min)) {
86
85
  return true;
87
86
  }
88
87
  // new max is max+max
89
- if (!OP::Operation(lstats.max.GetValueUnsafe<T>(), rstats.max.GetValueUnsafe<T>(), max)) {
88
+ if (!OP::Operation(NumericStats::GetMax<T>(lstats), NumericStats::GetMax<T>(rstats), max)) {
90
89
  return true;
91
90
  }
92
91
  new_min = Value::Numeric(type, min);
@@ -97,13 +96,13 @@ struct AddPropagateStatistics {
97
96
 
98
97
  struct SubtractPropagateStatistics {
99
98
  template <class T, class OP>
100
- static bool Operation(LogicalType type, NumericStatistics &lstats, NumericStatistics &rstats, Value &new_min,
99
+ static bool Operation(LogicalType type, BaseStatistics &lstats, BaseStatistics &rstats, Value &new_min,
101
100
  Value &new_max) {
102
101
  T min, max;
103
- if (!OP::Operation(lstats.min.GetValueUnsafe<T>(), rstats.max.GetValueUnsafe<T>(), min)) {
102
+ if (!OP::Operation(NumericStats::GetMin<T>(lstats), NumericStats::GetMax<T>(rstats), min)) {
104
103
  return true;
105
104
  }
106
- if (!OP::Operation(lstats.max.GetValueUnsafe<T>(), rstats.min.GetValueUnsafe<T>(), max)) {
105
+ if (!OP::Operation(NumericStats::GetMax<T>(lstats), NumericStats::GetMin<T>(rstats), max)) {
107
106
  return true;
108
107
  }
109
108
  new_min = Value::Numeric(type, min);
@@ -136,14 +135,11 @@ static unique_ptr<BaseStatistics> PropagateNumericStats(ClientContext &context,
136
135
  auto &expr = input.expr;
137
136
  D_ASSERT(child_stats.size() == 2);
138
137
  // can only propagate stats if the children have stats
139
- if (!child_stats[0] || !child_stats[1]) {
140
- return nullptr;
141
- }
142
- auto &lstats = (NumericStatistics &)*child_stats[0];
143
- auto &rstats = (NumericStatistics &)*child_stats[1];
138
+ auto &lstats = child_stats[0];
139
+ auto &rstats = child_stats[1];
144
140
  Value new_min, new_max;
145
141
  bool potential_overflow = true;
146
- if (!lstats.min.IsNull() && !lstats.max.IsNull() && !rstats.min.IsNull() && !rstats.max.IsNull()) {
142
+ if (NumericStats::HasMinMax(lstats) && NumericStats::HasMinMax(rstats)) {
147
143
  switch (expr.return_type.InternalType()) {
148
144
  case PhysicalType::INT8:
149
145
  potential_overflow =
@@ -176,10 +172,11 @@ static unique_ptr<BaseStatistics> PropagateNumericStats(ClientContext &context,
176
172
  }
177
173
  expr.function.function = GetScalarIntegerFunction<BASEOP>(expr.return_type.InternalType());
178
174
  }
179
- auto stats = make_unique<NumericStatistics>(expr.return_type, std::move(new_min), std::move(new_max),
180
- StatisticsType::LOCAL_STATS);
181
- stats->validity_stats = ValidityStatistics::Combine(lstats.validity_stats, rstats.validity_stats);
182
- return std::move(stats);
175
+ auto result = NumericStats::CreateEmpty(expr.return_type);
176
+ NumericStats::SetMin(result, new_min);
177
+ NumericStats::SetMax(result, new_max);
178
+ result.CombineValidity(lstats, rstats);
179
+ return result.ToUnique();
183
180
  }
184
181
 
185
182
  template <class OP, class OPOVERFLOWCHECK, bool IS_SUBTRACT = false>
@@ -431,12 +428,12 @@ struct NegateOperator {
431
428
 
432
429
  template <>
433
430
  bool NegateOperator::CanNegate(float input) {
434
- return Value::FloatIsFinite(input);
431
+ return true;
435
432
  }
436
433
 
437
434
  template <>
438
435
  bool NegateOperator::CanNegate(double input) {
439
- return Value::DoubleIsFinite(input);
436
+ return true;
440
437
  }
441
438
 
442
439
  template <>
@@ -491,9 +488,9 @@ unique_ptr<FunctionData> DecimalNegateBind(ClientContext &context, ScalarFunctio
491
488
 
492
489
  struct NegatePropagateStatistics {
493
490
  template <class T>
494
- static bool Operation(LogicalType type, NumericStatistics &istats, Value &new_min, Value &new_max) {
495
- auto max_value = istats.max.GetValueUnsafe<T>();
496
- auto min_value = istats.min.GetValueUnsafe<T>();
491
+ static bool Operation(LogicalType type, BaseStatistics &istats, Value &new_min, Value &new_max) {
492
+ auto max_value = NumericStats::GetMax<T>(istats);
493
+ auto min_value = NumericStats::GetMin<T>(istats);
497
494
  if (!NegateOperator::CanNegate<T>(min_value) || !NegateOperator::CanNegate<T>(max_value)) {
498
495
  return true;
499
496
  }
@@ -510,13 +507,10 @@ static unique_ptr<BaseStatistics> NegateBindStatistics(ClientContext &context, F
510
507
  auto &expr = input.expr;
511
508
  D_ASSERT(child_stats.size() == 1);
512
509
  // can only propagate stats if the children have stats
513
- if (!child_stats[0]) {
514
- return nullptr;
515
- }
516
- auto &istats = (NumericStatistics &)*child_stats[0];
510
+ auto &istats = child_stats[0];
517
511
  Value new_min, new_max;
518
512
  bool potential_overflow = true;
519
- if (!istats.min.IsNull() && !istats.max.IsNull()) {
513
+ if (NumericStats::HasMinMax(istats)) {
520
514
  switch (expr.return_type.InternalType()) {
521
515
  case PhysicalType::INT8:
522
516
  potential_overflow =
@@ -542,12 +536,11 @@ static unique_ptr<BaseStatistics> NegateBindStatistics(ClientContext &context, F
542
536
  new_min = Value(expr.return_type);
543
537
  new_max = Value(expr.return_type);
544
538
  }
545
- auto stats = make_unique<NumericStatistics>(expr.return_type, std::move(new_min), std::move(new_max),
546
- StatisticsType::LOCAL_STATS);
547
- if (istats.validity_stats) {
548
- stats->validity_stats = istats.validity_stats->Copy();
549
- }
550
- return std::move(stats);
539
+ auto stats = NumericStats::CreateEmpty(expr.return_type);
540
+ NumericStats::SetMin(stats, new_min);
541
+ NumericStats::SetMax(stats, new_max);
542
+ stats.CopyValidity(istats);
543
+ return stats.ToUnique();
551
544
  }
552
545
 
553
546
  ScalarFunction SubtractFun::GetFunction(const LogicalType &type) {
@@ -662,7 +655,7 @@ void SubtractFun::RegisterFunction(BuiltinFunctions &set) {
662
655
  //===--------------------------------------------------------------------===//
663
656
  struct MultiplyPropagateStatistics {
664
657
  template <class T, class OP>
665
- static bool Operation(LogicalType type, NumericStatistics &lstats, NumericStatistics &rstats, Value &new_min,
658
+ static bool Operation(LogicalType type, BaseStatistics &lstats, BaseStatistics &rstats, Value &new_min,
666
659
  Value &new_max) {
667
660
  // statistics propagation on the multiplication is slightly less straightforward because of negative numbers
668
661
  // the new min/max depend on the signs of the input types
@@ -671,8 +664,8 @@ struct MultiplyPropagateStatistics {
671
664
  // etc
672
665
  // rather than doing all this switcheroo we just multiply all combinations of lmin/lmax with rmin/rmax
673
666
  // and check what the minimum/maximum value is
674
- T lvals[] {lstats.min.GetValueUnsafe<T>(), lstats.max.GetValueUnsafe<T>()};
675
- T rvals[] {rstats.min.GetValueUnsafe<T>(), rstats.max.GetValueUnsafe<T>()};
667
+ T lvals[] {NumericStats::GetMin<T>(lstats), NumericStats::GetMax<T>(lstats)};
668
+ T rvals[] {NumericStats::GetMin<T>(rstats), NumericStats::GetMax<T>(rstats)};
676
669
  T min = NumericLimits<T>::Maximum();
677
670
  T max = NumericLimits<T>::Minimum();
678
671
  // multiplications
@@ -803,18 +796,12 @@ void MultiplyFun::RegisterFunction(BuiltinFunctions &set) {
803
796
  template <>
804
797
  float DivideOperator::Operation(float left, float right) {
805
798
  auto result = left / right;
806
- if (!Value::FloatIsFinite(result)) {
807
- throw OutOfRangeException("Overflow in division of float!");
808
- }
809
799
  return result;
810
800
  }
811
801
 
812
802
  template <>
813
803
  double DivideOperator::Operation(double left, double right) {
814
804
  auto result = left / right;
815
- if (!Value::DoubleIsFinite(result)) {
816
- throw OutOfRangeException("Overflow in division of double!");
817
- }
818
805
  return result;
819
806
  }
820
807
 
@@ -946,9 +933,6 @@ template <>
946
933
  float ModuloOperator::Operation(float left, float right) {
947
934
  D_ASSERT(right != 0);
948
935
  auto result = std::fmod(left, right);
949
- if (!Value::FloatIsFinite(result)) {
950
- throw OutOfRangeException("Overflow in modulo of float!");
951
- }
952
936
  return result;
953
937
  }
954
938
 
@@ -956,9 +940,6 @@ template <>
956
940
  double ModuloOperator::Operation(double left, double right) {
957
941
  D_ASSERT(right != 0);
958
942
  auto result = std::fmod(left, right);
959
- if (!Value::DoubleIsFinite(result)) {
960
- throw OutOfRangeException("Overflow in modulo of double!");
961
- }
962
943
  return result;
963
944
  }
964
945