duckdb 0.7.2-dev0.0 → 0.7.2-dev1034.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (590) hide show
  1. package/binding.gyp +12 -7
  2. package/lib/duckdb.d.ts +55 -2
  3. package/lib/duckdb.js +20 -1
  4. package/package.json +1 -1
  5. package/src/connection.cpp +1 -2
  6. package/src/database.cpp +1 -1
  7. package/src/duckdb/extension/icu/icu-extension.cpp +4 -0
  8. package/src/duckdb/extension/icu/icu-list-range.cpp +207 -0
  9. package/src/duckdb/extension/icu/icu-table-range.cpp +194 -0
  10. package/src/duckdb/extension/icu/include/icu-list-range.hpp +17 -0
  11. package/src/duckdb/extension/icu/include/icu-table-range.hpp +17 -0
  12. package/src/duckdb/extension/json/include/json_common.hpp +1 -0
  13. package/src/duckdb/extension/json/include/json_functions.hpp +2 -0
  14. package/src/duckdb/extension/json/include/json_serializer.hpp +77 -0
  15. package/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp +147 -0
  16. package/src/duckdb/extension/json/json_functions/read_json.cpp +6 -5
  17. package/src/duckdb/extension/json/json_functions.cpp +12 -4
  18. package/src/duckdb/extension/json/json_scan.cpp +2 -2
  19. package/src/duckdb/extension/json/json_serializer.cpp +217 -0
  20. package/src/duckdb/extension/parquet/column_reader.cpp +94 -15
  21. package/src/duckdb/extension/parquet/column_writer.cpp +0 -1
  22. package/src/duckdb/extension/parquet/include/column_reader.hpp +1 -2
  23. package/src/duckdb/extension/parquet/include/decode_utils.hpp +5 -4
  24. package/src/duckdb/extension/parquet/include/generated_column_reader.hpp +1 -11
  25. package/src/duckdb/extension/parquet/include/parquet_timestamp.hpp +2 -1
  26. package/src/duckdb/extension/parquet/parquet-extension.cpp +12 -2
  27. package/src/duckdb/extension/parquet/parquet_reader.cpp +1 -1
  28. package/src/duckdb/extension/parquet/parquet_statistics.cpp +26 -32
  29. package/src/duckdb/extension/parquet/parquet_timestamp.cpp +16 -6
  30. package/src/duckdb/src/catalog/catalog.cpp +34 -5
  31. package/src/duckdb/src/catalog/catalog_entry/duck_schema_entry.cpp +4 -0
  32. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +2 -21
  33. package/src/duckdb/src/catalog/catalog_entry/scalar_function_catalog_entry.cpp +7 -6
  34. package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +3 -3
  35. package/src/duckdb/src/catalog/catalog_entry/table_function_catalog_entry.cpp +20 -1
  36. package/src/duckdb/src/catalog/catalog_entry/type_catalog_entry.cpp +8 -2
  37. package/src/duckdb/src/catalog/catalog_set.cpp +1 -0
  38. package/src/duckdb/src/catalog/default/default_functions.cpp +3 -0
  39. package/src/duckdb/src/catalog/dependency_list.cpp +12 -0
  40. package/src/duckdb/src/catalog/duck_catalog.cpp +34 -7
  41. package/src/duckdb/src/common/arrow/arrow_appender.cpp +48 -4
  42. package/src/duckdb/src/common/arrow/arrow_converter.cpp +1 -1
  43. package/src/duckdb/src/common/box_renderer.cpp +109 -23
  44. package/src/duckdb/src/common/enums/expression_type.cpp +8 -222
  45. package/src/duckdb/src/common/enums/join_type.cpp +3 -22
  46. package/src/duckdb/src/common/enums/logical_operator_type.cpp +2 -0
  47. package/src/duckdb/src/common/enums/statement_type.cpp +2 -0
  48. package/src/duckdb/src/common/exception.cpp +15 -1
  49. package/src/duckdb/src/common/field_writer.cpp +1 -0
  50. package/src/duckdb/src/common/operator/cast_operators.cpp +1 -1
  51. package/src/duckdb/src/common/preserved_error.cpp +7 -5
  52. package/src/duckdb/src/common/serializer/buffered_deserializer.cpp +4 -0
  53. package/src/duckdb/src/common/serializer/buffered_file_reader.cpp +15 -2
  54. package/src/duckdb/src/common/serializer/enum_serializer.cpp +1176 -0
  55. package/src/duckdb/src/common/sort/sort_state.cpp +5 -7
  56. package/src/duckdb/src/common/sort/sorted_block.cpp +0 -1
  57. package/src/duckdb/src/common/string_util.cpp +4 -1
  58. package/src/duckdb/src/common/types/bit.cpp +166 -87
  59. package/src/duckdb/src/common/types/blob.cpp +1 -1
  60. package/src/duckdb/src/common/types/chunk_collection.cpp +2 -2
  61. package/src/duckdb/src/common/types/column_data_collection.cpp +39 -2
  62. package/src/duckdb/src/common/types/column_data_collection_segment.cpp +11 -6
  63. package/src/duckdb/src/common/types/data_chunk.cpp +1 -1
  64. package/src/duckdb/src/common/types/time.cpp +13 -0
  65. package/src/duckdb/src/common/types/value.cpp +320 -154
  66. package/src/duckdb/src/common/types/vector.cpp +155 -127
  67. package/src/duckdb/src/common/types.cpp +313 -153
  68. package/src/duckdb/src/common/vector_operations/vector_cast.cpp +2 -1
  69. package/src/duckdb/src/execution/aggregate_hashtable.cpp +10 -5
  70. package/src/duckdb/src/execution/column_binding_resolver.cpp +21 -5
  71. package/src/duckdb/src/execution/expression_executor/execute_cast.cpp +2 -1
  72. package/src/duckdb/src/execution/index/art/art.cpp +6 -5
  73. package/src/duckdb/src/execution/operator/aggregate/physical_perfecthash_aggregate.cpp +4 -5
  74. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +117 -26
  75. package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +3 -0
  76. package/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp +5 -3
  77. package/src/duckdb/src/execution/operator/join/physical_blockwise_nl_join.cpp +64 -17
  78. package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +2 -2
  79. package/src/duckdb/src/execution/operator/join/physical_index_join.cpp +12 -4
  80. package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +6 -11
  81. package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +3 -1
  82. package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +6 -3
  83. package/src/duckdb/src/execution/operator/persistent/buffered_csv_reader.cpp +6 -14
  84. package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +2 -2
  85. package/src/duckdb/src/execution/operator/projection/physical_projection.cpp +34 -0
  86. package/src/duckdb/src/execution/operator/scan/physical_positional_scan.cpp +20 -5
  87. package/src/duckdb/src/execution/operator/schema/physical_create_type.cpp +20 -40
  88. package/src/duckdb/src/execution/partitionable_hashtable.cpp +14 -2
  89. package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +21 -16
  90. package/src/duckdb/src/execution/physical_plan/plan_asof_join.cpp +97 -0
  91. package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +95 -47
  92. package/src/duckdb/src/execution/physical_plan/plan_distinct.cpp +5 -8
  93. package/src/duckdb/src/execution/physical_plan/plan_positional_join.cpp +14 -5
  94. package/src/duckdb/src/execution/physical_plan_generator.cpp +3 -0
  95. package/src/duckdb/src/execution/window_segment_tree.cpp +173 -1
  96. package/src/duckdb/src/function/aggregate/algebraic/avg.cpp +0 -6
  97. package/src/duckdb/src/function/aggregate/distributive/bitagg.cpp +99 -95
  98. package/src/duckdb/src/function/aggregate/distributive/bitstring_agg.cpp +269 -0
  99. package/src/duckdb/src/function/aggregate/distributive/bool.cpp +2 -0
  100. package/src/duckdb/src/function/aggregate/distributive/count.cpp +3 -4
  101. package/src/duckdb/src/function/aggregate/distributive/first.cpp +1 -0
  102. package/src/duckdb/src/function/aggregate/distributive/minmax.cpp +2 -0
  103. package/src/duckdb/src/function/aggregate/distributive/sum.cpp +19 -16
  104. package/src/duckdb/src/function/aggregate/distributive_functions.cpp +1 -0
  105. package/src/duckdb/src/function/aggregate/holistic/approximate_quantile.cpp +5 -2
  106. package/src/duckdb/src/function/aggregate/holistic/mode.cpp +1 -1
  107. package/src/duckdb/src/function/aggregate/holistic/quantile.cpp +16 -1
  108. package/src/duckdb/src/function/aggregate/nested/list.cpp +8 -8
  109. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +58 -16
  110. package/src/duckdb/src/function/cast/bit_cast.cpp +0 -2
  111. package/src/duckdb/src/function/cast/blob_cast.cpp +0 -1
  112. package/src/duckdb/src/function/cast/cast_function_set.cpp +1 -1
  113. package/src/duckdb/src/function/cast/enum_casts.cpp +25 -3
  114. package/src/duckdb/src/function/cast/list_casts.cpp +17 -4
  115. package/src/duckdb/src/function/cast/map_cast.cpp +5 -2
  116. package/src/duckdb/src/function/cast/string_cast.cpp +36 -10
  117. package/src/duckdb/src/function/cast/struct_cast.cpp +24 -4
  118. package/src/duckdb/src/function/cast/time_casts.cpp +2 -2
  119. package/src/duckdb/src/function/cast/union_casts.cpp +33 -7
  120. package/src/duckdb/src/function/function_binder.cpp +1 -8
  121. package/src/duckdb/src/function/scalar/bit/bitstring.cpp +100 -0
  122. package/src/duckdb/src/function/scalar/date/current.cpp +0 -2
  123. package/src/duckdb/src/function/scalar/date/date_diff.cpp +0 -1
  124. package/src/duckdb/src/function/scalar/date/date_part.cpp +18 -26
  125. package/src/duckdb/src/function/scalar/date/date_sub.cpp +0 -1
  126. package/src/duckdb/src/function/scalar/date/date_trunc.cpp +10 -14
  127. package/src/duckdb/src/function/scalar/generic/stats.cpp +2 -4
  128. package/src/duckdb/src/function/scalar/list/contains_or_position.cpp +4 -146
  129. package/src/duckdb/src/function/scalar/list/flatten.cpp +5 -12
  130. package/src/duckdb/src/function/scalar/list/list_aggregates.cpp +1 -1
  131. package/src/duckdb/src/function/scalar/list/list_concat.cpp +8 -12
  132. package/src/duckdb/src/function/scalar/list/list_extract.cpp +5 -12
  133. package/src/duckdb/src/function/scalar/list/list_lambdas.cpp +7 -3
  134. package/src/duckdb/src/function/scalar/list/list_value.cpp +6 -10
  135. package/src/duckdb/src/function/scalar/map/map.cpp +47 -1
  136. package/src/duckdb/src/function/scalar/map/map_entries.cpp +61 -0
  137. package/src/duckdb/src/function/scalar/map/map_extract.cpp +68 -26
  138. package/src/duckdb/src/function/scalar/map/map_keys_values.cpp +97 -0
  139. package/src/duckdb/src/function/scalar/math/numeric.cpp +101 -17
  140. package/src/duckdb/src/function/scalar/math_functions.cpp +3 -0
  141. package/src/duckdb/src/function/scalar/nested_functions.cpp +3 -0
  142. package/src/duckdb/src/function/scalar/operators/add.cpp +0 -9
  143. package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +29 -48
  144. package/src/duckdb/src/function/scalar/operators/bitwise.cpp +0 -63
  145. package/src/duckdb/src/function/scalar/operators/multiply.cpp +5 -6
  146. package/src/duckdb/src/function/scalar/operators/subtract.cpp +0 -6
  147. package/src/duckdb/src/function/scalar/string/caseconvert.cpp +2 -6
  148. package/src/duckdb/src/function/scalar/string/hex.cpp +201 -0
  149. package/src/duckdb/src/function/scalar/string/instr.cpp +2 -6
  150. package/src/duckdb/src/function/scalar/string/length.cpp +2 -6
  151. package/src/duckdb/src/function/scalar/string/like.cpp +2 -6
  152. package/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp +243 -0
  153. package/src/duckdb/src/function/scalar/string/regexp/regexp_util.cpp +79 -0
  154. package/src/duckdb/src/function/scalar/string/regexp.cpp +21 -80
  155. package/src/duckdb/src/function/scalar/string/substring.cpp +2 -6
  156. package/src/duckdb/src/function/scalar/string_functions.cpp +2 -0
  157. package/src/duckdb/src/function/scalar/struct/struct_extract.cpp +5 -10
  158. package/src/duckdb/src/function/scalar/struct/struct_insert.cpp +11 -14
  159. package/src/duckdb/src/function/scalar/struct/struct_pack.cpp +6 -7
  160. package/src/duckdb/src/function/table/arrow.cpp +5 -2
  161. package/src/duckdb/src/function/table/arrow_conversion.cpp +25 -1
  162. package/src/duckdb/src/function/table/checkpoint.cpp +5 -1
  163. package/src/duckdb/src/function/table/read_csv.cpp +55 -0
  164. package/src/duckdb/src/function/table/system/duckdb_constraints.cpp +2 -2
  165. package/src/duckdb/src/function/table/system/test_all_types.cpp +2 -2
  166. package/src/duckdb/src/function/table/table_scan.cpp +1 -1
  167. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  168. package/src/duckdb/src/function/table_function.cpp +30 -11
  169. package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +6 -0
  170. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_table_entry.hpp +1 -1
  171. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_function_catalog_entry.hpp +6 -8
  172. package/src/duckdb/src/include/duckdb/catalog/dependency_list.hpp +3 -0
  173. package/src/duckdb/src/include/duckdb/catalog/duck_catalog.hpp +2 -1
  174. package/src/duckdb/src/include/duckdb/common/box_renderer.hpp +8 -2
  175. package/src/duckdb/src/include/duckdb/common/constants.hpp +0 -19
  176. package/src/duckdb/src/include/duckdb/common/enums/aggregate_handling.hpp +2 -0
  177. package/src/duckdb/src/include/duckdb/common/enums/expression_type.hpp +2 -3
  178. package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +7 -4
  179. package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +1 -0
  180. package/src/duckdb/src/include/duckdb/common/enums/order_type.hpp +2 -0
  181. package/src/duckdb/src/include/duckdb/common/enums/set_operation_type.hpp +2 -1
  182. package/src/duckdb/src/include/duckdb/common/enums/statement_type.hpp +2 -1
  183. package/src/duckdb/src/include/duckdb/common/enums/tableref_type.hpp +2 -1
  184. package/src/duckdb/src/include/duckdb/common/exception.hpp +69 -2
  185. package/src/duckdb/src/include/duckdb/common/field_writer.hpp +12 -4
  186. package/src/duckdb/src/include/duckdb/common/{http_stats.hpp → http_state.hpp} +18 -4
  187. package/src/duckdb/src/include/duckdb/common/operator/multiply.hpp +2 -0
  188. package/src/duckdb/src/include/duckdb/common/optional_ptr.hpp +45 -0
  189. package/src/duckdb/src/include/duckdb/common/preserved_error.hpp +6 -1
  190. package/src/duckdb/src/include/duckdb/common/serializer/buffered_deserializer.hpp +4 -2
  191. package/src/duckdb/src/include/duckdb/common/serializer/buffered_file_reader.hpp +8 -2
  192. package/src/duckdb/src/include/duckdb/common/serializer/enum_serializer.hpp +113 -0
  193. package/src/duckdb/src/include/duckdb/common/serializer/format_deserializer.hpp +336 -0
  194. package/src/duckdb/src/include/duckdb/common/serializer/format_serializer.hpp +268 -0
  195. package/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp +126 -0
  196. package/src/duckdb/src/include/duckdb/common/serializer.hpp +13 -0
  197. package/src/duckdb/src/include/duckdb/common/string_util.hpp +25 -0
  198. package/src/duckdb/src/include/duckdb/common/types/bit.hpp +12 -7
  199. package/src/duckdb/src/include/duckdb/common/types/time.hpp +3 -0
  200. package/src/duckdb/src/include/duckdb/common/types/value.hpp +17 -48
  201. package/src/duckdb/src/include/duckdb/common/types/value_map.hpp +1 -1
  202. package/src/duckdb/src/include/duckdb/common/types/vector.hpp +3 -1
  203. package/src/duckdb/src/include/duckdb/common/types.hpp +45 -8
  204. package/src/duckdb/src/include/duckdb/common/vector_operations/unary_executor.hpp +2 -2
  205. package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +1 -0
  206. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +2 -2
  207. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_perfecthash_aggregate.hpp +1 -1
  208. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_cross_product.hpp +2 -0
  209. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_file_handle.hpp +1 -0
  210. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +6 -0
  211. package/src/duckdb/src/include/duckdb/execution/operator/projection/physical_projection.hpp +5 -0
  212. package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +3 -0
  213. package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +1 -3
  214. package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +54 -0
  215. package/src/duckdb/src/include/duckdb/function/aggregate/distributive_functions.hpp +5 -0
  216. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +18 -6
  217. package/src/duckdb/src/include/duckdb/function/cast/bound_cast_data.hpp +84 -0
  218. package/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp +2 -2
  219. package/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp +28 -64
  220. package/src/duckdb/src/include/duckdb/function/function_binder.hpp +3 -6
  221. package/src/duckdb/src/include/duckdb/function/scalar/bit_functions.hpp +4 -0
  222. package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +138 -0
  223. package/src/duckdb/src/include/duckdb/function/scalar/math_functions.hpp +8 -0
  224. package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +59 -0
  225. package/src/duckdb/src/include/duckdb/function/scalar/regexp.hpp +81 -1
  226. package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +4 -0
  227. package/src/duckdb/src/include/duckdb/function/scalar_function.hpp +2 -2
  228. package/src/duckdb/src/include/duckdb/function/table/arrow.hpp +12 -1
  229. package/src/duckdb/src/include/duckdb/function/table_function.hpp +10 -0
  230. package/src/duckdb/src/include/duckdb/main/capi/capi_internal.hpp +2 -0
  231. package/src/duckdb/src/include/duckdb/main/client_data.hpp +3 -3
  232. package/src/duckdb/src/include/duckdb/main/config.hpp +3 -0
  233. package/src/duckdb/src/include/duckdb/main/connection_manager.hpp +2 -0
  234. package/src/duckdb/src/include/duckdb/main/database.hpp +1 -0
  235. package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +2 -0
  236. package/src/duckdb/src/include/duckdb/main/prepared_statement.hpp +2 -0
  237. package/src/duckdb/src/include/duckdb/main/relation/explain_relation.hpp +2 -1
  238. package/src/duckdb/src/include/duckdb/main/relation.hpp +2 -1
  239. package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +2 -0
  240. package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +2 -2
  241. package/src/duckdb/src/include/duckdb/optimizer/rule/list.hpp +1 -0
  242. package/src/duckdb/src/include/duckdb/optimizer/rule/ordered_aggregate_optimizer.hpp +24 -0
  243. package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +4 -0
  244. package/src/duckdb/src/include/duckdb/parser/expression/between_expression.hpp +3 -0
  245. package/src/duckdb/src/include/duckdb/parser/expression/bound_expression.hpp +2 -0
  246. package/src/duckdb/src/include/duckdb/parser/expression/case_expression.hpp +5 -0
  247. package/src/duckdb/src/include/duckdb/parser/expression/cast_expression.hpp +2 -0
  248. package/src/duckdb/src/include/duckdb/parser/expression/collate_expression.hpp +2 -0
  249. package/src/duckdb/src/include/duckdb/parser/expression/columnref_expression.hpp +2 -0
  250. package/src/duckdb/src/include/duckdb/parser/expression/comparison_expression.hpp +2 -0
  251. package/src/duckdb/src/include/duckdb/parser/expression/conjunction_expression.hpp +2 -0
  252. package/src/duckdb/src/include/duckdb/parser/expression/constant_expression.hpp +3 -0
  253. package/src/duckdb/src/include/duckdb/parser/expression/default_expression.hpp +1 -0
  254. package/src/duckdb/src/include/duckdb/parser/expression/function_expression.hpp +4 -2
  255. package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +2 -0
  256. package/src/duckdb/src/include/duckdb/parser/expression/operator_expression.hpp +2 -0
  257. package/src/duckdb/src/include/duckdb/parser/expression/parameter_expression.hpp +2 -0
  258. package/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +2 -0
  259. package/src/duckdb/src/include/duckdb/parser/expression/star_expression.hpp +4 -2
  260. package/src/duckdb/src/include/duckdb/parser/expression/subquery_expression.hpp +2 -0
  261. package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +5 -0
  262. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_info.hpp +5 -1
  263. package/src/duckdb/src/include/duckdb/parser/parsed_data/{alter_function_info.hpp → alter_scalar_function_info.hpp} +13 -13
  264. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_function_info.hpp +47 -0
  265. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp +6 -0
  266. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_table_function_info.hpp +2 -1
  267. package/src/duckdb/src/include/duckdb/parser/parsed_data/sample_options.hpp +2 -0
  268. package/src/duckdb/src/include/duckdb/parser/parsed_expression.hpp +5 -0
  269. package/src/duckdb/src/include/duckdb/parser/query_node/recursive_cte_node.hpp +3 -0
  270. package/src/duckdb/src/include/duckdb/parser/query_node/select_node.hpp +5 -0
  271. package/src/duckdb/src/include/duckdb/parser/query_node/set_operation_node.hpp +3 -0
  272. package/src/duckdb/src/include/duckdb/parser/query_node.hpp +13 -2
  273. package/src/duckdb/src/include/duckdb/parser/result_modifier.hpp +24 -1
  274. package/src/duckdb/src/include/duckdb/parser/sql_statement.hpp +2 -1
  275. package/src/duckdb/src/include/duckdb/parser/statement/multi_statement.hpp +28 -0
  276. package/src/duckdb/src/include/duckdb/parser/statement/select_statement.hpp +6 -1
  277. package/src/duckdb/src/include/duckdb/parser/tableref/basetableref.hpp +4 -0
  278. package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +2 -0
  279. package/src/duckdb/src/include/duckdb/parser/tableref/expressionlistref.hpp +3 -0
  280. package/src/duckdb/src/include/duckdb/parser/tableref/joinref.hpp +3 -0
  281. package/src/duckdb/src/include/duckdb/parser/tableref/list.hpp +1 -0
  282. package/src/duckdb/src/include/duckdb/parser/tableref/pivotref.hpp +87 -0
  283. package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +3 -0
  284. package/src/duckdb/src/include/duckdb/parser/tableref/table_function_ref.hpp +3 -0
  285. package/src/duckdb/src/include/duckdb/parser/tableref.hpp +3 -1
  286. package/src/duckdb/src/include/duckdb/parser/tokens.hpp +2 -0
  287. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +33 -0
  288. package/src/duckdb/src/include/duckdb/planner/bind_context.hpp +2 -0
  289. package/src/duckdb/src/include/duckdb/planner/binder.hpp +15 -4
  290. package/src/duckdb/src/include/duckdb/planner/bound_result_modifier.hpp +3 -0
  291. package/src/duckdb/src/include/duckdb/planner/expression/bound_aggregate_expression.hpp +3 -0
  292. package/src/duckdb/src/include/duckdb/planner/expression_binder/base_select_binder.hpp +64 -0
  293. package/src/duckdb/src/include/duckdb/planner/expression_binder/having_binder.hpp +2 -2
  294. package/src/duckdb/src/include/duckdb/planner/expression_binder/order_binder.hpp +4 -1
  295. package/src/duckdb/src/include/duckdb/planner/expression_binder/qualify_binder.hpp +2 -2
  296. package/src/duckdb/src/include/duckdb/planner/expression_binder/select_binder.hpp +9 -38
  297. package/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +1 -1
  298. package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +1 -0
  299. package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +1 -0
  300. package/src/duckdb/src/include/duckdb/planner/operator/logical_asof_join.hpp +22 -0
  301. package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +5 -2
  302. package/src/duckdb/src/include/duckdb/planner/operator/logical_distinct.hpp +3 -0
  303. package/src/duckdb/src/include/duckdb/planner/query_node/bound_select_node.hpp +8 -2
  304. package/src/duckdb/src/include/duckdb/storage/buffer/block_handle.hpp +2 -0
  305. package/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp +76 -44
  306. package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp +3 -2
  307. package/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp +1 -1
  308. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_compress.hpp +2 -2
  309. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_fetch.hpp +1 -1
  310. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_scan.hpp +1 -1
  311. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_compress.hpp +2 -2
  312. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_fetch.hpp +1 -1
  313. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_scan.hpp +1 -1
  314. package/src/duckdb/src/include/duckdb/storage/data_pointer.hpp +5 -2
  315. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +3 -3
  316. package/src/duckdb/src/include/duckdb/storage/index.hpp +4 -3
  317. package/src/duckdb/src/include/duckdb/storage/meta_block_reader.hpp +7 -0
  318. package/src/duckdb/src/include/duckdb/storage/statistics/base_statistics.hpp +93 -29
  319. package/src/duckdb/src/include/duckdb/storage/statistics/column_statistics.hpp +22 -3
  320. package/src/duckdb/src/include/duckdb/storage/statistics/distinct_statistics.hpp +8 -6
  321. package/src/duckdb/src/include/duckdb/storage/statistics/list_stats.hpp +41 -0
  322. package/src/duckdb/src/include/duckdb/storage/statistics/node_statistics.hpp +26 -0
  323. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats.hpp +114 -0
  324. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats_union.hpp +62 -0
  325. package/src/duckdb/src/include/duckdb/storage/statistics/segment_statistics.hpp +2 -7
  326. package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +74 -0
  327. package/src/duckdb/src/include/duckdb/storage/statistics/struct_stats.hpp +42 -0
  328. package/src/duckdb/src/include/duckdb/storage/string_uncompressed.hpp +2 -3
  329. package/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp +2 -1
  330. package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +6 -3
  331. package/src/duckdb/src/include/duckdb/storage/table/column_data_checkpointer.hpp +3 -2
  332. package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +7 -5
  333. package/src/duckdb/src/include/duckdb/storage/table/list_column_data.hpp +1 -1
  334. package/src/duckdb/src/include/duckdb/storage/table/persistent_table_data.hpp +6 -2
  335. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +10 -6
  336. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +8 -5
  337. package/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp +37 -0
  338. package/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp +10 -1
  339. package/src/duckdb/src/include/duckdb/storage/table/segment_base.hpp +4 -3
  340. package/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +271 -26
  341. package/src/duckdb/src/include/duckdb/storage/table/table_statistics.hpp +5 -0
  342. package/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +0 -1
  343. package/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +1 -1
  344. package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +2 -2
  345. package/src/duckdb/src/include/duckdb.h +50 -2
  346. package/src/duckdb/src/include/duckdb.hpp +0 -1
  347. package/src/duckdb/src/main/capi/pending-c.cpp +16 -3
  348. package/src/duckdb/src/main/capi/result-c.cpp +27 -1
  349. package/src/duckdb/src/main/capi/stream-c.cpp +25 -0
  350. package/src/duckdb/src/main/client_context.cpp +38 -34
  351. package/src/duckdb/src/main/client_data.cpp +7 -6
  352. package/src/duckdb/src/main/config.cpp +70 -1
  353. package/src/duckdb/src/main/database.cpp +19 -2
  354. package/src/duckdb/src/main/extension/extension_install.cpp +7 -2
  355. package/src/duckdb/src/main/prepared_statement.cpp +4 -0
  356. package/src/duckdb/src/main/query_profiler.cpp +17 -15
  357. package/src/duckdb/src/main/relation/explain_relation.cpp +3 -3
  358. package/src/duckdb/src/main/relation.cpp +3 -2
  359. package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +1 -0
  360. package/src/duckdb/src/optimizer/deliminator.cpp +1 -1
  361. package/src/duckdb/src/optimizer/filter_combiner.cpp +1 -1
  362. package/src/duckdb/src/optimizer/filter_pullup.cpp +3 -1
  363. package/src/duckdb/src/optimizer/filter_pushdown.cpp +14 -8
  364. package/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp +105 -71
  365. package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +31 -12
  366. package/src/duckdb/src/optimizer/optimizer.cpp +1 -0
  367. package/src/duckdb/src/optimizer/pullup/pullup_from_left.cpp +2 -2
  368. package/src/duckdb/src/optimizer/pushdown/pushdown_aggregate.cpp +33 -5
  369. package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +1 -1
  370. package/src/duckdb/src/optimizer/pushdown/pushdown_inner_join.cpp +3 -0
  371. package/src/duckdb/src/optimizer/pushdown/pushdown_left_join.cpp +5 -12
  372. package/src/duckdb/src/optimizer/pushdown/pushdown_mark_join.cpp +2 -2
  373. package/src/duckdb/src/optimizer/pushdown/pushdown_single_join.cpp +1 -1
  374. package/src/duckdb/src/optimizer/remove_unused_columns.cpp +1 -0
  375. package/src/duckdb/src/optimizer/rule/move_constants.cpp +10 -4
  376. package/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp +30 -0
  377. package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +9 -2
  378. package/src/duckdb/src/optimizer/statistics/expression/propagate_aggregate.cpp +9 -3
  379. package/src/duckdb/src/optimizer/statistics/expression/propagate_and_compress.cpp +6 -7
  380. package/src/duckdb/src/optimizer/statistics/expression/propagate_cast.cpp +14 -11
  381. package/src/duckdb/src/optimizer/statistics/expression/propagate_columnref.cpp +1 -1
  382. package/src/duckdb/src/optimizer/statistics/expression/propagate_comparison.cpp +13 -15
  383. package/src/duckdb/src/optimizer/statistics/expression/propagate_conjunction.cpp +0 -1
  384. package/src/duckdb/src/optimizer/statistics/expression/propagate_constant.cpp +3 -75
  385. package/src/duckdb/src/optimizer/statistics/expression/propagate_function.cpp +7 -2
  386. package/src/duckdb/src/optimizer/statistics/expression/propagate_operator.cpp +10 -0
  387. package/src/duckdb/src/optimizer/statistics/operator/propagate_aggregate.cpp +2 -3
  388. package/src/duckdb/src/optimizer/statistics/operator/propagate_filter.cpp +29 -32
  389. package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +5 -5
  390. package/src/duckdb/src/optimizer/statistics/operator/propagate_set_operation.cpp +3 -3
  391. package/src/duckdb/src/optimizer/statistics_propagator.cpp +2 -1
  392. package/src/duckdb/src/optimizer/unnest_rewriter.cpp +2 -2
  393. package/src/duckdb/src/parallel/meta_pipeline.cpp +0 -4
  394. package/src/duckdb/src/parser/common_table_expression_info.cpp +19 -0
  395. package/src/duckdb/src/parser/expression/between_expression.cpp +17 -0
  396. package/src/duckdb/src/parser/expression/case_expression.cpp +28 -0
  397. package/src/duckdb/src/parser/expression/cast_expression.cpp +17 -0
  398. package/src/duckdb/src/parser/expression/collate_expression.cpp +16 -0
  399. package/src/duckdb/src/parser/expression/columnref_expression.cpp +15 -0
  400. package/src/duckdb/src/parser/expression/comparison_expression.cpp +16 -0
  401. package/src/duckdb/src/parser/expression/conjunction_expression.cpp +17 -0
  402. package/src/duckdb/src/parser/expression/constant_expression.cpp +14 -0
  403. package/src/duckdb/src/parser/expression/default_expression.cpp +7 -0
  404. package/src/duckdb/src/parser/expression/function_expression.cpp +35 -0
  405. package/src/duckdb/src/parser/expression/lambda_expression.cpp +16 -0
  406. package/src/duckdb/src/parser/expression/operator_expression.cpp +15 -0
  407. package/src/duckdb/src/parser/expression/parameter_expression.cpp +15 -0
  408. package/src/duckdb/src/parser/expression/positional_reference_expression.cpp +14 -0
  409. package/src/duckdb/src/parser/expression/star_expression.cpp +26 -6
  410. package/src/duckdb/src/parser/expression/subquery_expression.cpp +20 -0
  411. package/src/duckdb/src/parser/expression/window_expression.cpp +43 -0
  412. package/src/duckdb/src/parser/parsed_data/alter_info.cpp +7 -3
  413. package/src/duckdb/src/parser/parsed_data/alter_scalar_function_info.cpp +56 -0
  414. package/src/duckdb/src/parser/parsed_data/alter_table_function_info.cpp +51 -0
  415. package/src/duckdb/src/parser/parsed_data/create_scalar_function_info.cpp +3 -2
  416. package/src/duckdb/src/parser/parsed_data/create_table_function_info.cpp +6 -0
  417. package/src/duckdb/src/parser/parsed_data/sample_options.cpp +22 -10
  418. package/src/duckdb/src/parser/parsed_expression.cpp +72 -0
  419. package/src/duckdb/src/parser/parsed_expression_iterator.cpp +15 -1
  420. package/src/duckdb/src/parser/query_node/recursive_cte_node.cpp +21 -0
  421. package/src/duckdb/src/parser/query_node/select_node.cpp +31 -0
  422. package/src/duckdb/src/parser/query_node/set_operation_node.cpp +17 -0
  423. package/src/duckdb/src/parser/query_node.cpp +51 -1
  424. package/src/duckdb/src/parser/result_modifier.cpp +78 -0
  425. package/src/duckdb/src/parser/statement/multi_statement.cpp +18 -0
  426. package/src/duckdb/src/parser/statement/select_statement.cpp +12 -0
  427. package/src/duckdb/src/parser/tableref/basetableref.cpp +21 -0
  428. package/src/duckdb/src/parser/tableref/emptytableref.cpp +4 -0
  429. package/src/duckdb/src/parser/tableref/expressionlistref.cpp +17 -0
  430. package/src/duckdb/src/parser/tableref/joinref.cpp +29 -0
  431. package/src/duckdb/src/parser/tableref/pivotref.cpp +373 -0
  432. package/src/duckdb/src/parser/tableref/subqueryref.cpp +15 -0
  433. package/src/duckdb/src/parser/tableref/table_function.cpp +17 -0
  434. package/src/duckdb/src/parser/tableref.cpp +49 -0
  435. package/src/duckdb/src/parser/transform/expression/transform_array_access.cpp +11 -0
  436. package/src/duckdb/src/parser/transform/expression/transform_bool_expr.cpp +1 -1
  437. package/src/duckdb/src/parser/transform/expression/transform_columnref.cpp +17 -2
  438. package/src/duckdb/src/parser/transform/expression/transform_function.cpp +63 -42
  439. package/src/duckdb/src/parser/transform/expression/transform_operator.cpp +1 -1
  440. package/src/duckdb/src/parser/transform/expression/transform_subquery.cpp +1 -1
  441. package/src/duckdb/src/parser/transform/helpers/transform_alias.cpp +12 -6
  442. package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +24 -0
  443. package/src/duckdb/src/parser/transform/helpers/transform_groupby.cpp +7 -0
  444. package/src/duckdb/src/parser/transform/helpers/transform_orderby.cpp +0 -7
  445. package/src/duckdb/src/parser/transform/helpers/transform_typename.cpp +3 -2
  446. package/src/duckdb/src/parser/transform/statement/transform_create_function.cpp +4 -0
  447. package/src/duckdb/src/parser/transform/statement/transform_create_view.cpp +4 -0
  448. package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +179 -0
  449. package/src/duckdb/src/parser/transform/statement/transform_rename.cpp +3 -4
  450. package/src/duckdb/src/parser/transform/statement/transform_select.cpp +8 -0
  451. package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +2 -3
  452. package/src/duckdb/src/parser/transform/tableref/transform_join.cpp +12 -1
  453. package/src/duckdb/src/parser/transform/tableref/transform_pivot.cpp +121 -0
  454. package/src/duckdb/src/parser/transform/tableref/transform_tableref.cpp +2 -0
  455. package/src/duckdb/src/parser/transformer.cpp +15 -3
  456. package/src/duckdb/src/planner/bind_context.cpp +18 -25
  457. package/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp +9 -7
  458. package/src/duckdb/src/planner/binder/expression/bind_columnref_expression.cpp +4 -3
  459. package/src/duckdb/src/planner/binder/expression/bind_function_expression.cpp +23 -12
  460. package/src/duckdb/src/planner/binder/expression/bind_lambda.cpp +3 -2
  461. package/src/duckdb/src/planner/binder/expression/bind_star_expression.cpp +176 -0
  462. package/src/duckdb/src/planner/binder/expression/bind_subquery_expression.cpp +4 -0
  463. package/src/duckdb/src/planner/binder/expression/bind_unnest_expression.cpp +163 -24
  464. package/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp +2 -2
  465. package/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +109 -94
  466. package/src/duckdb/src/planner/binder/query_node/plan_query_node.cpp +11 -0
  467. package/src/duckdb/src/planner/binder/query_node/plan_select_node.cpp +9 -4
  468. package/src/duckdb/src/planner/binder/statement/bind_copy.cpp +5 -3
  469. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +3 -2
  470. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +9 -1
  471. package/src/duckdb/src/planner/binder/statement/bind_delete.cpp +1 -1
  472. package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +12 -8
  473. package/src/duckdb/src/planner/binder/statement/bind_logical_plan.cpp +17 -0
  474. package/src/duckdb/src/planner/binder/statement/bind_update.cpp +4 -2
  475. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +19 -3
  476. package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +366 -0
  477. package/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp +11 -1
  478. package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -0
  479. package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +61 -13
  480. package/src/duckdb/src/planner/binder.cpp +19 -24
  481. package/src/duckdb/src/planner/bound_result_modifier.cpp +27 -1
  482. package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +9 -2
  483. package/src/duckdb/src/planner/expression/bound_expression.cpp +4 -0
  484. package/src/duckdb/src/planner/expression/bound_window_expression.cpp +1 -1
  485. package/src/duckdb/src/planner/expression_binder/base_select_binder.cpp +146 -0
  486. package/src/duckdb/src/planner/expression_binder/having_binder.cpp +6 -3
  487. package/src/duckdb/src/planner/expression_binder/qualify_binder.cpp +3 -3
  488. package/src/duckdb/src/planner/expression_binder/select_binder.cpp +1 -132
  489. package/src/duckdb/src/planner/expression_binder.cpp +10 -3
  490. package/src/duckdb/src/planner/expression_iterator.cpp +17 -10
  491. package/src/duckdb/src/planner/filter/constant_filter.cpp +4 -6
  492. package/src/duckdb/src/planner/logical_operator.cpp +7 -2
  493. package/src/duckdb/src/planner/logical_operator_visitor.cpp +6 -0
  494. package/src/duckdb/src/planner/operator/logical_asof_join.cpp +8 -0
  495. package/src/duckdb/src/planner/operator/logical_distinct.cpp +3 -0
  496. package/src/duckdb/src/planner/planner.cpp +2 -1
  497. package/src/duckdb/src/planner/pragma_handler.cpp +10 -2
  498. package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +3 -1
  499. package/src/duckdb/src/storage/buffer_manager.cpp +44 -46
  500. package/src/duckdb/src/storage/checkpoint/row_group_writer.cpp +1 -1
  501. package/src/duckdb/src/storage/checkpoint/table_data_reader.cpp +4 -15
  502. package/src/duckdb/src/storage/checkpoint/table_data_writer.cpp +10 -4
  503. package/src/duckdb/src/storage/checkpoint_manager.cpp +9 -3
  504. package/src/duckdb/src/storage/compression/bitpacking.cpp +28 -24
  505. package/src/duckdb/src/storage/compression/fixed_size_uncompressed.cpp +43 -45
  506. package/src/duckdb/src/storage/compression/numeric_constant.cpp +9 -10
  507. package/src/duckdb/src/storage/compression/patas.cpp +1 -1
  508. package/src/duckdb/src/storage/compression/rle.cpp +19 -15
  509. package/src/duckdb/src/storage/compression/validity_uncompressed.cpp +5 -5
  510. package/src/duckdb/src/storage/data_table.cpp +20 -20
  511. package/src/duckdb/src/storage/index.cpp +12 -1
  512. package/src/duckdb/src/storage/local_storage.cpp +20 -23
  513. package/src/duckdb/src/storage/meta_block_reader.cpp +22 -0
  514. package/src/duckdb/src/storage/statistics/base_statistics.cpp +373 -128
  515. package/src/duckdb/src/storage/statistics/column_statistics.cpp +57 -3
  516. package/src/duckdb/src/storage/statistics/distinct_statistics.cpp +8 -9
  517. package/src/duckdb/src/storage/statistics/list_stats.cpp +121 -0
  518. package/src/duckdb/src/storage/statistics/numeric_stats.cpp +591 -0
  519. package/src/duckdb/src/storage/statistics/numeric_stats_union.cpp +65 -0
  520. package/src/duckdb/src/storage/statistics/segment_statistics.cpp +2 -11
  521. package/src/duckdb/src/storage/statistics/string_stats.cpp +273 -0
  522. package/src/duckdb/src/storage/statistics/struct_stats.cpp +133 -0
  523. package/src/duckdb/src/storage/storage_info.cpp +2 -2
  524. package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +4 -10
  525. package/src/duckdb/src/storage/table/column_data.cpp +45 -46
  526. package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +7 -8
  527. package/src/duckdb/src/storage/table/column_segment.cpp +13 -14
  528. package/src/duckdb/src/storage/table/list_column_data.cpp +41 -59
  529. package/src/duckdb/src/storage/table/persistent_table_data.cpp +2 -1
  530. package/src/duckdb/src/storage/table/row_group.cpp +38 -32
  531. package/src/duckdb/src/storage/table/row_group_collection.cpp +94 -78
  532. package/src/duckdb/src/storage/table/scan_state.cpp +22 -3
  533. package/src/duckdb/src/storage/table/standard_column_data.cpp +7 -6
  534. package/src/duckdb/src/storage/table/struct_column_data.cpp +16 -16
  535. package/src/duckdb/src/storage/table/table_statistics.cpp +27 -7
  536. package/src/duckdb/src/storage/table/update_segment.cpp +20 -18
  537. package/src/duckdb/src/storage/wal_replay.cpp +8 -5
  538. package/src/duckdb/src/storage/write_ahead_log.cpp +2 -2
  539. package/src/duckdb/src/transaction/commit_state.cpp +11 -7
  540. package/src/duckdb/src/verification/deserialized_statement_verifier.cpp +0 -1
  541. package/src/duckdb/third_party/libpg_query/include/nodes/nodes.hpp +35 -0
  542. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +36 -2
  543. package/src/duckdb/third_party/libpg_query/include/nodes/primnodes.hpp +3 -3
  544. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +1022 -530
  545. package/src/duckdb/third_party/libpg_query/include/parser/kwlist.hpp +8 -0
  546. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +24462 -22828
  547. package/src/duckdb/third_party/re2/re2/re2.cc +9 -0
  548. package/src/duckdb/third_party/re2/re2/re2.h +2 -0
  549. package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +4 -4
  550. package/src/duckdb/ub_extension_json_json_functions.cpp +2 -0
  551. package/src/duckdb/ub_src_common_serializer.cpp +2 -0
  552. package/src/duckdb/ub_src_execution_physical_plan.cpp +2 -0
  553. package/src/duckdb/ub_src_function_aggregate_distributive.cpp +2 -0
  554. package/src/duckdb/ub_src_function_scalar_bit.cpp +2 -0
  555. package/src/duckdb/ub_src_function_scalar_map.cpp +4 -0
  556. package/src/duckdb/ub_src_function_scalar_string.cpp +2 -0
  557. package/src/duckdb/ub_src_function_scalar_string_regexp.cpp +4 -0
  558. package/src/duckdb/ub_src_main_capi.cpp +2 -0
  559. package/src/duckdb/ub_src_optimizer_rule.cpp +2 -0
  560. package/src/duckdb/ub_src_parser.cpp +2 -0
  561. package/src/duckdb/ub_src_parser_parsed_data.cpp +4 -2
  562. package/src/duckdb/ub_src_parser_statement.cpp +2 -0
  563. package/src/duckdb/ub_src_parser_tableref.cpp +2 -0
  564. package/src/duckdb/ub_src_parser_transform_statement.cpp +2 -0
  565. package/src/duckdb/ub_src_parser_transform_tableref.cpp +2 -0
  566. package/src/duckdb/ub_src_planner_binder_expression.cpp +2 -0
  567. package/src/duckdb/ub_src_planner_binder_tableref.cpp +2 -0
  568. package/src/duckdb/ub_src_planner_expression_binder.cpp +2 -0
  569. package/src/duckdb/ub_src_planner_operator.cpp +2 -0
  570. package/src/duckdb/ub_src_storage_statistics.cpp +6 -6
  571. package/src/duckdb/ub_src_storage_table.cpp +0 -2
  572. package/src/duckdb_node.hpp +2 -1
  573. package/src/statement.cpp +5 -5
  574. package/src/utils.cpp +27 -2
  575. package/test/extension.test.ts +44 -26
  576. package/test/syntax_error.test.ts +3 -1
  577. package/filelist.cache +0 -0
  578. package/src/duckdb/src/include/duckdb/main/loadable_extension.hpp +0 -59
  579. package/src/duckdb/src/include/duckdb/storage/statistics/list_statistics.hpp +0 -36
  580. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_statistics.hpp +0 -75
  581. package/src/duckdb/src/include/duckdb/storage/statistics/string_statistics.hpp +0 -49
  582. package/src/duckdb/src/include/duckdb/storage/statistics/struct_statistics.hpp +0 -36
  583. package/src/duckdb/src/include/duckdb/storage/statistics/validity_statistics.hpp +0 -45
  584. package/src/duckdb/src/parser/parsed_data/alter_function_info.cpp +0 -55
  585. package/src/duckdb/src/storage/statistics/list_statistics.cpp +0 -94
  586. package/src/duckdb/src/storage/statistics/numeric_statistics.cpp +0 -307
  587. package/src/duckdb/src/storage/statistics/string_statistics.cpp +0 -220
  588. package/src/duckdb/src/storage/statistics/struct_statistics.cpp +0 -108
  589. package/src/duckdb/src/storage/statistics/validity_statistics.cpp +0 -91
  590. package/src/duckdb/src/storage/table/segment_tree.cpp +0 -179
@@ -6,24 +6,18 @@
6
6
  #include "duckdb/planner/operator/logical_comparison_join.hpp"
7
7
  #include "duckdb/planner/operator/logical_get.hpp"
8
8
  #include "duckdb/storage/data_table.hpp"
9
- #include "duckdb/storage/statistics/numeric_statistics.hpp"
10
9
  #include "duckdb/catalog/catalog_entry/table_catalog_entry.hpp"
11
10
 
12
11
  namespace duckdb {
13
12
 
14
13
  static TableCatalogEntry *GetCatalogTableEntry(LogicalOperator *op) {
15
- if (op->type == LogicalOperatorType::LOGICAL_GET) {
16
- auto get = (LogicalGet *)op;
17
- TableCatalogEntry *entry = get->GetTable();
18
- return entry;
14
+ if (!op) {
15
+ return nullptr;
19
16
  }
20
- for (auto &child : op->children) {
21
- TableCatalogEntry *entry = GetCatalogTableEntry(child.get());
22
- if (entry != nullptr) {
23
- return entry;
24
- }
25
- }
26
- return nullptr;
17
+ D_ASSERT(op->type == LogicalOperatorType::LOGICAL_GET);
18
+ auto get = (LogicalGet *)op;
19
+ TableCatalogEntry *entry = get->GetTable();
20
+ return entry;
27
21
  }
28
22
 
29
23
  // The filter was made on top of a logical sample or other projection,
@@ -45,8 +39,7 @@ void CardinalityEstimator::AddRelationTdom(FilterInfo *filter_info) {
45
39
  }
46
40
  }
47
41
  auto key = ColumnBinding(filter_info->left_binding.table_index, filter_info->left_binding.column_index);
48
- column_binding_set_t tmp({key});
49
- relations_to_tdoms.emplace_back(RelationsToTDom(tmp));
42
+ relations_to_tdoms.emplace_back(column_binding_set_t({key}));
50
43
  }
51
44
 
52
45
  bool CardinalityEstimator::SingleColumnFilter(FilterInfo *filter_info) {
@@ -99,7 +92,7 @@ void CardinalityEstimator::AddToEquivalenceSets(FilterInfo *filter_info, vector<
99
92
  column_binding_set_t tmp;
100
93
  tmp.insert(filter_info->left_binding);
101
94
  tmp.insert(filter_info->right_binding);
102
- relations_to_tdoms.emplace_back(RelationsToTDom(tmp));
95
+ relations_to_tdoms.emplace_back(tmp);
103
96
  relations_to_tdoms.back().filters.push_back(filter_info);
104
97
  }
105
98
  }
@@ -265,7 +258,7 @@ double CardinalityEstimator::EstimateCardinalityWithSet(JoinRelationSet *new_set
265
258
  // connection to any subgraph in subgraphs. Add a new subgraph, and maybe later there will be
266
259
  // a connection.
267
260
  if (!found_match) {
268
- subgraphs.emplace_back(Subgraph2Denominator());
261
+ subgraphs.emplace_back();
269
262
  auto subgraph = &subgraphs.back();
270
263
  subgraph->relations.insert(filter->left_binding.table_index);
271
264
  subgraph->relations.insert(filter->right_binding.table_index);
@@ -304,23 +297,37 @@ static bool IsLogicalFilter(LogicalOperator *op) {
304
297
  return op->type == LogicalOperatorType::LOGICAL_FILTER;
305
298
  }
306
299
 
307
- static LogicalGet *GetLogicalGet(LogicalOperator *op) {
300
+ static LogicalGet *GetLogicalGet(LogicalOperator *op, idx_t table_index = DConstants::INVALID_INDEX) {
308
301
  LogicalGet *get = nullptr;
309
302
  switch (op->type) {
310
303
  case LogicalOperatorType::LOGICAL_GET:
311
304
  get = (LogicalGet *)op;
312
305
  break;
313
306
  case LogicalOperatorType::LOGICAL_FILTER:
314
- get = GetLogicalGet(op->children.at(0).get());
307
+ get = GetLogicalGet(op->children.at(0).get(), table_index);
315
308
  break;
316
309
  case LogicalOperatorType::LOGICAL_PROJECTION:
317
- get = GetLogicalGet(op->children.at(0).get());
310
+ get = GetLogicalGet(op->children.at(0).get(), table_index);
318
311
  break;
312
+ case LogicalOperatorType::LOGICAL_ASOF_JOIN:
319
313
  case LogicalOperatorType::LOGICAL_COMPARISON_JOIN: {
320
314
  LogicalComparisonJoin *join = (LogicalComparisonJoin *)op;
315
+ // We should never be calling GetLogicalGet without a valid table_index.
316
+ // We are attempting to get the catalog table for a relation (for statistics/cardinality estimation)
317
+ // A logical join means there is a non-reorderable relation in the join plan. This means we need
318
+ // to know the exact table index to return.
319
+ D_ASSERT(table_index != DConstants::INVALID_INDEX);
321
320
  if (join->join_type == JoinType::MARK || join->join_type == JoinType::LEFT) {
322
321
  auto child = join->children.at(0).get();
323
- get = GetLogicalGet(child);
322
+ get = GetLogicalGet(child, table_index);
323
+ if (get && get->table_index == table_index) {
324
+ return get;
325
+ }
326
+ child = join->children.at(1).get();
327
+ get = GetLogicalGet(child, table_index);
328
+ if (get && get->table_index == table_index) {
329
+ return get;
330
+ }
324
331
  }
325
332
  break;
326
333
  }
@@ -370,16 +377,20 @@ void CardinalityEstimator::InitCardinalityEstimatorProps(vector<NodeOp> *node_op
370
377
  if (op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN) {
371
378
  auto &join = (LogicalComparisonJoin &)*op;
372
379
  if (join.join_type == JoinType::LEFT) {
373
- // TODO: inspect child operators to get a more accurate cost
374
- // and cardinality estimation. If an base op is a Logical Comparison join
375
- // it is probably a left join, so cost of the larger table is a fine
376
- // estimate
377
- // No need to update a mark join cost because I say so.
380
+ // If a base op is a Logical Comparison join it is probably a left join,
381
+ // so the cost of the larger table is a fine estimate.
382
+ // TODO: provide better estimates for cost of mark joins
383
+ // MARK joins are used for anti and semi joins, so the cost can conceivably be
384
+ // less than the base table cardinality.
378
385
  join_node->SetCost(join_node->GetBaseTableCardinality());
379
386
  }
387
+ } else if (op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN) {
388
+ // AsOf joins have the cardinality of the LHS
389
+ join_node->SetCost(join_node->GetBaseTableCardinality());
380
390
  }
381
- // update cardinality with filters
391
+ // Total domains can be affected by filters. So we update base table cardinality first
382
392
  EstimateBaseTableCardinality(join_node, op);
393
+ // Then update total domains.
383
394
  UpdateTotalDomains(join_node, op);
384
395
  }
385
396
 
@@ -390,74 +401,84 @@ void CardinalityEstimator::InitCardinalityEstimatorProps(vector<NodeOp> *node_op
390
401
  void CardinalityEstimator::UpdateTotalDomains(JoinNode *node, LogicalOperator *op) {
391
402
  auto relation_id = node->set->relations[0];
392
403
  relation_attributes[relation_id].cardinality = node->GetCardinality<double>();
404
+ //! Initialize the distinct count for all columns used in joins with the current relation.
405
+ idx_t distinct_count = node->GetBaseTableCardinality();
393
406
  TableCatalogEntry *catalog_table = nullptr;
394
- auto get = GetLogicalGet(op);
395
- if (get) {
396
- catalog_table = GetCatalogTableEntry(get);
397
- }
398
-
399
- //! Initialize the tdoms for all columns the relation uses in join conditions.
400
- unordered_set<idx_t>::iterator ite;
401
- idx_t count = node->GetBaseTableCardinality();
402
407
 
403
408
  bool direct_filter = false;
409
+ LogicalGet *get = nullptr;
410
+ bool get_updated = true;
404
411
  for (auto &column : relation_attributes[relation_id].columns) {
405
- //! for every column in the relation, get the count via either HLL, or assume it to be
412
+ //! for every column used in a filter in the relation, get the distinct count via HLL, or assume it to be
406
413
  //! the cardinality
407
414
  ColumnBinding key = ColumnBinding(relation_id, column);
415
+ auto actual_binding = relation_column_to_original_column.find(key);
416
+ // each relation has columns that are either projected or used as filters
417
+ // In order to get column statistics we need to make sure the actual binding still
418
+ // refers to the same base table relation, as non-reorderable joins may involve 2+
419
+ // base table relations and therefore the columns may also refer to 2 different
420
+ // base table relations
421
+ if (actual_binding != relation_column_to_original_column.end() &&
422
+ (!get || get->table_index != actual_binding->second.table_index)) {
423
+ get = GetLogicalGet(op, actual_binding->second.table_index);
424
+ get_updated = true;
425
+ } else {
426
+ get_updated = false;
427
+ }
408
428
 
409
- if (catalog_table) {
410
- relation_attributes[relation_id].original_name = catalog_table->name;
411
- // Get HLL stats here
412
- auto actual_binding = relation_column_to_original_column[key];
429
+ if (get_updated) {
430
+ catalog_table = GetCatalogTableEntry(get);
431
+ }
413
432
 
414
- auto base_stats = catalog_table->GetStatistics(context, actual_binding.column_index);
433
+ if (catalog_table && actual_binding != relation_column_to_original_column.end()) {
434
+ // Get HLL stats here
435
+ auto base_stats = catalog_table->GetStatistics(context, actual_binding->second.column_index);
415
436
  if (base_stats) {
416
- count = base_stats->GetDistinctCount();
437
+ distinct_count = base_stats->GetDistinctCount();
417
438
  }
418
439
 
419
- // means you have a direct filter on a column. The count/total domain for the column
440
+ // means you have a direct filter on a column. The distinct_count/total domain for the column
420
441
  // should be decreased to match the predicted total domain matching the filter.
421
442
  // We decrease the total domain for all columns in the equivalence set because filter pushdown
422
443
  // will mean all columns are affected.
423
444
  if (direct_filter) {
424
- count = node->GetCardinality<idx_t>();
445
+ distinct_count = node->GetCardinality<idx_t>();
425
446
  }
426
447
 
427
- // HLL has estimation error, count can't be greater than cardinality of the table before filters
428
- if (count > node->GetBaseTableCardinality()) {
429
- count = node->GetBaseTableCardinality();
448
+ // HLL has estimation error, distinct_count can't be greater than cardinality of the table before filters
449
+ if (distinct_count > node->GetBaseTableCardinality()) {
450
+ distinct_count = node->GetBaseTableCardinality();
430
451
  }
431
452
  } else {
432
- // No HLL. So if we know there is a direct filter, reduce count to cardinality with filter
433
- // otherwise assume the total domain is still the cardinality
453
+ // No HLL. So if we know there is a direct filter, reduce the distinct count to the cardinality
454
+ // with filter effects. Otherwise assume the distinct count is still the cardinality
434
455
  if (direct_filter) {
435
- count = node->GetCardinality<idx_t>();
456
+ distinct_count = node->GetCardinality<idx_t>();
436
457
  } else {
437
- count = node->GetBaseTableCardinality();
458
+ distinct_count = node->GetBaseTableCardinality();
438
459
  }
439
460
  }
440
-
461
+ // Update the relation_to_tdom set with the estimated distinct count (or tdom) calculated above
441
462
  for (auto &relation_to_tdom : relations_to_tdoms) {
442
463
  column_binding_set_t i_set = relation_to_tdom.equivalent_relations;
443
464
  if (i_set.count(key) != 1) {
444
465
  continue;
445
466
  }
446
467
  if (catalog_table) {
447
- if (relation_to_tdom.tdom_hll < count) {
448
- relation_to_tdom.tdom_hll = count;
468
+ if (relation_to_tdom.tdom_hll < distinct_count) {
469
+ relation_to_tdom.tdom_hll = distinct_count;
449
470
  relation_to_tdom.has_tdom_hll = true;
450
471
  }
451
- if (relation_to_tdom.tdom_no_hll > count) {
452
- relation_to_tdom.tdom_no_hll = count;
472
+ if (relation_to_tdom.tdom_no_hll > distinct_count) {
473
+ relation_to_tdom.tdom_no_hll = distinct_count;
453
474
  }
454
475
  } else {
455
476
  // Here we don't have catalog statistics, and the following is how we determine
456
477
  // the tdom
457
478
  // 1. If there is any hll data in the equivalence set, use that
458
479
  // 2. Otherwise, use the table with the smallest cardinality
459
- if (relation_to_tdom.tdom_no_hll > count && !relation_to_tdom.has_tdom_hll) {
460
- relation_to_tdom.tdom_no_hll = count;
480
+ if (relation_to_tdom.tdom_no_hll > distinct_count && !relation_to_tdom.has_tdom_hll) {
481
+ relation_to_tdom.tdom_no_hll = distinct_count;
461
482
  }
462
483
  }
463
484
  break;
@@ -465,9 +486,8 @@ void CardinalityEstimator::UpdateTotalDomains(JoinNode *node, LogicalOperator *o
465
486
  }
466
487
  }
467
488
 
468
- TableFilterSet *CardinalityEstimator::GetTableFilters(LogicalOperator *op) {
469
- // First check table filters
470
- auto get = GetLogicalGet(op);
489
+ TableFilterSet *CardinalityEstimator::GetTableFilters(LogicalOperator *op, idx_t table_index) {
490
+ auto get = GetLogicalGet(op, table_index);
471
491
  return get ? &get->table_filters : nullptr;
472
492
  }
473
493
 
@@ -529,9 +549,10 @@ idx_t CardinalityEstimator::InspectConjunctionOR(idx_t cardinality, idx_t column
529
549
  return cardinality_after_filters;
530
550
  }
531
551
 
532
- idx_t CardinalityEstimator::InspectTableFilters(idx_t cardinality, LogicalOperator *op, TableFilterSet *table_filters) {
552
+ idx_t CardinalityEstimator::InspectTableFilters(idx_t cardinality, LogicalOperator *op, TableFilterSet *table_filters,
553
+ idx_t table_index) {
533
554
  idx_t cardinality_after_filters = cardinality;
534
- auto get = GetLogicalGet(op);
555
+ auto get = GetLogicalGet(op, table_index);
535
556
  unique_ptr<BaseStatistics> column_statistics;
536
557
  for (auto &it : table_filters->filters) {
537
558
  column_statistics = nullptr;
@@ -562,17 +583,30 @@ idx_t CardinalityEstimator::InspectTableFilters(idx_t cardinality, LogicalOperat
562
583
 
563
584
  void CardinalityEstimator::EstimateBaseTableCardinality(JoinNode *node, LogicalOperator *op) {
564
585
  auto has_logical_filter = IsLogicalFilter(op);
565
- auto table_filters = GetTableFilters(op);
586
+ D_ASSERT(node->set->count == 1);
587
+ auto relation_id = node->set->relations[0];
566
588
 
567
- auto card_after_filters = node->GetBaseTableCardinality();
568
- if (table_filters) {
569
- double inspect_result = (double)InspectTableFilters(card_after_filters, op, table_filters);
570
- card_after_filters = MinValue(inspect_result, (double)card_after_filters);
571
- }
572
- if (has_logical_filter) {
573
- card_after_filters *= DEFAULT_SELECTIVITY;
589
+ double lowest_card_found = NumericLimits<double>::Maximum();
590
+ for (auto &column : relation_attributes[relation_id].columns) {
591
+ auto card_after_filters = node->GetBaseTableCardinality();
592
+ ColumnBinding key = ColumnBinding(relation_id, column);
593
+ TableFilterSet *table_filters = nullptr;
594
+ auto actual_binding = relation_column_to_original_column.find(key);
595
+ if (actual_binding != relation_column_to_original_column.end()) {
596
+ table_filters = GetTableFilters(op, actual_binding->second.table_index);
597
+ }
598
+
599
+ if (table_filters) {
600
+ double inspect_result =
601
+ (double)InspectTableFilters(card_after_filters, op, table_filters, actual_binding->second.table_index);
602
+ card_after_filters = MinValue(inspect_result, (double)card_after_filters);
603
+ }
604
+ if (has_logical_filter) {
605
+ card_after_filters *= DEFAULT_SELECTIVITY;
606
+ }
607
+ lowest_card_found = MinValue(card_after_filters, lowest_card_found);
574
608
  }
575
- node->SetEstimatedCardinality(card_after_filters);
609
+ node->SetEstimatedCardinality(lowest_card_found);
576
610
  }
577
611
 
578
612
  } // namespace duckdb
@@ -113,7 +113,7 @@ bool JoinOrderOptimizer::ExtractJoinRelations(LogicalOperator &input_op, vector<
113
113
  bool non_reorderable_operation = false;
114
114
  if (op->type == LogicalOperatorType::LOGICAL_UNION || op->type == LogicalOperatorType::LOGICAL_EXCEPT ||
115
115
  op->type == LogicalOperatorType::LOGICAL_INTERSECT || op->type == LogicalOperatorType::LOGICAL_DELIM_JOIN ||
116
- op->type == LogicalOperatorType::LOGICAL_ANY_JOIN) {
116
+ op->type == LogicalOperatorType::LOGICAL_ANY_JOIN || op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN) {
117
117
  // set operation, optimize separately in children
118
118
  non_reorderable_operation = true;
119
119
  }
@@ -138,7 +138,7 @@ bool JoinOrderOptimizer::ExtractJoinRelations(LogicalOperator &input_op, vector<
138
138
  std::swap(join.children[0], join.children[1]);
139
139
  for (auto &cond : join.conditions) {
140
140
  std::swap(cond.left, cond.right);
141
- cond.comparison = FlipComparisionExpression(cond.comparison);
141
+ cond.comparison = FlipComparisonExpression(cond.comparison);
142
142
  }
143
143
  }
144
144
  }
@@ -152,11 +152,11 @@ bool JoinOrderOptimizer::ExtractJoinRelations(LogicalOperator &input_op, vector<
152
152
  // new NULL values in the right side, so pushing this condition through the join leads to incorrect results
153
153
  // for this reason, we just start a new JoinOptimizer pass in each of the children of the join
154
154
 
155
- // Keep track of all of the filter bindings the new join order optimizer makes
155
+ // Keep track of all filter bindings the new join order optimizer makes
156
156
  vector<column_binding_map_t<ColumnBinding>> child_binding_maps;
157
157
  idx_t child_bindings_it = 0;
158
158
  for (auto &child : op->children) {
159
- child_binding_maps.emplace_back(column_binding_map_t<ColumnBinding>());
159
+ child_binding_maps.emplace_back();
160
160
  JoinOrderOptimizer optimizer(context);
161
161
  child = optimizer.Optimize(std::move(child));
162
162
  // save the relation bindings from the optimized child. These later all get added to the
@@ -184,6 +184,7 @@ bool JoinOrderOptimizer::ExtractJoinRelations(LogicalOperator &input_op, vector<
184
184
  }
185
185
 
186
186
  switch (op->type) {
187
+ case LogicalOperatorType::LOGICAL_ASOF_JOIN:
187
188
  case LogicalOperatorType::LOGICAL_COMPARISON_JOIN:
188
189
  case LogicalOperatorType::LOGICAL_CROSS_PRODUCT: {
189
190
  // inner join or cross product
@@ -222,12 +223,25 @@ bool JoinOrderOptimizer::ExtractJoinRelations(LogicalOperator &input_op, vector<
222
223
  }
223
224
  case LogicalOperatorType::LOGICAL_PROJECTION: {
224
225
  auto proj = (LogicalProjection *)op;
225
- // we run the join order optimizer witin the subquery as well
226
+ // we run the join order optimizer within the subquery as well
226
227
  JoinOrderOptimizer optimizer(context);
227
228
  op->children[0] = optimizer.Optimize(std::move(op->children[0]));
228
229
  // projection, add to the set of relations
229
230
  auto relation = make_unique<SingleJoinRelation>(&input_op, parent);
230
- relation_mapping[proj->table_index] = relations.size();
231
+ auto relation_id = relations.size();
232
+ // push one child column binding map back.
233
+ vector<column_binding_map_t<ColumnBinding>> child_binding_maps;
234
+ child_binding_maps.emplace_back();
235
+ optimizer.cardinality_estimator.CopyRelationMap(child_binding_maps.at(0));
236
+ // This logical projection may sit on top of a logical comparison join that has been pushed down
237
+ // we want to copy the binding info of both tables
238
+ relation_mapping[proj->table_index] = relation_id;
239
+ for (auto &binding_info : child_binding_maps.at(0)) {
240
+ cardinality_estimator.AddRelationToColumnMapping(
241
+ ColumnBinding(proj->table_index, binding_info.first.column_index), binding_info.second);
242
+ cardinality_estimator.AddColumnToRelationMap(binding_info.second.table_index,
243
+ binding_info.second.column_index);
244
+ }
231
245
  relations.push_back(std::move(relation));
232
246
  return true;
233
247
  }
@@ -756,7 +770,7 @@ JoinOrderOptimizer::GenerateJoins(vector<unique_ptr<LogicalOperator>> &extracted
756
770
 
757
771
  if (invert) {
758
772
  // reverse comparison expression if we reverse the order of the children
759
- cond.comparison = FlipComparisionExpression(cond.comparison);
773
+ cond.comparison = FlipComparisonExpression(cond.comparison);
760
774
  }
761
775
  join->conditions.push_back(std::move(cond));
762
776
  }
@@ -833,7 +847,7 @@ JoinOrderOptimizer::GenerateJoins(vector<unique_ptr<LogicalOperator>> &extracted
833
847
  cond.comparison = comparison.type;
834
848
  if (invert) {
835
849
  // reverse comparison expression if we reverse the order of the children
836
- cond.comparison = FlipComparisionExpression(comparison.type);
850
+ cond.comparison = FlipComparisonExpression(comparison.type);
837
851
  }
838
852
  // now find the join to push it into
839
853
  auto node = result_operator.get();
@@ -853,7 +867,8 @@ JoinOrderOptimizer::GenerateJoins(vector<unique_ptr<LogicalOperator>> &extracted
853
867
  result_operator->children[0] = std::move(comp_join);
854
868
  }
855
869
  } else {
856
- D_ASSERT(node->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN);
870
+ D_ASSERT(node->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN ||
871
+ node->type == LogicalOperatorType::LOGICAL_ASOF_JOIN);
857
872
  auto &comp_join = (LogicalComparisonJoin &)*node;
858
873
  comp_join.conditions.push_back(std::move(cond));
859
874
  }
@@ -869,9 +884,11 @@ unique_ptr<LogicalOperator> JoinOrderOptimizer::RewritePlan(unique_ptr<LogicalOp
869
884
 
870
885
  // first we will extract all relations from the main plan
871
886
  vector<unique_ptr<LogicalOperator>> extracted_relations;
887
+ extracted_relations.reserve(relations.size());
872
888
  for (auto &relation : relations) {
873
889
  extracted_relations.push_back(ExtractJoinRelation(*relation));
874
890
  }
891
+
875
892
  // now we generate the actual joins
876
893
  auto join_tree = GenerateJoins(extracted_relations, node);
877
894
  // perform the final pushdown of remaining filters
@@ -893,7 +910,8 @@ unique_ptr<LogicalOperator> JoinOrderOptimizer::RewritePlan(unique_ptr<LogicalOp
893
910
  auto op = plan.get();
894
911
  auto parent = plan.get();
895
912
  while (op->type != LogicalOperatorType::LOGICAL_CROSS_PRODUCT &&
896
- op->type != LogicalOperatorType::LOGICAL_COMPARISON_JOIN) {
913
+ op->type != LogicalOperatorType::LOGICAL_COMPARISON_JOIN &&
914
+ op->type != LogicalOperatorType::LOGICAL_ASOF_JOIN) {
897
915
  D_ASSERT(op->children.size() == 1);
898
916
  parent = op;
899
917
  op = op->children[0].get();
@@ -928,7 +946,8 @@ unique_ptr<LogicalOperator> JoinOrderOptimizer::Optimize(unique_ptr<LogicalOpera
928
946
  // filters in the process
929
947
  expression_set_t filter_set;
930
948
  for (auto &f_op : filter_operators) {
931
- if (f_op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN) {
949
+ if (f_op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN ||
950
+ f_op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN) {
932
951
  auto &join = (LogicalComparisonJoin &)*f_op;
933
952
  D_ASSERT(join.join_type == JoinType::INNER);
934
953
  D_ASSERT(join.expressions.empty());
@@ -999,7 +1018,7 @@ unique_ptr<LogicalOperator> JoinOrderOptimizer::Optimize(unique_ptr<LogicalOpera
999
1018
  for (idx_t i = 0; i < relations.size(); i++) {
1000
1019
  auto &rel = *relations[i];
1001
1020
  auto node = set_manager.GetJoinRelation(i);
1002
- nodes_ops.emplace_back(NodeOp(make_unique<JoinNode>(node, 0), rel.op));
1021
+ nodes_ops.emplace_back(make_unique<JoinNode>(node, 0), rel.op);
1003
1022
  }
1004
1023
 
1005
1024
  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