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
@@ -1,6 +1,7 @@
1
1
  #include "duckdb/execution/column_binding_resolver.hpp"
2
2
 
3
3
  #include "duckdb/planner/operator/logical_comparison_join.hpp"
4
+ #include "duckdb/planner/operator/logical_any_join.hpp"
4
5
  #include "duckdb/planner/operator/logical_create_index.hpp"
5
6
  #include "duckdb/planner/operator/logical_delim_join.hpp"
6
7
  #include "duckdb/planner/operator/logical_insert.hpp"
@@ -17,7 +18,10 @@ ColumnBindingResolver::ColumnBindingResolver() {
17
18
  }
18
19
 
19
20
  void ColumnBindingResolver::VisitOperator(LogicalOperator &op) {
20
- if (op.type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN || op.type == LogicalOperatorType::LOGICAL_DELIM_JOIN) {
21
+ switch (op.type) {
22
+ case LogicalOperatorType::LOGICAL_ASOF_JOIN:
23
+ case LogicalOperatorType::LOGICAL_COMPARISON_JOIN:
24
+ case LogicalOperatorType::LOGICAL_DELIM_JOIN: {
21
25
  // special case: comparison join
22
26
  auto &comp_join = (LogicalComparisonJoin &)op;
23
27
  // first get the bindings of the LHS and resolve the LHS expressions
@@ -40,27 +44,36 @@ void ColumnBindingResolver::VisitOperator(LogicalOperator &op) {
40
44
  // finally update the bindings with the result bindings of the join
41
45
  bindings = op.GetColumnBindings();
42
46
  return;
43
- } else if (op.type == LogicalOperatorType::LOGICAL_ANY_JOIN) {
47
+ }
48
+ case LogicalOperatorType::LOGICAL_ANY_JOIN: {
44
49
  // ANY join, this join is different because we evaluate the expression on the bindings of BOTH join sides at
45
50
  // once i.e. we set the bindings first to the bindings of the entire join, and then resolve the expressions of
46
51
  // this operator
47
52
  VisitOperatorChildren(op);
48
53
  bindings = op.GetColumnBindings();
54
+ auto &any_join = (LogicalAnyJoin &)op;
55
+ if (any_join.join_type == JoinType::SEMI || any_join.join_type == JoinType::ANTI) {
56
+ auto right_bindings = op.children[1]->GetColumnBindings();
57
+ bindings.insert(bindings.end(), right_bindings.begin(), right_bindings.end());
58
+ }
49
59
  VisitOperatorExpressions(op);
50
60
  return;
51
- } else if (op.type == LogicalOperatorType::LOGICAL_CREATE_INDEX) {
61
+ }
62
+ case LogicalOperatorType::LOGICAL_CREATE_INDEX: {
52
63
  // CREATE INDEX statement, add the columns of the table with table index 0 to the binding set
53
64
  // afterwards bind the expressions of the CREATE INDEX statement
54
65
  auto &create_index = (LogicalCreateIndex &)op;
55
66
  bindings = LogicalOperator::GenerateColumnBindings(0, create_index.table.GetColumns().LogicalColumnCount());
56
67
  VisitOperatorExpressions(op);
57
68
  return;
58
- } else if (op.type == LogicalOperatorType::LOGICAL_GET) {
69
+ }
70
+ case LogicalOperatorType::LOGICAL_GET: {
59
71
  //! We first need to update the current set of bindings and then visit operator expressions
60
72
  bindings = op.GetColumnBindings();
61
73
  VisitOperatorExpressions(op);
62
74
  return;
63
- } else if (op.type == LogicalOperatorType::LOGICAL_INSERT) {
75
+ }
76
+ case LogicalOperatorType::LOGICAL_INSERT: {
64
77
  //! We want to execute the normal path, but also add a dummy 'excluded' binding if there is a
65
78
  // ON CONFLICT DO UPDATE clause
66
79
  auto &insert_op = (LogicalInsert &)op;
@@ -83,6 +96,9 @@ void ColumnBindingResolver::VisitOperator(LogicalOperator &op) {
83
96
  return;
84
97
  }
85
98
  }
99
+ default:
100
+ break;
101
+ }
86
102
  // general case
87
103
  // first visit the children of this operator
88
104
  VisitOperatorChildren(op);
@@ -11,7 +11,8 @@ unique_ptr<ExpressionState> ExpressionExecutor::InitializeState(const BoundCastE
11
11
  result->AddChild(expr.child.get());
12
12
  result->Finalize();
13
13
  if (expr.bound_cast.init_local_state) {
14
- result->local_state = expr.bound_cast.init_local_state(root.executor->GetContext());
14
+ CastLocalStateParameters parameters(root.executor->GetContext(), expr.bound_cast.cast_data);
15
+ result->local_state = expr.bound_cast.init_local_state(parameters);
15
16
  }
16
17
  return std::move(result);
17
18
  }
@@ -266,12 +266,12 @@ idx_t VectorOperations::GreaterThanEquals(Vector &left, Vector &right, const Sel
266
266
 
267
267
  idx_t VectorOperations::LessThan(Vector &left, Vector &right, const SelectionVector *sel, idx_t count,
268
268
  SelectionVector *true_sel, SelectionVector *false_sel) {
269
- return TemplatedSelectOperation<duckdb::LessThan>(left, right, sel, count, true_sel, false_sel);
269
+ return TemplatedSelectOperation<duckdb::GreaterThan>(right, left, sel, count, true_sel, false_sel);
270
270
  }
271
271
 
272
272
  idx_t VectorOperations::LessThanEquals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count,
273
273
  SelectionVector *true_sel, SelectionVector *false_sel) {
274
- return TemplatedSelectOperation<duckdb::LessThanEquals>(left, right, sel, count, true_sel, false_sel);
274
+ return TemplatedSelectOperation<duckdb::GreaterThanEquals>(right, left, sel, count, true_sel, false_sel);
275
275
  }
276
276
 
277
277
  idx_t ExpressionExecutor::Select(const BoundComparisonExpression &expr, ExpressionState *state,
@@ -6,6 +6,7 @@
6
6
  #include "duckdb/storage/arena_allocator.hpp"
7
7
  #include "duckdb/execution/index/art/art_key.hpp"
8
8
  #include "duckdb/common/types/conflict_manager.hpp"
9
+ #include "duckdb/storage/table/scan_state.hpp"
9
10
 
10
11
  #include <algorithm>
11
12
  #include <cstring>
@@ -13,6 +14,18 @@
13
14
 
14
15
  namespace duckdb {
15
16
 
17
+ struct ARTIndexScanState : public IndexScanState {
18
+
19
+ //! Scan predicates (single predicate scan or range scan)
20
+ Value values[2];
21
+ //! Expressions of the scan predicates
22
+ ExpressionType expressions[2];
23
+ bool checked = false;
24
+ //! All scanned row IDs
25
+ vector<row_t> result_ids;
26
+ Iterator iterator;
27
+ };
28
+
16
29
  ART::ART(const vector<column_t> &column_ids, TableIOManager &table_io_manager,
17
30
  const vector<unique_ptr<Expression>> &unbound_expressions, IndexConstraintType constraint_type,
18
31
  AttachedDatabase &db, bool track_memory, idx_t block_id, idx_t block_offset)
@@ -330,8 +343,7 @@ bool ART::ConstructFromSorted(idx_t count, vector<Key> &keys, Vector &row_identi
330
343
  //===--------------------------------------------------------------------===//
331
344
  // Insert / Verification / Constraint Checking
332
345
  //===--------------------------------------------------------------------===//
333
-
334
- bool ART::Insert(IndexLock &lock, DataChunk &input, Vector &row_ids) {
346
+ PreservedError ART::Insert(IndexLock &lock, DataChunk &input, Vector &row_ids) {
335
347
 
336
348
  D_ASSERT(row_ids.GetType().InternalType() == ROW_TYPE);
337
349
  D_ASSERT(logical_types[0] == input.data[0].GetType());
@@ -375,12 +387,13 @@ bool ART::Insert(IndexLock &lock, DataChunk &input, Vector &row_ids) {
375
387
 
376
388
  IncreaseAndVerifyMemorySize(old_memory_size);
377
389
  if (failed_index != DConstants::INVALID_INDEX) {
378
- return false;
390
+ return PreservedError(ConstraintException("PRIMARY KEY or UNIQUE constraint violated: duplicate key \"%s\"",
391
+ AppendRowError(input, failed_index)));
379
392
  }
380
- return true;
393
+ return PreservedError();
381
394
  }
382
395
 
383
- bool ART::Append(IndexLock &lock, DataChunk &appended_data, Vector &row_identifiers) {
396
+ PreservedError ART::Append(IndexLock &lock, DataChunk &appended_data, Vector &row_identifiers) {
384
397
  DataChunk expression_result;
385
398
  expression_result.Initialize(Allocator::DefaultAllocator(), logical_types);
386
399
 
@@ -654,6 +667,7 @@ bool ART::SearchEqual(Key &key, idx_t max_count, vector<row_t> &result_ids) {
654
667
  }
655
668
 
656
669
  void ART::SearchEqualJoinNoFetch(Key &key, idx_t &result_size) {
670
+ result_size = 0;
657
671
 
658
672
  // we need to look for a leaf
659
673
  auto old_memory_size = memory_size;
@@ -219,7 +219,9 @@ void JoinHashTable::Build(DataChunk &keys, DataChunk &payload) {
219
219
  }
220
220
  info.correlated_payload.SetCardinality(keys);
221
221
  info.correlated_payload.data[0].Reference(keys.data[info.correlated_types.size()]);
222
- info.correlated_counts->AddChunk(info.group_chunk, info.correlated_payload, AggregateType::NON_DISTINCT);
222
+ AggregateHTAppendState append_state;
223
+ info.correlated_counts->AddChunk(append_state, info.group_chunk, info.correlated_payload,
224
+ AggregateType::NON_DISTINCT);
223
225
  }
224
226
 
225
227
  // prepare the keys for processing
@@ -3,13 +3,13 @@
3
3
  #include "duckdb/catalog/catalog_entry/aggregate_function_catalog_entry.hpp"
4
4
  #include "duckdb/common/vector_operations/vector_operations.hpp"
5
5
  #include "duckdb/execution/aggregate_hashtable.hpp"
6
- #include "duckdb/execution/partitionable_hashtable.hpp"
7
6
  #include "duckdb/main/client_context.hpp"
8
7
  #include "duckdb/parallel/pipeline.hpp"
9
8
  #include "duckdb/parallel/task_scheduler.hpp"
10
9
  #include "duckdb/parallel/thread_context.hpp"
11
10
  #include "duckdb/planner/expression/bound_aggregate_expression.hpp"
12
11
  #include "duckdb/planner/expression/bound_constant_expression.hpp"
12
+ #include "duckdb/planner/expression/bound_reference_expression.hpp"
13
13
  #include "duckdb/parallel/base_pipeline_event.hpp"
14
14
  #include "duckdb/common/atomic.hpp"
15
15
  #include "duckdb/execution/operator/aggregate/distinct_aggregate_data.hpp"
@@ -4,14 +4,13 @@
4
4
  #include "duckdb/planner/expression/bound_aggregate_expression.hpp"
5
5
  #include "duckdb/planner/expression/bound_reference_expression.hpp"
6
6
  #include "duckdb/storage/buffer_manager.hpp"
7
- #include "duckdb/storage/statistics/numeric_statistics.hpp"
8
7
 
9
8
  namespace duckdb {
10
9
 
11
10
  PhysicalPerfectHashAggregate::PhysicalPerfectHashAggregate(ClientContext &context, vector<LogicalType> types_p,
12
11
  vector<unique_ptr<Expression>> aggregates_p,
13
12
  vector<unique_ptr<Expression>> groups_p,
14
- vector<unique_ptr<BaseStatistics>> group_stats,
13
+ const vector<unique_ptr<BaseStatistics>> &group_stats,
15
14
  vector<idx_t> required_bits_p, idx_t estimated_cardinality)
16
15
  : PhysicalOperator(PhysicalOperatorType::PERFECT_HASH_GROUP_BY, std::move(types_p), estimated_cardinality),
17
16
  groups(std::move(groups_p)), aggregates(std::move(aggregates_p)), required_bits(std::move(required_bits_p)) {
@@ -19,9 +18,9 @@ PhysicalPerfectHashAggregate::PhysicalPerfectHashAggregate(ClientContext &contex
19
18
  group_minima.reserve(group_stats.size());
20
19
  for (auto &stats : group_stats) {
21
20
  D_ASSERT(stats);
22
- auto &nstats = (NumericStatistics &)*stats;
23
- D_ASSERT(!nstats.min.IsNull());
24
- group_minima.push_back(std::move(nstats.min));
21
+ auto &nstats = *stats;
22
+ D_ASSERT(NumericStats::HasMin(nstats));
23
+ group_minima.push_back(NumericStats::Min(nstats));
25
24
  }
26
25
  for (auto &expr : groups) {
27
26
  group_types.push_back(expr->return_type);
@@ -111,7 +111,7 @@ public:
111
111
  orders.emplace_back(OrderType::ASCENDING, OrderByNullType::NULLS_FIRST, pexpr->Copy(), nullptr);
112
112
  } else {
113
113
  orders.emplace_back(OrderType::ASCENDING, OrderByNullType::NULLS_FIRST, pexpr->Copy(),
114
- wexpr->partitions_stats[prt_idx]->Copy());
114
+ wexpr->partitions_stats[prt_idx]->ToUnique());
115
115
  }
116
116
  partitions.emplace_back(orders.back().Copy());
117
117
  }
@@ -994,7 +994,10 @@ void WindowBoundariesState::Update(const idx_t row_idx, WindowInputColumn &range
994
994
  }
995
995
 
996
996
  struct WindowExecutor {
997
- WindowExecutor(BoundWindowExpression *wexpr, ClientContext &context, const idx_t count);
997
+ static bool IsConstantAggregate(const BoundWindowExpression &wexpr);
998
+
999
+ WindowExecutor(BoundWindowExpression *wexpr, ClientContext &context, const ValidityMask &partition_mask,
1000
+ const idx_t count);
998
1001
 
999
1002
  void Sink(DataChunk &input_chunk, const idx_t input_idx, const idx_t total_count);
1000
1003
  void Finalize(WindowAggregationMode mode);
@@ -1038,9 +1041,67 @@ struct WindowExecutor {
1038
1041
  // build a segment tree for frame-adhering aggregates
1039
1042
  // see http://www.vldb.org/pvldb/vol8/p1058-leis.pdf
1040
1043
  unique_ptr<WindowSegmentTree> segment_tree = nullptr;
1044
+
1045
+ // all aggregate values are the same for each partition
1046
+ unique_ptr<WindowConstantAggregate> constant_aggregate = nullptr;
1041
1047
  };
1042
1048
 
1043
- WindowExecutor::WindowExecutor(BoundWindowExpression *wexpr, ClientContext &context, const idx_t count)
1049
+ bool WindowExecutor::IsConstantAggregate(const BoundWindowExpression &wexpr) {
1050
+ if (!wexpr.aggregate) {
1051
+ return false;
1052
+ }
1053
+
1054
+ // COUNT(*) is already handled efficiently by segment trees.
1055
+ if (wexpr.children.empty()) {
1056
+ return false;
1057
+ }
1058
+
1059
+ /*
1060
+ The default framing option is RANGE UNBOUNDED PRECEDING, which
1061
+ is the same as RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT
1062
+ ROW; it sets the frame to be all rows from the partition start
1063
+ up through the current row's last peer (a row that the window's
1064
+ ORDER BY clause considers equivalent to the current row; all
1065
+ rows are peers if there is no ORDER BY). In general, UNBOUNDED
1066
+ PRECEDING means that the frame starts with the first row of the
1067
+ partition, and similarly UNBOUNDED FOLLOWING means that the
1068
+ frame ends with the last row of the partition, regardless of
1069
+ RANGE, ROWS or GROUPS mode. In ROWS mode, CURRENT ROW means that
1070
+ the frame starts or ends with the current row; but in RANGE or
1071
+ GROUPS mode it means that the frame starts or ends with the
1072
+ current row's first or last peer in the ORDER BY ordering. The
1073
+ offset PRECEDING and offset FOLLOWING options vary in meaning
1074
+ depending on the frame mode.
1075
+ */
1076
+ switch (wexpr.start) {
1077
+ case WindowBoundary::UNBOUNDED_PRECEDING:
1078
+ break;
1079
+ case WindowBoundary::CURRENT_ROW_RANGE:
1080
+ if (!wexpr.orders.empty()) {
1081
+ return false;
1082
+ }
1083
+ break;
1084
+ default:
1085
+ return false;
1086
+ }
1087
+
1088
+ switch (wexpr.end) {
1089
+ case WindowBoundary::UNBOUNDED_FOLLOWING:
1090
+ break;
1091
+ case WindowBoundary::CURRENT_ROW_RANGE:
1092
+ if (!wexpr.orders.empty()) {
1093
+ return false;
1094
+ }
1095
+ break;
1096
+ default:
1097
+ return false;
1098
+ }
1099
+
1100
+ return true;
1101
+ }
1102
+
1103
+ WindowExecutor::WindowExecutor(BoundWindowExpression *wexpr, ClientContext &context, const ValidityMask &partition_mask,
1104
+ const idx_t count)
1044
1105
  : wexpr(wexpr), bounds(wexpr, count), payload_collection(), payload_executor(context), filter_executor(context),
1045
1106
  leadlag_offset(wexpr->offset_expr.get(), context), leadlag_default(wexpr->default_expr.get(), context),
1046
1107
  boundary_start(wexpr->start_expr.get(), context), boundary_end(wexpr->end_expr.get(), context),
@@ -1050,6 +1111,12 @@ WindowExecutor::WindowExecutor(BoundWindowExpression *wexpr, ClientContext &cont
1050
1111
  {
1051
1112
  // TODO we could evaluate those expressions in parallel
1052
1113
 
1114
+ // Check for constant aggregate
1115
+ if (IsConstantAggregate(*wexpr)) {
1116
+ constant_aggregate = make_unique<WindowConstantAggregate>(*(wexpr->aggregate), wexpr->bind_info.get(),
1117
+ wexpr->return_type, partition_mask, count);
1118
+ }
1119
+
1053
1120
  // evaluate the FILTER clause and stuff it into a large mask for compactness and reuse
1054
1121
  if (wexpr->filter_expr) {
1055
1122
  // Start with all invalid and set the ones that pass
@@ -1097,11 +1164,25 @@ void WindowExecutor::Sink(DataChunk &input_chunk, const idx_t input_idx, const i
1097
1164
 
1098
1165
  const auto count = input_chunk.size();
1099
1166
 
1167
+ idx_t filtered = 0;
1168
+ SelectionVector *filtering = nullptr;
1169
+ if (wexpr->filter_expr) {
1170
+ filtering = &filter_sel;
1171
+ filtered = filter_executor.SelectExpression(input_chunk, filter_sel);
1172
+ for (idx_t f = 0; f < filtered; ++f) {
1173
+ filter_mask.SetValid(input_idx + filter_sel[f]);
1174
+ }
1175
+ }
1176
+
1100
1177
  if (!wexpr->children.empty()) {
1101
1178
  payload_chunk.Reset();
1102
1179
  payload_executor.Execute(input_chunk, payload_chunk);
1103
1180
  payload_chunk.Verify();
1104
- payload_collection.Append(payload_chunk, true);
1181
+ if (constant_aggregate) {
1182
+ constant_aggregate->Sink(payload_chunk, filtering, filtered);
1183
+ } else {
1184
+ payload_collection.Append(payload_chunk, true);
1185
+ }
1105
1186
 
1106
1187
  // process payload chunks while they are still piping hot
1107
1188
  if (check_nulls) {
@@ -1130,21 +1211,15 @@ void WindowExecutor::Sink(DataChunk &input_chunk, const idx_t input_idx, const i
1130
1211
  }
1131
1212
  }
1132
1213
 
1133
- if (wexpr->filter_expr) {
1134
- const auto filtered = filter_executor.SelectExpression(input_chunk, filter_sel);
1135
- for (idx_t f = 0; f < filtered; ++f) {
1136
- filter_mask.SetValid(input_idx + filter_sel[f]);
1137
- }
1138
- }
1139
-
1140
1214
  range.Append(input_chunk);
1141
1215
  }
1142
1216
 
1143
1217
  void WindowExecutor::Finalize(WindowAggregationMode mode) {
1144
1218
  // build a segment tree for frame-adhering aggregates
1145
1219
  // see http://www.vldb.org/pvldb/vol8/p1058-leis.pdf
1146
-
1147
- if (wexpr->aggregate) {
1220
+ if (constant_aggregate) {
1221
+ constant_aggregate->Finalize();
1222
+ } else if (wexpr->aggregate) {
1148
1223
  segment_tree = make_unique<WindowSegmentTree>(*(wexpr->aggregate), wexpr->bind_info.get(), wexpr->return_type,
1149
1224
  &payload_collection, filter_mask, mode);
1150
1225
  }
@@ -1184,7 +1259,11 @@ void WindowExecutor::Evaluate(idx_t row_idx, DataChunk &input_chunk, Vector &res
1184
1259
 
1185
1260
  switch (wexpr->type) {
1186
1261
  case ExpressionType::WINDOW_AGGREGATE: {
1187
- segment_tree->Compute(result, output_offset, bounds.window_start, bounds.window_end);
1262
+ if (constant_aggregate) {
1263
+ constant_aggregate->Compute(result, output_offset, bounds.window_start, bounds.window_end);
1264
+ } else {
1265
+ segment_tree->Compute(result, output_offset, bounds.window_start, bounds.window_end);
1266
+ }
1188
1267
  break;
1189
1268
  }
1190
1269
  case ExpressionType::WINDOW_ROW_NUMBER: {
@@ -1289,15 +1368,24 @@ void WindowExecutor::Evaluate(idx_t row_idx, DataChunk &input_chunk, Vector &res
1289
1368
  break;
1290
1369
  }
1291
1370
  case ExpressionType::WINDOW_FIRST_VALUE: {
1371
+ // Same as NTH_VALUE(..., 1)
1292
1372
  idx_t n = 1;
1293
1373
  const auto first_idx = FindNextStart(ignore_nulls, bounds.window_start, bounds.window_end, n);
1294
- CopyCell(payload_collection, 0, first_idx, result, output_offset);
1374
+ if (!n) {
1375
+ CopyCell(payload_collection, 0, first_idx, result, output_offset);
1376
+ } else {
1377
+ FlatVector::SetNull(result, output_offset, true);
1378
+ }
1295
1379
  break;
1296
1380
  }
1297
1381
  case ExpressionType::WINDOW_LAST_VALUE: {
1298
1382
  idx_t n = 1;
1299
- CopyCell(payload_collection, 0, FindPrevStart(ignore_nulls, bounds.window_start, bounds.window_end, n),
1300
- result, output_offset);
1383
+ const auto last_idx = FindPrevStart(ignore_nulls, bounds.window_start, bounds.window_end, n);
1384
+ if (!n) {
1385
+ CopyCell(payload_collection, 0, last_idx, result, output_offset);
1386
+ } else {
1387
+ FlatVector::SetNull(result, output_offset, true);
1388
+ }
1301
1389
  break;
1302
1390
  }
1303
1391
  case ExpressionType::WINDOW_NTH_VALUE: {
@@ -1550,6 +1638,9 @@ TaskExecutionResult WindowMergeTask::ExecuteTask(TaskExecutionMode mode) {
1550
1638
  size_t sorted = 0;
1551
1639
  while (sorted < hash_groups.states.size()) {
1552
1640
  // First check if there is an unfinished task for this thread
1641
+ if (executor.HasError()) {
1642
+ return TaskExecutionResult::TASK_ERROR;
1643
+ }
1553
1644
  if (!local_state.TaskFinished()) {
1554
1645
  local_state.ExecuteTask();
1555
1646
  continue;
@@ -1799,15 +1890,6 @@ void WindowLocalSourceState::GeneratePartition(WindowGlobalSinkState &gstate, co
1799
1890
  return;
1800
1891
  }
1801
1892
 
1802
- // Create the executors for each function
1803
- window_execs.clear();
1804
- for (idx_t expr_idx = 0; expr_idx < op.select_list.size(); ++expr_idx) {
1805
- D_ASSERT(op.select_list[expr_idx]->GetExpressionClass() == ExpressionClass::BOUND_WINDOW);
1806
- auto wexpr = reinterpret_cast<BoundWindowExpression *>(op.select_list[expr_idx].get());
1807
- auto wexec = make_unique<WindowExecutor>(wexpr, context, count);
1808
- window_execs.emplace_back(std::move(wexec));
1809
- }
1810
-
1811
1893
  // Initialise masks to false
1812
1894
  const auto bit_count = ValidityMask::ValidityMaskSize(count);
1813
1895
  partition_bits.clear();
@@ -1838,6 +1920,15 @@ void WindowLocalSourceState::GeneratePartition(WindowGlobalSinkState &gstate, co
1838
1920
  return;
1839
1921
  }
1840
1922
 
1923
+ // Create the executors for each function
1924
+ window_execs.clear();
1925
+ for (idx_t expr_idx = 0; expr_idx < op.select_list.size(); ++expr_idx) {
1926
+ D_ASSERT(op.select_list[expr_idx]->GetExpressionClass() == ExpressionClass::BOUND_WINDOW);
1927
+ auto wexpr = reinterpret_cast<BoundWindowExpression *>(op.select_list[expr_idx].get());
1928
+ auto wexec = make_unique<WindowExecutor>(wexpr, context, partition_mask, count);
1929
+ window_execs.emplace_back(std::move(wexec));
1930
+ }
1931
+
1841
1932
  // First pass over the input without flushing
1842
1933
  // TODO: Factor out the constructor data as global state
1843
1934
  scanner = make_unique<RowDataCollectionScanner>(*rows, *heap, layout, external, false);
@@ -111,6 +111,9 @@ SinkResultType PhysicalLimit::Sink(ExecutionContext &context, GlobalSinkState &g
111
111
  }
112
112
  state.data.Append(input, lstate.batch_index);
113
113
  state.current_offset += input.size();
114
+ if (state.current_offset == max_element) {
115
+ return SinkResultType::FINISHED;
116
+ }
114
117
  return SinkResultType::NEED_MORE_INPUT;
115
118
  }
116
119
 
@@ -49,6 +49,9 @@ SinkResultType PhysicalVacuum::Sink(ExecutionContext &context, GlobalSinkState &
49
49
  D_ASSERT(lstate.column_distinct_stats.size() == info->column_id_map.size());
50
50
 
51
51
  for (idx_t col_idx = 0; col_idx < input.data.size(); col_idx++) {
52
+ if (!DistinctStatistics::TypeIsSupported(input.data[col_idx].GetType())) {
53
+ continue;
54
+ }
52
55
  lstate.column_distinct_stats[col_idx]->Update(input.data[col_idx], input.size(), false);
53
56
  }
54
57
 
@@ -72,9 +75,8 @@ SinkFinalizeType PhysicalVacuum::Finalize(Pipeline &pipeline, Event &event, Clie
72
75
 
73
76
  auto table = info->table;
74
77
  for (idx_t col_idx = 0; col_idx < sink.column_distinct_stats.size(); col_idx++) {
75
- table->GetStorage().SetStatistics(info->column_id_map.at(col_idx), [&](BaseStatistics &stats) {
76
- stats.distinct_stats = std::move(sink.column_distinct_stats[col_idx]);
77
- });
78
+ table->GetStorage().SetDistinct(info->column_id_map.at(col_idx),
79
+ std::move(sink.column_distinct_stats[col_idx]));
78
80
  }
79
81
 
80
82
  return SinkFinalizeType::READY;
@@ -87,11 +87,23 @@ public:
87
87
  OuterJoinMarker left_outer;
88
88
  SelectionVector match_sel;
89
89
  ExpressionExecutor executor;
90
+ DataChunk intermediate_chunk;
90
91
  };
91
92
 
92
93
  unique_ptr<OperatorState> PhysicalBlockwiseNLJoin::GetOperatorState(ExecutionContext &context) const {
93
94
  auto &gstate = (BlockwiseNLJoinGlobalState &)*sink_state;
94
- return make_unique<BlockwiseNLJoinState>(context, gstate.right_chunks, *this);
95
+ auto result = make_unique<BlockwiseNLJoinState>(context, gstate.right_chunks, *this);
96
+ if (join_type == JoinType::SEMI || join_type == JoinType::ANTI) {
97
+ vector<LogicalType> intermediate_types;
98
+ for (auto &type : children[0]->types) {
99
+ intermediate_types.emplace_back(type);
100
+ }
101
+ for (auto &type : children[1]->types) {
102
+ intermediate_types.emplace_back(type);
103
+ }
104
+ result->intermediate_chunk.Initialize(Allocator::DefaultAllocator(), intermediate_types);
105
+ }
106
+ return std::move(result);
95
107
  }
96
108
 
97
109
  OperatorResultType PhysicalBlockwiseNLJoin::ExecuteInternal(ExecutionContext &context, DataChunk &input,
@@ -111,44 +123,79 @@ OperatorResultType PhysicalBlockwiseNLJoin::ExecuteInternal(ExecutionContext &co
111
123
  }
112
124
  }
113
125
 
126
+ DataChunk *intermediate_chunk = &chunk;
127
+ if (join_type == JoinType::SEMI || join_type == JoinType::ANTI) {
128
+ intermediate_chunk = &state.intermediate_chunk;
129
+ intermediate_chunk->Reset();
130
+ }
131
+
114
132
  // now perform the actual join
115
- // we perform a cross product, then execute the expression directly on the cross product' result
133
+ // we perform a cross product, then execute the expression directly on the cross product result
116
134
  idx_t result_count = 0;
135
+ bool found_match[STANDARD_VECTOR_SIZE] = {false};
136
+
117
137
  do {
118
- auto result = state.cross_product.Execute(input, chunk);
138
+ auto result = state.cross_product.Execute(input, *intermediate_chunk);
119
139
  if (result == OperatorResultType::NEED_MORE_INPUT) {
120
140
  // exhausted input, have to pull new LHS chunk
121
141
  if (state.left_outer.Enabled()) {
122
142
  // left join: before we move to the next chunk, see if we need to output any vectors that didn't
123
143
  // have a match found
124
- state.left_outer.ConstructLeftJoinResult(input, chunk);
144
+ state.left_outer.ConstructLeftJoinResult(input, *intermediate_chunk);
125
145
  state.left_outer.Reset();
126
146
  }
147
+
148
+ if (join_type == JoinType::SEMI) {
149
+ PhysicalJoin::ConstructSemiJoinResult(input, chunk, found_match);
150
+ }
151
+ if (join_type == JoinType::ANTI) {
152
+ PhysicalJoin::ConstructAntiJoinResult(input, chunk, found_match);
153
+ }
154
+
127
155
  return OperatorResultType::NEED_MORE_INPUT;
128
156
  }
129
157
 
130
158
  // now perform the computation
131
- result_count = state.executor.SelectExpression(chunk, state.match_sel);
159
+ result_count = state.executor.SelectExpression(*intermediate_chunk, state.match_sel);
160
+
161
+ // handle anti and semi joins with different logic
132
162
  if (result_count > 0) {
133
163
  // found a match!
134
- // check if the cross product is scanning the LHS or the RHS in its entirety
135
- if (!state.cross_product.ScanLHS()) {
136
- // set the match flags in the LHS
137
- state.left_outer.SetMatches(state.match_sel, result_count);
138
- // set the match flag in the RHS
139
- gstate.right_outer.SetMatch(state.cross_product.ScanPosition() + state.cross_product.PositionInChunk());
164
+ // handle anti semi join conditions first
165
+ if (join_type == JoinType::ANTI || join_type == JoinType::SEMI) {
166
+ if (state.cross_product.ScanLHS()) {
167
+ found_match[state.cross_product.PositionInChunk()] = true;
168
+ } else {
169
+ for (idx_t i = 0; i < result_count; i++) {
170
+ found_match[state.match_sel.get_index(i)] = true;
171
+ }
172
+ }
173
+ intermediate_chunk->Reset();
174
+ // trick the loop to continue as semi and anti joins will never produce more output than
175
+ // the LHS cardinality
176
+ result_count = 0;
140
177
  } else {
141
- // set the match flag in the LHS
142
- state.left_outer.SetMatch(state.cross_product.PositionInChunk());
143
- // set the match flags in the RHS
144
- gstate.right_outer.SetMatches(state.match_sel, result_count, state.cross_product.ScanPosition());
178
+ // check if the cross product is scanning the LHS or the RHS in its entirety
179
+ if (!state.cross_product.ScanLHS()) {
180
+ // set the match flags in the LHS
181
+ state.left_outer.SetMatches(state.match_sel, result_count);
182
+ // set the match flag in the RHS
183
+ gstate.right_outer.SetMatch(state.cross_product.ScanPosition() +
184
+ state.cross_product.PositionInChunk());
185
+ } else {
186
+ // set the match flag in the LHS
187
+ state.left_outer.SetMatch(state.cross_product.PositionInChunk());
188
+ // set the match flags in the RHS
189
+ gstate.right_outer.SetMatches(state.match_sel, result_count, state.cross_product.ScanPosition());
190
+ }
191
+ intermediate_chunk->Slice(state.match_sel, result_count);
145
192
  }
146
- chunk.Slice(state.match_sel, result_count);
147
193
  } else {
148
194
  // no result: reset the chunk
149
- chunk.Reset();
195
+ intermediate_chunk->Reset();
150
196
  }
151
197
  } while (result_count == 0);
198
+
152
199
  return OperatorResultType::HAVE_MORE_OUTPUT;
153
200
  }
154
201
 
@@ -1,5 +1,7 @@
1
1
  #include "duckdb/execution/operator/join/physical_hash_join.hpp"
2
2
 
3
+ #include "duckdb/planner/expression/bound_aggregate_expression.hpp"
4
+ #include "duckdb/planner/expression/bound_reference_expression.hpp"
3
5
  #include "duckdb/common/types/column_data_collection.hpp"
4
6
  #include "duckdb/common/vector_operations/vector_operations.hpp"
5
7
  #include "duckdb/execution/expression_executor.hpp"
@@ -386,7 +386,7 @@ IEJoinUnion::IEJoinUnion(ClientContext &context, const PhysicalIEJoin &op, Sorte
386
386
  // Sort on the first expression
387
387
  auto ref = make_unique<BoundReferenceExpression>(order1.expression->return_type, 0);
388
388
  vector<BoundOrderByNode> orders;
389
- orders.emplace_back(BoundOrderByNode(order1.type, order1.null_order, std::move(ref)));
389
+ orders.emplace_back(order1.type, order1.null_order, std::move(ref));
390
390
 
391
391
  l1 = make_unique<SortedTable>(context, orders, payload_layout);
392
392
 
@@ -422,7 +422,7 @@ IEJoinUnion::IEJoinUnion(ClientContext &context, const PhysicalIEJoin &op, Sorte
422
422
  // Sort on the first expression
423
423
  orders.clear();
424
424
  ref = make_unique<BoundReferenceExpression>(order2.expression->return_type, 0);
425
- orders.emplace_back(BoundOrderByNode(order2.type, order2.null_order, std::move(ref)));
425
+ orders.emplace_back(order2.type, order2.null_order, std::move(ref));
426
426
 
427
427
  ExpressionExecutor executor(context);
428
428
  executor.AddExpression(*orders[0].expression);