duckdb 0.7.1 → 0.7.2-dev1034.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 (590) 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/json/include/json_common.hpp +1 -0
  13. package/src/duckdb/extension/json/include/json_functions.hpp +2 -0
  14. package/src/duckdb/extension/json/include/json_serializer.hpp +77 -0
  15. package/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp +147 -0
  16. package/src/duckdb/extension/json/json_functions/read_json.cpp +6 -5
  17. package/src/duckdb/extension/json/json_functions.cpp +12 -4
  18. package/src/duckdb/extension/json/json_scan.cpp +2 -2
  19. package/src/duckdb/extension/json/json_serializer.cpp +217 -0
  20. package/src/duckdb/extension/parquet/column_reader.cpp +94 -15
  21. package/src/duckdb/extension/parquet/column_writer.cpp +0 -1
  22. package/src/duckdb/extension/parquet/include/column_reader.hpp +1 -2
  23. package/src/duckdb/extension/parquet/include/decode_utils.hpp +5 -4
  24. package/src/duckdb/extension/parquet/include/generated_column_reader.hpp +1 -11
  25. package/src/duckdb/extension/parquet/include/parquet_timestamp.hpp +2 -1
  26. package/src/duckdb/extension/parquet/parquet-extension.cpp +12 -2
  27. package/src/duckdb/extension/parquet/parquet_reader.cpp +1 -1
  28. package/src/duckdb/extension/parquet/parquet_statistics.cpp +26 -32
  29. package/src/duckdb/extension/parquet/parquet_timestamp.cpp +16 -6
  30. package/src/duckdb/src/catalog/catalog.cpp +34 -5
  31. package/src/duckdb/src/catalog/catalog_entry/duck_schema_entry.cpp +4 -0
  32. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +2 -21
  33. package/src/duckdb/src/catalog/catalog_entry/scalar_function_catalog_entry.cpp +7 -6
  34. package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +3 -3
  35. package/src/duckdb/src/catalog/catalog_entry/table_function_catalog_entry.cpp +20 -1
  36. package/src/duckdb/src/catalog/catalog_entry/type_catalog_entry.cpp +8 -2
  37. package/src/duckdb/src/catalog/catalog_set.cpp +1 -0
  38. package/src/duckdb/src/catalog/default/default_functions.cpp +3 -0
  39. package/src/duckdb/src/catalog/dependency_list.cpp +12 -0
  40. package/src/duckdb/src/catalog/duck_catalog.cpp +34 -7
  41. package/src/duckdb/src/common/arrow/arrow_appender.cpp +48 -4
  42. package/src/duckdb/src/common/arrow/arrow_converter.cpp +1 -1
  43. package/src/duckdb/src/common/box_renderer.cpp +109 -23
  44. package/src/duckdb/src/common/enums/expression_type.cpp +8 -222
  45. package/src/duckdb/src/common/enums/join_type.cpp +3 -22
  46. package/src/duckdb/src/common/enums/logical_operator_type.cpp +2 -0
  47. package/src/duckdb/src/common/enums/statement_type.cpp +2 -0
  48. package/src/duckdb/src/common/exception.cpp +15 -1
  49. package/src/duckdb/src/common/field_writer.cpp +1 -0
  50. package/src/duckdb/src/common/operator/cast_operators.cpp +1 -1
  51. package/src/duckdb/src/common/preserved_error.cpp +7 -5
  52. package/src/duckdb/src/common/serializer/buffered_deserializer.cpp +4 -0
  53. package/src/duckdb/src/common/serializer/buffered_file_reader.cpp +15 -2
  54. package/src/duckdb/src/common/serializer/enum_serializer.cpp +1176 -0
  55. package/src/duckdb/src/common/sort/sort_state.cpp +5 -7
  56. package/src/duckdb/src/common/sort/sorted_block.cpp +0 -1
  57. package/src/duckdb/src/common/string_util.cpp +4 -1
  58. package/src/duckdb/src/common/types/bit.cpp +166 -87
  59. package/src/duckdb/src/common/types/blob.cpp +1 -1
  60. package/src/duckdb/src/common/types/chunk_collection.cpp +2 -2
  61. package/src/duckdb/src/common/types/column_data_collection.cpp +39 -2
  62. package/src/duckdb/src/common/types/column_data_collection_segment.cpp +11 -6
  63. package/src/duckdb/src/common/types/data_chunk.cpp +1 -1
  64. package/src/duckdb/src/common/types/time.cpp +13 -0
  65. package/src/duckdb/src/common/types/value.cpp +320 -154
  66. package/src/duckdb/src/common/types/vector.cpp +155 -127
  67. package/src/duckdb/src/common/types.cpp +313 -153
  68. package/src/duckdb/src/common/vector_operations/vector_cast.cpp +2 -1
  69. package/src/duckdb/src/execution/aggregate_hashtable.cpp +10 -5
  70. package/src/duckdb/src/execution/column_binding_resolver.cpp +21 -5
  71. package/src/duckdb/src/execution/expression_executor/execute_cast.cpp +2 -1
  72. package/src/duckdb/src/execution/index/art/art.cpp +6 -5
  73. package/src/duckdb/src/execution/operator/aggregate/physical_perfecthash_aggregate.cpp +4 -5
  74. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +117 -26
  75. package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +3 -0
  76. package/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp +5 -3
  77. package/src/duckdb/src/execution/operator/join/physical_blockwise_nl_join.cpp +64 -17
  78. package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +2 -2
  79. package/src/duckdb/src/execution/operator/join/physical_index_join.cpp +12 -4
  80. package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +6 -11
  81. package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +3 -1
  82. package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +6 -3
  83. package/src/duckdb/src/execution/operator/persistent/buffered_csv_reader.cpp +6 -14
  84. package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +2 -2
  85. package/src/duckdb/src/execution/operator/projection/physical_projection.cpp +34 -0
  86. package/src/duckdb/src/execution/operator/scan/physical_positional_scan.cpp +20 -5
  87. package/src/duckdb/src/execution/operator/schema/physical_create_type.cpp +20 -40
  88. package/src/duckdb/src/execution/partitionable_hashtable.cpp +14 -2
  89. package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +21 -16
  90. package/src/duckdb/src/execution/physical_plan/plan_asof_join.cpp +97 -0
  91. package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +95 -47
  92. package/src/duckdb/src/execution/physical_plan/plan_distinct.cpp +5 -8
  93. package/src/duckdb/src/execution/physical_plan/plan_positional_join.cpp +14 -5
  94. package/src/duckdb/src/execution/physical_plan_generator.cpp +3 -0
  95. package/src/duckdb/src/execution/window_segment_tree.cpp +173 -1
  96. package/src/duckdb/src/function/aggregate/algebraic/avg.cpp +0 -6
  97. package/src/duckdb/src/function/aggregate/distributive/bitagg.cpp +99 -95
  98. package/src/duckdb/src/function/aggregate/distributive/bitstring_agg.cpp +269 -0
  99. package/src/duckdb/src/function/aggregate/distributive/bool.cpp +2 -0
  100. package/src/duckdb/src/function/aggregate/distributive/count.cpp +3 -4
  101. package/src/duckdb/src/function/aggregate/distributive/first.cpp +1 -0
  102. package/src/duckdb/src/function/aggregate/distributive/minmax.cpp +2 -0
  103. package/src/duckdb/src/function/aggregate/distributive/sum.cpp +19 -16
  104. package/src/duckdb/src/function/aggregate/distributive_functions.cpp +1 -0
  105. package/src/duckdb/src/function/aggregate/holistic/approximate_quantile.cpp +5 -2
  106. package/src/duckdb/src/function/aggregate/holistic/mode.cpp +1 -1
  107. package/src/duckdb/src/function/aggregate/holistic/quantile.cpp +16 -1
  108. package/src/duckdb/src/function/aggregate/nested/list.cpp +8 -8
  109. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +58 -16
  110. package/src/duckdb/src/function/cast/bit_cast.cpp +0 -2
  111. package/src/duckdb/src/function/cast/blob_cast.cpp +0 -1
  112. package/src/duckdb/src/function/cast/cast_function_set.cpp +1 -1
  113. package/src/duckdb/src/function/cast/enum_casts.cpp +25 -3
  114. package/src/duckdb/src/function/cast/list_casts.cpp +17 -4
  115. package/src/duckdb/src/function/cast/map_cast.cpp +5 -2
  116. package/src/duckdb/src/function/cast/string_cast.cpp +36 -10
  117. package/src/duckdb/src/function/cast/struct_cast.cpp +24 -4
  118. package/src/duckdb/src/function/cast/time_casts.cpp +2 -2
  119. package/src/duckdb/src/function/cast/union_casts.cpp +33 -7
  120. package/src/duckdb/src/function/function_binder.cpp +1 -8
  121. package/src/duckdb/src/function/scalar/bit/bitstring.cpp +100 -0
  122. package/src/duckdb/src/function/scalar/date/current.cpp +0 -2
  123. package/src/duckdb/src/function/scalar/date/date_diff.cpp +0 -1
  124. package/src/duckdb/src/function/scalar/date/date_part.cpp +18 -26
  125. package/src/duckdb/src/function/scalar/date/date_sub.cpp +0 -1
  126. package/src/duckdb/src/function/scalar/date/date_trunc.cpp +10 -14
  127. package/src/duckdb/src/function/scalar/generic/stats.cpp +2 -4
  128. package/src/duckdb/src/function/scalar/list/contains_or_position.cpp +4 -146
  129. package/src/duckdb/src/function/scalar/list/flatten.cpp +5 -12
  130. package/src/duckdb/src/function/scalar/list/list_aggregates.cpp +1 -1
  131. package/src/duckdb/src/function/scalar/list/list_concat.cpp +8 -12
  132. package/src/duckdb/src/function/scalar/list/list_extract.cpp +5 -12
  133. package/src/duckdb/src/function/scalar/list/list_lambdas.cpp +7 -3
  134. package/src/duckdb/src/function/scalar/list/list_value.cpp +6 -10
  135. package/src/duckdb/src/function/scalar/map/map.cpp +47 -1
  136. package/src/duckdb/src/function/scalar/map/map_entries.cpp +61 -0
  137. package/src/duckdb/src/function/scalar/map/map_extract.cpp +68 -26
  138. package/src/duckdb/src/function/scalar/map/map_keys_values.cpp +97 -0
  139. package/src/duckdb/src/function/scalar/math/numeric.cpp +101 -17
  140. package/src/duckdb/src/function/scalar/math_functions.cpp +3 -0
  141. package/src/duckdb/src/function/scalar/nested_functions.cpp +3 -0
  142. package/src/duckdb/src/function/scalar/operators/add.cpp +0 -9
  143. package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +29 -48
  144. package/src/duckdb/src/function/scalar/operators/bitwise.cpp +0 -63
  145. package/src/duckdb/src/function/scalar/operators/multiply.cpp +5 -6
  146. package/src/duckdb/src/function/scalar/operators/subtract.cpp +0 -6
  147. package/src/duckdb/src/function/scalar/string/caseconvert.cpp +2 -6
  148. package/src/duckdb/src/function/scalar/string/hex.cpp +201 -0
  149. package/src/duckdb/src/function/scalar/string/instr.cpp +2 -6
  150. package/src/duckdb/src/function/scalar/string/length.cpp +2 -6
  151. package/src/duckdb/src/function/scalar/string/like.cpp +2 -6
  152. package/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp +243 -0
  153. package/src/duckdb/src/function/scalar/string/regexp/regexp_util.cpp +79 -0
  154. package/src/duckdb/src/function/scalar/string/regexp.cpp +21 -80
  155. package/src/duckdb/src/function/scalar/string/substring.cpp +2 -6
  156. package/src/duckdb/src/function/scalar/string_functions.cpp +2 -0
  157. package/src/duckdb/src/function/scalar/struct/struct_extract.cpp +5 -10
  158. package/src/duckdb/src/function/scalar/struct/struct_insert.cpp +11 -14
  159. package/src/duckdb/src/function/scalar/struct/struct_pack.cpp +6 -7
  160. package/src/duckdb/src/function/table/arrow.cpp +5 -2
  161. package/src/duckdb/src/function/table/arrow_conversion.cpp +25 -1
  162. package/src/duckdb/src/function/table/checkpoint.cpp +5 -1
  163. package/src/duckdb/src/function/table/read_csv.cpp +55 -0
  164. package/src/duckdb/src/function/table/system/duckdb_constraints.cpp +2 -2
  165. package/src/duckdb/src/function/table/system/test_all_types.cpp +2 -2
  166. package/src/duckdb/src/function/table/table_scan.cpp +1 -1
  167. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  168. package/src/duckdb/src/function/table_function.cpp +30 -11
  169. package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +6 -0
  170. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_table_entry.hpp +1 -1
  171. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_function_catalog_entry.hpp +6 -8
  172. package/src/duckdb/src/include/duckdb/catalog/dependency_list.hpp +3 -0
  173. package/src/duckdb/src/include/duckdb/catalog/duck_catalog.hpp +2 -1
  174. package/src/duckdb/src/include/duckdb/common/box_renderer.hpp +8 -2
  175. package/src/duckdb/src/include/duckdb/common/constants.hpp +0 -19
  176. package/src/duckdb/src/include/duckdb/common/enums/aggregate_handling.hpp +2 -0
  177. package/src/duckdb/src/include/duckdb/common/enums/expression_type.hpp +2 -3
  178. package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +7 -4
  179. package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +1 -0
  180. package/src/duckdb/src/include/duckdb/common/enums/order_type.hpp +2 -0
  181. package/src/duckdb/src/include/duckdb/common/enums/set_operation_type.hpp +2 -1
  182. package/src/duckdb/src/include/duckdb/common/enums/statement_type.hpp +2 -1
  183. package/src/duckdb/src/include/duckdb/common/enums/tableref_type.hpp +2 -1
  184. package/src/duckdb/src/include/duckdb/common/exception.hpp +69 -2
  185. package/src/duckdb/src/include/duckdb/common/field_writer.hpp +12 -4
  186. package/src/duckdb/src/include/duckdb/common/{http_stats.hpp → http_state.hpp} +18 -4
  187. package/src/duckdb/src/include/duckdb/common/operator/multiply.hpp +2 -0
  188. package/src/duckdb/src/include/duckdb/common/optional_ptr.hpp +45 -0
  189. package/src/duckdb/src/include/duckdb/common/preserved_error.hpp +6 -1
  190. package/src/duckdb/src/include/duckdb/common/serializer/buffered_deserializer.hpp +4 -2
  191. package/src/duckdb/src/include/duckdb/common/serializer/buffered_file_reader.hpp +8 -2
  192. package/src/duckdb/src/include/duckdb/common/serializer/enum_serializer.hpp +113 -0
  193. package/src/duckdb/src/include/duckdb/common/serializer/format_deserializer.hpp +336 -0
  194. package/src/duckdb/src/include/duckdb/common/serializer/format_serializer.hpp +268 -0
  195. package/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp +126 -0
  196. package/src/duckdb/src/include/duckdb/common/serializer.hpp +13 -0
  197. package/src/duckdb/src/include/duckdb/common/string_util.hpp +25 -0
  198. package/src/duckdb/src/include/duckdb/common/types/bit.hpp +12 -7
  199. package/src/duckdb/src/include/duckdb/common/types/time.hpp +3 -0
  200. package/src/duckdb/src/include/duckdb/common/types/value.hpp +17 -48
  201. package/src/duckdb/src/include/duckdb/common/types/value_map.hpp +1 -1
  202. package/src/duckdb/src/include/duckdb/common/types/vector.hpp +3 -1
  203. package/src/duckdb/src/include/duckdb/common/types.hpp +45 -8
  204. package/src/duckdb/src/include/duckdb/common/vector_operations/unary_executor.hpp +2 -2
  205. package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +1 -0
  206. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +2 -2
  207. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_perfecthash_aggregate.hpp +1 -1
  208. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_cross_product.hpp +2 -0
  209. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_file_handle.hpp +1 -0
  210. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +6 -0
  211. package/src/duckdb/src/include/duckdb/execution/operator/projection/physical_projection.hpp +5 -0
  212. package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +3 -0
  213. package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +1 -3
  214. package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +54 -0
  215. package/src/duckdb/src/include/duckdb/function/aggregate/distributive_functions.hpp +5 -0
  216. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +18 -6
  217. package/src/duckdb/src/include/duckdb/function/cast/bound_cast_data.hpp +84 -0
  218. package/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp +2 -2
  219. package/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp +28 -64
  220. package/src/duckdb/src/include/duckdb/function/function_binder.hpp +3 -6
  221. package/src/duckdb/src/include/duckdb/function/scalar/bit_functions.hpp +4 -0
  222. package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +138 -0
  223. package/src/duckdb/src/include/duckdb/function/scalar/math_functions.hpp +8 -0
  224. package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +59 -0
  225. package/src/duckdb/src/include/duckdb/function/scalar/regexp.hpp +81 -1
  226. package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +4 -0
  227. package/src/duckdb/src/include/duckdb/function/scalar_function.hpp +2 -2
  228. package/src/duckdb/src/include/duckdb/function/table/arrow.hpp +12 -1
  229. package/src/duckdb/src/include/duckdb/function/table_function.hpp +10 -0
  230. package/src/duckdb/src/include/duckdb/main/capi/capi_internal.hpp +2 -0
  231. package/src/duckdb/src/include/duckdb/main/client_data.hpp +3 -3
  232. package/src/duckdb/src/include/duckdb/main/config.hpp +3 -0
  233. package/src/duckdb/src/include/duckdb/main/connection_manager.hpp +2 -0
  234. package/src/duckdb/src/include/duckdb/main/database.hpp +1 -0
  235. package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +2 -0
  236. package/src/duckdb/src/include/duckdb/main/prepared_statement.hpp +2 -0
  237. package/src/duckdb/src/include/duckdb/main/relation/explain_relation.hpp +2 -1
  238. package/src/duckdb/src/include/duckdb/main/relation.hpp +2 -1
  239. package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +2 -0
  240. package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +2 -2
  241. package/src/duckdb/src/include/duckdb/optimizer/rule/list.hpp +1 -0
  242. package/src/duckdb/src/include/duckdb/optimizer/rule/ordered_aggregate_optimizer.hpp +24 -0
  243. package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +4 -0
  244. package/src/duckdb/src/include/duckdb/parser/expression/between_expression.hpp +3 -0
  245. package/src/duckdb/src/include/duckdb/parser/expression/bound_expression.hpp +2 -0
  246. package/src/duckdb/src/include/duckdb/parser/expression/case_expression.hpp +5 -0
  247. package/src/duckdb/src/include/duckdb/parser/expression/cast_expression.hpp +2 -0
  248. package/src/duckdb/src/include/duckdb/parser/expression/collate_expression.hpp +2 -0
  249. package/src/duckdb/src/include/duckdb/parser/expression/columnref_expression.hpp +2 -0
  250. package/src/duckdb/src/include/duckdb/parser/expression/comparison_expression.hpp +2 -0
  251. package/src/duckdb/src/include/duckdb/parser/expression/conjunction_expression.hpp +2 -0
  252. package/src/duckdb/src/include/duckdb/parser/expression/constant_expression.hpp +3 -0
  253. package/src/duckdb/src/include/duckdb/parser/expression/default_expression.hpp +1 -0
  254. package/src/duckdb/src/include/duckdb/parser/expression/function_expression.hpp +4 -2
  255. package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +2 -0
  256. package/src/duckdb/src/include/duckdb/parser/expression/operator_expression.hpp +2 -0
  257. package/src/duckdb/src/include/duckdb/parser/expression/parameter_expression.hpp +2 -0
  258. package/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +2 -0
  259. package/src/duckdb/src/include/duckdb/parser/expression/star_expression.hpp +4 -2
  260. package/src/duckdb/src/include/duckdb/parser/expression/subquery_expression.hpp +2 -0
  261. package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +5 -0
  262. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_info.hpp +5 -1
  263. package/src/duckdb/src/include/duckdb/parser/parsed_data/{alter_function_info.hpp → alter_scalar_function_info.hpp} +13 -13
  264. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_function_info.hpp +47 -0
  265. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp +6 -0
  266. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_table_function_info.hpp +2 -1
  267. package/src/duckdb/src/include/duckdb/parser/parsed_data/sample_options.hpp +2 -0
  268. package/src/duckdb/src/include/duckdb/parser/parsed_expression.hpp +5 -0
  269. package/src/duckdb/src/include/duckdb/parser/query_node/recursive_cte_node.hpp +3 -0
  270. package/src/duckdb/src/include/duckdb/parser/query_node/select_node.hpp +5 -0
  271. package/src/duckdb/src/include/duckdb/parser/query_node/set_operation_node.hpp +3 -0
  272. package/src/duckdb/src/include/duckdb/parser/query_node.hpp +13 -2
  273. package/src/duckdb/src/include/duckdb/parser/result_modifier.hpp +24 -1
  274. package/src/duckdb/src/include/duckdb/parser/sql_statement.hpp +2 -1
  275. package/src/duckdb/src/include/duckdb/parser/statement/multi_statement.hpp +28 -0
  276. package/src/duckdb/src/include/duckdb/parser/statement/select_statement.hpp +6 -1
  277. package/src/duckdb/src/include/duckdb/parser/tableref/basetableref.hpp +4 -0
  278. package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +2 -0
  279. package/src/duckdb/src/include/duckdb/parser/tableref/expressionlistref.hpp +3 -0
  280. package/src/duckdb/src/include/duckdb/parser/tableref/joinref.hpp +3 -0
  281. package/src/duckdb/src/include/duckdb/parser/tableref/list.hpp +1 -0
  282. package/src/duckdb/src/include/duckdb/parser/tableref/pivotref.hpp +87 -0
  283. package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +3 -0
  284. package/src/duckdb/src/include/duckdb/parser/tableref/table_function_ref.hpp +3 -0
  285. package/src/duckdb/src/include/duckdb/parser/tableref.hpp +3 -1
  286. package/src/duckdb/src/include/duckdb/parser/tokens.hpp +2 -0
  287. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +33 -0
  288. package/src/duckdb/src/include/duckdb/planner/bind_context.hpp +2 -0
  289. package/src/duckdb/src/include/duckdb/planner/binder.hpp +15 -4
  290. package/src/duckdb/src/include/duckdb/planner/bound_result_modifier.hpp +3 -0
  291. package/src/duckdb/src/include/duckdb/planner/expression/bound_aggregate_expression.hpp +3 -0
  292. package/src/duckdb/src/include/duckdb/planner/expression_binder/base_select_binder.hpp +64 -0
  293. package/src/duckdb/src/include/duckdb/planner/expression_binder/having_binder.hpp +2 -2
  294. package/src/duckdb/src/include/duckdb/planner/expression_binder/order_binder.hpp +4 -1
  295. package/src/duckdb/src/include/duckdb/planner/expression_binder/qualify_binder.hpp +2 -2
  296. package/src/duckdb/src/include/duckdb/planner/expression_binder/select_binder.hpp +9 -38
  297. package/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +1 -1
  298. package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +1 -0
  299. package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +1 -0
  300. package/src/duckdb/src/include/duckdb/planner/operator/logical_asof_join.hpp +22 -0
  301. package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +5 -2
  302. package/src/duckdb/src/include/duckdb/planner/operator/logical_distinct.hpp +3 -0
  303. package/src/duckdb/src/include/duckdb/planner/query_node/bound_select_node.hpp +8 -2
  304. package/src/duckdb/src/include/duckdb/storage/buffer/block_handle.hpp +2 -0
  305. package/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp +76 -44
  306. package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp +3 -2
  307. package/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp +1 -1
  308. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_compress.hpp +2 -2
  309. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_fetch.hpp +1 -1
  310. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_scan.hpp +1 -1
  311. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_compress.hpp +2 -2
  312. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_fetch.hpp +1 -1
  313. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_scan.hpp +1 -1
  314. package/src/duckdb/src/include/duckdb/storage/data_pointer.hpp +5 -2
  315. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +3 -3
  316. package/src/duckdb/src/include/duckdb/storage/index.hpp +4 -3
  317. package/src/duckdb/src/include/duckdb/storage/meta_block_reader.hpp +7 -0
  318. package/src/duckdb/src/include/duckdb/storage/statistics/base_statistics.hpp +93 -29
  319. package/src/duckdb/src/include/duckdb/storage/statistics/column_statistics.hpp +22 -3
  320. package/src/duckdb/src/include/duckdb/storage/statistics/distinct_statistics.hpp +8 -6
  321. package/src/duckdb/src/include/duckdb/storage/statistics/list_stats.hpp +41 -0
  322. package/src/duckdb/src/include/duckdb/storage/statistics/node_statistics.hpp +26 -0
  323. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats.hpp +114 -0
  324. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats_union.hpp +62 -0
  325. package/src/duckdb/src/include/duckdb/storage/statistics/segment_statistics.hpp +2 -7
  326. package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +74 -0
  327. package/src/duckdb/src/include/duckdb/storage/statistics/struct_stats.hpp +42 -0
  328. package/src/duckdb/src/include/duckdb/storage/string_uncompressed.hpp +2 -3
  329. package/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp +2 -1
  330. package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +6 -3
  331. package/src/duckdb/src/include/duckdb/storage/table/column_data_checkpointer.hpp +3 -2
  332. package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +7 -5
  333. package/src/duckdb/src/include/duckdb/storage/table/list_column_data.hpp +1 -1
  334. package/src/duckdb/src/include/duckdb/storage/table/persistent_table_data.hpp +6 -2
  335. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +10 -6
  336. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +8 -5
  337. package/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp +37 -0
  338. package/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp +10 -1
  339. package/src/duckdb/src/include/duckdb/storage/table/segment_base.hpp +4 -3
  340. package/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +271 -26
  341. package/src/duckdb/src/include/duckdb/storage/table/table_statistics.hpp +5 -0
  342. package/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +0 -1
  343. package/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +1 -1
  344. package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +2 -2
  345. package/src/duckdb/src/include/duckdb.h +50 -2
  346. package/src/duckdb/src/include/duckdb.hpp +0 -1
  347. package/src/duckdb/src/main/capi/pending-c.cpp +16 -3
  348. package/src/duckdb/src/main/capi/result-c.cpp +27 -1
  349. package/src/duckdb/src/main/capi/stream-c.cpp +25 -0
  350. package/src/duckdb/src/main/client_context.cpp +38 -34
  351. package/src/duckdb/src/main/client_data.cpp +7 -6
  352. package/src/duckdb/src/main/config.cpp +70 -1
  353. package/src/duckdb/src/main/database.cpp +19 -2
  354. package/src/duckdb/src/main/extension/extension_install.cpp +7 -2
  355. package/src/duckdb/src/main/prepared_statement.cpp +4 -0
  356. package/src/duckdb/src/main/query_profiler.cpp +17 -15
  357. package/src/duckdb/src/main/relation/explain_relation.cpp +3 -3
  358. package/src/duckdb/src/main/relation.cpp +3 -2
  359. package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +1 -0
  360. package/src/duckdb/src/optimizer/deliminator.cpp +1 -1
  361. package/src/duckdb/src/optimizer/filter_combiner.cpp +1 -1
  362. package/src/duckdb/src/optimizer/filter_pullup.cpp +3 -1
  363. package/src/duckdb/src/optimizer/filter_pushdown.cpp +14 -8
  364. package/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp +105 -71
  365. package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +31 -12
  366. package/src/duckdb/src/optimizer/optimizer.cpp +1 -0
  367. package/src/duckdb/src/optimizer/pullup/pullup_from_left.cpp +2 -2
  368. package/src/duckdb/src/optimizer/pushdown/pushdown_aggregate.cpp +33 -5
  369. package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +1 -1
  370. package/src/duckdb/src/optimizer/pushdown/pushdown_inner_join.cpp +3 -0
  371. package/src/duckdb/src/optimizer/pushdown/pushdown_left_join.cpp +5 -12
  372. package/src/duckdb/src/optimizer/pushdown/pushdown_mark_join.cpp +2 -2
  373. package/src/duckdb/src/optimizer/pushdown/pushdown_single_join.cpp +1 -1
  374. package/src/duckdb/src/optimizer/remove_unused_columns.cpp +1 -0
  375. package/src/duckdb/src/optimizer/rule/move_constants.cpp +10 -4
  376. package/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp +30 -0
  377. package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +9 -2
  378. package/src/duckdb/src/optimizer/statistics/expression/propagate_aggregate.cpp +9 -3
  379. package/src/duckdb/src/optimizer/statistics/expression/propagate_and_compress.cpp +6 -7
  380. package/src/duckdb/src/optimizer/statistics/expression/propagate_cast.cpp +14 -11
  381. package/src/duckdb/src/optimizer/statistics/expression/propagate_columnref.cpp +1 -1
  382. package/src/duckdb/src/optimizer/statistics/expression/propagate_comparison.cpp +13 -15
  383. package/src/duckdb/src/optimizer/statistics/expression/propagate_conjunction.cpp +0 -1
  384. package/src/duckdb/src/optimizer/statistics/expression/propagate_constant.cpp +3 -75
  385. package/src/duckdb/src/optimizer/statistics/expression/propagate_function.cpp +7 -2
  386. package/src/duckdb/src/optimizer/statistics/expression/propagate_operator.cpp +10 -0
  387. package/src/duckdb/src/optimizer/statistics/operator/propagate_aggregate.cpp +2 -3
  388. package/src/duckdb/src/optimizer/statistics/operator/propagate_filter.cpp +29 -32
  389. package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +5 -5
  390. package/src/duckdb/src/optimizer/statistics/operator/propagate_set_operation.cpp +3 -3
  391. package/src/duckdb/src/optimizer/statistics_propagator.cpp +2 -1
  392. package/src/duckdb/src/optimizer/unnest_rewriter.cpp +2 -2
  393. package/src/duckdb/src/parallel/meta_pipeline.cpp +0 -4
  394. package/src/duckdb/src/parser/common_table_expression_info.cpp +19 -0
  395. package/src/duckdb/src/parser/expression/between_expression.cpp +17 -0
  396. package/src/duckdb/src/parser/expression/case_expression.cpp +28 -0
  397. package/src/duckdb/src/parser/expression/cast_expression.cpp +17 -0
  398. package/src/duckdb/src/parser/expression/collate_expression.cpp +16 -0
  399. package/src/duckdb/src/parser/expression/columnref_expression.cpp +15 -0
  400. package/src/duckdb/src/parser/expression/comparison_expression.cpp +16 -0
  401. package/src/duckdb/src/parser/expression/conjunction_expression.cpp +17 -0
  402. package/src/duckdb/src/parser/expression/constant_expression.cpp +14 -0
  403. package/src/duckdb/src/parser/expression/default_expression.cpp +7 -0
  404. package/src/duckdb/src/parser/expression/function_expression.cpp +35 -0
  405. package/src/duckdb/src/parser/expression/lambda_expression.cpp +16 -0
  406. package/src/duckdb/src/parser/expression/operator_expression.cpp +15 -0
  407. package/src/duckdb/src/parser/expression/parameter_expression.cpp +15 -0
  408. package/src/duckdb/src/parser/expression/positional_reference_expression.cpp +14 -0
  409. package/src/duckdb/src/parser/expression/star_expression.cpp +26 -6
  410. package/src/duckdb/src/parser/expression/subquery_expression.cpp +20 -0
  411. package/src/duckdb/src/parser/expression/window_expression.cpp +43 -0
  412. package/src/duckdb/src/parser/parsed_data/alter_info.cpp +7 -3
  413. package/src/duckdb/src/parser/parsed_data/alter_scalar_function_info.cpp +56 -0
  414. package/src/duckdb/src/parser/parsed_data/alter_table_function_info.cpp +51 -0
  415. package/src/duckdb/src/parser/parsed_data/create_scalar_function_info.cpp +3 -2
  416. package/src/duckdb/src/parser/parsed_data/create_table_function_info.cpp +6 -0
  417. package/src/duckdb/src/parser/parsed_data/sample_options.cpp +22 -10
  418. package/src/duckdb/src/parser/parsed_expression.cpp +72 -0
  419. package/src/duckdb/src/parser/parsed_expression_iterator.cpp +15 -1
  420. package/src/duckdb/src/parser/query_node/recursive_cte_node.cpp +21 -0
  421. package/src/duckdb/src/parser/query_node/select_node.cpp +31 -0
  422. package/src/duckdb/src/parser/query_node/set_operation_node.cpp +17 -0
  423. package/src/duckdb/src/parser/query_node.cpp +51 -1
  424. package/src/duckdb/src/parser/result_modifier.cpp +78 -0
  425. package/src/duckdb/src/parser/statement/multi_statement.cpp +18 -0
  426. package/src/duckdb/src/parser/statement/select_statement.cpp +12 -0
  427. package/src/duckdb/src/parser/tableref/basetableref.cpp +21 -0
  428. package/src/duckdb/src/parser/tableref/emptytableref.cpp +4 -0
  429. package/src/duckdb/src/parser/tableref/expressionlistref.cpp +17 -0
  430. package/src/duckdb/src/parser/tableref/joinref.cpp +29 -0
  431. package/src/duckdb/src/parser/tableref/pivotref.cpp +373 -0
  432. package/src/duckdb/src/parser/tableref/subqueryref.cpp +15 -0
  433. package/src/duckdb/src/parser/tableref/table_function.cpp +17 -0
  434. package/src/duckdb/src/parser/tableref.cpp +49 -0
  435. package/src/duckdb/src/parser/transform/expression/transform_array_access.cpp +11 -0
  436. package/src/duckdb/src/parser/transform/expression/transform_bool_expr.cpp +1 -1
  437. package/src/duckdb/src/parser/transform/expression/transform_columnref.cpp +17 -2
  438. package/src/duckdb/src/parser/transform/expression/transform_function.cpp +63 -42
  439. package/src/duckdb/src/parser/transform/expression/transform_operator.cpp +1 -1
  440. package/src/duckdb/src/parser/transform/expression/transform_subquery.cpp +1 -1
  441. package/src/duckdb/src/parser/transform/helpers/transform_alias.cpp +12 -6
  442. package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +24 -0
  443. package/src/duckdb/src/parser/transform/helpers/transform_groupby.cpp +7 -0
  444. package/src/duckdb/src/parser/transform/helpers/transform_orderby.cpp +0 -7
  445. package/src/duckdb/src/parser/transform/helpers/transform_typename.cpp +3 -2
  446. package/src/duckdb/src/parser/transform/statement/transform_create_function.cpp +4 -0
  447. package/src/duckdb/src/parser/transform/statement/transform_create_view.cpp +4 -0
  448. package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +179 -0
  449. package/src/duckdb/src/parser/transform/statement/transform_rename.cpp +3 -4
  450. package/src/duckdb/src/parser/transform/statement/transform_select.cpp +8 -0
  451. package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +2 -3
  452. package/src/duckdb/src/parser/transform/tableref/transform_join.cpp +12 -1
  453. package/src/duckdb/src/parser/transform/tableref/transform_pivot.cpp +121 -0
  454. package/src/duckdb/src/parser/transform/tableref/transform_tableref.cpp +2 -0
  455. package/src/duckdb/src/parser/transformer.cpp +15 -3
  456. package/src/duckdb/src/planner/bind_context.cpp +18 -25
  457. package/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp +9 -7
  458. package/src/duckdb/src/planner/binder/expression/bind_columnref_expression.cpp +4 -3
  459. package/src/duckdb/src/planner/binder/expression/bind_function_expression.cpp +23 -12
  460. package/src/duckdb/src/planner/binder/expression/bind_lambda.cpp +3 -2
  461. package/src/duckdb/src/planner/binder/expression/bind_star_expression.cpp +176 -0
  462. package/src/duckdb/src/planner/binder/expression/bind_subquery_expression.cpp +4 -0
  463. package/src/duckdb/src/planner/binder/expression/bind_unnest_expression.cpp +163 -24
  464. package/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp +2 -2
  465. package/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +109 -94
  466. package/src/duckdb/src/planner/binder/query_node/plan_query_node.cpp +11 -0
  467. package/src/duckdb/src/planner/binder/query_node/plan_select_node.cpp +9 -4
  468. package/src/duckdb/src/planner/binder/statement/bind_copy.cpp +5 -3
  469. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +3 -2
  470. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +9 -1
  471. package/src/duckdb/src/planner/binder/statement/bind_delete.cpp +1 -1
  472. package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +12 -8
  473. package/src/duckdb/src/planner/binder/statement/bind_logical_plan.cpp +17 -0
  474. package/src/duckdb/src/planner/binder/statement/bind_update.cpp +4 -2
  475. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +19 -3
  476. package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +366 -0
  477. package/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp +11 -1
  478. package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -0
  479. package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +61 -13
  480. package/src/duckdb/src/planner/binder.cpp +19 -24
  481. package/src/duckdb/src/planner/bound_result_modifier.cpp +27 -1
  482. package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +9 -2
  483. package/src/duckdb/src/planner/expression/bound_expression.cpp +4 -0
  484. package/src/duckdb/src/planner/expression/bound_window_expression.cpp +1 -1
  485. package/src/duckdb/src/planner/expression_binder/base_select_binder.cpp +146 -0
  486. package/src/duckdb/src/planner/expression_binder/having_binder.cpp +6 -3
  487. package/src/duckdb/src/planner/expression_binder/qualify_binder.cpp +3 -3
  488. package/src/duckdb/src/planner/expression_binder/select_binder.cpp +1 -132
  489. package/src/duckdb/src/planner/expression_binder.cpp +10 -3
  490. package/src/duckdb/src/planner/expression_iterator.cpp +17 -10
  491. package/src/duckdb/src/planner/filter/constant_filter.cpp +4 -6
  492. package/src/duckdb/src/planner/logical_operator.cpp +7 -2
  493. package/src/duckdb/src/planner/logical_operator_visitor.cpp +6 -0
  494. package/src/duckdb/src/planner/operator/logical_asof_join.cpp +8 -0
  495. package/src/duckdb/src/planner/operator/logical_distinct.cpp +3 -0
  496. package/src/duckdb/src/planner/planner.cpp +2 -1
  497. package/src/duckdb/src/planner/pragma_handler.cpp +10 -2
  498. package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +3 -1
  499. package/src/duckdb/src/storage/buffer_manager.cpp +44 -46
  500. package/src/duckdb/src/storage/checkpoint/row_group_writer.cpp +1 -1
  501. package/src/duckdb/src/storage/checkpoint/table_data_reader.cpp +4 -15
  502. package/src/duckdb/src/storage/checkpoint/table_data_writer.cpp +10 -4
  503. package/src/duckdb/src/storage/checkpoint_manager.cpp +9 -3
  504. package/src/duckdb/src/storage/compression/bitpacking.cpp +28 -24
  505. package/src/duckdb/src/storage/compression/fixed_size_uncompressed.cpp +43 -45
  506. package/src/duckdb/src/storage/compression/numeric_constant.cpp +9 -10
  507. package/src/duckdb/src/storage/compression/patas.cpp +1 -1
  508. package/src/duckdb/src/storage/compression/rle.cpp +19 -15
  509. package/src/duckdb/src/storage/compression/validity_uncompressed.cpp +5 -5
  510. package/src/duckdb/src/storage/data_table.cpp +20 -20
  511. package/src/duckdb/src/storage/index.cpp +12 -1
  512. package/src/duckdb/src/storage/local_storage.cpp +20 -23
  513. package/src/duckdb/src/storage/meta_block_reader.cpp +22 -0
  514. package/src/duckdb/src/storage/statistics/base_statistics.cpp +373 -128
  515. package/src/duckdb/src/storage/statistics/column_statistics.cpp +57 -3
  516. package/src/duckdb/src/storage/statistics/distinct_statistics.cpp +8 -9
  517. package/src/duckdb/src/storage/statistics/list_stats.cpp +121 -0
  518. package/src/duckdb/src/storage/statistics/numeric_stats.cpp +591 -0
  519. package/src/duckdb/src/storage/statistics/numeric_stats_union.cpp +65 -0
  520. package/src/duckdb/src/storage/statistics/segment_statistics.cpp +2 -11
  521. package/src/duckdb/src/storage/statistics/string_stats.cpp +273 -0
  522. package/src/duckdb/src/storage/statistics/struct_stats.cpp +133 -0
  523. package/src/duckdb/src/storage/storage_info.cpp +2 -2
  524. package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +4 -10
  525. package/src/duckdb/src/storage/table/column_data.cpp +45 -46
  526. package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +7 -8
  527. package/src/duckdb/src/storage/table/column_segment.cpp +13 -14
  528. package/src/duckdb/src/storage/table/list_column_data.cpp +41 -59
  529. package/src/duckdb/src/storage/table/persistent_table_data.cpp +2 -1
  530. package/src/duckdb/src/storage/table/row_group.cpp +38 -32
  531. package/src/duckdb/src/storage/table/row_group_collection.cpp +94 -78
  532. package/src/duckdb/src/storage/table/scan_state.cpp +22 -3
  533. package/src/duckdb/src/storage/table/standard_column_data.cpp +7 -6
  534. package/src/duckdb/src/storage/table/struct_column_data.cpp +16 -16
  535. package/src/duckdb/src/storage/table/table_statistics.cpp +27 -7
  536. package/src/duckdb/src/storage/table/update_segment.cpp +20 -18
  537. package/src/duckdb/src/storage/wal_replay.cpp +8 -5
  538. package/src/duckdb/src/storage/write_ahead_log.cpp +2 -2
  539. package/src/duckdb/src/transaction/commit_state.cpp +11 -7
  540. package/src/duckdb/src/verification/deserialized_statement_verifier.cpp +0 -1
  541. package/src/duckdb/third_party/libpg_query/include/nodes/nodes.hpp +35 -0
  542. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +36 -2
  543. package/src/duckdb/third_party/libpg_query/include/nodes/primnodes.hpp +3 -3
  544. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +1022 -530
  545. package/src/duckdb/third_party/libpg_query/include/parser/kwlist.hpp +8 -0
  546. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +24462 -22828
  547. package/src/duckdb/third_party/re2/re2/re2.cc +9 -0
  548. package/src/duckdb/third_party/re2/re2/re2.h +2 -0
  549. package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +4 -4
  550. package/src/duckdb/ub_extension_json_json_functions.cpp +2 -0
  551. package/src/duckdb/ub_src_common_serializer.cpp +2 -0
  552. package/src/duckdb/ub_src_execution_physical_plan.cpp +2 -0
  553. package/src/duckdb/ub_src_function_aggregate_distributive.cpp +2 -0
  554. package/src/duckdb/ub_src_function_scalar_bit.cpp +2 -0
  555. package/src/duckdb/ub_src_function_scalar_map.cpp +4 -0
  556. package/src/duckdb/ub_src_function_scalar_string.cpp +2 -0
  557. package/src/duckdb/ub_src_function_scalar_string_regexp.cpp +4 -0
  558. package/src/duckdb/ub_src_main_capi.cpp +2 -0
  559. package/src/duckdb/ub_src_optimizer_rule.cpp +2 -0
  560. package/src/duckdb/ub_src_parser.cpp +2 -0
  561. package/src/duckdb/ub_src_parser_parsed_data.cpp +4 -2
  562. package/src/duckdb/ub_src_parser_statement.cpp +2 -0
  563. package/src/duckdb/ub_src_parser_tableref.cpp +2 -0
  564. package/src/duckdb/ub_src_parser_transform_statement.cpp +2 -0
  565. package/src/duckdb/ub_src_parser_transform_tableref.cpp +2 -0
  566. package/src/duckdb/ub_src_planner_binder_expression.cpp +2 -0
  567. package/src/duckdb/ub_src_planner_binder_tableref.cpp +2 -0
  568. package/src/duckdb/ub_src_planner_expression_binder.cpp +2 -0
  569. package/src/duckdb/ub_src_planner_operator.cpp +2 -0
  570. package/src/duckdb/ub_src_storage_statistics.cpp +6 -6
  571. package/src/duckdb/ub_src_storage_table.cpp +0 -2
  572. package/src/duckdb_node.hpp +2 -1
  573. package/src/statement.cpp +5 -5
  574. package/src/utils.cpp +27 -2
  575. package/test/extension.test.ts +44 -26
  576. package/test/syntax_error.test.ts +3 -1
  577. package/filelist.cache +0 -0
  578. package/src/duckdb/src/include/duckdb/main/loadable_extension.hpp +0 -59
  579. package/src/duckdb/src/include/duckdb/storage/statistics/list_statistics.hpp +0 -36
  580. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_statistics.hpp +0 -75
  581. package/src/duckdb/src/include/duckdb/storage/statistics/string_statistics.hpp +0 -49
  582. package/src/duckdb/src/include/duckdb/storage/statistics/struct_statistics.hpp +0 -36
  583. package/src/duckdb/src/include/duckdb/storage/statistics/validity_statistics.hpp +0 -45
  584. package/src/duckdb/src/parser/parsed_data/alter_function_info.cpp +0 -55
  585. package/src/duckdb/src/storage/statistics/list_statistics.cpp +0 -94
  586. package/src/duckdb/src/storage/statistics/numeric_statistics.cpp +0 -307
  587. package/src/duckdb/src/storage/statistics/string_statistics.cpp +0 -220
  588. package/src/duckdb/src/storage/statistics/struct_statistics.cpp +0 -108
  589. package/src/duckdb/src/storage/statistics/validity_statistics.cpp +0 -91
  590. package/src/duckdb/src/storage/table/segment_tree.cpp +0 -179
@@ -2,7 +2,6 @@
2
2
  #include "duckdb/function/aggregate/sum_helpers.hpp"
3
3
  #include "duckdb/common/exception.hpp"
4
4
  #include "duckdb/common/types/decimal.hpp"
5
- #include "duckdb/storage/statistics/numeric_statistics.hpp"
6
5
  #include "duckdb/planner/expression/bound_aggregate_expression.hpp"
7
6
  #include "duckdb/function/aggregate/algebraic_functions.hpp"
8
7
 
@@ -52,9 +51,6 @@ struct DoubleSumOperation : public BaseSumOperation<SumSetOperation, ADD_OPERATO
52
51
  if (!state->isset) {
53
52
  mask.SetInvalid(idx);
54
53
  } else {
55
- if (!Value::DoubleIsFinite(state->value)) {
56
- throw OutOfRangeException("SUM is out of range!");
57
- }
58
54
  target[idx] = state->value;
59
55
  }
60
56
  }
@@ -75,30 +71,29 @@ struct HugeintSumOperation : public BaseSumOperation<SumSetOperation, RegularAdd
75
71
  };
76
72
 
77
73
  unique_ptr<BaseStatistics> SumPropagateStats(ClientContext &context, BoundAggregateExpression &expr,
78
- FunctionData *bind_data, vector<unique_ptr<BaseStatistics>> &child_stats,
79
- NodeStatistics *node_stats) {
80
- if (child_stats[0] && node_stats && node_stats->has_max_cardinality) {
81
- auto &numeric_stats = (NumericStatistics &)*child_stats[0];
82
- if (numeric_stats.min.IsNull() || numeric_stats.max.IsNull()) {
74
+ AggregateStatisticsInput &input) {
75
+ if (input.node_stats && input.node_stats->has_max_cardinality) {
76
+ auto &numeric_stats = input.child_stats[0];
77
+ if (!NumericStats::HasMinMax(numeric_stats)) {
83
78
  return nullptr;
84
79
  }
85
- auto internal_type = numeric_stats.min.type().InternalType();
80
+ auto internal_type = numeric_stats.GetType().InternalType();
86
81
  hugeint_t max_negative;
87
82
  hugeint_t max_positive;
88
83
  switch (internal_type) {
89
84
  case PhysicalType::INT32:
90
- max_negative = numeric_stats.min.GetValueUnsafe<int32_t>();
91
- max_positive = numeric_stats.max.GetValueUnsafe<int32_t>();
85
+ max_negative = NumericStats::Min(numeric_stats).GetValueUnsafe<int32_t>();
86
+ max_positive = NumericStats::Max(numeric_stats).GetValueUnsafe<int32_t>();
92
87
  break;
93
88
  case PhysicalType::INT64:
94
- max_negative = numeric_stats.min.GetValueUnsafe<int64_t>();
95
- max_positive = numeric_stats.max.GetValueUnsafe<int64_t>();
89
+ max_negative = NumericStats::Min(numeric_stats).GetValueUnsafe<int64_t>();
90
+ max_positive = NumericStats::Max(numeric_stats).GetValueUnsafe<int64_t>();
96
91
  break;
97
92
  default:
98
93
  throw InternalException("Unsupported type for propagate sum stats");
99
94
  }
100
- auto max_sum_negative = max_negative * hugeint_t(node_stats->max_cardinality);
101
- auto max_sum_positive = max_positive * hugeint_t(node_stats->max_cardinality);
95
+ auto max_sum_negative = max_negative * hugeint_t(input.node_stats->max_cardinality);
96
+ auto max_sum_positive = max_positive * hugeint_t(input.node_stats->max_cardinality);
102
97
  if (max_sum_positive >= NumericLimits<int64_t>::Maximum() ||
103
98
  max_sum_negative <= NumericLimits<int64_t>::Minimum()) {
104
99
  // sum can potentially exceed int64_t bounds: use hugeint sum
@@ -115,6 +110,7 @@ AggregateFunction SumFun::GetSumAggregate(PhysicalType type) {
115
110
  case PhysicalType::INT16: {
116
111
  auto function = AggregateFunction::UnaryAggregate<SumState<int64_t>, int16_t, hugeint_t, IntegerSumOperation>(
117
112
  LogicalType::SMALLINT, LogicalType::HUGEINT);
113
+ function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
118
114
  return function;
119
115
  }
120
116
 
@@ -123,6 +119,7 @@ AggregateFunction SumFun::GetSumAggregate(PhysicalType type) {
123
119
  AggregateFunction::UnaryAggregate<SumState<hugeint_t>, int32_t, hugeint_t, SumToHugeintOperation>(
124
120
  LogicalType::INTEGER, LogicalType::HUGEINT);
125
121
  function.statistics = SumPropagateStats;
122
+ function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
126
123
  return function;
127
124
  }
128
125
  case PhysicalType::INT64: {
@@ -130,12 +127,14 @@ AggregateFunction SumFun::GetSumAggregate(PhysicalType type) {
130
127
  AggregateFunction::UnaryAggregate<SumState<hugeint_t>, int64_t, hugeint_t, SumToHugeintOperation>(
131
128
  LogicalType::BIGINT, LogicalType::HUGEINT);
132
129
  function.statistics = SumPropagateStats;
130
+ function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
133
131
  return function;
134
132
  }
135
133
  case PhysicalType::INT128: {
136
134
  auto function =
137
135
  AggregateFunction::UnaryAggregate<SumState<hugeint_t>, hugeint_t, hugeint_t, HugeintSumOperation>(
138
136
  LogicalType::HUGEINT, LogicalType::HUGEINT);
137
+ function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
139
138
  return function;
140
139
  }
141
140
  default:
@@ -149,12 +148,14 @@ AggregateFunction SumFun::GetSumAggregateNoOverflow(PhysicalType type) {
149
148
  auto function = AggregateFunction::UnaryAggregate<SumState<int64_t>, int32_t, hugeint_t, IntegerSumOperation>(
150
149
  LogicalType::INTEGER, LogicalType::HUGEINT);
151
150
  function.name = "sum_no_overflow";
151
+ function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
152
152
  return function;
153
153
  }
154
154
  case PhysicalType::INT64: {
155
155
  auto function = AggregateFunction::UnaryAggregate<SumState<int64_t>, int64_t, hugeint_t, IntegerSumOperation>(
156
156
  LogicalType::BIGINT, LogicalType::HUGEINT);
157
157
  function.name = "sum_no_overflow";
158
+ function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
158
159
  return function;
159
160
  }
160
161
  default:
@@ -169,6 +170,7 @@ unique_ptr<FunctionData> BindDecimalSum(ClientContext &context, AggregateFunctio
169
170
  function.name = "sum";
170
171
  function.arguments[0] = decimal_type;
171
172
  function.return_type = LogicalType::DECIMAL(Decimal::MAX_WIDTH_DECIMAL, DecimalType::GetScale(decimal_type));
173
+ function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
172
174
  return nullptr;
173
175
  }
174
176
 
@@ -179,6 +181,7 @@ unique_ptr<FunctionData> BindDecimalSumNoOverflow(ClientContext &context, Aggreg
179
181
  function.name = "sum_no_overflow";
180
182
  function.arguments[0] = decimal_type;
181
183
  function.return_type = LogicalType::DECIMAL(Decimal::MAX_WIDTH_DECIMAL, DecimalType::GetScale(decimal_type));
184
+ function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
182
185
  return nullptr;
183
186
  }
184
187
 
@@ -10,6 +10,7 @@ void BuiltinFunctions::RegisterDistributiveAggregates() {
10
10
  Register<BitAndFun>();
11
11
  Register<BitOrFun>();
12
12
  Register<BitXorFun>();
13
+ Register<BitStringAggFun>();
13
14
  Register<CountStarFun>();
14
15
  Register<CountFun>();
15
16
  Register<FirstFun>();
@@ -70,11 +70,14 @@ struct ApproxQuantileOperation {
70
70
 
71
71
  template <class INPUT_TYPE, class STATE, class OP>
72
72
  static void Operation(STATE *state, AggregateInputData &, INPUT_TYPE *data, ValidityMask &mask, idx_t idx) {
73
+ auto val = Cast::template Operation<INPUT_TYPE, SAVE_TYPE>(data[idx]);
74
+ if (!Value::DoubleIsFinite(val)) {
75
+ return;
76
+ }
73
77
  if (!state->h) {
74
78
  state->h = new duckdb_tdigest::TDigest(100);
75
79
  }
76
-
77
- state->h->add(Cast::template Operation<INPUT_TYPE, SAVE_TYPE>(data[idx]));
80
+ state->h->add(val);
78
81
  state->pos++;
79
82
  }
80
83
 
@@ -176,7 +176,7 @@ struct ModeFunction {
176
176
  }
177
177
  auto highest_frequency = state->Scan();
178
178
  if (highest_frequency != state->frequency_map->end()) {
179
- target[idx] = INPUT_TYPE(highest_frequency->first);
179
+ target[idx] = ASSIGN_OP::template Assign<INPUT_TYPE, INPUT_TYPE>(result, highest_frequency->first);
180
180
  } else {
181
181
  mask.SetInvalid(idx);
182
182
  }
@@ -414,7 +414,7 @@ struct QuantileBindData : public FunctionData {
414
414
  size_t pos = 0;
415
415
  size_t neg = 0;
416
416
  for (idx_t i = 0; i < quantiles_p.size(); ++i) {
417
- const auto q = quantiles_p[i];
417
+ const auto &q = quantiles_p[i];
418
418
  pos += (q > 0);
419
419
  neg += (q < 0);
420
420
  quantiles.emplace_back(QuantileAbs(q));
@@ -795,6 +795,7 @@ AggregateFunction GetTypedDiscreteQuantileListAggregateFunction(const LogicalTyp
795
795
  using STATE = QuantileState<SAVE_TYPE>;
796
796
  using OP = QuantileListOperation<INPUT_TYPE, true>;
797
797
  auto fun = QuantileListAggregate<STATE, INPUT_TYPE, list_entry_t, OP>(type, type);
798
+ fun.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
798
799
  fun.window = AggregateFunction::UnaryWindow<STATE, INPUT_TYPE, list_entry_t, OP>;
799
800
  return fun;
800
801
  }
@@ -851,6 +852,7 @@ AggregateFunction GetTypedContinuousQuantileAggregateFunction(const LogicalType
851
852
  using STATE = QuantileState<INPUT_TYPE>;
852
853
  using OP = QuantileScalarOperation<false>;
853
854
  auto fun = AggregateFunction::UnaryAggregateDestructor<STATE, INPUT_TYPE, TARGET_TYPE, OP>(input_type, target_type);
855
+ fun.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
854
856
  fun.window = AggregateFunction::UnaryWindow<STATE, INPUT_TYPE, TARGET_TYPE, OP>;
855
857
  return fun;
856
858
  }
@@ -904,6 +906,7 @@ AggregateFunction GetTypedContinuousQuantileListAggregateFunction(const LogicalT
904
906
  using STATE = QuantileState<INPUT_TYPE>;
905
907
  using OP = QuantileListOperation<CHILD_TYPE, false>;
906
908
  auto fun = QuantileListAggregate<STATE, INPUT_TYPE, list_entry_t, OP>(input_type, result_type);
909
+ fun.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
907
910
  fun.window = AggregateFunction::UnaryWindow<STATE, INPUT_TYPE, list_entry_t, OP>;
908
911
  return fun;
909
912
  }
@@ -1129,6 +1132,7 @@ AggregateFunction GetTypedMedianAbsoluteDeviationAggregateFunction(const Logical
1129
1132
  using STATE = QuantileState<INPUT_TYPE>;
1130
1133
  using OP = MedianAbsoluteDeviationOperation<MEDIAN_TYPE>;
1131
1134
  auto fun = AggregateFunction::UnaryAggregateDestructor<STATE, INPUT_TYPE, TARGET_TYPE, OP>(input_type, target_type);
1135
+ fun.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
1132
1136
  fun.window = AggregateFunction::UnaryWindow<STATE, INPUT_TYPE, TARGET_TYPE, OP>;
1133
1137
  return fun;
1134
1138
  }
@@ -1198,6 +1202,7 @@ unique_ptr<FunctionData> BindMedianDecimal(ClientContext &context, AggregateFunc
1198
1202
  function.name = "median";
1199
1203
  function.serialize = QuantileSerialize;
1200
1204
  function.deserialize = QuantileDeserialize;
1205
+ function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
1201
1206
  return bind_data;
1202
1207
  }
1203
1208
 
@@ -1205,6 +1210,7 @@ unique_ptr<FunctionData> BindMedianAbsoluteDeviationDecimal(ClientContext &conte
1205
1210
  vector<unique_ptr<Expression>> &arguments) {
1206
1211
  function = GetMedianAbsoluteDeviationAggregateFunction(arguments[0]->return_type);
1207
1212
  function.name = "mad";
1213
+ function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
1208
1214
  return nullptr;
1209
1215
  }
1210
1216
 
@@ -1257,6 +1263,7 @@ unique_ptr<FunctionData> BindDiscreteQuantileDecimal(ClientContext &context, Agg
1257
1263
  function.name = "quantile_disc";
1258
1264
  function.serialize = QuantileDecimalSerialize;
1259
1265
  function.deserialize = QuantileDeserialize;
1266
+ function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
1260
1267
  return bind_data;
1261
1268
  }
1262
1269
 
@@ -1267,6 +1274,7 @@ unique_ptr<FunctionData> BindDiscreteQuantileDecimalList(ClientContext &context,
1267
1274
  function.name = "quantile_disc";
1268
1275
  function.serialize = QuantileDecimalSerialize;
1269
1276
  function.deserialize = QuantileDeserialize;
1277
+ function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
1270
1278
  return bind_data;
1271
1279
  }
1272
1280
 
@@ -1277,6 +1285,7 @@ unique_ptr<FunctionData> BindContinuousQuantileDecimal(ClientContext &context, A
1277
1285
  function.name = "quantile_cont";
1278
1286
  function.serialize = QuantileDecimalSerialize;
1279
1287
  function.deserialize = QuantileDeserialize;
1288
+ function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
1280
1289
  return bind_data;
1281
1290
  }
1282
1291
 
@@ -1287,6 +1296,7 @@ unique_ptr<FunctionData> BindContinuousQuantileDecimalList(ClientContext &contex
1287
1296
  function.name = "quantile_cont";
1288
1297
  function.serialize = QuantileDecimalSerialize;
1289
1298
  function.deserialize = QuantileDeserialize;
1299
+ function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
1290
1300
  return bind_data;
1291
1301
  }
1292
1302
 
@@ -1316,6 +1326,7 @@ AggregateFunction GetDiscreteQuantileAggregate(const LogicalType &type) {
1316
1326
  fun.deserialize = QuantileDeserialize;
1317
1327
  // temporarily push an argument so we can bind the actual quantile
1318
1328
  fun.arguments.emplace_back(LogicalType::DOUBLE);
1329
+ fun.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
1319
1330
  return fun;
1320
1331
  }
1321
1332
 
@@ -1327,6 +1338,7 @@ AggregateFunction GetDiscreteQuantileListAggregate(const LogicalType &type) {
1327
1338
  // temporarily push an argument so we can bind the actual quantile
1328
1339
  auto list_of_double = LogicalType::LIST(LogicalType::DOUBLE);
1329
1340
  fun.arguments.push_back(list_of_double);
1341
+ fun.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
1330
1342
  return fun;
1331
1343
  }
1332
1344
 
@@ -1337,6 +1349,7 @@ AggregateFunction GetContinuousQuantileAggregate(const LogicalType &type) {
1337
1349
  fun.deserialize = QuantileDeserialize;
1338
1350
  // temporarily push an argument so we can bind the actual quantile
1339
1351
  fun.arguments.emplace_back(LogicalType::DOUBLE);
1352
+ fun.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
1340
1353
  return fun;
1341
1354
  }
1342
1355
 
@@ -1348,6 +1361,7 @@ AggregateFunction GetContinuousQuantileListAggregate(const LogicalType &type) {
1348
1361
  // temporarily push an argument so we can bind the actual quantile
1349
1362
  auto list_of_double = LogicalType::LIST(LogicalType::DOUBLE);
1350
1363
  fun.arguments.push_back(list_of_double);
1364
+ fun.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
1351
1365
  return fun;
1352
1366
  }
1353
1367
 
@@ -1357,6 +1371,7 @@ AggregateFunction GetQuantileDecimalAggregate(const vector<LogicalType> &argumen
1357
1371
  fun.bind = bind;
1358
1372
  fun.serialize = QuantileSerialize;
1359
1373
  fun.deserialize = QuantileDeserialize;
1374
+ fun.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
1360
1375
  return fun;
1361
1376
  }
1362
1377
 
@@ -723,9 +723,9 @@ static void GetSegmentDataFunctions(WriteDataToSegment &write_data_to_segment,
723
723
  read_data_from_segment.segment_function = ReadDataFromVarcharSegment;
724
724
  copy_data_from_segment.segment_function = CopyDataFromListSegment;
725
725
 
726
- write_data_to_segment.child_functions.emplace_back(WriteDataToSegment());
726
+ write_data_to_segment.child_functions.emplace_back();
727
727
  write_data_to_segment.child_functions.back().create_segment = CreatePrimitiveSegment<char>;
728
- copy_data_from_segment.child_functions.emplace_back(CopyDataFromSegment());
728
+ copy_data_from_segment.child_functions.emplace_back();
729
729
  copy_data_from_segment.child_functions.back().segment_function = CopyDataFromPrimitiveSegment<char>;
730
730
  break;
731
731
  }
@@ -736,9 +736,9 @@ static void GetSegmentDataFunctions(WriteDataToSegment &write_data_to_segment,
736
736
  copy_data_from_segment.segment_function = CopyDataFromListSegment;
737
737
 
738
738
  // recurse
739
- write_data_to_segment.child_functions.emplace_back(WriteDataToSegment());
740
- read_data_from_segment.child_functions.emplace_back(ReadDataFromSegment());
741
- copy_data_from_segment.child_functions.emplace_back(CopyDataFromSegment());
739
+ write_data_to_segment.child_functions.emplace_back();
740
+ read_data_from_segment.child_functions.emplace_back();
741
+ copy_data_from_segment.child_functions.emplace_back();
742
742
  GetSegmentDataFunctions(write_data_to_segment.child_functions.back(),
743
743
  read_data_from_segment.child_functions.back(),
744
744
  copy_data_from_segment.child_functions.back(), ListType::GetChildType(type));
@@ -753,9 +753,9 @@ static void GetSegmentDataFunctions(WriteDataToSegment &write_data_to_segment,
753
753
  // recurse
754
754
  auto child_types = StructType::GetChildTypes(type);
755
755
  for (idx_t i = 0; i < child_types.size(); i++) {
756
- write_data_to_segment.child_functions.emplace_back(WriteDataToSegment());
757
- read_data_from_segment.child_functions.emplace_back(ReadDataFromSegment());
758
- copy_data_from_segment.child_functions.emplace_back(CopyDataFromSegment());
756
+ write_data_to_segment.child_functions.emplace_back();
757
+ read_data_from_segment.child_functions.emplace_back();
758
+ copy_data_from_segment.child_functions.emplace_back();
759
759
  GetSegmentDataFunctions(write_data_to_segment.child_functions.back(),
760
760
  read_data_from_segment.child_functions.back(),
761
761
  copy_data_from_segment.child_functions.back(), child_types[i].second);
@@ -3,6 +3,9 @@
3
3
  #include "duckdb/common/types/column_data_collection.hpp"
4
4
  #include "duckdb/function/function_binder.hpp"
5
5
  #include "duckdb/storage/buffer_manager.hpp"
6
+ #include "duckdb/planner/expression/bound_aggregate_expression.hpp"
7
+ #include "duckdb/parser/expression_map.hpp"
8
+ #include "duckdb/function/aggregate/distributive_functions.hpp"
6
9
 
7
10
  namespace duckdb {
8
11
 
@@ -71,17 +74,25 @@ struct SortedAggregateBindData : public FunctionData {
71
74
  };
72
75
 
73
76
  struct SortedAggregateState {
74
- static const idx_t BUFFER_CAPACITY = STANDARD_VECTOR_SIZE;
77
+ //! Default buffer size, optimised for small group to avoid blowing out memory.
78
+ static const idx_t BUFFER_CAPACITY = 16;
75
79
 
76
80
  SortedAggregateState() : nsel(0) {
77
81
  }
78
82
 
79
83
  static inline void InitializeBuffer(DataChunk &chunk, const vector<LogicalType> &types) {
80
84
  if (!chunk.ColumnCount() && !types.empty()) {
81
- chunk.Initialize(Allocator::DefaultAllocator(), types);
85
+ chunk.Initialize(Allocator::DefaultAllocator(), types, BUFFER_CAPACITY);
82
86
  }
83
87
  }
84
88
 
89
+ //! Make sure the buffer is large enough for slicing
90
+ static inline void ResetBuffer(DataChunk &chunk, const vector<LogicalType> &types) {
91
+ chunk.Reset();
92
+ chunk.Destroy();
93
+ chunk.Initialize(Allocator::DefaultAllocator(), types);
94
+ }
95
+
85
96
  void Flush(SortedAggregateBindData &order_bind) {
86
97
  if (ordering) {
87
98
  return;
@@ -90,10 +101,12 @@ struct SortedAggregateState {
90
101
  ordering = make_unique<ColumnDataCollection>(order_bind.buffer_manager, order_bind.sort_types);
91
102
  InitializeBuffer(sort_buffer, order_bind.sort_types);
92
103
  ordering->Append(sort_buffer);
104
+ ResetBuffer(sort_buffer, order_bind.sort_types);
93
105
 
94
106
  arguments = make_unique<ColumnDataCollection>(order_bind.buffer_manager, order_bind.arg_types);
95
107
  InitializeBuffer(arg_buffer, order_bind.arg_types);
96
108
  arguments->Append(arg_buffer);
109
+ ResetBuffer(arg_buffer, order_bind.arg_types);
97
110
  }
98
111
 
99
112
  void Update(SortedAggregateBindData &order_bind, DataChunk &sort_chunk, DataChunk &arg_chunk) {
@@ -101,7 +114,7 @@ struct SortedAggregateState {
101
114
  InitializeBuffer(sort_buffer, order_bind.sort_types);
102
115
  InitializeBuffer(arg_buffer, order_bind.arg_types);
103
116
 
104
- if (sort_chunk.size() + sort_buffer.size() > BUFFER_CAPACITY) {
117
+ if (sort_chunk.size() + sort_buffer.size() > STANDARD_VECTOR_SIZE) {
105
118
  Flush(order_bind);
106
119
  }
107
120
  if (ordering) {
@@ -118,7 +131,7 @@ struct SortedAggregateState {
118
131
  InitializeBuffer(sort_buffer, order_bind.sort_types);
119
132
  InitializeBuffer(arg_buffer, order_bind.arg_types);
120
133
 
121
- if (nsel + sort_buffer.size() > BUFFER_CAPACITY) {
134
+ if (nsel + sort_buffer.size() > STANDARD_VECTOR_SIZE) {
122
135
  Flush(order_bind);
123
136
  }
124
137
  if (ordering) {
@@ -276,6 +289,8 @@ struct SortedAggregateFunction {
276
289
  auto &orders = order_bind->orders;
277
290
  RowLayout payload_layout;
278
291
  payload_layout.Initialize(order_bind->arg_types);
292
+ DataChunk chunk;
293
+ chunk.Initialize(Allocator::DefaultAllocator(), order_bind->arg_types);
279
294
 
280
295
  // Reusable inner state
281
296
  vector<data_t> agg_state(order_bind->function.state_size());
@@ -314,7 +329,6 @@ struct SortedAggregateFunction {
314
329
  global_sort->CompleteMergeRound(false);
315
330
  }
316
331
 
317
- auto &chunk = state->arg_buffer;
318
332
  PayloadScanner scanner(*global_sort);
319
333
  for (;;) {
320
334
  chunk.Reset();
@@ -352,16 +366,44 @@ struct SortedAggregateFunction {
352
366
  }
353
367
  };
354
368
 
355
- unique_ptr<FunctionData> FunctionBinder::BindSortedAggregate(AggregateFunction &bound_function,
356
- vector<unique_ptr<Expression>> &children,
357
- unique_ptr<FunctionData> bind_info,
358
- unique_ptr<BoundOrderModifier> order_bys) {
359
-
360
- auto sorted_bind =
361
- make_unique<SortedAggregateBindData>(context, bound_function, children, std::move(bind_info), *order_bys);
369
+ void FunctionBinder::BindSortedAggregate(ClientContext &context, BoundAggregateExpression &expr,
370
+ const vector<unique_ptr<Expression>> &groups) {
371
+ if (!expr.order_bys || expr.order_bys->orders.empty() || expr.children.empty()) {
372
+ // not a sorted aggregate: return
373
+ return;
374
+ }
375
+ if (context.config.enable_optimizer) {
376
+ // for each ORDER BY - check if it is actually necessary
377
+ // expressions that are in the groups do not need to be ORDERED BY
378
+ // `ORDER BY` on a group has no effect, because for each aggregate, the group is unique
379
+ // similarly, we only need to ORDER BY each aggregate once
380
+ expression_set_t seen_expressions;
381
+ for (auto &target : groups) {
382
+ seen_expressions.insert(target.get());
383
+ }
384
+ vector<BoundOrderByNode> new_order_nodes;
385
+ for (auto &order_node : expr.order_bys->orders) {
386
+ if (seen_expressions.find(order_node.expression.get()) != seen_expressions.end()) {
387
+ // we do not need to order by this node
388
+ continue;
389
+ }
390
+ seen_expressions.insert(order_node.expression.get());
391
+ new_order_nodes.push_back(std::move(order_node));
392
+ }
393
+ if (new_order_nodes.empty()) {
394
+ expr.order_bys.reset();
395
+ return;
396
+ }
397
+ expr.order_bys->orders = std::move(new_order_nodes);
398
+ }
399
+ auto &bound_function = expr.function;
400
+ auto &children = expr.children;
401
+ auto &order_bys = *expr.order_bys;
402
+ auto sorted_bind = make_unique<SortedAggregateBindData>(context, bound_function, expr.children,
403
+ std::move(expr.bind_info), order_bys);
362
404
 
363
405
  // The arguments are the children plus the sort columns.
364
- for (auto &order : order_bys->orders) {
406
+ for (auto &order : order_bys.orders) {
365
407
  children.emplace_back(std::move(order.expression));
366
408
  }
367
409
 
@@ -381,9 +423,9 @@ unique_ptr<FunctionData> FunctionBinder::BindSortedAggregate(AggregateFunction &
381
423
  AggregateFunction::StateDestroy<SortedAggregateState, SortedAggregateFunction>, nullptr,
382
424
  SortedAggregateFunction::Window, SortedAggregateFunction::Serialize, SortedAggregateFunction::Deserialize);
383
425
 
384
- bound_function = std::move(ordered_aggregate);
385
-
386
- return std::move(sorted_bind);
426
+ expr.function = std::move(ordered_aggregate);
427
+ expr.bind_info = std::move(sorted_bind);
428
+ expr.order_bys.reset();
387
429
  }
388
430
 
389
431
  } // namespace duckdb
@@ -9,8 +9,6 @@ BoundCastInfo DefaultCasts::BitCastSwitch(BindCastInput &input, const LogicalTyp
9
9
  case LogicalTypeId::VARCHAR:
10
10
  // bit to varchar
11
11
  return BoundCastInfo(&VectorCastHelpers::StringCast<string_t, duckdb::CastFromBit>);
12
- case LogicalTypeId::BLOB:
13
- return DefaultCasts::ReinterpretCast;
14
12
  default:
15
13
  return DefaultCasts::TryVectorNullCast;
16
14
  }
@@ -10,7 +10,6 @@ BoundCastInfo DefaultCasts::BlobCastSwitch(BindCastInput &input, const LogicalTy
10
10
  // blob to varchar
11
11
  return BoundCastInfo(&VectorCastHelpers::StringCast<string_t, duckdb::CastFromBlob>);
12
12
  case LogicalTypeId::AGGREGATE_STATE:
13
- case LogicalTypeId::BIT:
14
13
  return DefaultCasts::ReinterpretCast;
15
14
  default:
16
15
  return DefaultCasts::TryVectorNullCast;
@@ -6,7 +6,7 @@
6
6
 
7
7
  namespace duckdb {
8
8
 
9
- BindCastInput::BindCastInput(CastFunctionSet &function_set, BindCastInfo *info, ClientContext *context)
9
+ BindCastInput::BindCastInput(CastFunctionSet &function_set, BindCastInfo *info, optional_ptr<ClientContext> context)
10
10
  : function_set(function_set), info(info), context(context) {
11
11
  }
12
12
 
@@ -109,17 +109,39 @@ unique_ptr<BoundCastData> BindEnumCast(BindCastInput &input, const LogicalType &
109
109
  return make_unique<EnumBoundCastData>(std::move(to_varchar_cast), std::move(from_varchar_cast));
110
110
  }
111
111
 
112
+ struct EnumCastLocalState : public FunctionLocalState {
113
+ public:
114
+ unique_ptr<FunctionLocalState> to_varchar_local;
115
+ unique_ptr<FunctionLocalState> from_varchar_local;
116
+ };
117
+
118
+ static unique_ptr<FunctionLocalState> InitEnumCastLocalState(CastLocalStateParameters &parameters) {
119
+ auto &cast_data = (EnumBoundCastData &)*parameters.cast_data;
120
+ auto result = make_unique<EnumCastLocalState>();
121
+
122
+ if (cast_data.from_varchar_cast.init_local_state) {
123
+ CastLocalStateParameters from_varchar_params(parameters, cast_data.from_varchar_cast.cast_data);
124
+ result->from_varchar_local = cast_data.from_varchar_cast.init_local_state(from_varchar_params);
125
+ }
126
+ if (cast_data.to_varchar_cast.init_local_state) {
127
+ CastLocalStateParameters from_varchar_params(parameters, cast_data.to_varchar_cast.cast_data);
128
+ result->from_varchar_local = cast_data.to_varchar_cast.init_local_state(from_varchar_params);
129
+ }
130
+ return std::move(result);
131
+ }
132
+
112
133
  static bool EnumToAnyCast(Vector &source, Vector &result, idx_t count, CastParameters &parameters) {
113
134
  auto &cast_data = (EnumBoundCastData &)*parameters.cast_data;
135
+ auto &lstate = (EnumCastLocalState &)*parameters.local_state;
114
136
 
115
137
  Vector varchar_cast(LogicalType::VARCHAR, count);
116
138
 
117
139
  // cast to varchar
118
- CastParameters to_varchar_params(parameters, cast_data.to_varchar_cast.cast_data.get());
140
+ CastParameters to_varchar_params(parameters, cast_data.to_varchar_cast.cast_data, lstate.to_varchar_local);
119
141
  cast_data.to_varchar_cast.function(source, varchar_cast, count, to_varchar_params);
120
142
 
121
143
  // cast from varchar to the target
122
- CastParameters from_varchar_params(parameters, cast_data.from_varchar_cast.cast_data.get());
144
+ CastParameters from_varchar_params(parameters, cast_data.from_varchar_cast.cast_data, lstate.from_varchar_local);
123
145
  cast_data.from_varchar_cast.function(varchar_cast, result, count, from_varchar_params);
124
146
  return true;
125
147
  }
@@ -152,7 +174,7 @@ BoundCastInfo DefaultCasts::EnumCastSwitch(BindCastInput &input, const LogicalTy
152
174
  throw InternalException("ENUM can only have unsigned integers (except UINT64) as physical types");
153
175
  }
154
176
  default: {
155
- return BoundCastInfo(EnumToAnyCast, BindEnumCast(input, source, target));
177
+ return BoundCastInfo(EnumToAnyCast, BindEnumCast(input, source, target), InitEnumCastLocalState);
156
178
  }
157
179
  }
158
180
  }
@@ -1,5 +1,6 @@
1
1
  #include "duckdb/function/cast/default_casts.hpp"
2
2
  #include "duckdb/function/cast/cast_function_set.hpp"
3
+ #include "duckdb/function/cast/bound_cast_data.hpp"
3
4
 
4
5
  namespace duckdb {
5
6
 
@@ -12,6 +13,15 @@ unique_ptr<BoundCastData> ListBoundCastData::BindListToListCast(BindCastInput &i
12
13
  return make_unique<ListBoundCastData>(std::move(child_cast));
13
14
  }
14
15
 
16
+ unique_ptr<FunctionLocalState> ListBoundCastData::InitListLocalState(CastLocalStateParameters &parameters) {
17
+ auto &cast_data = (ListBoundCastData &)*parameters.cast_data;
18
+ if (!cast_data.child_cast_info.init_local_state) {
19
+ return nullptr;
20
+ }
21
+ CastLocalStateParameters child_parameters(parameters, cast_data.child_cast_info.cast_data);
22
+ return cast_data.child_cast_info.init_local_state(child_parameters);
23
+ }
24
+
15
25
  bool ListCast::ListToListCast(Vector &source, Vector &result, idx_t count, CastParameters &parameters) {
16
26
  auto &cast_data = (ListBoundCastData &)*parameters.cast_data;
17
27
 
@@ -40,7 +50,7 @@ bool ListCast::ListToListCast(Vector &source, Vector &result, idx_t count, CastP
40
50
  ListVector::Reserve(result, source_size);
41
51
  auto &append_vector = ListVector::GetEntry(result);
42
52
 
43
- CastParameters child_parameters(parameters, cast_data.child_cast_info.cast_data.get());
53
+ CastParameters child_parameters(parameters, cast_data.child_cast_info.cast_data, parameters.local_state);
44
54
  if (!cast_data.child_cast_info.function(source_cc, append_vector, source_size, child_parameters)) {
45
55
  return false;
46
56
  }
@@ -116,10 +126,13 @@ static bool ListToVarcharCast(Vector &source, Vector &result, idx_t count, CastP
116
126
  BoundCastInfo DefaultCasts::ListCastSwitch(BindCastInput &input, const LogicalType &source, const LogicalType &target) {
117
127
  switch (target.id()) {
118
128
  case LogicalTypeId::LIST:
119
- return BoundCastInfo(ListCast::ListToListCast, ListBoundCastData::BindListToListCast(input, source, target));
129
+ return BoundCastInfo(ListCast::ListToListCast, ListBoundCastData::BindListToListCast(input, source, target),
130
+ ListBoundCastData::InitListLocalState);
120
131
  case LogicalTypeId::VARCHAR:
121
- return BoundCastInfo(ListToVarcharCast, ListBoundCastData::BindListToListCast(
122
- input, source, LogicalType::LIST(LogicalType::VARCHAR)));
132
+ return BoundCastInfo(
133
+ ListToVarcharCast,
134
+ ListBoundCastData::BindListToListCast(input, source, LogicalType::LIST(LogicalType::VARCHAR)),
135
+ ListBoundCastData::InitListLocalState);
123
136
  default:
124
137
  return DefaultCasts::TryVectorNullCast;
125
138
  }
@@ -1,5 +1,6 @@
1
1
  #include "duckdb/function/cast/default_casts.hpp"
2
2
  #include "duckdb/function/cast/cast_function_set.hpp"
3
+ #include "duckdb/function/cast/bound_cast_data.hpp"
3
4
 
4
5
  namespace duckdb {
5
6
 
@@ -78,10 +79,12 @@ static bool MapToVarcharCast(Vector &source, Vector &result, idx_t count, CastPa
78
79
  BoundCastInfo DefaultCasts::MapCastSwitch(BindCastInput &input, const LogicalType &source, const LogicalType &target) {
79
80
  switch (target.id()) {
80
81
  case LogicalTypeId::MAP:
81
- return BoundCastInfo(ListCast::ListToListCast, ListBoundCastData::BindListToListCast(input, source, target));
82
+ return BoundCastInfo(ListCast::ListToListCast, ListBoundCastData::BindListToListCast(input, source, target),
83
+ ListBoundCastData::InitListLocalState);
82
84
  case LogicalTypeId::VARCHAR: {
83
85
  auto varchar_type = LogicalType::MAP(LogicalType::VARCHAR, LogicalType::VARCHAR);
84
- return BoundCastInfo(MapToVarcharCast, ListBoundCastData::BindListToListCast(input, source, varchar_type));
86
+ return BoundCastInfo(MapToVarcharCast, ListBoundCastData::BindListToListCast(input, source, varchar_type),
87
+ ListBoundCastData::InitListLocalState);
85
88
  }
86
89
  default:
87
90
  return TryVectorNullCast;