duckdb 0.7.2-dev0.0 → 0.7.2-dev1138.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 (625) 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 +12 -2
  28. package/src/duckdb/extension/parquet/parquet_reader.cpp +1 -1
  29. package/src/duckdb/extension/parquet/parquet_statistics.cpp +26 -32
  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/operator/cast_operators.cpp +1 -1
  53. package/src/duckdb/src/common/preserved_error.cpp +7 -5
  54. package/src/duckdb/src/common/progress_bar/progress_bar.cpp +7 -0
  55. package/src/duckdb/src/common/serializer/buffered_deserializer.cpp +4 -0
  56. package/src/duckdb/src/common/serializer/buffered_file_reader.cpp +15 -2
  57. package/src/duckdb/src/common/serializer/enum_serializer.cpp +1176 -0
  58. package/src/duckdb/src/common/sort/comparators.cpp +14 -5
  59. package/src/duckdb/src/common/sort/sort_state.cpp +5 -7
  60. package/src/duckdb/src/common/sort/sorted_block.cpp +0 -1
  61. package/src/duckdb/src/common/string_util.cpp +4 -1
  62. package/src/duckdb/src/common/types/bit.cpp +166 -87
  63. package/src/duckdb/src/common/types/blob.cpp +1 -1
  64. package/src/duckdb/src/common/types/chunk_collection.cpp +2 -2
  65. package/src/duckdb/src/common/types/column_data_collection.cpp +39 -2
  66. package/src/duckdb/src/common/types/column_data_collection_segment.cpp +11 -6
  67. package/src/duckdb/src/common/types/data_chunk.cpp +1 -1
  68. package/src/duckdb/src/common/types/interval.cpp +0 -41
  69. package/src/duckdb/src/common/types/list_segment.cpp +658 -0
  70. package/src/duckdb/src/common/types/string_heap.cpp +1 -1
  71. package/src/duckdb/src/common/types/string_type.cpp +1 -1
  72. package/src/duckdb/src/common/types/time.cpp +13 -0
  73. package/src/duckdb/src/common/types/value.cpp +320 -154
  74. package/src/duckdb/src/common/types/vector.cpp +156 -128
  75. package/src/duckdb/src/common/types.cpp +313 -153
  76. package/src/duckdb/src/common/value_operations/comparison_operations.cpp +14 -22
  77. package/src/duckdb/src/common/vector_operations/comparison_operators.cpp +10 -10
  78. package/src/duckdb/src/common/vector_operations/is_distinct_from.cpp +11 -10
  79. package/src/duckdb/src/common/vector_operations/vector_cast.cpp +2 -1
  80. package/src/duckdb/src/execution/aggregate_hashtable.cpp +10 -5
  81. package/src/duckdb/src/execution/column_binding_resolver.cpp +21 -5
  82. package/src/duckdb/src/execution/expression_executor/execute_cast.cpp +2 -1
  83. package/src/duckdb/src/execution/expression_executor/execute_comparison.cpp +2 -2
  84. package/src/duckdb/src/execution/index/art/art.cpp +19 -5
  85. package/src/duckdb/src/execution/operator/aggregate/physical_hash_aggregate.cpp +1 -1
  86. package/src/duckdb/src/execution/operator/aggregate/physical_perfecthash_aggregate.cpp +4 -5
  87. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +117 -26
  88. package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +3 -0
  89. package/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp +5 -3
  90. package/src/duckdb/src/execution/operator/join/physical_blockwise_nl_join.cpp +64 -17
  91. package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +2 -0
  92. package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +2 -2
  93. package/src/duckdb/src/execution/operator/join/physical_index_join.cpp +13 -4
  94. package/src/duckdb/src/execution/operator/join/physical_join.cpp +0 -3
  95. package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +6 -11
  96. package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +3 -1
  97. package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +11 -4
  98. package/src/duckdb/src/execution/operator/persistent/buffered_csv_reader.cpp +24 -19
  99. package/src/duckdb/src/execution/operator/persistent/csv_reader_options.cpp +3 -0
  100. package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +2 -1
  101. package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +2 -2
  102. package/src/duckdb/src/execution/operator/persistent/physical_delete.cpp +1 -3
  103. package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +1 -0
  104. package/src/duckdb/src/execution/operator/projection/physical_projection.cpp +34 -0
  105. package/src/duckdb/src/execution/operator/scan/physical_positional_scan.cpp +20 -5
  106. package/src/duckdb/src/execution/operator/schema/physical_create_type.cpp +20 -40
  107. package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +0 -4
  108. package/src/duckdb/src/execution/partitionable_hashtable.cpp +14 -2
  109. package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +22 -16
  110. package/src/duckdb/src/execution/physical_plan/plan_asof_join.cpp +97 -0
  111. package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +95 -47
  112. package/src/duckdb/src/execution/physical_plan/plan_create_index.cpp +2 -1
  113. package/src/duckdb/src/execution/physical_plan/plan_distinct.cpp +5 -8
  114. package/src/duckdb/src/execution/physical_plan/plan_positional_join.cpp +14 -5
  115. package/src/duckdb/src/execution/physical_plan_generator.cpp +3 -0
  116. package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +1 -0
  117. package/src/duckdb/src/execution/window_segment_tree.cpp +173 -1
  118. package/src/duckdb/src/function/aggregate/algebraic/avg.cpp +0 -6
  119. package/src/duckdb/src/function/aggregate/distributive/bitagg.cpp +99 -95
  120. package/src/duckdb/src/function/aggregate/distributive/bitstring_agg.cpp +269 -0
  121. package/src/duckdb/src/function/aggregate/distributive/bool.cpp +2 -0
  122. package/src/duckdb/src/function/aggregate/distributive/count.cpp +3 -4
  123. package/src/duckdb/src/function/aggregate/distributive/first.cpp +1 -0
  124. package/src/duckdb/src/function/aggregate/distributive/minmax.cpp +2 -0
  125. package/src/duckdb/src/function/aggregate/distributive/sum.cpp +19 -16
  126. package/src/duckdb/src/function/aggregate/distributive_functions.cpp +1 -0
  127. package/src/duckdb/src/function/aggregate/holistic/approximate_quantile.cpp +5 -2
  128. package/src/duckdb/src/function/aggregate/holistic/mode.cpp +1 -1
  129. package/src/duckdb/src/function/aggregate/holistic/quantile.cpp +16 -1
  130. package/src/duckdb/src/function/aggregate/nested/list.cpp +6 -712
  131. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +58 -16
  132. package/src/duckdb/src/function/cast/bit_cast.cpp +0 -2
  133. package/src/duckdb/src/function/cast/blob_cast.cpp +0 -1
  134. package/src/duckdb/src/function/cast/cast_function_set.cpp +1 -1
  135. package/src/duckdb/src/function/cast/enum_casts.cpp +25 -3
  136. package/src/duckdb/src/function/cast/list_casts.cpp +17 -4
  137. package/src/duckdb/src/function/cast/map_cast.cpp +5 -2
  138. package/src/duckdb/src/function/cast/string_cast.cpp +36 -10
  139. package/src/duckdb/src/function/cast/struct_cast.cpp +24 -4
  140. package/src/duckdb/src/function/cast/time_casts.cpp +2 -2
  141. package/src/duckdb/src/function/cast/union_casts.cpp +33 -7
  142. package/src/duckdb/src/function/function_binder.cpp +1 -8
  143. package/src/duckdb/src/function/scalar/bit/bitstring.cpp +100 -0
  144. package/src/duckdb/src/function/scalar/date/current.cpp +0 -2
  145. package/src/duckdb/src/function/scalar/date/date_diff.cpp +0 -1
  146. package/src/duckdb/src/function/scalar/date/date_part.cpp +18 -26
  147. package/src/duckdb/src/function/scalar/date/date_sub.cpp +0 -1
  148. package/src/duckdb/src/function/scalar/date/date_trunc.cpp +10 -14
  149. package/src/duckdb/src/function/scalar/generic/stats.cpp +2 -4
  150. package/src/duckdb/src/function/scalar/list/contains_or_position.cpp +4 -146
  151. package/src/duckdb/src/function/scalar/list/flatten.cpp +5 -12
  152. package/src/duckdb/src/function/scalar/list/list_aggregates.cpp +1 -1
  153. package/src/duckdb/src/function/scalar/list/list_concat.cpp +8 -12
  154. package/src/duckdb/src/function/scalar/list/list_extract.cpp +5 -12
  155. package/src/duckdb/src/function/scalar/list/list_lambdas.cpp +7 -3
  156. package/src/duckdb/src/function/scalar/list/list_sort.cpp +25 -18
  157. package/src/duckdb/src/function/scalar/list/list_value.cpp +6 -10
  158. package/src/duckdb/src/function/scalar/map/map.cpp +47 -1
  159. package/src/duckdb/src/function/scalar/map/map_entries.cpp +61 -0
  160. package/src/duckdb/src/function/scalar/map/map_extract.cpp +68 -26
  161. package/src/duckdb/src/function/scalar/map/map_keys_values.cpp +97 -0
  162. package/src/duckdb/src/function/scalar/math/numeric.cpp +101 -17
  163. package/src/duckdb/src/function/scalar/math_functions.cpp +3 -0
  164. package/src/duckdb/src/function/scalar/nested_functions.cpp +3 -0
  165. package/src/duckdb/src/function/scalar/operators/add.cpp +0 -9
  166. package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +29 -48
  167. package/src/duckdb/src/function/scalar/operators/bitwise.cpp +0 -63
  168. package/src/duckdb/src/function/scalar/operators/multiply.cpp +5 -6
  169. package/src/duckdb/src/function/scalar/operators/subtract.cpp +0 -6
  170. package/src/duckdb/src/function/scalar/string/caseconvert.cpp +2 -6
  171. package/src/duckdb/src/function/scalar/string/hex.cpp +201 -0
  172. package/src/duckdb/src/function/scalar/string/instr.cpp +2 -6
  173. package/src/duckdb/src/function/scalar/string/length.cpp +2 -6
  174. package/src/duckdb/src/function/scalar/string/like.cpp +2 -6
  175. package/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp +243 -0
  176. package/src/duckdb/src/function/scalar/string/regexp/regexp_util.cpp +79 -0
  177. package/src/duckdb/src/function/scalar/string/regexp.cpp +21 -80
  178. package/src/duckdb/src/function/scalar/string/substring.cpp +2 -6
  179. package/src/duckdb/src/function/scalar/string_functions.cpp +2 -0
  180. package/src/duckdb/src/function/scalar/struct/struct_extract.cpp +5 -10
  181. package/src/duckdb/src/function/scalar/struct/struct_insert.cpp +11 -14
  182. package/src/duckdb/src/function/scalar/struct/struct_pack.cpp +6 -7
  183. package/src/duckdb/src/function/table/arrow.cpp +5 -2
  184. package/src/duckdb/src/function/table/arrow_conversion.cpp +25 -1
  185. package/src/duckdb/src/function/table/checkpoint.cpp +5 -1
  186. package/src/duckdb/src/function/table/read_csv.cpp +60 -0
  187. package/src/duckdb/src/function/table/system/duckdb_constraints.cpp +2 -2
  188. package/src/duckdb/src/function/table/system/test_all_types.cpp +2 -2
  189. package/src/duckdb/src/function/table/table_scan.cpp +9 -12
  190. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  191. package/src/duckdb/src/function/table_function.cpp +30 -11
  192. package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +6 -0
  193. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_table_entry.hpp +1 -1
  194. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_function_catalog_entry.hpp +6 -8
  195. package/src/duckdb/src/include/duckdb/catalog/dependency_list.hpp +3 -0
  196. package/src/duckdb/src/include/duckdb/catalog/duck_catalog.hpp +2 -1
  197. package/src/duckdb/src/include/duckdb/common/box_renderer.hpp +8 -2
  198. package/src/duckdb/src/include/duckdb/common/constants.hpp +0 -19
  199. package/src/duckdb/src/include/duckdb/common/enums/aggregate_handling.hpp +2 -0
  200. package/src/duckdb/src/include/duckdb/common/enums/expression_type.hpp +2 -3
  201. package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +7 -4
  202. package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +1 -0
  203. package/src/duckdb/src/include/duckdb/common/enums/order_type.hpp +2 -0
  204. package/src/duckdb/src/include/duckdb/common/enums/set_operation_type.hpp +2 -1
  205. package/src/duckdb/src/include/duckdb/common/enums/statement_type.hpp +2 -1
  206. package/src/duckdb/src/include/duckdb/common/enums/tableref_type.hpp +2 -1
  207. package/src/duckdb/src/include/duckdb/common/exception.hpp +69 -2
  208. package/src/duckdb/src/include/duckdb/common/field_writer.hpp +12 -4
  209. package/src/duckdb/src/include/duckdb/common/helper.hpp +1 -1
  210. package/src/duckdb/src/include/duckdb/common/{http_stats.hpp → http_state.hpp} +18 -4
  211. package/src/duckdb/src/include/duckdb/common/operator/comparison_operators.hpp +45 -149
  212. package/src/duckdb/src/include/duckdb/common/operator/multiply.hpp +2 -0
  213. package/src/duckdb/src/include/duckdb/common/optional_ptr.hpp +45 -0
  214. package/src/duckdb/src/include/duckdb/common/preserved_error.hpp +6 -1
  215. package/src/duckdb/src/include/duckdb/common/progress_bar/progress_bar.hpp +2 -0
  216. package/src/duckdb/src/include/duckdb/common/serializer/buffered_deserializer.hpp +4 -2
  217. package/src/duckdb/src/include/duckdb/common/serializer/buffered_file_reader.hpp +8 -2
  218. package/src/duckdb/src/include/duckdb/common/serializer/enum_serializer.hpp +113 -0
  219. package/src/duckdb/src/include/duckdb/common/serializer/format_deserializer.hpp +336 -0
  220. package/src/duckdb/src/include/duckdb/common/serializer/format_serializer.hpp +268 -0
  221. package/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp +126 -0
  222. package/src/duckdb/src/include/duckdb/common/serializer.hpp +13 -0
  223. package/src/duckdb/src/include/duckdb/common/string_util.hpp +25 -0
  224. package/src/duckdb/src/include/duckdb/common/types/bit.hpp +12 -7
  225. package/src/duckdb/src/include/duckdb/common/types/interval.hpp +39 -3
  226. package/src/duckdb/src/include/duckdb/common/types/list_segment.hpp +70 -0
  227. package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +73 -3
  228. package/src/duckdb/src/include/duckdb/common/types/time.hpp +3 -0
  229. package/src/duckdb/src/include/duckdb/common/types/value.hpp +17 -48
  230. package/src/duckdb/src/include/duckdb/common/types/value_map.hpp +1 -1
  231. package/src/duckdb/src/include/duckdb/common/types/vector.hpp +3 -1
  232. package/src/duckdb/src/include/duckdb/common/types.hpp +45 -8
  233. package/src/duckdb/src/include/duckdb/common/vector_operations/unary_executor.hpp +2 -2
  234. package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +1 -0
  235. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +3 -14
  236. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_perfecthash_aggregate.hpp +1 -1
  237. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_cross_product.hpp +2 -0
  238. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_file_handle.hpp +1 -0
  239. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +10 -0
  240. package/src/duckdb/src/include/duckdb/execution/operator/projection/physical_projection.hpp +5 -0
  241. package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +3 -0
  242. package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +1 -3
  243. package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +54 -0
  244. package/src/duckdb/src/include/duckdb/function/aggregate/distributive_functions.hpp +5 -0
  245. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +18 -6
  246. package/src/duckdb/src/include/duckdb/function/cast/bound_cast_data.hpp +84 -0
  247. package/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp +2 -2
  248. package/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp +28 -64
  249. package/src/duckdb/src/include/duckdb/function/function_binder.hpp +3 -6
  250. package/src/duckdb/src/include/duckdb/function/scalar/bit_functions.hpp +4 -0
  251. package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +138 -0
  252. package/src/duckdb/src/include/duckdb/function/scalar/math_functions.hpp +8 -0
  253. package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +59 -0
  254. package/src/duckdb/src/include/duckdb/function/scalar/regexp.hpp +81 -1
  255. package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +4 -0
  256. package/src/duckdb/src/include/duckdb/function/scalar_function.hpp +2 -2
  257. package/src/duckdb/src/include/duckdb/function/table/arrow.hpp +12 -1
  258. package/src/duckdb/src/include/duckdb/function/table_function.hpp +10 -0
  259. package/src/duckdb/src/include/duckdb/main/capi/capi_internal.hpp +2 -0
  260. package/src/duckdb/src/include/duckdb/main/client_config.hpp +2 -0
  261. package/src/duckdb/src/include/duckdb/main/client_data.hpp +3 -3
  262. package/src/duckdb/src/include/duckdb/main/config.hpp +3 -0
  263. package/src/duckdb/src/include/duckdb/main/connection_manager.hpp +2 -0
  264. package/src/duckdb/src/include/duckdb/main/database.hpp +1 -0
  265. package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +2 -0
  266. package/src/duckdb/src/include/duckdb/main/prepared_statement.hpp +2 -0
  267. package/src/duckdb/src/include/duckdb/main/relation/explain_relation.hpp +2 -1
  268. package/src/duckdb/src/include/duckdb/main/relation.hpp +2 -1
  269. package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +2 -0
  270. package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +2 -2
  271. package/src/duckdb/src/include/duckdb/optimizer/rule/list.hpp +1 -0
  272. package/src/duckdb/src/include/duckdb/optimizer/rule/ordered_aggregate_optimizer.hpp +24 -0
  273. package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +4 -0
  274. package/src/duckdb/src/include/duckdb/parser/expression/between_expression.hpp +3 -0
  275. package/src/duckdb/src/include/duckdb/parser/expression/bound_expression.hpp +2 -0
  276. package/src/duckdb/src/include/duckdb/parser/expression/case_expression.hpp +5 -0
  277. package/src/duckdb/src/include/duckdb/parser/expression/cast_expression.hpp +2 -0
  278. package/src/duckdb/src/include/duckdb/parser/expression/collate_expression.hpp +2 -0
  279. package/src/duckdb/src/include/duckdb/parser/expression/columnref_expression.hpp +2 -0
  280. package/src/duckdb/src/include/duckdb/parser/expression/comparison_expression.hpp +2 -0
  281. package/src/duckdb/src/include/duckdb/parser/expression/conjunction_expression.hpp +2 -0
  282. package/src/duckdb/src/include/duckdb/parser/expression/constant_expression.hpp +3 -0
  283. package/src/duckdb/src/include/duckdb/parser/expression/default_expression.hpp +1 -0
  284. package/src/duckdb/src/include/duckdb/parser/expression/function_expression.hpp +4 -2
  285. package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +2 -0
  286. package/src/duckdb/src/include/duckdb/parser/expression/operator_expression.hpp +2 -0
  287. package/src/duckdb/src/include/duckdb/parser/expression/parameter_expression.hpp +2 -0
  288. package/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +2 -0
  289. package/src/duckdb/src/include/duckdb/parser/expression/star_expression.hpp +4 -2
  290. package/src/duckdb/src/include/duckdb/parser/expression/subquery_expression.hpp +2 -0
  291. package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +5 -0
  292. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_info.hpp +5 -1
  293. package/src/duckdb/src/include/duckdb/parser/parsed_data/{alter_function_info.hpp → alter_scalar_function_info.hpp} +13 -13
  294. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_function_info.hpp +47 -0
  295. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp +6 -0
  296. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_table_function_info.hpp +2 -1
  297. package/src/duckdb/src/include/duckdb/parser/parsed_data/sample_options.hpp +2 -0
  298. package/src/duckdb/src/include/duckdb/parser/parsed_expression.hpp +5 -0
  299. package/src/duckdb/src/include/duckdb/parser/query_node/recursive_cte_node.hpp +3 -0
  300. package/src/duckdb/src/include/duckdb/parser/query_node/select_node.hpp +5 -0
  301. package/src/duckdb/src/include/duckdb/parser/query_node/set_operation_node.hpp +3 -0
  302. package/src/duckdb/src/include/duckdb/parser/query_node.hpp +13 -2
  303. package/src/duckdb/src/include/duckdb/parser/result_modifier.hpp +24 -1
  304. package/src/duckdb/src/include/duckdb/parser/sql_statement.hpp +2 -1
  305. package/src/duckdb/src/include/duckdb/parser/statement/multi_statement.hpp +28 -0
  306. package/src/duckdb/src/include/duckdb/parser/statement/select_statement.hpp +6 -1
  307. package/src/duckdb/src/include/duckdb/parser/tableref/basetableref.hpp +4 -0
  308. package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +2 -0
  309. package/src/duckdb/src/include/duckdb/parser/tableref/expressionlistref.hpp +3 -0
  310. package/src/duckdb/src/include/duckdb/parser/tableref/joinref.hpp +3 -0
  311. package/src/duckdb/src/include/duckdb/parser/tableref/list.hpp +1 -0
  312. package/src/duckdb/src/include/duckdb/parser/tableref/pivotref.hpp +87 -0
  313. package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +3 -0
  314. package/src/duckdb/src/include/duckdb/parser/tableref/table_function_ref.hpp +3 -0
  315. package/src/duckdb/src/include/duckdb/parser/tableref.hpp +3 -1
  316. package/src/duckdb/src/include/duckdb/parser/tokens.hpp +2 -0
  317. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +33 -0
  318. package/src/duckdb/src/include/duckdb/planner/bind_context.hpp +2 -0
  319. package/src/duckdb/src/include/duckdb/planner/binder.hpp +15 -4
  320. package/src/duckdb/src/include/duckdb/planner/bound_result_modifier.hpp +3 -0
  321. package/src/duckdb/src/include/duckdb/planner/expression/bound_aggregate_expression.hpp +3 -0
  322. package/src/duckdb/src/include/duckdb/planner/expression_binder/base_select_binder.hpp +64 -0
  323. package/src/duckdb/src/include/duckdb/planner/expression_binder/having_binder.hpp +2 -2
  324. package/src/duckdb/src/include/duckdb/planner/expression_binder/order_binder.hpp +4 -1
  325. package/src/duckdb/src/include/duckdb/planner/expression_binder/qualify_binder.hpp +2 -2
  326. package/src/duckdb/src/include/duckdb/planner/expression_binder/select_binder.hpp +9 -38
  327. package/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +1 -1
  328. package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +1 -0
  329. package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +1 -0
  330. package/src/duckdb/src/include/duckdb/planner/operator/logical_asof_join.hpp +22 -0
  331. package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +5 -2
  332. package/src/duckdb/src/include/duckdb/planner/operator/logical_distinct.hpp +3 -0
  333. package/src/duckdb/src/include/duckdb/planner/query_node/bound_select_node.hpp +8 -2
  334. package/src/duckdb/src/include/duckdb/storage/buffer/block_handle.hpp +2 -0
  335. package/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp +76 -44
  336. package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp +3 -2
  337. package/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp +1 -1
  338. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_compress.hpp +2 -2
  339. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_fetch.hpp +1 -1
  340. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_scan.hpp +2 -1
  341. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_compress.hpp +2 -2
  342. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_fetch.hpp +1 -1
  343. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_scan.hpp +2 -1
  344. package/src/duckdb/src/include/duckdb/storage/data_pointer.hpp +4 -3
  345. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +4 -3
  346. package/src/duckdb/src/include/duckdb/storage/index.hpp +5 -4
  347. package/src/duckdb/src/include/duckdb/storage/meta_block_reader.hpp +7 -0
  348. package/src/duckdb/src/include/duckdb/storage/statistics/base_statistics.hpp +93 -29
  349. package/src/duckdb/src/include/duckdb/storage/statistics/column_statistics.hpp +22 -3
  350. package/src/duckdb/src/include/duckdb/storage/statistics/distinct_statistics.hpp +8 -6
  351. package/src/duckdb/src/include/duckdb/storage/statistics/list_stats.hpp +41 -0
  352. package/src/duckdb/src/include/duckdb/storage/statistics/node_statistics.hpp +26 -0
  353. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats.hpp +114 -0
  354. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats_union.hpp +62 -0
  355. package/src/duckdb/src/include/duckdb/storage/statistics/segment_statistics.hpp +2 -7
  356. package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +74 -0
  357. package/src/duckdb/src/include/duckdb/storage/statistics/struct_stats.hpp +42 -0
  358. package/src/duckdb/src/include/duckdb/storage/string_uncompressed.hpp +2 -3
  359. package/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp +2 -1
  360. package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +21 -7
  361. package/src/duckdb/src/include/duckdb/storage/table/column_data_checkpointer.hpp +3 -2
  362. package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +5 -6
  363. package/src/duckdb/src/include/duckdb/storage/table/column_segment_tree.hpp +18 -0
  364. package/src/duckdb/src/include/duckdb/storage/table/list_column_data.hpp +1 -1
  365. package/src/duckdb/src/include/duckdb/storage/table/persistent_table_data.hpp +6 -3
  366. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +41 -45
  367. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +23 -7
  368. package/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp +35 -0
  369. package/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp +21 -29
  370. package/src/duckdb/src/include/duckdb/storage/table/segment_base.hpp +6 -6
  371. package/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +281 -26
  372. package/src/duckdb/src/include/duckdb/storage/table/standard_column_data.hpp +0 -4
  373. package/src/duckdb/src/include/duckdb/storage/table/table_statistics.hpp +5 -0
  374. package/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +0 -1
  375. package/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +1 -1
  376. package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +6 -3
  377. package/src/duckdb/src/include/duckdb.h +71 -2
  378. package/src/duckdb/src/include/duckdb.hpp +0 -1
  379. package/src/duckdb/src/main/capi/pending-c.cpp +16 -3
  380. package/src/duckdb/src/main/capi/result-c.cpp +27 -1
  381. package/src/duckdb/src/main/capi/stream-c.cpp +25 -0
  382. package/src/duckdb/src/main/capi/table_function-c.cpp +23 -0
  383. package/src/duckdb/src/main/client_context.cpp +38 -34
  384. package/src/duckdb/src/main/client_data.cpp +7 -6
  385. package/src/duckdb/src/main/config.cpp +70 -1
  386. package/src/duckdb/src/main/database.cpp +19 -2
  387. package/src/duckdb/src/main/extension/extension_install.cpp +7 -2
  388. package/src/duckdb/src/main/prepared_statement.cpp +4 -0
  389. package/src/duckdb/src/main/query_profiler.cpp +17 -15
  390. package/src/duckdb/src/main/relation/explain_relation.cpp +3 -3
  391. package/src/duckdb/src/main/relation.cpp +3 -2
  392. package/src/duckdb/src/main/settings/settings.cpp +20 -8
  393. package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +1 -0
  394. package/src/duckdb/src/optimizer/deliminator.cpp +1 -1
  395. package/src/duckdb/src/optimizer/filter_combiner.cpp +3 -6
  396. package/src/duckdb/src/optimizer/filter_pullup.cpp +3 -1
  397. package/src/duckdb/src/optimizer/filter_pushdown.cpp +14 -8
  398. package/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp +107 -71
  399. package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +32 -12
  400. package/src/duckdb/src/optimizer/optimizer.cpp +1 -0
  401. package/src/duckdb/src/optimizer/pullup/pullup_from_left.cpp +2 -2
  402. package/src/duckdb/src/optimizer/pushdown/pushdown_aggregate.cpp +33 -5
  403. package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +1 -1
  404. package/src/duckdb/src/optimizer/pushdown/pushdown_inner_join.cpp +3 -0
  405. package/src/duckdb/src/optimizer/pushdown/pushdown_left_join.cpp +5 -12
  406. package/src/duckdb/src/optimizer/pushdown/pushdown_mark_join.cpp +2 -2
  407. package/src/duckdb/src/optimizer/pushdown/pushdown_single_join.cpp +1 -1
  408. package/src/duckdb/src/optimizer/remove_unused_columns.cpp +1 -0
  409. package/src/duckdb/src/optimizer/rule/move_constants.cpp +10 -4
  410. package/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp +30 -0
  411. package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +9 -2
  412. package/src/duckdb/src/optimizer/statistics/expression/propagate_aggregate.cpp +9 -3
  413. package/src/duckdb/src/optimizer/statistics/expression/propagate_and_compress.cpp +6 -7
  414. package/src/duckdb/src/optimizer/statistics/expression/propagate_cast.cpp +14 -11
  415. package/src/duckdb/src/optimizer/statistics/expression/propagate_columnref.cpp +1 -1
  416. package/src/duckdb/src/optimizer/statistics/expression/propagate_comparison.cpp +13 -15
  417. package/src/duckdb/src/optimizer/statistics/expression/propagate_conjunction.cpp +0 -1
  418. package/src/duckdb/src/optimizer/statistics/expression/propagate_constant.cpp +3 -75
  419. package/src/duckdb/src/optimizer/statistics/expression/propagate_function.cpp +7 -2
  420. package/src/duckdb/src/optimizer/statistics/expression/propagate_operator.cpp +10 -0
  421. package/src/duckdb/src/optimizer/statistics/operator/propagate_aggregate.cpp +2 -3
  422. package/src/duckdb/src/optimizer/statistics/operator/propagate_filter.cpp +29 -32
  423. package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +5 -5
  424. package/src/duckdb/src/optimizer/statistics/operator/propagate_set_operation.cpp +3 -3
  425. package/src/duckdb/src/optimizer/statistics_propagator.cpp +2 -1
  426. package/src/duckdb/src/optimizer/unnest_rewriter.cpp +2 -2
  427. package/src/duckdb/src/parallel/meta_pipeline.cpp +0 -7
  428. package/src/duckdb/src/parser/common_table_expression_info.cpp +19 -0
  429. package/src/duckdb/src/parser/expression/between_expression.cpp +17 -0
  430. package/src/duckdb/src/parser/expression/case_expression.cpp +28 -0
  431. package/src/duckdb/src/parser/expression/cast_expression.cpp +17 -0
  432. package/src/duckdb/src/parser/expression/collate_expression.cpp +16 -0
  433. package/src/duckdb/src/parser/expression/columnref_expression.cpp +15 -0
  434. package/src/duckdb/src/parser/expression/comparison_expression.cpp +16 -0
  435. package/src/duckdb/src/parser/expression/conjunction_expression.cpp +17 -0
  436. package/src/duckdb/src/parser/expression/constant_expression.cpp +14 -0
  437. package/src/duckdb/src/parser/expression/default_expression.cpp +7 -0
  438. package/src/duckdb/src/parser/expression/function_expression.cpp +35 -0
  439. package/src/duckdb/src/parser/expression/lambda_expression.cpp +16 -0
  440. package/src/duckdb/src/parser/expression/operator_expression.cpp +15 -0
  441. package/src/duckdb/src/parser/expression/parameter_expression.cpp +15 -0
  442. package/src/duckdb/src/parser/expression/positional_reference_expression.cpp +14 -0
  443. package/src/duckdb/src/parser/expression/star_expression.cpp +26 -6
  444. package/src/duckdb/src/parser/expression/subquery_expression.cpp +20 -0
  445. package/src/duckdb/src/parser/expression/window_expression.cpp +43 -0
  446. package/src/duckdb/src/parser/parsed_data/alter_info.cpp +7 -3
  447. package/src/duckdb/src/parser/parsed_data/alter_scalar_function_info.cpp +56 -0
  448. package/src/duckdb/src/parser/parsed_data/alter_table_function_info.cpp +51 -0
  449. package/src/duckdb/src/parser/parsed_data/create_scalar_function_info.cpp +3 -2
  450. package/src/duckdb/src/parser/parsed_data/create_table_function_info.cpp +6 -0
  451. package/src/duckdb/src/parser/parsed_data/sample_options.cpp +22 -10
  452. package/src/duckdb/src/parser/parsed_expression.cpp +72 -0
  453. package/src/duckdb/src/parser/parsed_expression_iterator.cpp +15 -1
  454. package/src/duckdb/src/parser/query_node/recursive_cte_node.cpp +21 -0
  455. package/src/duckdb/src/parser/query_node/select_node.cpp +31 -0
  456. package/src/duckdb/src/parser/query_node/set_operation_node.cpp +17 -0
  457. package/src/duckdb/src/parser/query_node.cpp +51 -1
  458. package/src/duckdb/src/parser/result_modifier.cpp +78 -0
  459. package/src/duckdb/src/parser/statement/multi_statement.cpp +18 -0
  460. package/src/duckdb/src/parser/statement/select_statement.cpp +12 -0
  461. package/src/duckdb/src/parser/tableref/basetableref.cpp +21 -0
  462. package/src/duckdb/src/parser/tableref/emptytableref.cpp +4 -0
  463. package/src/duckdb/src/parser/tableref/expressionlistref.cpp +17 -0
  464. package/src/duckdb/src/parser/tableref/joinref.cpp +29 -0
  465. package/src/duckdb/src/parser/tableref/pivotref.cpp +373 -0
  466. package/src/duckdb/src/parser/tableref/subqueryref.cpp +15 -0
  467. package/src/duckdb/src/parser/tableref/table_function.cpp +17 -0
  468. package/src/duckdb/src/parser/tableref.cpp +49 -0
  469. package/src/duckdb/src/parser/transform/expression/transform_array_access.cpp +11 -0
  470. package/src/duckdb/src/parser/transform/expression/transform_bool_expr.cpp +1 -1
  471. package/src/duckdb/src/parser/transform/expression/transform_columnref.cpp +17 -2
  472. package/src/duckdb/src/parser/transform/expression/transform_function.cpp +85 -42
  473. package/src/duckdb/src/parser/transform/expression/transform_operator.cpp +1 -1
  474. package/src/duckdb/src/parser/transform/expression/transform_subquery.cpp +1 -1
  475. package/src/duckdb/src/parser/transform/helpers/transform_alias.cpp +12 -6
  476. package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +24 -0
  477. package/src/duckdb/src/parser/transform/helpers/transform_groupby.cpp +7 -0
  478. package/src/duckdb/src/parser/transform/helpers/transform_orderby.cpp +0 -7
  479. package/src/duckdb/src/parser/transform/helpers/transform_typename.cpp +3 -2
  480. package/src/duckdb/src/parser/transform/statement/transform_create_function.cpp +4 -0
  481. package/src/duckdb/src/parser/transform/statement/transform_create_view.cpp +4 -0
  482. package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +179 -0
  483. package/src/duckdb/src/parser/transform/statement/transform_rename.cpp +3 -4
  484. package/src/duckdb/src/parser/transform/statement/transform_select.cpp +8 -0
  485. package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +2 -3
  486. package/src/duckdb/src/parser/transform/tableref/transform_join.cpp +12 -1
  487. package/src/duckdb/src/parser/transform/tableref/transform_pivot.cpp +121 -0
  488. package/src/duckdb/src/parser/transform/tableref/transform_tableref.cpp +2 -0
  489. package/src/duckdb/src/parser/transformer.cpp +15 -3
  490. package/src/duckdb/src/planner/bind_context.cpp +18 -25
  491. package/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp +9 -7
  492. package/src/duckdb/src/planner/binder/expression/bind_columnref_expression.cpp +4 -3
  493. package/src/duckdb/src/planner/binder/expression/bind_function_expression.cpp +23 -12
  494. package/src/duckdb/src/planner/binder/expression/bind_lambda.cpp +3 -2
  495. package/src/duckdb/src/planner/binder/expression/bind_star_expression.cpp +176 -0
  496. package/src/duckdb/src/planner/binder/expression/bind_subquery_expression.cpp +4 -0
  497. package/src/duckdb/src/planner/binder/expression/bind_unnest_expression.cpp +163 -24
  498. package/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp +2 -2
  499. package/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +109 -94
  500. package/src/duckdb/src/planner/binder/query_node/plan_query_node.cpp +11 -0
  501. package/src/duckdb/src/planner/binder/query_node/plan_select_node.cpp +9 -4
  502. package/src/duckdb/src/planner/binder/statement/bind_copy.cpp +5 -3
  503. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +3 -2
  504. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +10 -1
  505. package/src/duckdb/src/planner/binder/statement/bind_delete.cpp +1 -1
  506. package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +12 -8
  507. package/src/duckdb/src/planner/binder/statement/bind_logical_plan.cpp +17 -0
  508. package/src/duckdb/src/planner/binder/statement/bind_update.cpp +4 -2
  509. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +19 -3
  510. package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +366 -0
  511. package/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp +11 -1
  512. package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -0
  513. package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +61 -13
  514. package/src/duckdb/src/planner/binder.cpp +19 -24
  515. package/src/duckdb/src/planner/bound_result_modifier.cpp +27 -1
  516. package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +9 -2
  517. package/src/duckdb/src/planner/expression/bound_expression.cpp +4 -0
  518. package/src/duckdb/src/planner/expression/bound_window_expression.cpp +1 -1
  519. package/src/duckdb/src/planner/expression_binder/base_select_binder.cpp +146 -0
  520. package/src/duckdb/src/planner/expression_binder/having_binder.cpp +6 -3
  521. package/src/duckdb/src/planner/expression_binder/qualify_binder.cpp +3 -3
  522. package/src/duckdb/src/planner/expression_binder/select_binder.cpp +1 -132
  523. package/src/duckdb/src/planner/expression_binder.cpp +10 -3
  524. package/src/duckdb/src/planner/expression_iterator.cpp +17 -10
  525. package/src/duckdb/src/planner/filter/constant_filter.cpp +4 -6
  526. package/src/duckdb/src/planner/logical_operator.cpp +7 -2
  527. package/src/duckdb/src/planner/logical_operator_visitor.cpp +6 -0
  528. package/src/duckdb/src/planner/operator/logical_asof_join.cpp +8 -0
  529. package/src/duckdb/src/planner/operator/logical_distinct.cpp +3 -0
  530. package/src/duckdb/src/planner/planner.cpp +2 -1
  531. package/src/duckdb/src/planner/pragma_handler.cpp +10 -2
  532. package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +3 -1
  533. package/src/duckdb/src/storage/buffer_manager.cpp +44 -46
  534. package/src/duckdb/src/storage/checkpoint/row_group_writer.cpp +1 -1
  535. package/src/duckdb/src/storage/checkpoint/table_data_reader.cpp +4 -15
  536. package/src/duckdb/src/storage/checkpoint/table_data_writer.cpp +10 -4
  537. package/src/duckdb/src/storage/checkpoint_manager.cpp +9 -3
  538. package/src/duckdb/src/storage/compression/bitpacking.cpp +29 -25
  539. package/src/duckdb/src/storage/compression/fixed_size_uncompressed.cpp +45 -46
  540. package/src/duckdb/src/storage/compression/numeric_constant.cpp +10 -11
  541. package/src/duckdb/src/storage/compression/patas.cpp +1 -1
  542. package/src/duckdb/src/storage/compression/rle.cpp +20 -15
  543. package/src/duckdb/src/storage/compression/validity_uncompressed.cpp +6 -6
  544. package/src/duckdb/src/storage/data_table.cpp +23 -23
  545. package/src/duckdb/src/storage/index.cpp +12 -1
  546. package/src/duckdb/src/storage/local_storage.cpp +27 -23
  547. package/src/duckdb/src/storage/meta_block_reader.cpp +22 -0
  548. package/src/duckdb/src/storage/statistics/base_statistics.cpp +373 -128
  549. package/src/duckdb/src/storage/statistics/column_statistics.cpp +57 -3
  550. package/src/duckdb/src/storage/statistics/distinct_statistics.cpp +8 -9
  551. package/src/duckdb/src/storage/statistics/list_stats.cpp +121 -0
  552. package/src/duckdb/src/storage/statistics/numeric_stats.cpp +591 -0
  553. package/src/duckdb/src/storage/statistics/numeric_stats_union.cpp +65 -0
  554. package/src/duckdb/src/storage/statistics/segment_statistics.cpp +2 -11
  555. package/src/duckdb/src/storage/statistics/string_stats.cpp +273 -0
  556. package/src/duckdb/src/storage/statistics/struct_stats.cpp +133 -0
  557. package/src/duckdb/src/storage/storage_info.cpp +2 -2
  558. package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +4 -10
  559. package/src/duckdb/src/storage/table/column_data.cpp +118 -62
  560. package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +10 -9
  561. package/src/duckdb/src/storage/table/column_segment.cpp +30 -45
  562. package/src/duckdb/src/storage/table/list_column_data.cpp +50 -71
  563. package/src/duckdb/src/storage/table/persistent_table_data.cpp +2 -1
  564. package/src/duckdb/src/storage/table/row_group.cpp +213 -143
  565. package/src/duckdb/src/storage/table/row_group_collection.cpp +151 -105
  566. package/src/duckdb/src/storage/table/scan_state.cpp +45 -33
  567. package/src/duckdb/src/storage/table/standard_column_data.cpp +11 -12
  568. package/src/duckdb/src/storage/table/struct_column_data.cpp +27 -34
  569. package/src/duckdb/src/storage/table/table_statistics.cpp +27 -7
  570. package/src/duckdb/src/storage/table/update_segment.cpp +23 -18
  571. package/src/duckdb/src/storage/wal_replay.cpp +8 -5
  572. package/src/duckdb/src/storage/write_ahead_log.cpp +2 -2
  573. package/src/duckdb/src/transaction/commit_state.cpp +11 -7
  574. package/src/duckdb/src/verification/deserialized_statement_verifier.cpp +0 -1
  575. package/src/duckdb/third_party/libpg_query/include/nodes/nodes.hpp +35 -0
  576. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +36 -2
  577. package/src/duckdb/third_party/libpg_query/include/nodes/primnodes.hpp +3 -3
  578. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +1022 -530
  579. package/src/duckdb/third_party/libpg_query/include/parser/kwlist.hpp +8 -0
  580. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +24462 -22828
  581. package/src/duckdb/third_party/re2/re2/re2.cc +9 -0
  582. package/src/duckdb/third_party/re2/re2/re2.h +2 -0
  583. package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +4 -4
  584. package/src/duckdb/ub_extension_json_json_functions.cpp +2 -0
  585. package/src/duckdb/ub_src_common_serializer.cpp +2 -0
  586. package/src/duckdb/ub_src_common_types.cpp +2 -0
  587. package/src/duckdb/ub_src_execution_physical_plan.cpp +2 -0
  588. package/src/duckdb/ub_src_function_aggregate_distributive.cpp +2 -0
  589. package/src/duckdb/ub_src_function_scalar_bit.cpp +2 -0
  590. package/src/duckdb/ub_src_function_scalar_map.cpp +4 -0
  591. package/src/duckdb/ub_src_function_scalar_string.cpp +2 -0
  592. package/src/duckdb/ub_src_function_scalar_string_regexp.cpp +4 -0
  593. package/src/duckdb/ub_src_main_capi.cpp +2 -0
  594. package/src/duckdb/ub_src_optimizer_rule.cpp +2 -0
  595. package/src/duckdb/ub_src_parser.cpp +2 -0
  596. package/src/duckdb/ub_src_parser_parsed_data.cpp +4 -2
  597. package/src/duckdb/ub_src_parser_statement.cpp +2 -0
  598. package/src/duckdb/ub_src_parser_tableref.cpp +2 -0
  599. package/src/duckdb/ub_src_parser_transform_statement.cpp +2 -0
  600. package/src/duckdb/ub_src_parser_transform_tableref.cpp +2 -0
  601. package/src/duckdb/ub_src_planner_binder_expression.cpp +2 -0
  602. package/src/duckdb/ub_src_planner_binder_tableref.cpp +2 -0
  603. package/src/duckdb/ub_src_planner_expression_binder.cpp +2 -0
  604. package/src/duckdb/ub_src_planner_operator.cpp +2 -0
  605. package/src/duckdb/ub_src_storage_statistics.cpp +6 -6
  606. package/src/duckdb/ub_src_storage_table.cpp +0 -2
  607. package/src/duckdb_node.hpp +2 -1
  608. package/src/statement.cpp +5 -5
  609. package/src/utils.cpp +27 -2
  610. package/test/extension.test.ts +44 -26
  611. package/test/syntax_error.test.ts +3 -1
  612. package/filelist.cache +0 -0
  613. package/src/duckdb/src/include/duckdb/main/loadable_extension.hpp +0 -59
  614. package/src/duckdb/src/include/duckdb/storage/statistics/list_statistics.hpp +0 -36
  615. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_statistics.hpp +0 -75
  616. package/src/duckdb/src/include/duckdb/storage/statistics/string_statistics.hpp +0 -49
  617. package/src/duckdb/src/include/duckdb/storage/statistics/struct_statistics.hpp +0 -36
  618. package/src/duckdb/src/include/duckdb/storage/statistics/validity_statistics.hpp +0 -45
  619. package/src/duckdb/src/parser/parsed_data/alter_function_info.cpp +0 -55
  620. package/src/duckdb/src/storage/statistics/list_statistics.cpp +0 -94
  621. package/src/duckdb/src/storage/statistics/numeric_statistics.cpp +0 -307
  622. package/src/duckdb/src/storage/statistics/string_statistics.cpp +0 -220
  623. package/src/duckdb/src/storage/statistics/struct_statistics.cpp +0 -108
  624. package/src/duckdb/src/storage/statistics/validity_statistics.cpp +0 -91
  625. package/src/duckdb/src/storage/table/segment_tree.cpp +0 -179
@@ -7,6 +7,7 @@
7
7
  #include "duckdb/planner/operator/list.hpp"
8
8
 
9
9
  #include <algorithm>
10
+ #include <cmath>
10
11
 
11
12
  namespace std {
12
13
 
@@ -113,7 +114,7 @@ bool JoinOrderOptimizer::ExtractJoinRelations(LogicalOperator &input_op, vector<
113
114
  bool non_reorderable_operation = false;
114
115
  if (op->type == LogicalOperatorType::LOGICAL_UNION || op->type == LogicalOperatorType::LOGICAL_EXCEPT ||
115
116
  op->type == LogicalOperatorType::LOGICAL_INTERSECT || op->type == LogicalOperatorType::LOGICAL_DELIM_JOIN ||
116
- op->type == LogicalOperatorType::LOGICAL_ANY_JOIN) {
117
+ op->type == LogicalOperatorType::LOGICAL_ANY_JOIN || op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN) {
117
118
  // set operation, optimize separately in children
118
119
  non_reorderable_operation = true;
119
120
  }
@@ -138,7 +139,7 @@ bool JoinOrderOptimizer::ExtractJoinRelations(LogicalOperator &input_op, vector<
138
139
  std::swap(join.children[0], join.children[1]);
139
140
  for (auto &cond : join.conditions) {
140
141
  std::swap(cond.left, cond.right);
141
- cond.comparison = FlipComparisionExpression(cond.comparison);
142
+ cond.comparison = FlipComparisonExpression(cond.comparison);
142
143
  }
143
144
  }
144
145
  }
@@ -152,11 +153,11 @@ bool JoinOrderOptimizer::ExtractJoinRelations(LogicalOperator &input_op, vector<
152
153
  // new NULL values in the right side, so pushing this condition through the join leads to incorrect results
153
154
  // for this reason, we just start a new JoinOptimizer pass in each of the children of the join
154
155
 
155
- // Keep track of all of the filter bindings the new join order optimizer makes
156
+ // Keep track of all filter bindings the new join order optimizer makes
156
157
  vector<column_binding_map_t<ColumnBinding>> child_binding_maps;
157
158
  idx_t child_bindings_it = 0;
158
159
  for (auto &child : op->children) {
159
- child_binding_maps.emplace_back(column_binding_map_t<ColumnBinding>());
160
+ child_binding_maps.emplace_back();
160
161
  JoinOrderOptimizer optimizer(context);
161
162
  child = optimizer.Optimize(std::move(child));
162
163
  // save the relation bindings from the optimized child. These later all get added to the
@@ -184,6 +185,7 @@ bool JoinOrderOptimizer::ExtractJoinRelations(LogicalOperator &input_op, vector<
184
185
  }
185
186
 
186
187
  switch (op->type) {
188
+ case LogicalOperatorType::LOGICAL_ASOF_JOIN:
187
189
  case LogicalOperatorType::LOGICAL_COMPARISON_JOIN:
188
190
  case LogicalOperatorType::LOGICAL_CROSS_PRODUCT: {
189
191
  // inner join or cross product
@@ -222,12 +224,25 @@ bool JoinOrderOptimizer::ExtractJoinRelations(LogicalOperator &input_op, vector<
222
224
  }
223
225
  case LogicalOperatorType::LOGICAL_PROJECTION: {
224
226
  auto proj = (LogicalProjection *)op;
225
- // we run the join order optimizer witin the subquery as well
227
+ // we run the join order optimizer within the subquery as well
226
228
  JoinOrderOptimizer optimizer(context);
227
229
  op->children[0] = optimizer.Optimize(std::move(op->children[0]));
228
230
  // projection, add to the set of relations
229
231
  auto relation = make_unique<SingleJoinRelation>(&input_op, parent);
230
- relation_mapping[proj->table_index] = relations.size();
232
+ auto relation_id = relations.size();
233
+ // push one child column binding map back.
234
+ vector<column_binding_map_t<ColumnBinding>> child_binding_maps;
235
+ child_binding_maps.emplace_back();
236
+ optimizer.cardinality_estimator.CopyRelationMap(child_binding_maps.at(0));
237
+ // This logical projection may sit on top of a logical comparison join that has been pushed down
238
+ // we want to copy the binding info of both tables
239
+ relation_mapping[proj->table_index] = relation_id;
240
+ for (auto &binding_info : child_binding_maps.at(0)) {
241
+ cardinality_estimator.AddRelationToColumnMapping(
242
+ ColumnBinding(proj->table_index, binding_info.first.column_index), binding_info.second);
243
+ cardinality_estimator.AddColumnToRelationMap(binding_info.second.table_index,
244
+ binding_info.second.column_index);
245
+ }
231
246
  relations.push_back(std::move(relation));
232
247
  return true;
233
248
  }
@@ -756,7 +771,7 @@ JoinOrderOptimizer::GenerateJoins(vector<unique_ptr<LogicalOperator>> &extracted
756
771
 
757
772
  if (invert) {
758
773
  // reverse comparison expression if we reverse the order of the children
759
- cond.comparison = FlipComparisionExpression(cond.comparison);
774
+ cond.comparison = FlipComparisonExpression(cond.comparison);
760
775
  }
761
776
  join->conditions.push_back(std::move(cond));
762
777
  }
@@ -833,7 +848,7 @@ JoinOrderOptimizer::GenerateJoins(vector<unique_ptr<LogicalOperator>> &extracted
833
848
  cond.comparison = comparison.type;
834
849
  if (invert) {
835
850
  // reverse comparison expression if we reverse the order of the children
836
- cond.comparison = FlipComparisionExpression(comparison.type);
851
+ cond.comparison = FlipComparisonExpression(comparison.type);
837
852
  }
838
853
  // now find the join to push it into
839
854
  auto node = result_operator.get();
@@ -853,7 +868,8 @@ JoinOrderOptimizer::GenerateJoins(vector<unique_ptr<LogicalOperator>> &extracted
853
868
  result_operator->children[0] = std::move(comp_join);
854
869
  }
855
870
  } else {
856
- D_ASSERT(node->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN);
871
+ D_ASSERT(node->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN ||
872
+ node->type == LogicalOperatorType::LOGICAL_ASOF_JOIN);
857
873
  auto &comp_join = (LogicalComparisonJoin &)*node;
858
874
  comp_join.conditions.push_back(std::move(cond));
859
875
  }
@@ -869,9 +885,11 @@ unique_ptr<LogicalOperator> JoinOrderOptimizer::RewritePlan(unique_ptr<LogicalOp
869
885
 
870
886
  // first we will extract all relations from the main plan
871
887
  vector<unique_ptr<LogicalOperator>> extracted_relations;
888
+ extracted_relations.reserve(relations.size());
872
889
  for (auto &relation : relations) {
873
890
  extracted_relations.push_back(ExtractJoinRelation(*relation));
874
891
  }
892
+
875
893
  // now we generate the actual joins
876
894
  auto join_tree = GenerateJoins(extracted_relations, node);
877
895
  // perform the final pushdown of remaining filters
@@ -893,7 +911,8 @@ unique_ptr<LogicalOperator> JoinOrderOptimizer::RewritePlan(unique_ptr<LogicalOp
893
911
  auto op = plan.get();
894
912
  auto parent = plan.get();
895
913
  while (op->type != LogicalOperatorType::LOGICAL_CROSS_PRODUCT &&
896
- op->type != LogicalOperatorType::LOGICAL_COMPARISON_JOIN) {
914
+ op->type != LogicalOperatorType::LOGICAL_COMPARISON_JOIN &&
915
+ op->type != LogicalOperatorType::LOGICAL_ASOF_JOIN) {
897
916
  D_ASSERT(op->children.size() == 1);
898
917
  parent = op;
899
918
  op = op->children[0].get();
@@ -928,7 +947,8 @@ unique_ptr<LogicalOperator> JoinOrderOptimizer::Optimize(unique_ptr<LogicalOpera
928
947
  // filters in the process
929
948
  expression_set_t filter_set;
930
949
  for (auto &f_op : filter_operators) {
931
- if (f_op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN) {
950
+ if (f_op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN ||
951
+ f_op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN) {
932
952
  auto &join = (LogicalComparisonJoin &)*f_op;
933
953
  D_ASSERT(join.join_type == JoinType::INNER);
934
954
  D_ASSERT(join.expressions.empty());
@@ -999,7 +1019,7 @@ unique_ptr<LogicalOperator> JoinOrderOptimizer::Optimize(unique_ptr<LogicalOpera
999
1019
  for (idx_t i = 0; i < relations.size(); i++) {
1000
1020
  auto &rel = *relations[i];
1001
1021
  auto node = set_manager.GetJoinRelation(i);
1002
- nodes_ops.emplace_back(NodeOp(make_unique<JoinNode>(node, 0), rel.op));
1022
+ nodes_ops.emplace_back(make_unique<JoinNode>(node, 0), rel.op);
1003
1023
  }
1004
1024
 
1005
1025
  cardinality_estimator.InitCardinalityEstimatorProps(&nodes_ops, &filter_infos);
@@ -39,6 +39,7 @@ Optimizer::Optimizer(Binder &binder, ClientContext &context) : context(context),
39
39
  rewriter.rules.push_back(make_unique<EqualOrNullSimplification>(rewriter));
40
40
  rewriter.rules.push_back(make_unique<MoveConstantsRule>(rewriter));
41
41
  rewriter.rules.push_back(make_unique<LikeOptimizationRule>(rewriter));
42
+ rewriter.rules.push_back(make_unique<OrderedAggregateOptimizer>(rewriter));
42
43
  rewriter.rules.push_back(make_unique<RegexOptimizationRule>(rewriter));
43
44
  rewriter.rules.push_back(make_unique<EmptyNeedleRemovalRule>(rewriter));
44
45
  rewriter.rules.push_back(make_unique<EnumComparisonRule>(rewriter));
@@ -6,8 +6,8 @@ namespace duckdb {
6
6
 
7
7
  unique_ptr<LogicalOperator> FilterPullup::PullupFromLeft(unique_ptr<LogicalOperator> op) {
8
8
  D_ASSERT(op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN ||
9
- op->type == LogicalOperatorType::LOGICAL_ANY_JOIN || op->type == LogicalOperatorType::LOGICAL_EXCEPT ||
10
- op->type == LogicalOperatorType::LOGICAL_DELIM_JOIN);
9
+ op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN || op->type == LogicalOperatorType::LOGICAL_ANY_JOIN ||
10
+ op->type == LogicalOperatorType::LOGICAL_EXCEPT || op->type == LogicalOperatorType::LOGICAL_DELIM_JOIN);
11
11
 
12
12
  FilterPullup left_pullup(true, can_add_column);
13
13
  FilterPullup right_pullup(false, can_add_column);
@@ -9,6 +9,14 @@ namespace duckdb {
9
9
 
10
10
  using Filter = FilterPushdown::Filter;
11
11
 
12
+ static void ExtractFilterBindings(Expression &expr, vector<ColumnBinding> &bindings) {
13
+ if (expr.type == ExpressionType::BOUND_COLUMN_REF) {
14
+ auto &colref = (BoundColumnRefExpression &)expr;
15
+ bindings.push_back(colref.binding);
16
+ }
17
+ ExpressionIterator::EnumerateChildren(expr, [&](Expression &child) { ExtractFilterBindings(child, bindings); });
18
+ }
19
+
12
20
  static unique_ptr<Expression> ReplaceGroupBindings(LogicalAggregate &proj, unique_ptr<Expression> expr) {
13
21
  if (expr->type == ExpressionType::BOUND_COLUMN_REF) {
14
22
  auto &colref = (BoundColumnRefExpression &)*expr;
@@ -40,14 +48,34 @@ unique_ptr<LogicalOperator> FilterPushdown::PushdownAggregate(unique_ptr<Logical
40
48
  // filter on GROUPINGS function: cannot pushdown
41
49
  continue;
42
50
  }
43
- // if there are any empty grouping sets, we cannot push down filters
44
- bool has_empty_grouping_sets = false;
51
+ // no aggregate! we are filtering on a group
52
+ // we can only push this down if the filter is in all grouping sets
53
+ vector<ColumnBinding> bindings;
54
+ ExtractFilterBindings(*f.filter, bindings);
55
+
56
+ bool can_pushdown_filter = true;
57
+ if (aggr.grouping_sets.empty()) {
58
+ // empty grouping set - we cannot pushdown the filter
59
+ can_pushdown_filter = false;
60
+ }
45
61
  for (auto &grp : aggr.grouping_sets) {
46
- if (grp.empty()) {
47
- has_empty_grouping_sets = true;
62
+ // check for each of the grouping sets if they contain all groups
63
+ if (bindings.empty()) {
64
+ // we can never push down empty grouping sets
65
+ can_pushdown_filter = false;
66
+ break;
67
+ }
68
+ for (auto &binding : bindings) {
69
+ if (grp.find(binding.column_index) == grp.end()) {
70
+ can_pushdown_filter = false;
71
+ break;
72
+ }
73
+ }
74
+ if (!can_pushdown_filter) {
75
+ break;
48
76
  }
49
77
  }
50
- if (has_empty_grouping_sets) {
78
+ if (!can_pushdown_filter) {
51
79
  continue;
52
80
  }
53
81
  // no aggregate! we can push this down
@@ -46,7 +46,7 @@ unique_ptr<LogicalOperator> FilterPushdown::PushdownCrossProduct(unique_ptr<Logi
46
46
  right_bindings, join_expressions, conditions,
47
47
  arbitrary_expressions);
48
48
  // create the join from the join conditions
49
- return LogicalComparisonJoin::CreateJoin(JoinType::INNER, std::move(op->children[0]),
49
+ return LogicalComparisonJoin::CreateJoin(JoinType::INNER, JoinRefType::REGULAR, std::move(op->children[0]),
50
50
  std::move(op->children[1]), std::move(conditions),
51
51
  std::move(arbitrary_expressions));
52
52
  } else {
@@ -24,6 +24,9 @@ unique_ptr<LogicalOperator> FilterPushdown::PushdownInnerJoin(unique_ptr<Logical
24
24
  // filter statically evaluates to false, strip tree
25
25
  return make_unique<LogicalEmptyResult>(std::move(op));
26
26
  }
27
+ } else if (op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN) {
28
+ // Don't mess with non-standard condition interpretations
29
+ return FinishPushdown(std::move(op));
27
30
  } else {
28
31
  // comparison join
29
32
  D_ASSERT(op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN);
@@ -68,7 +68,9 @@ unique_ptr<LogicalOperator> FilterPushdown::PushdownLeftJoin(unique_ptr<LogicalO
68
68
  // for a comparison join we create a FilterCombiner that checks if we can push conditions on LHS join conditions
69
69
  // into the RHS of the join
70
70
  FilterCombiner filter_combiner(optimizer);
71
- if (op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN) {
71
+ const auto isComparison = (op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN ||
72
+ op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN);
73
+ if (isComparison) {
72
74
  // add all comparison conditions
73
75
  auto &comparison_join = (LogicalComparisonJoin &)*op;
74
76
  for (auto &cond : comparison_join.conditions) {
@@ -82,7 +84,7 @@ unique_ptr<LogicalOperator> FilterPushdown::PushdownLeftJoin(unique_ptr<LogicalO
82
84
  if (side == JoinSide::LEFT) {
83
85
  // bindings match left side
84
86
  // we can push the filter into the left side
85
- if (op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN) {
87
+ if (isComparison) {
86
88
  // we MIGHT be able to push it down the RHS as well, but only if it is a comparison that matches the
87
89
  // join predicates we use the FilterCombiner to figure this out add the expression to the FilterCombiner
88
90
  filter_combiner.AddFilter(filters[i]->filter->Copy());
@@ -122,16 +124,7 @@ unique_ptr<LogicalOperator> FilterPushdown::PushdownLeftJoin(unique_ptr<LogicalO
122
124
  right_pushdown.GenerateFilters();
123
125
  op->children[0] = left_pushdown.Rewrite(std::move(op->children[0]));
124
126
  op->children[1] = right_pushdown.Rewrite(std::move(op->children[1]));
125
- if (filters.empty()) {
126
- // no filters to push
127
- return op;
128
- }
129
- auto filter = make_unique<LogicalFilter>();
130
- for (auto &f : filters) {
131
- filter->expressions.push_back(std::move(f->filter));
132
- }
133
- filter->children.push_back(std::move(op));
134
- return std::move(filter);
127
+ return PushFinalFilters(std::move(op));
135
128
  }
136
129
 
137
130
  } // namespace duckdb
@@ -13,7 +13,7 @@ unique_ptr<LogicalOperator> FilterPushdown::PushdownMarkJoin(unique_ptr<LogicalO
13
13
  auto &comp_join = (LogicalComparisonJoin &)*op;
14
14
  D_ASSERT(join.join_type == JoinType::MARK);
15
15
  D_ASSERT(op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN ||
16
- op->type == LogicalOperatorType::LOGICAL_DELIM_JOIN);
16
+ op->type == LogicalOperatorType::LOGICAL_DELIM_JOIN || op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN);
17
17
 
18
18
  right_bindings.insert(comp_join.mark_index);
19
19
  FilterPushdown left_pushdown(optimizer), right_pushdown(optimizer);
@@ -77,7 +77,7 @@ unique_ptr<LogicalOperator> FilterPushdown::PushdownMarkJoin(unique_ptr<LogicalO
77
77
  }
78
78
  op->children[0] = left_pushdown.Rewrite(std::move(op->children[0]));
79
79
  op->children[1] = right_pushdown.Rewrite(std::move(op->children[1]));
80
- return FinishPushdown(std::move(op));
80
+ return PushFinalFilters(std::move(op));
81
81
  }
82
82
 
83
83
  } // namespace duckdb
@@ -23,7 +23,7 @@ unique_ptr<LogicalOperator> FilterPushdown::PushdownSingleJoin(unique_ptr<Logica
23
23
  }
24
24
  op->children[0] = left_pushdown.Rewrite(std::move(op->children[0]));
25
25
  op->children[1] = right_pushdown.Rewrite(std::move(op->children[1]));
26
- return FinishPushdown(std::move(op));
26
+ return PushFinalFilters(std::move(op));
27
27
  }
28
28
 
29
29
  } // namespace duckdb
@@ -71,6 +71,7 @@ void RemoveUnusedColumns::VisitOperator(LogicalOperator &op) {
71
71
  remove.VisitOperator(*op.children[0]);
72
72
  return;
73
73
  }
74
+ case LogicalOperatorType::LOGICAL_ASOF_JOIN:
74
75
  case LogicalOperatorType::LOGICAL_DELIM_JOIN:
75
76
  case LogicalOperatorType::LOGICAL_COMPARISON_JOIN: {
76
77
  if (!everything_referenced) {
@@ -73,7 +73,10 @@ unique_ptr<Expression> MoveConstantsRule::Apply(LogicalOperator &op, vector<Expr
73
73
  }
74
74
  auto result_value = Value::HUGEINT(outer_value);
75
75
  if (!result_value.DefaultTryCastAs(constant_type)) {
76
- // if the cast is not possible then the comparison is not possible
76
+ // if the cast is not possible then an equality comparison is not possible
77
+ if (comparison->type != ExpressionType::COMPARE_EQUAL) {
78
+ return nullptr;
79
+ }
77
80
  return ExpressionRewriter::ConstantOrNull(std::move(arithmetic->children[arithmetic_child_index]),
78
81
  Value::BOOLEAN(false));
79
82
  }
@@ -86,14 +89,17 @@ unique_ptr<Expression> MoveConstantsRule::Apply(LogicalOperator &op, vector<Expr
86
89
  }
87
90
  auto result_value = Value::HUGEINT(inner_value);
88
91
  if (!result_value.DefaultTryCastAs(constant_type)) {
89
- // if the cast is not possible then the comparison is not possible
92
+ // if the cast is not possible then an equality comparison is not possible
93
+ if (comparison->type != ExpressionType::COMPARE_EQUAL) {
94
+ return nullptr;
95
+ }
90
96
  return ExpressionRewriter::ConstantOrNull(std::move(arithmetic->children[arithmetic_child_index]),
91
97
  Value::BOOLEAN(false));
92
98
  }
93
99
  outer_constant->value = std::move(result_value);
94
100
  // in this case, we should also flip the comparison
95
101
  // e.g. if we have [4 - x < 2] then we should have [x > 2]
96
- comparison->type = FlipComparisionExpression(comparison->type);
102
+ comparison->type = FlipComparisonExpression(comparison->type);
97
103
  }
98
104
  } else {
99
105
  D_ASSERT(op_type == "*");
@@ -123,7 +129,7 @@ unique_ptr<Expression> MoveConstantsRule::Apply(LogicalOperator &op, vector<Expr
123
129
  }
124
130
  if (inner_value < 0) {
125
131
  // multiply by negative value, need to flip expression
126
- comparison->type = FlipComparisionExpression(comparison->type);
132
+ comparison->type = FlipComparisonExpression(comparison->type);
127
133
  }
128
134
  // else divide the RHS by the LHS
129
135
  // we need to do a range check on the cast even though we do a division
@@ -0,0 +1,30 @@
1
+ #include "duckdb/optimizer/rule/ordered_aggregate_optimizer.hpp"
2
+
3
+ #include "duckdb/optimizer/matcher/expression_matcher.hpp"
4
+ #include "duckdb/planner/expression/bound_aggregate_expression.hpp"
5
+
6
+ namespace duckdb {
7
+
8
+ OrderedAggregateOptimizer::OrderedAggregateOptimizer(ExpressionRewriter &rewriter) : Rule(rewriter) {
9
+ // we match on an OR expression within a LogicalFilter node
10
+ root = make_unique<ExpressionMatcher>();
11
+ root->expr_class = ExpressionClass::BOUND_AGGREGATE;
12
+ }
13
+
14
+ unique_ptr<Expression> OrderedAggregateOptimizer::Apply(LogicalOperator &op, vector<Expression *> &bindings,
15
+ bool &changes_made, bool is_root) {
16
+ auto aggr = (BoundAggregateExpression *)bindings[0];
17
+ if (!aggr->order_bys) {
18
+ // no ORDER BYs defined
19
+ return nullptr;
20
+ }
21
+ if (aggr->function.order_dependent == AggregateOrderDependent::NOT_ORDER_DEPENDENT) {
22
+ // not an order dependent aggregate but we have an ORDER BY clause - remove it
23
+ aggr->order_bys.reset();
24
+ changes_made = true;
25
+ return nullptr;
26
+ }
27
+ return nullptr;
28
+ }
29
+
30
+ } // namespace duckdb
@@ -35,7 +35,7 @@ unique_ptr<Expression> RegexOptimizationRule::Apply(LogicalOperator &op, vector<
35
35
 
36
36
  auto constant_value = ExpressionExecutor::EvaluateScalar(GetContext(), *constant_expr);
37
37
  D_ASSERT(constant_value.type() == constant_expr->return_type);
38
- auto &patt_str = StringValue::Get(constant_value);
38
+ auto patt_str = StringValue::Get(constant_value);
39
39
 
40
40
  duckdb_re2::RE2 pattern(patt_str);
41
41
  if (!pattern.ok()) {
@@ -47,7 +47,14 @@ unique_ptr<Expression> RegexOptimizationRule::Apply(LogicalOperator &op, vector<
47
47
  auto contains = make_unique<BoundFunctionExpression>(root->return_type, ContainsFun::GetFunction(),
48
48
  std::move(root->children), nullptr);
49
49
 
50
- contains->children[1] = make_unique<BoundConstantExpression>(Value(patt_str));
50
+ string min;
51
+ string max;
52
+ pattern.PossibleMatchRange(&min, &max, patt_str.size());
53
+ if (min == max) {
54
+ contains->children[1] = make_unique<BoundConstantExpression>(Value(std::move(min)));
55
+ } else {
56
+ contains->children[1] = make_unique<BoundConstantExpression>(Value(std::move(patt_str)));
57
+ }
51
58
  return std::move(contains);
52
59
  }
53
60
  return nullptr;
@@ -5,15 +5,21 @@ namespace duckdb {
5
5
 
6
6
  unique_ptr<BaseStatistics> StatisticsPropagator::PropagateExpression(BoundAggregateExpression &aggr,
7
7
  unique_ptr<Expression> *expr_ptr) {
8
- vector<unique_ptr<BaseStatistics>> stats;
8
+ vector<BaseStatistics> stats;
9
9
  stats.reserve(aggr.children.size());
10
10
  for (auto &child : aggr.children) {
11
- stats.push_back(PropagateExpression(child));
11
+ auto stat = PropagateExpression(child);
12
+ if (!stat) {
13
+ stats.push_back(BaseStatistics::CreateUnknown(child->return_type));
14
+ } else {
15
+ stats.push_back(stat->Copy());
16
+ }
12
17
  }
13
18
  if (!aggr.function.statistics) {
14
19
  return nullptr;
15
20
  }
16
- return aggr.function.statistics(context, aggr, aggr.bind_info.get(), stats, node_stats.get());
21
+ AggregateStatisticsInput input(aggr.bind_info.get(), stats, node_stats.get());
22
+ return aggr.function.statistics(context, aggr, input);
17
23
  }
18
24
 
19
25
  } // namespace duckdb
@@ -5,7 +5,6 @@
5
5
  #include "duckdb/planner/expression/bound_constant_expression.hpp"
6
6
  #include "duckdb/planner/expression/bound_function_expression.hpp"
7
7
  #include "duckdb/storage/statistics/base_statistics.hpp"
8
- #include "duckdb/storage/statistics/numeric_statistics.hpp"
9
8
  #include "duckdb/common/operator/subtract.hpp"
10
9
 
11
10
  namespace duckdb {
@@ -44,14 +43,14 @@ bool GetCastType(hugeint_t range, LogicalType &cast_type) {
44
43
  }
45
44
 
46
45
  template <class T>
47
- unique_ptr<Expression> TemplatedCastToSmallestType(unique_ptr<Expression> expr, NumericStatistics &num_stats) {
46
+ unique_ptr<Expression> TemplatedCastToSmallestType(unique_ptr<Expression> expr, BaseStatistics &stats) {
48
47
  // Compute range
49
- if (num_stats.min.IsNull() || num_stats.max.IsNull()) {
48
+ if (!NumericStats::HasMinMax(stats)) {
50
49
  return expr;
51
50
  }
52
51
 
53
- auto signed_min_val = num_stats.min.GetValue<T>();
54
- auto signed_max_val = num_stats.max.GetValue<T>();
52
+ auto signed_min_val = NumericStats::Min(stats).GetValue<T>();
53
+ auto signed_max_val = NumericStats::Max(stats).GetValue<T>();
55
54
  if (signed_max_val < signed_min_val) {
56
55
  return expr;
57
56
  }
@@ -82,7 +81,7 @@ unique_ptr<Expression> TemplatedCastToSmallestType(unique_ptr<Expression> expr,
82
81
  return BoundCastExpression::AddDefaultCastToType(std::move(minus_expr), cast_type);
83
82
  }
84
83
 
85
- unique_ptr<Expression> CastToSmallestType(unique_ptr<Expression> expr, NumericStatistics &num_stats) {
84
+ unique_ptr<Expression> CastToSmallestType(unique_ptr<Expression> expr, BaseStatistics &num_stats) {
86
85
  auto physical_type = expr->return_type.InternalType();
87
86
  switch (physical_type) {
88
87
  case PhysicalType::UINT8:
@@ -111,7 +110,7 @@ void StatisticsPropagator::PropagateAndCompress(unique_ptr<Expression> &expr, un
111
110
  stats = PropagateExpression(expr);
112
111
  if (stats) {
113
112
  if (expr->return_type.IsIntegral()) {
114
- expr = CastToSmallestType(std::move(expr), (NumericStatistics &)*stats);
113
+ expr = CastToSmallestType(std::move(expr), *stats);
115
114
  }
116
115
  }
117
116
  }
@@ -1,24 +1,27 @@
1
1
  #include "duckdb/optimizer/statistics_propagator.hpp"
2
2
  #include "duckdb/planner/expression/bound_cast_expression.hpp"
3
- #include "duckdb/storage/statistics/numeric_statistics.hpp"
4
3
 
5
4
  namespace duckdb {
6
5
 
7
- static unique_ptr<BaseStatistics> StatisticsOperationsNumericNumericCast(const BaseStatistics *input_p,
6
+ static unique_ptr<BaseStatistics> StatisticsOperationsNumericNumericCast(const BaseStatistics &input,
8
7
  const LogicalType &target) {
9
- auto &input = (NumericStatistics &)*input_p;
10
-
11
- Value min = input.min, max = input.max;
8
+ if (!NumericStats::HasMinMax(input)) {
9
+ return nullptr;
10
+ }
11
+ Value min = NumericStats::Min(input);
12
+ Value max = NumericStats::Max(input);
12
13
  if (!min.DefaultTryCastAs(target) || !max.DefaultTryCastAs(target)) {
13
14
  // overflow in cast: bailout
14
15
  return nullptr;
15
16
  }
16
- auto stats = make_unique<NumericStatistics>(target, std::move(min), std::move(max), input.stats_type);
17
- stats->CopyBase(*input_p);
18
- return std::move(stats);
17
+ auto result = NumericStats::CreateEmpty(target);
18
+ result.CopyBase(input);
19
+ NumericStats::SetMin(result, min);
20
+ NumericStats::SetMax(result, max);
21
+ return result.ToUnique();
19
22
  }
20
23
 
21
- static unique_ptr<BaseStatistics> StatisticsNumericCastSwitch(const BaseStatistics *input, const LogicalType &target) {
24
+ static unique_ptr<BaseStatistics> StatisticsNumericCastSwitch(const BaseStatistics &input, const LogicalType &target) {
22
25
  switch (target.InternalType()) {
23
26
  case PhysicalType::INT8:
24
27
  case PhysicalType::INT16:
@@ -48,13 +51,13 @@ unique_ptr<BaseStatistics> StatisticsPropagator::PropagateExpression(BoundCastEx
48
51
  case PhysicalType::INT128:
49
52
  case PhysicalType::FLOAT:
50
53
  case PhysicalType::DOUBLE:
51
- result_stats = StatisticsNumericCastSwitch(child_stats.get(), cast.return_type);
54
+ result_stats = StatisticsNumericCastSwitch(*child_stats, cast.return_type);
52
55
  break;
53
56
  default:
54
57
  return nullptr;
55
58
  }
56
59
  if (cast.try_cast && result_stats) {
57
- result_stats->validity_stats = make_unique<ValidityStatistics>(true, true);
60
+ result_stats->Set(StatsInfo::CAN_HAVE_NULL_VALUES);
58
61
  }
59
62
  return result_stats;
60
63
  }
@@ -9,7 +9,7 @@ unique_ptr<BaseStatistics> StatisticsPropagator::PropagateExpression(BoundColumn
9
9
  if (stats == statistics_map.end()) {
10
10
  return nullptr;
11
11
  }
12
- return stats->second->Copy();
12
+ return stats->second->ToUnique();
13
13
  }
14
14
 
15
15
  } // namespace duckdb
@@ -1,15 +1,14 @@
1
1
  #include "duckdb/optimizer/statistics_propagator.hpp"
2
2
  #include "duckdb/planner/expression/bound_comparison_expression.hpp"
3
3
  #include "duckdb/planner/expression/bound_constant_expression.hpp"
4
- #include "duckdb/storage/statistics/numeric_statistics.hpp"
5
4
  #include "duckdb/optimizer/expression_rewriter.hpp"
6
5
 
7
6
  namespace duckdb {
8
7
 
9
- FilterPropagateResult StatisticsPropagator::PropagateComparison(BaseStatistics &left, BaseStatistics &right,
8
+ FilterPropagateResult StatisticsPropagator::PropagateComparison(BaseStatistics &lstats, BaseStatistics &rstats,
10
9
  ExpressionType comparison) {
11
10
  // only handle numerics for now
12
- switch (left.type.InternalType()) {
11
+ switch (lstats.GetType().InternalType()) {
13
12
  case PhysicalType::BOOL:
14
13
  case PhysicalType::UINT8:
15
14
  case PhysicalType::UINT16:
@@ -26,9 +25,7 @@ FilterPropagateResult StatisticsPropagator::PropagateComparison(BaseStatistics &
26
25
  default:
27
26
  return FilterPropagateResult::NO_PRUNING_POSSIBLE;
28
27
  }
29
- auto &lstats = (NumericStatistics &)left;
30
- auto &rstats = (NumericStatistics &)right;
31
- if (lstats.min.IsNull() || lstats.max.IsNull() || rstats.min.IsNull() || rstats.max.IsNull()) {
28
+ if (!NumericStats::HasMinMax(lstats) || !NumericStats::HasMinMax(rstats)) {
32
29
  // no stats available: nothing to prune
33
30
  return FilterPropagateResult::NO_PRUNING_POSSIBLE;
34
31
  }
@@ -38,52 +35,53 @@ FilterPropagateResult StatisticsPropagator::PropagateComparison(BaseStatistics &
38
35
  switch (comparison) {
39
36
  case ExpressionType::COMPARE_EQUAL:
40
37
  // l = r, if l.min > r.max or r.min > l.max equality is not possible
41
- if (lstats.min > rstats.max || rstats.min > lstats.max) {
38
+ if (NumericStats::Min(lstats) > NumericStats::Max(rstats) ||
39
+ NumericStats::Min(rstats) > NumericStats::Max(lstats)) {
42
40
  return has_null ? FilterPropagateResult::FILTER_FALSE_OR_NULL : FilterPropagateResult::FILTER_ALWAYS_FALSE;
43
41
  } else {
44
42
  return FilterPropagateResult::NO_PRUNING_POSSIBLE;
45
43
  }
46
44
  case ExpressionType::COMPARE_GREATERTHAN:
47
45
  // l > r
48
- if (lstats.min > rstats.max) {
46
+ if (NumericStats::Min(lstats) > NumericStats::Max(rstats)) {
49
47
  // if l.min > r.max, it is always true ONLY if neither side contains nulls
50
48
  return has_null ? FilterPropagateResult::FILTER_TRUE_OR_NULL : FilterPropagateResult::FILTER_ALWAYS_TRUE;
51
49
  }
52
50
  // if r.min is bigger or equal to l.max, the filter is always false
53
- if (rstats.min >= lstats.max) {
51
+ if (NumericStats::Min(rstats) >= NumericStats::Max(lstats)) {
54
52
  return has_null ? FilterPropagateResult::FILTER_FALSE_OR_NULL : FilterPropagateResult::FILTER_ALWAYS_FALSE;
55
53
  }
56
54
  return FilterPropagateResult::NO_PRUNING_POSSIBLE;
57
55
  case ExpressionType::COMPARE_GREATERTHANOREQUALTO:
58
56
  // l >= r
59
- if (lstats.min >= rstats.max) {
57
+ if (NumericStats::Min(lstats) >= NumericStats::Max(rstats)) {
60
58
  // if l.min >= r.max, it is always true ONLY if neither side contains nulls
61
59
  return has_null ? FilterPropagateResult::FILTER_TRUE_OR_NULL : FilterPropagateResult::FILTER_ALWAYS_TRUE;
62
60
  }
63
61
  // if r.min > l.max, the filter is always false
64
- if (rstats.min > lstats.max) {
62
+ if (NumericStats::Min(rstats) > NumericStats::Max(lstats)) {
65
63
  return has_null ? FilterPropagateResult::FILTER_FALSE_OR_NULL : FilterPropagateResult::FILTER_ALWAYS_FALSE;
66
64
  }
67
65
  return FilterPropagateResult::NO_PRUNING_POSSIBLE;
68
66
  case ExpressionType::COMPARE_LESSTHAN:
69
67
  // l < r
70
- if (lstats.max < rstats.min) {
68
+ if (NumericStats::Max(lstats) < NumericStats::Min(rstats)) {
71
69
  // if l.max < r.min, it is always true ONLY if neither side contains nulls
72
70
  return has_null ? FilterPropagateResult::FILTER_TRUE_OR_NULL : FilterPropagateResult::FILTER_ALWAYS_TRUE;
73
71
  }
74
72
  // if l.min >= rstats.max, the filter is always false
75
- if (lstats.min >= rstats.max) {
73
+ if (NumericStats::Min(lstats) >= NumericStats::Max(rstats)) {
76
74
  return has_null ? FilterPropagateResult::FILTER_FALSE_OR_NULL : FilterPropagateResult::FILTER_ALWAYS_FALSE;
77
75
  }
78
76
  return FilterPropagateResult::NO_PRUNING_POSSIBLE;
79
77
  case ExpressionType::COMPARE_LESSTHANOREQUALTO:
80
78
  // l <= r
81
- if (lstats.max <= rstats.min) {
79
+ if (NumericStats::Max(lstats) <= NumericStats::Min(rstats)) {
82
80
  // if l.max <= r.min, it is always true ONLY if neither side contains nulls
83
81
  return has_null ? FilterPropagateResult::FILTER_TRUE_OR_NULL : FilterPropagateResult::FILTER_ALWAYS_TRUE;
84
82
  }
85
83
  // if l.min > rstats.max, the filter is always false
86
- if (lstats.min > rstats.max) {
84
+ if (NumericStats::Min(lstats) > NumericStats::Max(rstats)) {
87
85
  return has_null ? FilterPropagateResult::FILTER_FALSE_OR_NULL : FilterPropagateResult::FILTER_ALWAYS_FALSE;
88
86
  }
89
87
  return FilterPropagateResult::NO_PRUNING_POSSIBLE;
@@ -2,7 +2,6 @@
2
2
  #include "duckdb/optimizer/statistics_propagator.hpp"
3
3
  #include "duckdb/planner/expression/bound_conjunction_expression.hpp"
4
4
  #include "duckdb/planner/expression/bound_constant_expression.hpp"
5
- #include "duckdb/storage/statistics/numeric_statistics.hpp"
6
5
  #include "duckdb/optimizer/expression_rewriter.hpp"
7
6
  #include "duckdb/execution/expression_executor.hpp"
8
7