duckdb 0.7.1 → 0.7.2-dev1034.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (590) hide show
  1. package/binding.gyp +12 -7
  2. package/lib/duckdb.d.ts +55 -2
  3. package/lib/duckdb.js +20 -1
  4. package/package.json +1 -1
  5. package/src/connection.cpp +1 -2
  6. package/src/database.cpp +1 -1
  7. package/src/duckdb/extension/icu/icu-extension.cpp +4 -0
  8. package/src/duckdb/extension/icu/icu-list-range.cpp +207 -0
  9. package/src/duckdb/extension/icu/icu-table-range.cpp +194 -0
  10. package/src/duckdb/extension/icu/include/icu-list-range.hpp +17 -0
  11. package/src/duckdb/extension/icu/include/icu-table-range.hpp +17 -0
  12. package/src/duckdb/extension/json/include/json_common.hpp +1 -0
  13. package/src/duckdb/extension/json/include/json_functions.hpp +2 -0
  14. package/src/duckdb/extension/json/include/json_serializer.hpp +77 -0
  15. package/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp +147 -0
  16. package/src/duckdb/extension/json/json_functions/read_json.cpp +6 -5
  17. package/src/duckdb/extension/json/json_functions.cpp +12 -4
  18. package/src/duckdb/extension/json/json_scan.cpp +2 -2
  19. package/src/duckdb/extension/json/json_serializer.cpp +217 -0
  20. package/src/duckdb/extension/parquet/column_reader.cpp +94 -15
  21. package/src/duckdb/extension/parquet/column_writer.cpp +0 -1
  22. package/src/duckdb/extension/parquet/include/column_reader.hpp +1 -2
  23. package/src/duckdb/extension/parquet/include/decode_utils.hpp +5 -4
  24. package/src/duckdb/extension/parquet/include/generated_column_reader.hpp +1 -11
  25. package/src/duckdb/extension/parquet/include/parquet_timestamp.hpp +2 -1
  26. package/src/duckdb/extension/parquet/parquet-extension.cpp +12 -2
  27. package/src/duckdb/extension/parquet/parquet_reader.cpp +1 -1
  28. package/src/duckdb/extension/parquet/parquet_statistics.cpp +26 -32
  29. package/src/duckdb/extension/parquet/parquet_timestamp.cpp +16 -6
  30. package/src/duckdb/src/catalog/catalog.cpp +34 -5
  31. package/src/duckdb/src/catalog/catalog_entry/duck_schema_entry.cpp +4 -0
  32. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +2 -21
  33. package/src/duckdb/src/catalog/catalog_entry/scalar_function_catalog_entry.cpp +7 -6
  34. package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +3 -3
  35. package/src/duckdb/src/catalog/catalog_entry/table_function_catalog_entry.cpp +20 -1
  36. package/src/duckdb/src/catalog/catalog_entry/type_catalog_entry.cpp +8 -2
  37. package/src/duckdb/src/catalog/catalog_set.cpp +1 -0
  38. package/src/duckdb/src/catalog/default/default_functions.cpp +3 -0
  39. package/src/duckdb/src/catalog/dependency_list.cpp +12 -0
  40. package/src/duckdb/src/catalog/duck_catalog.cpp +34 -7
  41. package/src/duckdb/src/common/arrow/arrow_appender.cpp +48 -4
  42. package/src/duckdb/src/common/arrow/arrow_converter.cpp +1 -1
  43. package/src/duckdb/src/common/box_renderer.cpp +109 -23
  44. package/src/duckdb/src/common/enums/expression_type.cpp +8 -222
  45. package/src/duckdb/src/common/enums/join_type.cpp +3 -22
  46. package/src/duckdb/src/common/enums/logical_operator_type.cpp +2 -0
  47. package/src/duckdb/src/common/enums/statement_type.cpp +2 -0
  48. package/src/duckdb/src/common/exception.cpp +15 -1
  49. package/src/duckdb/src/common/field_writer.cpp +1 -0
  50. package/src/duckdb/src/common/operator/cast_operators.cpp +1 -1
  51. package/src/duckdb/src/common/preserved_error.cpp +7 -5
  52. package/src/duckdb/src/common/serializer/buffered_deserializer.cpp +4 -0
  53. package/src/duckdb/src/common/serializer/buffered_file_reader.cpp +15 -2
  54. package/src/duckdb/src/common/serializer/enum_serializer.cpp +1176 -0
  55. package/src/duckdb/src/common/sort/sort_state.cpp +5 -7
  56. package/src/duckdb/src/common/sort/sorted_block.cpp +0 -1
  57. package/src/duckdb/src/common/string_util.cpp +4 -1
  58. package/src/duckdb/src/common/types/bit.cpp +166 -87
  59. package/src/duckdb/src/common/types/blob.cpp +1 -1
  60. package/src/duckdb/src/common/types/chunk_collection.cpp +2 -2
  61. package/src/duckdb/src/common/types/column_data_collection.cpp +39 -2
  62. package/src/duckdb/src/common/types/column_data_collection_segment.cpp +11 -6
  63. package/src/duckdb/src/common/types/data_chunk.cpp +1 -1
  64. package/src/duckdb/src/common/types/time.cpp +13 -0
  65. package/src/duckdb/src/common/types/value.cpp +320 -154
  66. package/src/duckdb/src/common/types/vector.cpp +155 -127
  67. package/src/duckdb/src/common/types.cpp +313 -153
  68. package/src/duckdb/src/common/vector_operations/vector_cast.cpp +2 -1
  69. package/src/duckdb/src/execution/aggregate_hashtable.cpp +10 -5
  70. package/src/duckdb/src/execution/column_binding_resolver.cpp +21 -5
  71. package/src/duckdb/src/execution/expression_executor/execute_cast.cpp +2 -1
  72. package/src/duckdb/src/execution/index/art/art.cpp +6 -5
  73. package/src/duckdb/src/execution/operator/aggregate/physical_perfecthash_aggregate.cpp +4 -5
  74. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +117 -26
  75. package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +3 -0
  76. package/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp +5 -3
  77. package/src/duckdb/src/execution/operator/join/physical_blockwise_nl_join.cpp +64 -17
  78. package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +2 -2
  79. package/src/duckdb/src/execution/operator/join/physical_index_join.cpp +12 -4
  80. package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +6 -11
  81. package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +3 -1
  82. package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +6 -3
  83. package/src/duckdb/src/execution/operator/persistent/buffered_csv_reader.cpp +6 -14
  84. package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +2 -2
  85. package/src/duckdb/src/execution/operator/projection/physical_projection.cpp +34 -0
  86. package/src/duckdb/src/execution/operator/scan/physical_positional_scan.cpp +20 -5
  87. package/src/duckdb/src/execution/operator/schema/physical_create_type.cpp +20 -40
  88. package/src/duckdb/src/execution/partitionable_hashtable.cpp +14 -2
  89. package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +21 -16
  90. package/src/duckdb/src/execution/physical_plan/plan_asof_join.cpp +97 -0
  91. package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +95 -47
  92. package/src/duckdb/src/execution/physical_plan/plan_distinct.cpp +5 -8
  93. package/src/duckdb/src/execution/physical_plan/plan_positional_join.cpp +14 -5
  94. package/src/duckdb/src/execution/physical_plan_generator.cpp +3 -0
  95. package/src/duckdb/src/execution/window_segment_tree.cpp +173 -1
  96. package/src/duckdb/src/function/aggregate/algebraic/avg.cpp +0 -6
  97. package/src/duckdb/src/function/aggregate/distributive/bitagg.cpp +99 -95
  98. package/src/duckdb/src/function/aggregate/distributive/bitstring_agg.cpp +269 -0
  99. package/src/duckdb/src/function/aggregate/distributive/bool.cpp +2 -0
  100. package/src/duckdb/src/function/aggregate/distributive/count.cpp +3 -4
  101. package/src/duckdb/src/function/aggregate/distributive/first.cpp +1 -0
  102. package/src/duckdb/src/function/aggregate/distributive/minmax.cpp +2 -0
  103. package/src/duckdb/src/function/aggregate/distributive/sum.cpp +19 -16
  104. package/src/duckdb/src/function/aggregate/distributive_functions.cpp +1 -0
  105. package/src/duckdb/src/function/aggregate/holistic/approximate_quantile.cpp +5 -2
  106. package/src/duckdb/src/function/aggregate/holistic/mode.cpp +1 -1
  107. package/src/duckdb/src/function/aggregate/holistic/quantile.cpp +16 -1
  108. package/src/duckdb/src/function/aggregate/nested/list.cpp +8 -8
  109. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +58 -16
  110. package/src/duckdb/src/function/cast/bit_cast.cpp +0 -2
  111. package/src/duckdb/src/function/cast/blob_cast.cpp +0 -1
  112. package/src/duckdb/src/function/cast/cast_function_set.cpp +1 -1
  113. package/src/duckdb/src/function/cast/enum_casts.cpp +25 -3
  114. package/src/duckdb/src/function/cast/list_casts.cpp +17 -4
  115. package/src/duckdb/src/function/cast/map_cast.cpp +5 -2
  116. package/src/duckdb/src/function/cast/string_cast.cpp +36 -10
  117. package/src/duckdb/src/function/cast/struct_cast.cpp +24 -4
  118. package/src/duckdb/src/function/cast/time_casts.cpp +2 -2
  119. package/src/duckdb/src/function/cast/union_casts.cpp +33 -7
  120. package/src/duckdb/src/function/function_binder.cpp +1 -8
  121. package/src/duckdb/src/function/scalar/bit/bitstring.cpp +100 -0
  122. package/src/duckdb/src/function/scalar/date/current.cpp +0 -2
  123. package/src/duckdb/src/function/scalar/date/date_diff.cpp +0 -1
  124. package/src/duckdb/src/function/scalar/date/date_part.cpp +18 -26
  125. package/src/duckdb/src/function/scalar/date/date_sub.cpp +0 -1
  126. package/src/duckdb/src/function/scalar/date/date_trunc.cpp +10 -14
  127. package/src/duckdb/src/function/scalar/generic/stats.cpp +2 -4
  128. package/src/duckdb/src/function/scalar/list/contains_or_position.cpp +4 -146
  129. package/src/duckdb/src/function/scalar/list/flatten.cpp +5 -12
  130. package/src/duckdb/src/function/scalar/list/list_aggregates.cpp +1 -1
  131. package/src/duckdb/src/function/scalar/list/list_concat.cpp +8 -12
  132. package/src/duckdb/src/function/scalar/list/list_extract.cpp +5 -12
  133. package/src/duckdb/src/function/scalar/list/list_lambdas.cpp +7 -3
  134. package/src/duckdb/src/function/scalar/list/list_value.cpp +6 -10
  135. package/src/duckdb/src/function/scalar/map/map.cpp +47 -1
  136. package/src/duckdb/src/function/scalar/map/map_entries.cpp +61 -0
  137. package/src/duckdb/src/function/scalar/map/map_extract.cpp +68 -26
  138. package/src/duckdb/src/function/scalar/map/map_keys_values.cpp +97 -0
  139. package/src/duckdb/src/function/scalar/math/numeric.cpp +101 -17
  140. package/src/duckdb/src/function/scalar/math_functions.cpp +3 -0
  141. package/src/duckdb/src/function/scalar/nested_functions.cpp +3 -0
  142. package/src/duckdb/src/function/scalar/operators/add.cpp +0 -9
  143. package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +29 -48
  144. package/src/duckdb/src/function/scalar/operators/bitwise.cpp +0 -63
  145. package/src/duckdb/src/function/scalar/operators/multiply.cpp +5 -6
  146. package/src/duckdb/src/function/scalar/operators/subtract.cpp +0 -6
  147. package/src/duckdb/src/function/scalar/string/caseconvert.cpp +2 -6
  148. package/src/duckdb/src/function/scalar/string/hex.cpp +201 -0
  149. package/src/duckdb/src/function/scalar/string/instr.cpp +2 -6
  150. package/src/duckdb/src/function/scalar/string/length.cpp +2 -6
  151. package/src/duckdb/src/function/scalar/string/like.cpp +2 -6
  152. package/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp +243 -0
  153. package/src/duckdb/src/function/scalar/string/regexp/regexp_util.cpp +79 -0
  154. package/src/duckdb/src/function/scalar/string/regexp.cpp +21 -80
  155. package/src/duckdb/src/function/scalar/string/substring.cpp +2 -6
  156. package/src/duckdb/src/function/scalar/string_functions.cpp +2 -0
  157. package/src/duckdb/src/function/scalar/struct/struct_extract.cpp +5 -10
  158. package/src/duckdb/src/function/scalar/struct/struct_insert.cpp +11 -14
  159. package/src/duckdb/src/function/scalar/struct/struct_pack.cpp +6 -7
  160. package/src/duckdb/src/function/table/arrow.cpp +5 -2
  161. package/src/duckdb/src/function/table/arrow_conversion.cpp +25 -1
  162. package/src/duckdb/src/function/table/checkpoint.cpp +5 -1
  163. package/src/duckdb/src/function/table/read_csv.cpp +55 -0
  164. package/src/duckdb/src/function/table/system/duckdb_constraints.cpp +2 -2
  165. package/src/duckdb/src/function/table/system/test_all_types.cpp +2 -2
  166. package/src/duckdb/src/function/table/table_scan.cpp +1 -1
  167. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  168. package/src/duckdb/src/function/table_function.cpp +30 -11
  169. package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +6 -0
  170. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_table_entry.hpp +1 -1
  171. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_function_catalog_entry.hpp +6 -8
  172. package/src/duckdb/src/include/duckdb/catalog/dependency_list.hpp +3 -0
  173. package/src/duckdb/src/include/duckdb/catalog/duck_catalog.hpp +2 -1
  174. package/src/duckdb/src/include/duckdb/common/box_renderer.hpp +8 -2
  175. package/src/duckdb/src/include/duckdb/common/constants.hpp +0 -19
  176. package/src/duckdb/src/include/duckdb/common/enums/aggregate_handling.hpp +2 -0
  177. package/src/duckdb/src/include/duckdb/common/enums/expression_type.hpp +2 -3
  178. package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +7 -4
  179. package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +1 -0
  180. package/src/duckdb/src/include/duckdb/common/enums/order_type.hpp +2 -0
  181. package/src/duckdb/src/include/duckdb/common/enums/set_operation_type.hpp +2 -1
  182. package/src/duckdb/src/include/duckdb/common/enums/statement_type.hpp +2 -1
  183. package/src/duckdb/src/include/duckdb/common/enums/tableref_type.hpp +2 -1
  184. package/src/duckdb/src/include/duckdb/common/exception.hpp +69 -2
  185. package/src/duckdb/src/include/duckdb/common/field_writer.hpp +12 -4
  186. package/src/duckdb/src/include/duckdb/common/{http_stats.hpp → http_state.hpp} +18 -4
  187. package/src/duckdb/src/include/duckdb/common/operator/multiply.hpp +2 -0
  188. package/src/duckdb/src/include/duckdb/common/optional_ptr.hpp +45 -0
  189. package/src/duckdb/src/include/duckdb/common/preserved_error.hpp +6 -1
  190. package/src/duckdb/src/include/duckdb/common/serializer/buffered_deserializer.hpp +4 -2
  191. package/src/duckdb/src/include/duckdb/common/serializer/buffered_file_reader.hpp +8 -2
  192. package/src/duckdb/src/include/duckdb/common/serializer/enum_serializer.hpp +113 -0
  193. package/src/duckdb/src/include/duckdb/common/serializer/format_deserializer.hpp +336 -0
  194. package/src/duckdb/src/include/duckdb/common/serializer/format_serializer.hpp +268 -0
  195. package/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp +126 -0
  196. package/src/duckdb/src/include/duckdb/common/serializer.hpp +13 -0
  197. package/src/duckdb/src/include/duckdb/common/string_util.hpp +25 -0
  198. package/src/duckdb/src/include/duckdb/common/types/bit.hpp +12 -7
  199. package/src/duckdb/src/include/duckdb/common/types/time.hpp +3 -0
  200. package/src/duckdb/src/include/duckdb/common/types/value.hpp +17 -48
  201. package/src/duckdb/src/include/duckdb/common/types/value_map.hpp +1 -1
  202. package/src/duckdb/src/include/duckdb/common/types/vector.hpp +3 -1
  203. package/src/duckdb/src/include/duckdb/common/types.hpp +45 -8
  204. package/src/duckdb/src/include/duckdb/common/vector_operations/unary_executor.hpp +2 -2
  205. package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +1 -0
  206. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +2 -2
  207. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_perfecthash_aggregate.hpp +1 -1
  208. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_cross_product.hpp +2 -0
  209. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_file_handle.hpp +1 -0
  210. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +6 -0
  211. package/src/duckdb/src/include/duckdb/execution/operator/projection/physical_projection.hpp +5 -0
  212. package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +3 -0
  213. package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +1 -3
  214. package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +54 -0
  215. package/src/duckdb/src/include/duckdb/function/aggregate/distributive_functions.hpp +5 -0
  216. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +18 -6
  217. package/src/duckdb/src/include/duckdb/function/cast/bound_cast_data.hpp +84 -0
  218. package/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp +2 -2
  219. package/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp +28 -64
  220. package/src/duckdb/src/include/duckdb/function/function_binder.hpp +3 -6
  221. package/src/duckdb/src/include/duckdb/function/scalar/bit_functions.hpp +4 -0
  222. package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +138 -0
  223. package/src/duckdb/src/include/duckdb/function/scalar/math_functions.hpp +8 -0
  224. package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +59 -0
  225. package/src/duckdb/src/include/duckdb/function/scalar/regexp.hpp +81 -1
  226. package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +4 -0
  227. package/src/duckdb/src/include/duckdb/function/scalar_function.hpp +2 -2
  228. package/src/duckdb/src/include/duckdb/function/table/arrow.hpp +12 -1
  229. package/src/duckdb/src/include/duckdb/function/table_function.hpp +10 -0
  230. package/src/duckdb/src/include/duckdb/main/capi/capi_internal.hpp +2 -0
  231. package/src/duckdb/src/include/duckdb/main/client_data.hpp +3 -3
  232. package/src/duckdb/src/include/duckdb/main/config.hpp +3 -0
  233. package/src/duckdb/src/include/duckdb/main/connection_manager.hpp +2 -0
  234. package/src/duckdb/src/include/duckdb/main/database.hpp +1 -0
  235. package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +2 -0
  236. package/src/duckdb/src/include/duckdb/main/prepared_statement.hpp +2 -0
  237. package/src/duckdb/src/include/duckdb/main/relation/explain_relation.hpp +2 -1
  238. package/src/duckdb/src/include/duckdb/main/relation.hpp +2 -1
  239. package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +2 -0
  240. package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +2 -2
  241. package/src/duckdb/src/include/duckdb/optimizer/rule/list.hpp +1 -0
  242. package/src/duckdb/src/include/duckdb/optimizer/rule/ordered_aggregate_optimizer.hpp +24 -0
  243. package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +4 -0
  244. package/src/duckdb/src/include/duckdb/parser/expression/between_expression.hpp +3 -0
  245. package/src/duckdb/src/include/duckdb/parser/expression/bound_expression.hpp +2 -0
  246. package/src/duckdb/src/include/duckdb/parser/expression/case_expression.hpp +5 -0
  247. package/src/duckdb/src/include/duckdb/parser/expression/cast_expression.hpp +2 -0
  248. package/src/duckdb/src/include/duckdb/parser/expression/collate_expression.hpp +2 -0
  249. package/src/duckdb/src/include/duckdb/parser/expression/columnref_expression.hpp +2 -0
  250. package/src/duckdb/src/include/duckdb/parser/expression/comparison_expression.hpp +2 -0
  251. package/src/duckdb/src/include/duckdb/parser/expression/conjunction_expression.hpp +2 -0
  252. package/src/duckdb/src/include/duckdb/parser/expression/constant_expression.hpp +3 -0
  253. package/src/duckdb/src/include/duckdb/parser/expression/default_expression.hpp +1 -0
  254. package/src/duckdb/src/include/duckdb/parser/expression/function_expression.hpp +4 -2
  255. package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +2 -0
  256. package/src/duckdb/src/include/duckdb/parser/expression/operator_expression.hpp +2 -0
  257. package/src/duckdb/src/include/duckdb/parser/expression/parameter_expression.hpp +2 -0
  258. package/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +2 -0
  259. package/src/duckdb/src/include/duckdb/parser/expression/star_expression.hpp +4 -2
  260. package/src/duckdb/src/include/duckdb/parser/expression/subquery_expression.hpp +2 -0
  261. package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +5 -0
  262. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_info.hpp +5 -1
  263. package/src/duckdb/src/include/duckdb/parser/parsed_data/{alter_function_info.hpp → alter_scalar_function_info.hpp} +13 -13
  264. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_function_info.hpp +47 -0
  265. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp +6 -0
  266. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_table_function_info.hpp +2 -1
  267. package/src/duckdb/src/include/duckdb/parser/parsed_data/sample_options.hpp +2 -0
  268. package/src/duckdb/src/include/duckdb/parser/parsed_expression.hpp +5 -0
  269. package/src/duckdb/src/include/duckdb/parser/query_node/recursive_cte_node.hpp +3 -0
  270. package/src/duckdb/src/include/duckdb/parser/query_node/select_node.hpp +5 -0
  271. package/src/duckdb/src/include/duckdb/parser/query_node/set_operation_node.hpp +3 -0
  272. package/src/duckdb/src/include/duckdb/parser/query_node.hpp +13 -2
  273. package/src/duckdb/src/include/duckdb/parser/result_modifier.hpp +24 -1
  274. package/src/duckdb/src/include/duckdb/parser/sql_statement.hpp +2 -1
  275. package/src/duckdb/src/include/duckdb/parser/statement/multi_statement.hpp +28 -0
  276. package/src/duckdb/src/include/duckdb/parser/statement/select_statement.hpp +6 -1
  277. package/src/duckdb/src/include/duckdb/parser/tableref/basetableref.hpp +4 -0
  278. package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +2 -0
  279. package/src/duckdb/src/include/duckdb/parser/tableref/expressionlistref.hpp +3 -0
  280. package/src/duckdb/src/include/duckdb/parser/tableref/joinref.hpp +3 -0
  281. package/src/duckdb/src/include/duckdb/parser/tableref/list.hpp +1 -0
  282. package/src/duckdb/src/include/duckdb/parser/tableref/pivotref.hpp +87 -0
  283. package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +3 -0
  284. package/src/duckdb/src/include/duckdb/parser/tableref/table_function_ref.hpp +3 -0
  285. package/src/duckdb/src/include/duckdb/parser/tableref.hpp +3 -1
  286. package/src/duckdb/src/include/duckdb/parser/tokens.hpp +2 -0
  287. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +33 -0
  288. package/src/duckdb/src/include/duckdb/planner/bind_context.hpp +2 -0
  289. package/src/duckdb/src/include/duckdb/planner/binder.hpp +15 -4
  290. package/src/duckdb/src/include/duckdb/planner/bound_result_modifier.hpp +3 -0
  291. package/src/duckdb/src/include/duckdb/planner/expression/bound_aggregate_expression.hpp +3 -0
  292. package/src/duckdb/src/include/duckdb/planner/expression_binder/base_select_binder.hpp +64 -0
  293. package/src/duckdb/src/include/duckdb/planner/expression_binder/having_binder.hpp +2 -2
  294. package/src/duckdb/src/include/duckdb/planner/expression_binder/order_binder.hpp +4 -1
  295. package/src/duckdb/src/include/duckdb/planner/expression_binder/qualify_binder.hpp +2 -2
  296. package/src/duckdb/src/include/duckdb/planner/expression_binder/select_binder.hpp +9 -38
  297. package/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +1 -1
  298. package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +1 -0
  299. package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +1 -0
  300. package/src/duckdb/src/include/duckdb/planner/operator/logical_asof_join.hpp +22 -0
  301. package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +5 -2
  302. package/src/duckdb/src/include/duckdb/planner/operator/logical_distinct.hpp +3 -0
  303. package/src/duckdb/src/include/duckdb/planner/query_node/bound_select_node.hpp +8 -2
  304. package/src/duckdb/src/include/duckdb/storage/buffer/block_handle.hpp +2 -0
  305. package/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp +76 -44
  306. package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp +3 -2
  307. package/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp +1 -1
  308. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_compress.hpp +2 -2
  309. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_fetch.hpp +1 -1
  310. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_scan.hpp +1 -1
  311. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_compress.hpp +2 -2
  312. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_fetch.hpp +1 -1
  313. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_scan.hpp +1 -1
  314. package/src/duckdb/src/include/duckdb/storage/data_pointer.hpp +5 -2
  315. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +3 -3
  316. package/src/duckdb/src/include/duckdb/storage/index.hpp +4 -3
  317. package/src/duckdb/src/include/duckdb/storage/meta_block_reader.hpp +7 -0
  318. package/src/duckdb/src/include/duckdb/storage/statistics/base_statistics.hpp +93 -29
  319. package/src/duckdb/src/include/duckdb/storage/statistics/column_statistics.hpp +22 -3
  320. package/src/duckdb/src/include/duckdb/storage/statistics/distinct_statistics.hpp +8 -6
  321. package/src/duckdb/src/include/duckdb/storage/statistics/list_stats.hpp +41 -0
  322. package/src/duckdb/src/include/duckdb/storage/statistics/node_statistics.hpp +26 -0
  323. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats.hpp +114 -0
  324. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats_union.hpp +62 -0
  325. package/src/duckdb/src/include/duckdb/storage/statistics/segment_statistics.hpp +2 -7
  326. package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +74 -0
  327. package/src/duckdb/src/include/duckdb/storage/statistics/struct_stats.hpp +42 -0
  328. package/src/duckdb/src/include/duckdb/storage/string_uncompressed.hpp +2 -3
  329. package/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp +2 -1
  330. package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +6 -3
  331. package/src/duckdb/src/include/duckdb/storage/table/column_data_checkpointer.hpp +3 -2
  332. package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +7 -5
  333. package/src/duckdb/src/include/duckdb/storage/table/list_column_data.hpp +1 -1
  334. package/src/duckdb/src/include/duckdb/storage/table/persistent_table_data.hpp +6 -2
  335. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +10 -6
  336. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +8 -5
  337. package/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp +37 -0
  338. package/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp +10 -1
  339. package/src/duckdb/src/include/duckdb/storage/table/segment_base.hpp +4 -3
  340. package/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +271 -26
  341. package/src/duckdb/src/include/duckdb/storage/table/table_statistics.hpp +5 -0
  342. package/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +0 -1
  343. package/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +1 -1
  344. package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +2 -2
  345. package/src/duckdb/src/include/duckdb.h +50 -2
  346. package/src/duckdb/src/include/duckdb.hpp +0 -1
  347. package/src/duckdb/src/main/capi/pending-c.cpp +16 -3
  348. package/src/duckdb/src/main/capi/result-c.cpp +27 -1
  349. package/src/duckdb/src/main/capi/stream-c.cpp +25 -0
  350. package/src/duckdb/src/main/client_context.cpp +38 -34
  351. package/src/duckdb/src/main/client_data.cpp +7 -6
  352. package/src/duckdb/src/main/config.cpp +70 -1
  353. package/src/duckdb/src/main/database.cpp +19 -2
  354. package/src/duckdb/src/main/extension/extension_install.cpp +7 -2
  355. package/src/duckdb/src/main/prepared_statement.cpp +4 -0
  356. package/src/duckdb/src/main/query_profiler.cpp +17 -15
  357. package/src/duckdb/src/main/relation/explain_relation.cpp +3 -3
  358. package/src/duckdb/src/main/relation.cpp +3 -2
  359. package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +1 -0
  360. package/src/duckdb/src/optimizer/deliminator.cpp +1 -1
  361. package/src/duckdb/src/optimizer/filter_combiner.cpp +1 -1
  362. package/src/duckdb/src/optimizer/filter_pullup.cpp +3 -1
  363. package/src/duckdb/src/optimizer/filter_pushdown.cpp +14 -8
  364. package/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp +105 -71
  365. package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +31 -12
  366. package/src/duckdb/src/optimizer/optimizer.cpp +1 -0
  367. package/src/duckdb/src/optimizer/pullup/pullup_from_left.cpp +2 -2
  368. package/src/duckdb/src/optimizer/pushdown/pushdown_aggregate.cpp +33 -5
  369. package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +1 -1
  370. package/src/duckdb/src/optimizer/pushdown/pushdown_inner_join.cpp +3 -0
  371. package/src/duckdb/src/optimizer/pushdown/pushdown_left_join.cpp +5 -12
  372. package/src/duckdb/src/optimizer/pushdown/pushdown_mark_join.cpp +2 -2
  373. package/src/duckdb/src/optimizer/pushdown/pushdown_single_join.cpp +1 -1
  374. package/src/duckdb/src/optimizer/remove_unused_columns.cpp +1 -0
  375. package/src/duckdb/src/optimizer/rule/move_constants.cpp +10 -4
  376. package/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp +30 -0
  377. package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +9 -2
  378. package/src/duckdb/src/optimizer/statistics/expression/propagate_aggregate.cpp +9 -3
  379. package/src/duckdb/src/optimizer/statistics/expression/propagate_and_compress.cpp +6 -7
  380. package/src/duckdb/src/optimizer/statistics/expression/propagate_cast.cpp +14 -11
  381. package/src/duckdb/src/optimizer/statistics/expression/propagate_columnref.cpp +1 -1
  382. package/src/duckdb/src/optimizer/statistics/expression/propagate_comparison.cpp +13 -15
  383. package/src/duckdb/src/optimizer/statistics/expression/propagate_conjunction.cpp +0 -1
  384. package/src/duckdb/src/optimizer/statistics/expression/propagate_constant.cpp +3 -75
  385. package/src/duckdb/src/optimizer/statistics/expression/propagate_function.cpp +7 -2
  386. package/src/duckdb/src/optimizer/statistics/expression/propagate_operator.cpp +10 -0
  387. package/src/duckdb/src/optimizer/statistics/operator/propagate_aggregate.cpp +2 -3
  388. package/src/duckdb/src/optimizer/statistics/operator/propagate_filter.cpp +29 -32
  389. package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +5 -5
  390. package/src/duckdb/src/optimizer/statistics/operator/propagate_set_operation.cpp +3 -3
  391. package/src/duckdb/src/optimizer/statistics_propagator.cpp +2 -1
  392. package/src/duckdb/src/optimizer/unnest_rewriter.cpp +2 -2
  393. package/src/duckdb/src/parallel/meta_pipeline.cpp +0 -4
  394. package/src/duckdb/src/parser/common_table_expression_info.cpp +19 -0
  395. package/src/duckdb/src/parser/expression/between_expression.cpp +17 -0
  396. package/src/duckdb/src/parser/expression/case_expression.cpp +28 -0
  397. package/src/duckdb/src/parser/expression/cast_expression.cpp +17 -0
  398. package/src/duckdb/src/parser/expression/collate_expression.cpp +16 -0
  399. package/src/duckdb/src/parser/expression/columnref_expression.cpp +15 -0
  400. package/src/duckdb/src/parser/expression/comparison_expression.cpp +16 -0
  401. package/src/duckdb/src/parser/expression/conjunction_expression.cpp +17 -0
  402. package/src/duckdb/src/parser/expression/constant_expression.cpp +14 -0
  403. package/src/duckdb/src/parser/expression/default_expression.cpp +7 -0
  404. package/src/duckdb/src/parser/expression/function_expression.cpp +35 -0
  405. package/src/duckdb/src/parser/expression/lambda_expression.cpp +16 -0
  406. package/src/duckdb/src/parser/expression/operator_expression.cpp +15 -0
  407. package/src/duckdb/src/parser/expression/parameter_expression.cpp +15 -0
  408. package/src/duckdb/src/parser/expression/positional_reference_expression.cpp +14 -0
  409. package/src/duckdb/src/parser/expression/star_expression.cpp +26 -6
  410. package/src/duckdb/src/parser/expression/subquery_expression.cpp +20 -0
  411. package/src/duckdb/src/parser/expression/window_expression.cpp +43 -0
  412. package/src/duckdb/src/parser/parsed_data/alter_info.cpp +7 -3
  413. package/src/duckdb/src/parser/parsed_data/alter_scalar_function_info.cpp +56 -0
  414. package/src/duckdb/src/parser/parsed_data/alter_table_function_info.cpp +51 -0
  415. package/src/duckdb/src/parser/parsed_data/create_scalar_function_info.cpp +3 -2
  416. package/src/duckdb/src/parser/parsed_data/create_table_function_info.cpp +6 -0
  417. package/src/duckdb/src/parser/parsed_data/sample_options.cpp +22 -10
  418. package/src/duckdb/src/parser/parsed_expression.cpp +72 -0
  419. package/src/duckdb/src/parser/parsed_expression_iterator.cpp +15 -1
  420. package/src/duckdb/src/parser/query_node/recursive_cte_node.cpp +21 -0
  421. package/src/duckdb/src/parser/query_node/select_node.cpp +31 -0
  422. package/src/duckdb/src/parser/query_node/set_operation_node.cpp +17 -0
  423. package/src/duckdb/src/parser/query_node.cpp +51 -1
  424. package/src/duckdb/src/parser/result_modifier.cpp +78 -0
  425. package/src/duckdb/src/parser/statement/multi_statement.cpp +18 -0
  426. package/src/duckdb/src/parser/statement/select_statement.cpp +12 -0
  427. package/src/duckdb/src/parser/tableref/basetableref.cpp +21 -0
  428. package/src/duckdb/src/parser/tableref/emptytableref.cpp +4 -0
  429. package/src/duckdb/src/parser/tableref/expressionlistref.cpp +17 -0
  430. package/src/duckdb/src/parser/tableref/joinref.cpp +29 -0
  431. package/src/duckdb/src/parser/tableref/pivotref.cpp +373 -0
  432. package/src/duckdb/src/parser/tableref/subqueryref.cpp +15 -0
  433. package/src/duckdb/src/parser/tableref/table_function.cpp +17 -0
  434. package/src/duckdb/src/parser/tableref.cpp +49 -0
  435. package/src/duckdb/src/parser/transform/expression/transform_array_access.cpp +11 -0
  436. package/src/duckdb/src/parser/transform/expression/transform_bool_expr.cpp +1 -1
  437. package/src/duckdb/src/parser/transform/expression/transform_columnref.cpp +17 -2
  438. package/src/duckdb/src/parser/transform/expression/transform_function.cpp +63 -42
  439. package/src/duckdb/src/parser/transform/expression/transform_operator.cpp +1 -1
  440. package/src/duckdb/src/parser/transform/expression/transform_subquery.cpp +1 -1
  441. package/src/duckdb/src/parser/transform/helpers/transform_alias.cpp +12 -6
  442. package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +24 -0
  443. package/src/duckdb/src/parser/transform/helpers/transform_groupby.cpp +7 -0
  444. package/src/duckdb/src/parser/transform/helpers/transform_orderby.cpp +0 -7
  445. package/src/duckdb/src/parser/transform/helpers/transform_typename.cpp +3 -2
  446. package/src/duckdb/src/parser/transform/statement/transform_create_function.cpp +4 -0
  447. package/src/duckdb/src/parser/transform/statement/transform_create_view.cpp +4 -0
  448. package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +179 -0
  449. package/src/duckdb/src/parser/transform/statement/transform_rename.cpp +3 -4
  450. package/src/duckdb/src/parser/transform/statement/transform_select.cpp +8 -0
  451. package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +2 -3
  452. package/src/duckdb/src/parser/transform/tableref/transform_join.cpp +12 -1
  453. package/src/duckdb/src/parser/transform/tableref/transform_pivot.cpp +121 -0
  454. package/src/duckdb/src/parser/transform/tableref/transform_tableref.cpp +2 -0
  455. package/src/duckdb/src/parser/transformer.cpp +15 -3
  456. package/src/duckdb/src/planner/bind_context.cpp +18 -25
  457. package/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp +9 -7
  458. package/src/duckdb/src/planner/binder/expression/bind_columnref_expression.cpp +4 -3
  459. package/src/duckdb/src/planner/binder/expression/bind_function_expression.cpp +23 -12
  460. package/src/duckdb/src/planner/binder/expression/bind_lambda.cpp +3 -2
  461. package/src/duckdb/src/planner/binder/expression/bind_star_expression.cpp +176 -0
  462. package/src/duckdb/src/planner/binder/expression/bind_subquery_expression.cpp +4 -0
  463. package/src/duckdb/src/planner/binder/expression/bind_unnest_expression.cpp +163 -24
  464. package/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp +2 -2
  465. package/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +109 -94
  466. package/src/duckdb/src/planner/binder/query_node/plan_query_node.cpp +11 -0
  467. package/src/duckdb/src/planner/binder/query_node/plan_select_node.cpp +9 -4
  468. package/src/duckdb/src/planner/binder/statement/bind_copy.cpp +5 -3
  469. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +3 -2
  470. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +9 -1
  471. package/src/duckdb/src/planner/binder/statement/bind_delete.cpp +1 -1
  472. package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +12 -8
  473. package/src/duckdb/src/planner/binder/statement/bind_logical_plan.cpp +17 -0
  474. package/src/duckdb/src/planner/binder/statement/bind_update.cpp +4 -2
  475. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +19 -3
  476. package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +366 -0
  477. package/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp +11 -1
  478. package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -0
  479. package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +61 -13
  480. package/src/duckdb/src/planner/binder.cpp +19 -24
  481. package/src/duckdb/src/planner/bound_result_modifier.cpp +27 -1
  482. package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +9 -2
  483. package/src/duckdb/src/planner/expression/bound_expression.cpp +4 -0
  484. package/src/duckdb/src/planner/expression/bound_window_expression.cpp +1 -1
  485. package/src/duckdb/src/planner/expression_binder/base_select_binder.cpp +146 -0
  486. package/src/duckdb/src/planner/expression_binder/having_binder.cpp +6 -3
  487. package/src/duckdb/src/planner/expression_binder/qualify_binder.cpp +3 -3
  488. package/src/duckdb/src/planner/expression_binder/select_binder.cpp +1 -132
  489. package/src/duckdb/src/planner/expression_binder.cpp +10 -3
  490. package/src/duckdb/src/planner/expression_iterator.cpp +17 -10
  491. package/src/duckdb/src/planner/filter/constant_filter.cpp +4 -6
  492. package/src/duckdb/src/planner/logical_operator.cpp +7 -2
  493. package/src/duckdb/src/planner/logical_operator_visitor.cpp +6 -0
  494. package/src/duckdb/src/planner/operator/logical_asof_join.cpp +8 -0
  495. package/src/duckdb/src/planner/operator/logical_distinct.cpp +3 -0
  496. package/src/duckdb/src/planner/planner.cpp +2 -1
  497. package/src/duckdb/src/planner/pragma_handler.cpp +10 -2
  498. package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +3 -1
  499. package/src/duckdb/src/storage/buffer_manager.cpp +44 -46
  500. package/src/duckdb/src/storage/checkpoint/row_group_writer.cpp +1 -1
  501. package/src/duckdb/src/storage/checkpoint/table_data_reader.cpp +4 -15
  502. package/src/duckdb/src/storage/checkpoint/table_data_writer.cpp +10 -4
  503. package/src/duckdb/src/storage/checkpoint_manager.cpp +9 -3
  504. package/src/duckdb/src/storage/compression/bitpacking.cpp +28 -24
  505. package/src/duckdb/src/storage/compression/fixed_size_uncompressed.cpp +43 -45
  506. package/src/duckdb/src/storage/compression/numeric_constant.cpp +9 -10
  507. package/src/duckdb/src/storage/compression/patas.cpp +1 -1
  508. package/src/duckdb/src/storage/compression/rle.cpp +19 -15
  509. package/src/duckdb/src/storage/compression/validity_uncompressed.cpp +5 -5
  510. package/src/duckdb/src/storage/data_table.cpp +20 -20
  511. package/src/duckdb/src/storage/index.cpp +12 -1
  512. package/src/duckdb/src/storage/local_storage.cpp +20 -23
  513. package/src/duckdb/src/storage/meta_block_reader.cpp +22 -0
  514. package/src/duckdb/src/storage/statistics/base_statistics.cpp +373 -128
  515. package/src/duckdb/src/storage/statistics/column_statistics.cpp +57 -3
  516. package/src/duckdb/src/storage/statistics/distinct_statistics.cpp +8 -9
  517. package/src/duckdb/src/storage/statistics/list_stats.cpp +121 -0
  518. package/src/duckdb/src/storage/statistics/numeric_stats.cpp +591 -0
  519. package/src/duckdb/src/storage/statistics/numeric_stats_union.cpp +65 -0
  520. package/src/duckdb/src/storage/statistics/segment_statistics.cpp +2 -11
  521. package/src/duckdb/src/storage/statistics/string_stats.cpp +273 -0
  522. package/src/duckdb/src/storage/statistics/struct_stats.cpp +133 -0
  523. package/src/duckdb/src/storage/storage_info.cpp +2 -2
  524. package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +4 -10
  525. package/src/duckdb/src/storage/table/column_data.cpp +45 -46
  526. package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +7 -8
  527. package/src/duckdb/src/storage/table/column_segment.cpp +13 -14
  528. package/src/duckdb/src/storage/table/list_column_data.cpp +41 -59
  529. package/src/duckdb/src/storage/table/persistent_table_data.cpp +2 -1
  530. package/src/duckdb/src/storage/table/row_group.cpp +38 -32
  531. package/src/duckdb/src/storage/table/row_group_collection.cpp +94 -78
  532. package/src/duckdb/src/storage/table/scan_state.cpp +22 -3
  533. package/src/duckdb/src/storage/table/standard_column_data.cpp +7 -6
  534. package/src/duckdb/src/storage/table/struct_column_data.cpp +16 -16
  535. package/src/duckdb/src/storage/table/table_statistics.cpp +27 -7
  536. package/src/duckdb/src/storage/table/update_segment.cpp +20 -18
  537. package/src/duckdb/src/storage/wal_replay.cpp +8 -5
  538. package/src/duckdb/src/storage/write_ahead_log.cpp +2 -2
  539. package/src/duckdb/src/transaction/commit_state.cpp +11 -7
  540. package/src/duckdb/src/verification/deserialized_statement_verifier.cpp +0 -1
  541. package/src/duckdb/third_party/libpg_query/include/nodes/nodes.hpp +35 -0
  542. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +36 -2
  543. package/src/duckdb/third_party/libpg_query/include/nodes/primnodes.hpp +3 -3
  544. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +1022 -530
  545. package/src/duckdb/third_party/libpg_query/include/parser/kwlist.hpp +8 -0
  546. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +24462 -22828
  547. package/src/duckdb/third_party/re2/re2/re2.cc +9 -0
  548. package/src/duckdb/third_party/re2/re2/re2.h +2 -0
  549. package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +4 -4
  550. package/src/duckdb/ub_extension_json_json_functions.cpp +2 -0
  551. package/src/duckdb/ub_src_common_serializer.cpp +2 -0
  552. package/src/duckdb/ub_src_execution_physical_plan.cpp +2 -0
  553. package/src/duckdb/ub_src_function_aggregate_distributive.cpp +2 -0
  554. package/src/duckdb/ub_src_function_scalar_bit.cpp +2 -0
  555. package/src/duckdb/ub_src_function_scalar_map.cpp +4 -0
  556. package/src/duckdb/ub_src_function_scalar_string.cpp +2 -0
  557. package/src/duckdb/ub_src_function_scalar_string_regexp.cpp +4 -0
  558. package/src/duckdb/ub_src_main_capi.cpp +2 -0
  559. package/src/duckdb/ub_src_optimizer_rule.cpp +2 -0
  560. package/src/duckdb/ub_src_parser.cpp +2 -0
  561. package/src/duckdb/ub_src_parser_parsed_data.cpp +4 -2
  562. package/src/duckdb/ub_src_parser_statement.cpp +2 -0
  563. package/src/duckdb/ub_src_parser_tableref.cpp +2 -0
  564. package/src/duckdb/ub_src_parser_transform_statement.cpp +2 -0
  565. package/src/duckdb/ub_src_parser_transform_tableref.cpp +2 -0
  566. package/src/duckdb/ub_src_planner_binder_expression.cpp +2 -0
  567. package/src/duckdb/ub_src_planner_binder_tableref.cpp +2 -0
  568. package/src/duckdb/ub_src_planner_expression_binder.cpp +2 -0
  569. package/src/duckdb/ub_src_planner_operator.cpp +2 -0
  570. package/src/duckdb/ub_src_storage_statistics.cpp +6 -6
  571. package/src/duckdb/ub_src_storage_table.cpp +0 -2
  572. package/src/duckdb_node.hpp +2 -1
  573. package/src/statement.cpp +5 -5
  574. package/src/utils.cpp +27 -2
  575. package/test/extension.test.ts +44 -26
  576. package/test/syntax_error.test.ts +3 -1
  577. package/filelist.cache +0 -0
  578. package/src/duckdb/src/include/duckdb/main/loadable_extension.hpp +0 -59
  579. package/src/duckdb/src/include/duckdb/storage/statistics/list_statistics.hpp +0 -36
  580. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_statistics.hpp +0 -75
  581. package/src/duckdb/src/include/duckdb/storage/statistics/string_statistics.hpp +0 -49
  582. package/src/duckdb/src/include/duckdb/storage/statistics/struct_statistics.hpp +0 -36
  583. package/src/duckdb/src/include/duckdb/storage/statistics/validity_statistics.hpp +0 -45
  584. package/src/duckdb/src/parser/parsed_data/alter_function_info.cpp +0 -55
  585. package/src/duckdb/src/storage/statistics/list_statistics.cpp +0 -94
  586. package/src/duckdb/src/storage/statistics/numeric_statistics.cpp +0 -307
  587. package/src/duckdb/src/storage/statistics/string_statistics.cpp +0 -220
  588. package/src/duckdb/src/storage/statistics/struct_statistics.cpp +0 -108
  589. package/src/duckdb/src/storage/statistics/validity_statistics.cpp +0 -91
  590. package/src/duckdb/src/storage/table/segment_tree.cpp +0 -179
@@ -0,0 +1,366 @@
1
+ #include "duckdb/planner/binder.hpp"
2
+ #include "duckdb/parser/tableref/pivotref.hpp"
3
+ #include "duckdb/parser/tableref/subqueryref.hpp"
4
+ #include "duckdb/parser/query_node/select_node.hpp"
5
+ #include "duckdb/parser/expression/case_expression.hpp"
6
+ #include "duckdb/parser/expression/columnref_expression.hpp"
7
+ #include "duckdb/parser/expression/comparison_expression.hpp"
8
+ #include "duckdb/parser/expression/conjunction_expression.hpp"
9
+ #include "duckdb/parser/expression/constant_expression.hpp"
10
+ #include "duckdb/parser/expression/function_expression.hpp"
11
+ #include "duckdb/planner/query_node/bound_select_node.hpp"
12
+ #include "duckdb/parser/expression/star_expression.hpp"
13
+ #include "duckdb/common/types/value_map.hpp"
14
+ #include "duckdb/parser/parsed_expression_iterator.hpp"
15
+ #include "duckdb/parser/expression/operator_expression.hpp"
16
+ #include "duckdb/planner/tableref/bound_subqueryref.hpp"
17
+
18
+ namespace duckdb {
19
+
20
+ static void ConstructPivots(PivotRef &ref, idx_t pivot_idx, vector<unique_ptr<ParsedExpression>> &pivot_expressions,
21
+ unique_ptr<ParsedExpression> current_expr = nullptr,
22
+ const string &current_name = string()) {
23
+ auto &pivot = ref.pivots[pivot_idx];
24
+ bool last_pivot = pivot_idx + 1 == ref.pivots.size();
25
+ for (auto &entry : pivot.entries) {
26
+ unique_ptr<ParsedExpression> expr = current_expr ? current_expr->Copy() : nullptr;
27
+ string name = entry.alias;
28
+ D_ASSERT(entry.values.size() == pivot.pivot_expressions.size());
29
+ for (idx_t v = 0; v < entry.values.size(); v++) {
30
+ auto &value = entry.values[v];
31
+ auto column_ref = pivot.pivot_expressions[v]->Copy();
32
+ auto constant_value = make_unique<ConstantExpression>(value);
33
+ auto comp_expr = make_unique<ComparisonExpression>(ExpressionType::COMPARE_NOT_DISTINCT_FROM,
34
+ std::move(column_ref), std::move(constant_value));
35
+ if (expr) {
36
+ expr = make_unique<ConjunctionExpression>(ExpressionType::CONJUNCTION_AND, std::move(expr),
37
+ std::move(comp_expr));
38
+ } else {
39
+ expr = std::move(comp_expr);
40
+ }
41
+ if (entry.alias.empty()) {
42
+ if (name.empty()) {
43
+ name = value.ToString();
44
+ } else {
45
+ name += "_" + value.ToString();
46
+ }
47
+ }
48
+ }
49
+ if (!current_name.empty()) {
50
+ name = current_name + "_" + name;
51
+ }
52
+ if (last_pivot) {
53
+ // construct the aggregates
54
+ for (auto &aggr : ref.aggregates) {
55
+ auto copy = aggr->Copy();
56
+ auto &function = (FunctionExpression &)*copy;
57
+ // add the filter and alias to the aggregate function
58
+ function.filter = expr->Copy();
59
+ if (ref.aggregates.size() > 1 || !function.alias.empty()) {
60
+ // if there are multiple aggregates specified we add the name of the aggregate as well
61
+ function.alias = name + "_" + function.GetName();
62
+ } else {
63
+ function.alias = name;
64
+ }
65
+ pivot_expressions.push_back(std::move(copy));
66
+ }
67
+ } else {
68
+ // need to recurse
69
+ ConstructPivots(ref, pivot_idx + 1, pivot_expressions, std::move(expr), name);
70
+ }
71
+ }
72
+ }
73
+
74
+ static void ExtractPivotExpressions(ParsedExpression &expr, case_insensitive_set_t &handled_columns) {
75
+ if (expr.type == ExpressionType::COLUMN_REF) {
76
+ auto &child_colref = (ColumnRefExpression &)expr;
77
+ if (child_colref.IsQualified()) {
78
+ throw BinderException("PIVOT expression cannot contain qualified columns");
79
+ }
80
+ handled_columns.insert(child_colref.GetColumnName());
81
+ }
82
+ ParsedExpressionIterator::EnumerateChildren(
83
+ expr, [&](ParsedExpression &child) { ExtractPivotExpressions(child, handled_columns); });
84
+ }
85
+
86
+ unique_ptr<SelectNode> Binder::BindPivot(PivotRef &ref, vector<unique_ptr<ParsedExpression>> all_columns) {
87
+ const static idx_t PIVOT_EXPRESSION_LIMIT = 10000;
88
+ // keep track of the columns by which we pivot/aggregate
89
+ // any columns which are not pivoted/aggregated on are added to the GROUP BY clause
90
+ case_insensitive_set_t handled_columns;
91
+ // parse the aggregate, and extract the referenced columns from the aggregate
92
+ for (auto &aggr : ref.aggregates) {
93
+ if (aggr->type != ExpressionType::FUNCTION) {
94
+ throw BinderException(FormatError(*aggr, "Pivot expression must be an aggregate"));
95
+ }
96
+ if (aggr->HasSubquery()) {
97
+ throw BinderException(FormatError(*aggr, "Pivot expression cannot contain subqueries"));
98
+ }
99
+ if (aggr->IsWindow()) {
100
+ throw BinderException(FormatError(*aggr, "Pivot expression cannot contain window functions"));
101
+ }
102
+ ExtractPivotExpressions(*aggr, handled_columns);
103
+ }
104
+ value_set_t pivots;
105
+
106
+ // now handle the pivots
107
+ auto select_node = make_unique<SelectNode>();
108
+ // first add all pivots to the set of handled columns, and check for duplicates
109
+ idx_t total_pivots = 1;
110
+ for (auto &pivot : ref.pivots) {
111
+ if (!pivot.pivot_enum.empty()) {
112
+ auto type = Catalog::GetType(context, INVALID_CATALOG, INVALID_SCHEMA, pivot.pivot_enum);
113
+ if (type.id() != LogicalTypeId::ENUM) {
114
+ throw BinderException(
115
+ FormatError(ref, StringUtil::Format("Pivot must reference an ENUM type: \"%s\" is of type \"%s\"",
116
+ pivot.pivot_enum, type.ToString())));
117
+ }
118
+ auto enum_size = EnumType::GetSize(type);
119
+ for (idx_t i = 0; i < enum_size; i++) {
120
+ auto enum_value = EnumType::GetValue(Value::ENUM(i, type));
121
+ PivotColumnEntry entry;
122
+ entry.values.emplace_back(enum_value);
123
+ entry.alias = std::move(enum_value);
124
+ pivot.entries.push_back(std::move(entry));
125
+ }
126
+ }
127
+ total_pivots *= pivot.entries.size();
128
+ // add the pivoted column to the columns that have been handled
129
+ for (auto &pivot_name : pivot.pivot_expressions) {
130
+ ExtractPivotExpressions(*pivot_name, handled_columns);
131
+ }
132
+ value_set_t pivots;
133
+ for (auto &entry : pivot.entries) {
134
+ D_ASSERT(!entry.star_expr);
135
+ Value val;
136
+ if (entry.values.size() == 1) {
137
+ val = entry.values[0];
138
+ } else {
139
+ val = Value::LIST(LogicalType::VARCHAR, entry.values);
140
+ }
141
+ if (pivots.find(val) != pivots.end()) {
142
+ throw BinderException(FormatError(
143
+ ref, StringUtil::Format("The value \"%s\" was specified multiple times in the IN clause",
144
+ val.ToString())));
145
+ }
146
+ if (entry.values.size() != pivot.pivot_expressions.size()) {
147
+ throw ParserException("PIVOT IN list - inconsistent amount of rows - expected %d but got %d",
148
+ pivot.pivot_expressions.size(), entry.values.size());
149
+ }
150
+ pivots.insert(val);
151
+ }
152
+ }
153
+ if (total_pivots >= PIVOT_EXPRESSION_LIMIT) {
154
+ throw BinderException("Pivot column limit of %llu exceeded", PIVOT_EXPRESSION_LIMIT);
155
+ }
156
+ // now construct the actual aggregates
157
+ // note that we construct a cross-product of all pivots
158
+ // we do this recursively
159
+ vector<unique_ptr<ParsedExpression>> pivot_expressions;
160
+ ConstructPivots(ref, 0, pivot_expressions);
161
+
162
+ if (ref.groups.empty()) {
163
+ // if rows are not specified any columns that are not pivoted/aggregated on are added to the GROUP BY clause
164
+ for (auto &entry : all_columns) {
165
+ if (entry->type != ExpressionType::COLUMN_REF) {
166
+ throw InternalException("Unexpected child of pivot source - not a ColumnRef");
167
+ }
168
+ auto &columnref = (ColumnRefExpression &)*entry;
169
+ if (handled_columns.find(columnref.GetColumnName()) == handled_columns.end()) {
170
+ // not handled - add to grouping set
171
+ select_node->groups.group_expressions.push_back(
172
+ make_unique<ConstantExpression>(Value::INTEGER(select_node->select_list.size() + 1)));
173
+ select_node->select_list.push_back(std::move(entry));
174
+ }
175
+ }
176
+ } else {
177
+ // if rows are specified only the columns mentioned in rows are added as groups
178
+ for (auto &row : ref.groups) {
179
+ select_node->groups.group_expressions.push_back(
180
+ make_unique<ConstantExpression>(Value::INTEGER(select_node->select_list.size() + 1)));
181
+ select_node->select_list.push_back(make_unique<ColumnRefExpression>(row));
182
+ }
183
+ }
184
+ // add the pivot expressions to the select list
185
+ for (auto &pivot_expr : pivot_expressions) {
186
+ select_node->select_list.push_back(std::move(pivot_expr));
187
+ }
188
+ return select_node;
189
+ }
190
+
191
+ unique_ptr<SelectNode> Binder::BindUnpivot(Binder &child_binder, PivotRef &ref,
192
+ vector<unique_ptr<ParsedExpression>> all_columns,
193
+ unique_ptr<ParsedExpression> &where_clause) {
194
+ D_ASSERT(ref.groups.empty());
195
+ D_ASSERT(ref.pivots.size() == 1);
196
+
197
+ unique_ptr<ParsedExpression> expr;
198
+ auto select_node = make_unique<SelectNode>();
199
+
200
+ // handle the pivot
201
+ auto &unpivot = ref.pivots[0];
202
+
203
+ // handle star expressions in any entries
204
+ vector<PivotColumnEntry> new_entries;
205
+ for (auto &entry : unpivot.entries) {
206
+ if (entry.star_expr) {
207
+ D_ASSERT(entry.values.empty());
208
+ vector<unique_ptr<ParsedExpression>> star_columns;
209
+ child_binder.ExpandStarExpression(std::move(entry.star_expr), star_columns);
210
+
211
+ for (auto &col : star_columns) {
212
+ if (col->type != ExpressionType::COLUMN_REF) {
213
+ throw InternalException("Unexpected child of unpivot star - not a ColumnRef");
214
+ }
215
+ auto &columnref = (ColumnRefExpression &)*col;
216
+ PivotColumnEntry new_entry;
217
+ new_entry.values.emplace_back(columnref.GetColumnName());
218
+ new_entry.alias = columnref.GetColumnName();
219
+ new_entries.push_back(std::move(new_entry));
220
+ }
221
+ } else {
222
+ new_entries.push_back(std::move(entry));
223
+ }
224
+ }
225
+ unpivot.entries = std::move(new_entries);
226
+
227
+ case_insensitive_set_t handled_columns;
228
+ case_insensitive_map_t<string> name_map;
229
+ for (auto &entry : unpivot.entries) {
230
+ for (auto &value : entry.values) {
231
+ handled_columns.insert(value.ToString());
232
+ }
233
+ }
234
+
235
+ for (auto &col_expr : all_columns) {
236
+ if (col_expr->type != ExpressionType::COLUMN_REF) {
237
+ throw InternalException("Unexpected child of pivot source - not a ColumnRef");
238
+ }
239
+ auto &columnref = (ColumnRefExpression &)*col_expr;
240
+ auto &column_name = columnref.GetColumnName();
241
+ auto entry = handled_columns.find(column_name);
242
+ if (entry == handled_columns.end()) {
243
+ // not handled - add to the set of regularly selected columns
244
+ select_node->select_list.push_back(std::move(col_expr));
245
+ } else {
246
+ name_map[column_name] = column_name;
247
+ handled_columns.erase(entry);
248
+ }
249
+ }
250
+ if (!handled_columns.empty()) {
251
+ for (auto &entry : handled_columns) {
252
+ throw BinderException("Column \"%s\" referenced in UNPIVOT but no matching entry was found in the table",
253
+ entry);
254
+ }
255
+ }
256
+ vector<Value> unpivot_names;
257
+ for (auto &entry : unpivot.entries) {
258
+ string generated_name;
259
+ for (auto &val : entry.values) {
260
+ auto name_entry = name_map.find(val.ToString());
261
+ if (name_entry == name_map.end()) {
262
+ throw InternalException("Unpivot - could not find column name in name map");
263
+ }
264
+ if (!generated_name.empty()) {
265
+ generated_name += "_";
266
+ }
267
+ generated_name += name_entry->second;
268
+ }
269
+ unpivot_names.emplace_back(!entry.alias.empty() ? entry.alias : generated_name);
270
+ }
271
+ vector<vector<unique_ptr<ParsedExpression>>> unpivot_expressions;
272
+ for (idx_t v_idx = 0; v_idx < unpivot.entries[0].values.size(); v_idx++) {
273
+ vector<unique_ptr<ParsedExpression>> expressions;
274
+ expressions.reserve(unpivot.entries.size());
275
+ for (auto &entry : unpivot.entries) {
276
+ expressions.push_back(make_unique<ColumnRefExpression>(entry.values[v_idx].ToString()));
277
+ }
278
+ unpivot_expressions.push_back(std::move(expressions));
279
+ }
280
+
281
+ // construct the UNNEST expression for the set of names (constant)
282
+ auto unpivot_list = Value::LIST(LogicalType::VARCHAR, std::move(unpivot_names));
283
+ auto unpivot_name_expr = make_unique<ConstantExpression>(std::move(unpivot_list));
284
+ vector<unique_ptr<ParsedExpression>> unnest_name_children;
285
+ unnest_name_children.push_back(std::move(unpivot_name_expr));
286
+ auto unnest_name_expr = make_unique<FunctionExpression>("unnest", std::move(unnest_name_children));
287
+ unnest_name_expr->alias = unpivot.unpivot_names[0];
288
+ select_node->select_list.push_back(std::move(unnest_name_expr));
289
+
290
+ // construct the UNNEST expression for the set of unpivoted columns
291
+ if (ref.unpivot_names.size() != unpivot_expressions.size()) {
292
+ throw BinderException("UNPIVOT name count mismatch - got %d names but %d expressions", ref.unpivot_names.size(),
293
+ unpivot_expressions.size());
294
+ }
295
+ for (idx_t i = 0; i < unpivot_expressions.size(); i++) {
296
+ auto list_expr = make_unique<FunctionExpression>("list_value", std::move(unpivot_expressions[i]));
297
+ vector<unique_ptr<ParsedExpression>> unnest_val_children;
298
+ unnest_val_children.push_back(std::move(list_expr));
299
+ auto unnest_val_expr = make_unique<FunctionExpression>("unnest", std::move(unnest_val_children));
300
+ auto unnest_name = i < ref.column_name_alias.size() ? ref.column_name_alias[i] : ref.unpivot_names[i];
301
+ unnest_val_expr->alias = unnest_name;
302
+ select_node->select_list.push_back(std::move(unnest_val_expr));
303
+ if (!ref.include_nulls) {
304
+ // if we are running with EXCLUDE NULLS we need to add an IS NOT NULL filter
305
+ auto colref = make_unique<ColumnRefExpression>(unnest_name);
306
+ auto filter = make_unique<OperatorExpression>(ExpressionType::OPERATOR_IS_NOT_NULL, std::move(colref));
307
+ if (where_clause) {
308
+ where_clause = make_unique<ConjunctionExpression>(ExpressionType::CONJUNCTION_AND,
309
+ std::move(where_clause), std::move(filter));
310
+ } else {
311
+ where_clause = std::move(filter);
312
+ }
313
+ }
314
+ }
315
+ return select_node;
316
+ }
317
+
318
+ unique_ptr<BoundTableRef> Binder::Bind(PivotRef &ref) {
319
+ if (!ref.source) {
320
+ throw InternalException("Pivot without a source!?");
321
+ }
322
+
323
+ // bind the source of the pivot
324
+ auto child_binder = Binder::CreateBinder(context, this);
325
+ auto from_table = child_binder->Bind(*ref.source);
326
+
327
+ // figure out the set of column names that are in the source of the pivot
328
+ vector<unique_ptr<ParsedExpression>> all_columns;
329
+ child_binder->ExpandStarExpression(make_unique<StarExpression>(), all_columns);
330
+
331
+ unique_ptr<SelectNode> select_node;
332
+ unique_ptr<ParsedExpression> where_clause;
333
+ if (!ref.aggregates.empty()) {
334
+ select_node = BindPivot(ref, std::move(all_columns));
335
+ } else {
336
+ select_node = BindUnpivot(*child_binder, ref, std::move(all_columns), where_clause);
337
+ }
338
+ // bind the generated select node
339
+ auto bound_select_node = child_binder->BindSelectNode(*select_node, std::move(from_table));
340
+ auto root_index = bound_select_node->GetRootIndex();
341
+ BoundQueryNode *bound_select_ptr = bound_select_node.get();
342
+
343
+ unique_ptr<BoundTableRef> result;
344
+ MoveCorrelatedExpressions(*child_binder);
345
+ result = make_unique<BoundSubqueryRef>(std::move(child_binder), std::move(bound_select_node));
346
+ auto alias = ref.alias.empty() ? "__unnamed_pivot" : ref.alias;
347
+ SubqueryRef subquery_ref(nullptr, alias);
348
+ subquery_ref.column_name_alias = std::move(ref.column_name_alias);
349
+ if (where_clause) {
350
+ // if a WHERE clause was provided - bind a subquery holding the WHERE clause
351
+ // we need to bind a new subquery here because the WHERE clause has to be applied AFTER the unnest
352
+ child_binder = Binder::CreateBinder(context, this);
353
+ child_binder->bind_context.AddSubquery(root_index, subquery_ref.alias, subquery_ref, *bound_select_ptr);
354
+ auto where_query = make_unique<SelectNode>();
355
+ where_query->select_list.push_back(make_unique<StarExpression>());
356
+ where_query->where_clause = std::move(where_clause);
357
+ bound_select_node = child_binder->BindSelectNode(*where_query, std::move(result));
358
+ bound_select_ptr = bound_select_node.get();
359
+ root_index = bound_select_node->GetRootIndex();
360
+ result = make_unique<BoundSubqueryRef>(std::move(child_binder), std::move(bound_select_node));
361
+ }
362
+ bind_context.AddSubquery(root_index, subquery_ref.alias, subquery_ref, *bound_select_ptr);
363
+ return result;
364
+ }
365
+
366
+ } // namespace duckdb
@@ -126,9 +126,18 @@ Binder::BindTableFunctionInternal(TableFunction &table_function, const string &f
126
126
  unique_ptr<FunctionData> bind_data;
127
127
  vector<LogicalType> return_types;
128
128
  vector<string> return_names;
129
- if (table_function.bind) {
129
+ if (table_function.bind || table_function.bind_replace) {
130
130
  TableFunctionBindInput bind_input(parameters, named_parameters, input_table_types, input_table_names,
131
131
  table_function.function_info.get());
132
+ if (table_function.bind_replace) {
133
+ auto new_plan = table_function.bind_replace(context, bind_input);
134
+ if (new_plan != nullptr) {
135
+ return CreatePlan(*Bind(*new_plan));
136
+ } else if (!table_function.bind) {
137
+ throw BinderException("Failed to bind \"%s\": nullptr returned from bind_replace without bind function",
138
+ table_function.name);
139
+ }
140
+ }
132
141
  bind_data = table_function.bind(context, bind_input, return_types, return_names);
133
142
  if (table_function.name == "pandas_scan" || table_function.name == "arrow_scan") {
134
143
  auto arrow_bind = (PyTableFunctionData *)bind_data.get();
@@ -153,6 +162,7 @@ Binder::BindTableFunctionInternal(TableFunction &table_function, const string &f
153
162
  return_names[i] = "C" + to_string(i);
154
163
  }
155
164
  }
165
+
156
166
  auto get = make_unique<LogicalGet>(bind_index, table_function, std::move(bind_data), return_types, return_names);
157
167
  get->parameters = parameters;
158
168
  get->named_parameters = named_parameters;
@@ -8,6 +8,7 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundCTERef &ref) {
8
8
  auto index = ref.bind_index;
9
9
 
10
10
  vector<LogicalType> types;
11
+ types.reserve(ref.types.size());
11
12
  for (auto &type : ref.types) {
12
13
  types.push_back(type);
13
14
  }
@@ -7,6 +7,7 @@
7
7
  #include "duckdb/planner/expression_iterator.hpp"
8
8
  #include "duckdb/planner/binder.hpp"
9
9
  #include "duckdb/planner/operator/logical_any_join.hpp"
10
+ #include "duckdb/planner/operator/logical_asof_join.hpp"
10
11
  #include "duckdb/planner/operator/logical_comparison_join.hpp"
11
12
  #include "duckdb/planner/operator/logical_cross_product.hpp"
12
13
  #include "duckdb/planner/operator/logical_filter.hpp"
@@ -33,7 +34,7 @@ static bool CreateJoinCondition(Expression &expr, const unordered_set<idx_t> &le
33
34
  if (left_side == JoinSide::RIGHT) {
34
35
  // left = right, right = left, flip the comparison symbol and reverse sides
35
36
  swap(left, right);
36
- condition.comparison = FlipComparisionExpression(expr.type);
37
+ condition.comparison = FlipComparisonExpression(expr.type);
37
38
  }
38
39
  condition.left = std::move(left);
39
40
  condition.right = std::move(right);
@@ -104,12 +105,43 @@ void LogicalComparisonJoin::ExtractJoinConditions(JoinType type, unique_ptr<Logi
104
105
  return ExtractJoinConditions(type, left_child, right_child, expressions, conditions, arbitrary_expressions);
105
106
  }
106
107
 
107
- unique_ptr<LogicalOperator> LogicalComparisonJoin::CreateJoin(JoinType type, unique_ptr<LogicalOperator> left_child,
108
+ unique_ptr<LogicalOperator> LogicalComparisonJoin::CreateJoin(JoinType type, JoinRefType reftype,
109
+ unique_ptr<LogicalOperator> left_child,
108
110
  unique_ptr<LogicalOperator> right_child,
109
111
  vector<JoinCondition> conditions,
110
112
  vector<unique_ptr<Expression>> arbitrary_expressions) {
113
+ // Validate the conditions
111
114
  bool need_to_consider_arbitrary_expressions = true;
112
- if (type == JoinType::INNER) {
115
+ switch (reftype) {
116
+ case JoinRefType::ASOF: {
117
+ need_to_consider_arbitrary_expressions = false;
118
+ auto asof_idx = conditions.size();
119
+ for (size_t c = 0; c < conditions.size(); ++c) {
120
+ auto &cond = conditions[c];
121
+ switch (cond.comparison) {
122
+ case ExpressionType::COMPARE_EQUAL:
123
+ case ExpressionType::COMPARE_NOT_DISTINCT_FROM:
124
+ break;
125
+ case ExpressionType::COMPARE_GREATERTHANOREQUALTO:
126
+ if (asof_idx < conditions.size()) {
127
+ throw BinderException("Multiple ASOF JOIN inequalities");
128
+ }
129
+ asof_idx = c;
130
+ break;
131
+ default:
132
+ throw BinderException("Invalid ASOF JOIN comparison");
133
+ }
134
+ }
135
+ if (asof_idx == conditions.size()) {
136
+ throw BinderException("Missing ASOF JOIN inequality");
137
+ }
138
+ break;
139
+ }
140
+ default:
141
+ break;
142
+ }
143
+
144
+ if (type == JoinType::INNER && reftype == JoinRefType::REGULAR) {
113
145
  // for inner joins we can push arbitrary expressions as a filter
114
146
  // here we prefer to create a comparison join if possible
115
147
  // that way we can use the much faster hash join to process the main join
@@ -144,7 +176,12 @@ unique_ptr<LogicalOperator> LogicalComparisonJoin::CreateJoin(JoinType type, uni
144
176
  } else {
145
177
  // we successfully converted expressions into JoinConditions
146
178
  // create a LogicalComparisonJoin
147
- auto comp_join = make_unique<LogicalComparisonJoin>(type);
179
+ unique_ptr<LogicalComparisonJoin> comp_join;
180
+ if (reftype == JoinRefType::ASOF) {
181
+ comp_join = make_unique<LogicalAsOfJoin>(type);
182
+ } else {
183
+ comp_join = make_unique<LogicalComparisonJoin>(type);
184
+ }
148
185
  comp_join->conditions = std::move(conditions);
149
186
  comp_join->children.push_back(std::move(left_child));
150
187
  comp_join->children.push_back(std::move(right_child));
@@ -179,15 +216,16 @@ static bool HasCorrelatedColumns(Expression &expression) {
179
216
  return has_correlated_columns;
180
217
  }
181
218
 
182
- unique_ptr<LogicalOperator> LogicalComparisonJoin::CreateJoin(JoinType type, unique_ptr<LogicalOperator> left_child,
219
+ unique_ptr<LogicalOperator> LogicalComparisonJoin::CreateJoin(JoinType type, JoinRefType reftype,
220
+ unique_ptr<LogicalOperator> left_child,
183
221
  unique_ptr<LogicalOperator> right_child,
184
222
  unique_ptr<Expression> condition) {
185
223
  vector<JoinCondition> conditions;
186
224
  vector<unique_ptr<Expression>> arbitrary_expressions;
187
225
  LogicalComparisonJoin::ExtractJoinConditions(type, left_child, right_child, std::move(condition), conditions,
188
226
  arbitrary_expressions);
189
- return LogicalComparisonJoin::CreateJoin(type, std::move(left_child), std::move(right_child), std::move(conditions),
190
- std::move(arbitrary_expressions));
227
+ return LogicalComparisonJoin::CreateJoin(type, reftype, std::move(left_child), std::move(right_child),
228
+ std::move(conditions), std::move(arbitrary_expressions));
191
229
  }
192
230
 
193
231
  unique_ptr<LogicalOperator> Binder::CreatePlan(BoundJoinRef &ref) {
@@ -201,7 +239,8 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundJoinRef &ref) {
201
239
  // we reduce expression depth of all columns in the "ref.correlated_columns" set by 1
202
240
  LateralBinder::ReduceExpressionDepth(*right, ref.correlated_columns);
203
241
  }
204
- if (ref.type == JoinType::RIGHT && ClientConfig::GetConfig(context).enable_optimizer) {
242
+ if (ref.type == JoinType::RIGHT && ref.ref_type != JoinRefType::ASOF &&
243
+ ClientConfig::GetConfig(context).enable_optimizer) {
205
244
  // we turn any right outer joins into left outer joins for optimization purposes
206
245
  // they are the same but with sides flipped, so treating them the same simplifies life
207
246
  ref.type = JoinType::LEFT;
@@ -220,7 +259,8 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundJoinRef &ref) {
220
259
  default:
221
260
  break;
222
261
  }
223
- if (ref.type == JoinType::INNER && (ref.condition->HasSubquery() || HasCorrelatedColumns(*ref.condition))) {
262
+ if (ref.type == JoinType::INNER && (ref.condition->HasSubquery() || HasCorrelatedColumns(*ref.condition)) &&
263
+ ref.ref_type == JoinRefType::REGULAR) {
224
264
  // inner join, generate a cross product + filter
225
265
  // this will be later turned into a proper join by the join order optimizer
226
266
  auto root = LogicalCrossProduct::Create(std::move(left), std::move(right));
@@ -235,8 +275,8 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundJoinRef &ref) {
235
275
  }
236
276
 
237
277
  // now create the join operator from the join condition
238
- auto result =
239
- LogicalComparisonJoin::CreateJoin(ref.type, std::move(left), std::move(right), std::move(ref.condition));
278
+ auto result = LogicalComparisonJoin::CreateJoin(ref.type, ref.ref_type, std::move(left), std::move(right),
279
+ std::move(ref.condition));
240
280
 
241
281
  LogicalOperator *join;
242
282
  if (result->type == LogicalOperatorType::LOGICAL_FILTER) {
@@ -254,7 +294,9 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundJoinRef &ref) {
254
294
  }
255
295
 
256
296
  // we visit the expressions depending on the type of join
257
- if (join->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN) {
297
+ switch (join->type) {
298
+ case LogicalOperatorType::LOGICAL_ASOF_JOIN:
299
+ case LogicalOperatorType::LOGICAL_COMPARISON_JOIN: {
258
300
  // comparison join
259
301
  // in this join we visit the expressions on the LHS with the LHS as root node
260
302
  // and the expressions on the RHS with the RHS as root node
@@ -263,12 +305,18 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundJoinRef &ref) {
263
305
  PlanSubqueries(&comp_join.conditions[i].left, &comp_join.children[0]);
264
306
  PlanSubqueries(&comp_join.conditions[i].right, &comp_join.children[1]);
265
307
  }
266
- } else if (join->type == LogicalOperatorType::LOGICAL_ANY_JOIN) {
308
+ break;
309
+ }
310
+ case LogicalOperatorType::LOGICAL_ANY_JOIN: {
267
311
  auto &any_join = (LogicalAnyJoin &)*join;
268
312
  // for the any join we just visit the condition
269
313
  if (any_join.condition->HasSubquery()) {
270
314
  throw NotImplementedException("Cannot perform non-inner join on subquery!");
271
315
  }
316
+ break;
317
+ }
318
+ default:
319
+ break;
272
320
  }
273
321
  return result;
274
322
  }
@@ -3,8 +3,10 @@
3
3
  #include "duckdb/catalog/catalog_entry/table_catalog_entry.hpp"
4
4
  #include "duckdb/catalog/catalog_entry/view_catalog_entry.hpp"
5
5
  #include "duckdb/main/config.hpp"
6
+ #include "duckdb/parser/parsed_expression_iterator.hpp"
6
7
  #include "duckdb/parser/query_node/select_node.hpp"
7
8
  #include "duckdb/parser/statement/list.hpp"
9
+ #include "duckdb/parser/tableref/joinref.hpp"
8
10
  #include "duckdb/parser/tableref/table_function_ref.hpp"
9
11
  #include "duckdb/planner/bound_query_node.hpp"
10
12
  #include "duckdb/planner/bound_tableref.hpp"
@@ -13,7 +15,6 @@
13
15
  #include "duckdb/planner/expression_iterator.hpp"
14
16
  #include "duckdb/planner/operator/logical_projection.hpp"
15
17
  #include "duckdb/planner/operator/logical_sample.hpp"
16
- #include "duckdb/parser/parsed_expression_iterator.hpp"
17
18
 
18
19
  #include <algorithm>
19
20
 
@@ -170,8 +171,12 @@ unique_ptr<BoundTableRef> Binder::Bind(TableRef &ref) {
170
171
  case TableReferenceType::EXPRESSION_LIST:
171
172
  result = Bind((ExpressionListRef &)ref);
172
173
  break;
174
+ case TableReferenceType::PIVOT:
175
+ result = Bind((PivotRef &)ref);
176
+ break;
173
177
  case TableReferenceType::CTE:
174
178
  case TableReferenceType::INVALID:
179
+ default:
175
180
  throw InternalException("Unknown table ref type");
176
181
  }
177
182
  result->sample = std::move(ref.sample);
@@ -203,6 +208,7 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundTableRef &ref) {
203
208
  root = CreatePlan((BoundCTERef &)ref);
204
209
  break;
205
210
  case TableReferenceType::INVALID:
211
+ default:
206
212
  throw InternalException("Unsupported bound table ref type");
207
213
  }
208
214
  // plan the sample clause
@@ -432,8 +438,8 @@ void VerifyNotExcluded(ParsedExpression &expr) {
432
438
  }
433
439
 
434
440
  BoundStatement Binder::BindReturning(vector<unique_ptr<ParsedExpression>> returning_list, TableCatalogEntry *table,
435
- idx_t update_table_index, unique_ptr<LogicalOperator> child_operator,
436
- BoundStatement result) {
441
+ const string &alias, idx_t update_table_index,
442
+ unique_ptr<LogicalOperator> child_operator, BoundStatement result) {
437
443
 
438
444
  vector<LogicalType> types;
439
445
  vector<std::string> names;
@@ -451,31 +457,20 @@ BoundStatement Binder::BindReturning(vector<unique_ptr<ParsedExpression>> return
451
457
  column_count++;
452
458
  }
453
459
 
454
- binder->bind_context.AddBaseTable(update_table_index, table->name, names, types, bound_columns, table, false);
460
+ binder->bind_context.AddBaseTable(update_table_index, alias.empty() ? table->name : alias, names, types,
461
+ bound_columns, table, false);
455
462
  ReturningBinder returning_binder(*binder, context);
456
463
 
457
464
  vector<unique_ptr<Expression>> projection_expressions;
458
465
  LogicalType result_type;
459
- for (auto &returning_expr : returning_list) {
460
- auto expr_type = returning_expr->GetExpressionType();
461
- if (expr_type == ExpressionType::STAR) {
462
- auto generated_star_list = vector<unique_ptr<ParsedExpression>>();
463
- binder->bind_context.GenerateAllColumnExpressions((StarExpression &)*returning_expr, generated_star_list);
464
-
465
- for (auto &star_column : generated_star_list) {
466
- auto star_expr = returning_binder.Bind(star_column, &result_type);
467
- result.types.push_back(result_type);
468
- result.names.push_back(star_expr->GetName());
469
- projection_expressions.push_back(std::move(star_expr));
470
- }
471
- } else {
472
- // TODO: accept 'excluded' in the RETURNING clause
473
- VerifyNotExcluded(*returning_expr);
474
- auto expr = returning_binder.Bind(returning_expr, &result_type);
475
- result.names.push_back(expr->GetName());
476
- result.types.push_back(result_type);
477
- projection_expressions.push_back(std::move(expr));
478
- }
466
+ vector<unique_ptr<ParsedExpression>> new_returning_list;
467
+ binder->ExpandStarExpressions(returning_list, new_returning_list);
468
+ for (auto &returning_expr : new_returning_list) {
469
+ VerifyNotExcluded(*returning_expr);
470
+ auto expr = returning_binder.Bind(returning_expr, &result_type);
471
+ result.names.push_back(expr->GetName());
472
+ result.types.push_back(result_type);
473
+ projection_expressions.push_back(std::move(expr));
479
474
  }
480
475
 
481
476
  auto projection = make_unique<LogicalProjection>(GenerateTableIndex(), std::move(projection_expressions));