duckdb 0.7.2-dev12.0 → 0.7.2-dev1244.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (631) hide show
  1. package/binding.gyp +12 -7
  2. package/lib/duckdb.d.ts +55 -2
  3. package/lib/duckdb.js +20 -1
  4. package/package.json +1 -1
  5. package/src/connection.cpp +1 -2
  6. package/src/database.cpp +1 -1
  7. package/src/duckdb/extension/icu/icu-extension.cpp +4 -0
  8. package/src/duckdb/extension/icu/icu-list-range.cpp +207 -0
  9. package/src/duckdb/extension/icu/icu-table-range.cpp +194 -0
  10. package/src/duckdb/extension/icu/include/icu-list-range.hpp +17 -0
  11. package/src/duckdb/extension/icu/include/icu-table-range.hpp +17 -0
  12. package/src/duckdb/extension/icu/third_party/icu/stubdata/stubdata.cpp +1 -1
  13. package/src/duckdb/extension/json/include/json_common.hpp +1 -0
  14. package/src/duckdb/extension/json/include/json_functions.hpp +2 -0
  15. package/src/duckdb/extension/json/include/json_serializer.hpp +77 -0
  16. package/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp +147 -0
  17. package/src/duckdb/extension/json/json_functions/read_json.cpp +6 -5
  18. package/src/duckdb/extension/json/json_functions.cpp +12 -4
  19. package/src/duckdb/extension/json/json_scan.cpp +2 -2
  20. package/src/duckdb/extension/json/json_serializer.cpp +217 -0
  21. package/src/duckdb/extension/parquet/column_reader.cpp +94 -15
  22. package/src/duckdb/extension/parquet/column_writer.cpp +0 -1
  23. package/src/duckdb/extension/parquet/include/column_reader.hpp +1 -2
  24. package/src/duckdb/extension/parquet/include/decode_utils.hpp +5 -4
  25. package/src/duckdb/extension/parquet/include/generated_column_reader.hpp +1 -11
  26. package/src/duckdb/extension/parquet/include/parquet_timestamp.hpp +2 -1
  27. package/src/duckdb/extension/parquet/parquet-extension.cpp +14 -3
  28. package/src/duckdb/extension/parquet/parquet_reader.cpp +6 -1
  29. package/src/duckdb/extension/parquet/parquet_statistics.cpp +49 -36
  30. package/src/duckdb/extension/parquet/parquet_timestamp.cpp +16 -6
  31. package/src/duckdb/src/catalog/catalog.cpp +34 -5
  32. package/src/duckdb/src/catalog/catalog_entry/duck_schema_entry.cpp +4 -0
  33. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +2 -21
  34. package/src/duckdb/src/catalog/catalog_entry/scalar_function_catalog_entry.cpp +7 -6
  35. package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +3 -3
  36. package/src/duckdb/src/catalog/catalog_entry/table_function_catalog_entry.cpp +20 -1
  37. package/src/duckdb/src/catalog/catalog_entry/type_catalog_entry.cpp +8 -2
  38. package/src/duckdb/src/catalog/catalog_set.cpp +1 -0
  39. package/src/duckdb/src/catalog/default/default_functions.cpp +3 -0
  40. package/src/duckdb/src/catalog/dependency_list.cpp +12 -0
  41. package/src/duckdb/src/catalog/duck_catalog.cpp +34 -7
  42. package/src/duckdb/src/common/arrow/arrow_appender.cpp +48 -4
  43. package/src/duckdb/src/common/arrow/arrow_converter.cpp +1 -1
  44. package/src/duckdb/src/common/box_renderer.cpp +109 -23
  45. package/src/duckdb/src/common/enums/expression_type.cpp +8 -222
  46. package/src/duckdb/src/common/enums/join_type.cpp +3 -22
  47. package/src/duckdb/src/common/enums/logical_operator_type.cpp +2 -0
  48. package/src/duckdb/src/common/enums/statement_type.cpp +2 -0
  49. package/src/duckdb/src/common/exception.cpp +15 -1
  50. package/src/duckdb/src/common/field_writer.cpp +1 -0
  51. package/src/duckdb/src/common/hive_partitioning.cpp +3 -1
  52. package/src/duckdb/src/common/local_file_system.cpp +64 -7
  53. package/src/duckdb/src/common/operator/cast_operators.cpp +1 -1
  54. package/src/duckdb/src/common/preserved_error.cpp +7 -5
  55. package/src/duckdb/src/common/progress_bar/progress_bar.cpp +7 -0
  56. package/src/duckdb/src/common/serializer/buffered_deserializer.cpp +4 -0
  57. package/src/duckdb/src/common/serializer/buffered_file_reader.cpp +15 -2
  58. package/src/duckdb/src/common/serializer/enum_serializer.cpp +1176 -0
  59. package/src/duckdb/src/common/sort/comparators.cpp +14 -5
  60. package/src/duckdb/src/common/sort/sort_state.cpp +5 -7
  61. package/src/duckdb/src/common/sort/sorted_block.cpp +0 -1
  62. package/src/duckdb/src/common/string_util.cpp +18 -1
  63. package/src/duckdb/src/common/types/bit.cpp +166 -87
  64. package/src/duckdb/src/common/types/blob.cpp +1 -1
  65. package/src/duckdb/src/common/types/chunk_collection.cpp +2 -2
  66. package/src/duckdb/src/common/types/column_data_collection.cpp +39 -2
  67. package/src/duckdb/src/common/types/column_data_collection_segment.cpp +12 -10
  68. package/src/duckdb/src/common/types/data_chunk.cpp +1 -1
  69. package/src/duckdb/src/common/types/interval.cpp +0 -41
  70. package/src/duckdb/src/common/types/list_segment.cpp +658 -0
  71. package/src/duckdb/src/common/types/string_heap.cpp +1 -1
  72. package/src/duckdb/src/common/types/string_type.cpp +1 -1
  73. package/src/duckdb/src/common/types/time.cpp +13 -0
  74. package/src/duckdb/src/common/types/validity_mask.cpp +24 -7
  75. package/src/duckdb/src/common/types/value.cpp +320 -154
  76. package/src/duckdb/src/common/types/vector.cpp +158 -134
  77. package/src/duckdb/src/common/types.cpp +313 -153
  78. package/src/duckdb/src/common/value_operations/comparison_operations.cpp +14 -22
  79. package/src/duckdb/src/common/vector_operations/comparison_operators.cpp +10 -10
  80. package/src/duckdb/src/common/vector_operations/is_distinct_from.cpp +11 -10
  81. package/src/duckdb/src/common/vector_operations/vector_cast.cpp +2 -1
  82. package/src/duckdb/src/execution/aggregate_hashtable.cpp +98 -74
  83. package/src/duckdb/src/execution/column_binding_resolver.cpp +21 -5
  84. package/src/duckdb/src/execution/expression_executor/execute_cast.cpp +2 -1
  85. package/src/duckdb/src/execution/expression_executor/execute_comparison.cpp +2 -2
  86. package/src/duckdb/src/execution/index/art/art.cpp +19 -5
  87. package/src/duckdb/src/execution/join_hashtable.cpp +3 -1
  88. package/src/duckdb/src/execution/operator/aggregate/physical_hash_aggregate.cpp +1 -1
  89. package/src/duckdb/src/execution/operator/aggregate/physical_perfecthash_aggregate.cpp +4 -5
  90. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +117 -26
  91. package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +3 -0
  92. package/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp +5 -3
  93. package/src/duckdb/src/execution/operator/join/physical_blockwise_nl_join.cpp +64 -17
  94. package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +2 -0
  95. package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +2 -2
  96. package/src/duckdb/src/execution/operator/join/physical_index_join.cpp +13 -4
  97. package/src/duckdb/src/execution/operator/join/physical_join.cpp +0 -3
  98. package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +6 -11
  99. package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +3 -1
  100. package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +11 -4
  101. package/src/duckdb/src/execution/operator/persistent/buffered_csv_reader.cpp +24 -19
  102. package/src/duckdb/src/execution/operator/persistent/csv_reader_options.cpp +3 -0
  103. package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +2 -1
  104. package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +2 -2
  105. package/src/duckdb/src/execution/operator/persistent/physical_delete.cpp +1 -3
  106. package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +1 -0
  107. package/src/duckdb/src/execution/operator/projection/physical_projection.cpp +34 -0
  108. package/src/duckdb/src/execution/operator/scan/physical_positional_scan.cpp +20 -5
  109. package/src/duckdb/src/execution/operator/schema/physical_create_type.cpp +20 -40
  110. package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +2 -5
  111. package/src/duckdb/src/execution/partitionable_hashtable.cpp +20 -5
  112. package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +22 -16
  113. package/src/duckdb/src/execution/physical_plan/plan_asof_join.cpp +97 -0
  114. package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +95 -47
  115. package/src/duckdb/src/execution/physical_plan/plan_create_index.cpp +2 -1
  116. package/src/duckdb/src/execution/physical_plan/plan_distinct.cpp +5 -8
  117. package/src/duckdb/src/execution/physical_plan/plan_positional_join.cpp +14 -5
  118. package/src/duckdb/src/execution/physical_plan_generator.cpp +3 -0
  119. package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +23 -15
  120. package/src/duckdb/src/execution/window_segment_tree.cpp +173 -1
  121. package/src/duckdb/src/function/aggregate/algebraic/avg.cpp +0 -6
  122. package/src/duckdb/src/function/aggregate/distributive/bitagg.cpp +99 -95
  123. package/src/duckdb/src/function/aggregate/distributive/bitstring_agg.cpp +269 -0
  124. package/src/duckdb/src/function/aggregate/distributive/bool.cpp +2 -0
  125. package/src/duckdb/src/function/aggregate/distributive/count.cpp +3 -4
  126. package/src/duckdb/src/function/aggregate/distributive/first.cpp +1 -0
  127. package/src/duckdb/src/function/aggregate/distributive/minmax.cpp +2 -0
  128. package/src/duckdb/src/function/aggregate/distributive/sum.cpp +19 -16
  129. package/src/duckdb/src/function/aggregate/distributive_functions.cpp +1 -0
  130. package/src/duckdb/src/function/aggregate/holistic/approximate_quantile.cpp +5 -2
  131. package/src/duckdb/src/function/aggregate/holistic/mode.cpp +1 -1
  132. package/src/duckdb/src/function/aggregate/holistic/quantile.cpp +16 -1
  133. package/src/duckdb/src/function/aggregate/nested/list.cpp +6 -712
  134. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +138 -45
  135. package/src/duckdb/src/function/cast/bit_cast.cpp +0 -2
  136. package/src/duckdb/src/function/cast/blob_cast.cpp +0 -1
  137. package/src/duckdb/src/function/cast/cast_function_set.cpp +1 -1
  138. package/src/duckdb/src/function/cast/enum_casts.cpp +25 -3
  139. package/src/duckdb/src/function/cast/list_casts.cpp +17 -4
  140. package/src/duckdb/src/function/cast/map_cast.cpp +5 -2
  141. package/src/duckdb/src/function/cast/string_cast.cpp +36 -10
  142. package/src/duckdb/src/function/cast/struct_cast.cpp +24 -4
  143. package/src/duckdb/src/function/cast/time_casts.cpp +2 -2
  144. package/src/duckdb/src/function/cast/union_casts.cpp +33 -7
  145. package/src/duckdb/src/function/cast_rules.cpp +9 -4
  146. package/src/duckdb/src/function/function_binder.cpp +1 -8
  147. package/src/duckdb/src/function/pragma/pragma_queries.cpp +24 -1
  148. package/src/duckdb/src/function/scalar/bit/bitstring.cpp +100 -0
  149. package/src/duckdb/src/function/scalar/date/current.cpp +0 -2
  150. package/src/duckdb/src/function/scalar/date/date_diff.cpp +0 -1
  151. package/src/duckdb/src/function/scalar/date/date_part.cpp +18 -26
  152. package/src/duckdb/src/function/scalar/date/date_sub.cpp +0 -1
  153. package/src/duckdb/src/function/scalar/date/date_trunc.cpp +10 -14
  154. package/src/duckdb/src/function/scalar/generic/stats.cpp +2 -4
  155. package/src/duckdb/src/function/scalar/list/contains_or_position.cpp +4 -146
  156. package/src/duckdb/src/function/scalar/list/flatten.cpp +5 -12
  157. package/src/duckdb/src/function/scalar/list/list_aggregates.cpp +1 -1
  158. package/src/duckdb/src/function/scalar/list/list_concat.cpp +8 -12
  159. package/src/duckdb/src/function/scalar/list/list_extract.cpp +5 -12
  160. package/src/duckdb/src/function/scalar/list/list_lambdas.cpp +7 -3
  161. package/src/duckdb/src/function/scalar/list/list_sort.cpp +25 -18
  162. package/src/duckdb/src/function/scalar/list/list_value.cpp +6 -10
  163. package/src/duckdb/src/function/scalar/map/map.cpp +47 -1
  164. package/src/duckdb/src/function/scalar/map/map_entries.cpp +61 -0
  165. package/src/duckdb/src/function/scalar/map/map_extract.cpp +68 -26
  166. package/src/duckdb/src/function/scalar/map/map_keys_values.cpp +97 -0
  167. package/src/duckdb/src/function/scalar/math/numeric.cpp +101 -17
  168. package/src/duckdb/src/function/scalar/math_functions.cpp +3 -0
  169. package/src/duckdb/src/function/scalar/nested_functions.cpp +3 -0
  170. package/src/duckdb/src/function/scalar/operators/add.cpp +0 -9
  171. package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +29 -48
  172. package/src/duckdb/src/function/scalar/operators/bitwise.cpp +0 -63
  173. package/src/duckdb/src/function/scalar/operators/multiply.cpp +5 -6
  174. package/src/duckdb/src/function/scalar/operators/subtract.cpp +0 -6
  175. package/src/duckdb/src/function/scalar/string/caseconvert.cpp +2 -6
  176. package/src/duckdb/src/function/scalar/string/hex.cpp +201 -0
  177. package/src/duckdb/src/function/scalar/string/instr.cpp +2 -6
  178. package/src/duckdb/src/function/scalar/string/length.cpp +2 -6
  179. package/src/duckdb/src/function/scalar/string/like.cpp +2 -6
  180. package/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp +243 -0
  181. package/src/duckdb/src/function/scalar/string/regexp/regexp_util.cpp +79 -0
  182. package/src/duckdb/src/function/scalar/string/regexp.cpp +21 -80
  183. package/src/duckdb/src/function/scalar/string/substring.cpp +2 -6
  184. package/src/duckdb/src/function/scalar/string_functions.cpp +2 -0
  185. package/src/duckdb/src/function/scalar/struct/struct_extract.cpp +5 -10
  186. package/src/duckdb/src/function/scalar/struct/struct_insert.cpp +11 -14
  187. package/src/duckdb/src/function/scalar/struct/struct_pack.cpp +6 -7
  188. package/src/duckdb/src/function/table/arrow.cpp +5 -2
  189. package/src/duckdb/src/function/table/arrow_conversion.cpp +25 -1
  190. package/src/duckdb/src/function/table/checkpoint.cpp +5 -1
  191. package/src/duckdb/src/function/table/read_csv.cpp +60 -0
  192. package/src/duckdb/src/function/table/system/duckdb_constraints.cpp +2 -2
  193. package/src/duckdb/src/function/table/system/test_all_types.cpp +2 -2
  194. package/src/duckdb/src/function/table/table_scan.cpp +9 -12
  195. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  196. package/src/duckdb/src/function/table_function.cpp +30 -11
  197. package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +6 -0
  198. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_table_entry.hpp +1 -1
  199. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_function_catalog_entry.hpp +6 -8
  200. package/src/duckdb/src/include/duckdb/catalog/dependency_list.hpp +3 -0
  201. package/src/duckdb/src/include/duckdb/catalog/duck_catalog.hpp +2 -1
  202. package/src/duckdb/src/include/duckdb/common/box_renderer.hpp +8 -2
  203. package/src/duckdb/src/include/duckdb/common/constants.hpp +0 -19
  204. package/src/duckdb/src/include/duckdb/common/enums/aggregate_handling.hpp +2 -0
  205. package/src/duckdb/src/include/duckdb/common/enums/expression_type.hpp +2 -3
  206. package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +7 -4
  207. package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +1 -0
  208. package/src/duckdb/src/include/duckdb/common/enums/order_type.hpp +2 -0
  209. package/src/duckdb/src/include/duckdb/common/enums/set_operation_type.hpp +2 -1
  210. package/src/duckdb/src/include/duckdb/common/enums/statement_type.hpp +2 -1
  211. package/src/duckdb/src/include/duckdb/common/enums/tableref_type.hpp +2 -1
  212. package/src/duckdb/src/include/duckdb/common/exception.hpp +69 -2
  213. package/src/duckdb/src/include/duckdb/common/field_writer.hpp +12 -4
  214. package/src/duckdb/src/include/duckdb/common/helper.hpp +1 -1
  215. package/src/duckdb/src/include/duckdb/common/{http_stats.hpp → http_state.hpp} +18 -4
  216. package/src/duckdb/src/include/duckdb/common/operator/comparison_operators.hpp +45 -149
  217. package/src/duckdb/src/include/duckdb/common/operator/multiply.hpp +2 -0
  218. package/src/duckdb/src/include/duckdb/common/optional_ptr.hpp +45 -0
  219. package/src/duckdb/src/include/duckdb/common/preserved_error.hpp +6 -1
  220. package/src/duckdb/src/include/duckdb/common/progress_bar/progress_bar.hpp +2 -0
  221. package/src/duckdb/src/include/duckdb/common/serializer/buffered_deserializer.hpp +4 -2
  222. package/src/duckdb/src/include/duckdb/common/serializer/buffered_file_reader.hpp +8 -2
  223. package/src/duckdb/src/include/duckdb/common/serializer/enum_serializer.hpp +113 -0
  224. package/src/duckdb/src/include/duckdb/common/serializer/format_deserializer.hpp +336 -0
  225. package/src/duckdb/src/include/duckdb/common/serializer/format_serializer.hpp +268 -0
  226. package/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp +126 -0
  227. package/src/duckdb/src/include/duckdb/common/serializer.hpp +13 -0
  228. package/src/duckdb/src/include/duckdb/common/string_util.hpp +27 -0
  229. package/src/duckdb/src/include/duckdb/common/types/bit.hpp +12 -7
  230. package/src/duckdb/src/include/duckdb/common/types/interval.hpp +39 -3
  231. package/src/duckdb/src/include/duckdb/common/types/list_segment.hpp +70 -0
  232. package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +73 -3
  233. package/src/duckdb/src/include/duckdb/common/types/time.hpp +3 -0
  234. package/src/duckdb/src/include/duckdb/common/types/validity_mask.hpp +4 -1
  235. package/src/duckdb/src/include/duckdb/common/types/value.hpp +17 -48
  236. package/src/duckdb/src/include/duckdb/common/types/value_map.hpp +1 -1
  237. package/src/duckdb/src/include/duckdb/common/types/vector.hpp +3 -1
  238. package/src/duckdb/src/include/duckdb/common/types.hpp +45 -8
  239. package/src/duckdb/src/include/duckdb/common/vector_operations/unary_executor.hpp +2 -2
  240. package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +35 -20
  241. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +3 -14
  242. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_perfecthash_aggregate.hpp +1 -1
  243. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_cross_product.hpp +2 -0
  244. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_file_handle.hpp +1 -0
  245. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +10 -0
  246. package/src/duckdb/src/include/duckdb/execution/operator/projection/physical_projection.hpp +5 -0
  247. package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +5 -1
  248. package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +1 -3
  249. package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +54 -0
  250. package/src/duckdb/src/include/duckdb/function/aggregate/distributive_functions.hpp +5 -0
  251. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +18 -6
  252. package/src/duckdb/src/include/duckdb/function/cast/bound_cast_data.hpp +84 -0
  253. package/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp +2 -2
  254. package/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp +28 -64
  255. package/src/duckdb/src/include/duckdb/function/function_binder.hpp +3 -6
  256. package/src/duckdb/src/include/duckdb/function/scalar/bit_functions.hpp +4 -0
  257. package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +138 -0
  258. package/src/duckdb/src/include/duckdb/function/scalar/math_functions.hpp +8 -0
  259. package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +59 -0
  260. package/src/duckdb/src/include/duckdb/function/scalar/regexp.hpp +81 -1
  261. package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +4 -0
  262. package/src/duckdb/src/include/duckdb/function/scalar_function.hpp +2 -2
  263. package/src/duckdb/src/include/duckdb/function/table/arrow.hpp +12 -1
  264. package/src/duckdb/src/include/duckdb/function/table_function.hpp +10 -0
  265. package/src/duckdb/src/include/duckdb/main/capi/capi_internal.hpp +2 -0
  266. package/src/duckdb/src/include/duckdb/main/client_config.hpp +2 -0
  267. package/src/duckdb/src/include/duckdb/main/client_data.hpp +3 -3
  268. package/src/duckdb/src/include/duckdb/main/config.hpp +3 -0
  269. package/src/duckdb/src/include/duckdb/main/connection_manager.hpp +2 -0
  270. package/src/duckdb/src/include/duckdb/main/database.hpp +1 -0
  271. package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +2 -0
  272. package/src/duckdb/src/include/duckdb/main/prepared_statement.hpp +2 -0
  273. package/src/duckdb/src/include/duckdb/main/relation/explain_relation.hpp +2 -1
  274. package/src/duckdb/src/include/duckdb/main/relation.hpp +2 -1
  275. package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +2 -0
  276. package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +2 -2
  277. package/src/duckdb/src/include/duckdb/optimizer/rule/list.hpp +1 -0
  278. package/src/duckdb/src/include/duckdb/optimizer/rule/ordered_aggregate_optimizer.hpp +24 -0
  279. package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +4 -0
  280. package/src/duckdb/src/include/duckdb/parser/expression/between_expression.hpp +3 -0
  281. package/src/duckdb/src/include/duckdb/parser/expression/bound_expression.hpp +2 -0
  282. package/src/duckdb/src/include/duckdb/parser/expression/case_expression.hpp +5 -0
  283. package/src/duckdb/src/include/duckdb/parser/expression/cast_expression.hpp +2 -0
  284. package/src/duckdb/src/include/duckdb/parser/expression/collate_expression.hpp +2 -0
  285. package/src/duckdb/src/include/duckdb/parser/expression/columnref_expression.hpp +2 -0
  286. package/src/duckdb/src/include/duckdb/parser/expression/comparison_expression.hpp +2 -0
  287. package/src/duckdb/src/include/duckdb/parser/expression/conjunction_expression.hpp +2 -0
  288. package/src/duckdb/src/include/duckdb/parser/expression/constant_expression.hpp +3 -0
  289. package/src/duckdb/src/include/duckdb/parser/expression/default_expression.hpp +1 -0
  290. package/src/duckdb/src/include/duckdb/parser/expression/function_expression.hpp +4 -2
  291. package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +2 -0
  292. package/src/duckdb/src/include/duckdb/parser/expression/operator_expression.hpp +2 -0
  293. package/src/duckdb/src/include/duckdb/parser/expression/parameter_expression.hpp +2 -0
  294. package/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +2 -0
  295. package/src/duckdb/src/include/duckdb/parser/expression/star_expression.hpp +4 -2
  296. package/src/duckdb/src/include/duckdb/parser/expression/subquery_expression.hpp +2 -0
  297. package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +5 -0
  298. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_info.hpp +5 -1
  299. package/src/duckdb/src/include/duckdb/parser/parsed_data/{alter_function_info.hpp → alter_scalar_function_info.hpp} +13 -13
  300. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_function_info.hpp +47 -0
  301. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp +6 -0
  302. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_table_function_info.hpp +2 -1
  303. package/src/duckdb/src/include/duckdb/parser/parsed_data/sample_options.hpp +2 -0
  304. package/src/duckdb/src/include/duckdb/parser/parsed_expression.hpp +5 -0
  305. package/src/duckdb/src/include/duckdb/parser/query_node/recursive_cte_node.hpp +3 -0
  306. package/src/duckdb/src/include/duckdb/parser/query_node/select_node.hpp +5 -0
  307. package/src/duckdb/src/include/duckdb/parser/query_node/set_operation_node.hpp +3 -0
  308. package/src/duckdb/src/include/duckdb/parser/query_node.hpp +13 -2
  309. package/src/duckdb/src/include/duckdb/parser/result_modifier.hpp +24 -1
  310. package/src/duckdb/src/include/duckdb/parser/sql_statement.hpp +2 -1
  311. package/src/duckdb/src/include/duckdb/parser/statement/multi_statement.hpp +28 -0
  312. package/src/duckdb/src/include/duckdb/parser/statement/select_statement.hpp +6 -1
  313. package/src/duckdb/src/include/duckdb/parser/tableref/basetableref.hpp +4 -0
  314. package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +2 -0
  315. package/src/duckdb/src/include/duckdb/parser/tableref/expressionlistref.hpp +3 -0
  316. package/src/duckdb/src/include/duckdb/parser/tableref/joinref.hpp +3 -0
  317. package/src/duckdb/src/include/duckdb/parser/tableref/list.hpp +1 -0
  318. package/src/duckdb/src/include/duckdb/parser/tableref/pivotref.hpp +87 -0
  319. package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +3 -0
  320. package/src/duckdb/src/include/duckdb/parser/tableref/table_function_ref.hpp +3 -0
  321. package/src/duckdb/src/include/duckdb/parser/tableref.hpp +3 -1
  322. package/src/duckdb/src/include/duckdb/parser/tokens.hpp +2 -0
  323. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +33 -0
  324. package/src/duckdb/src/include/duckdb/planner/bind_context.hpp +2 -0
  325. package/src/duckdb/src/include/duckdb/planner/binder.hpp +15 -4
  326. package/src/duckdb/src/include/duckdb/planner/bound_result_modifier.hpp +3 -0
  327. package/src/duckdb/src/include/duckdb/planner/expression/bound_aggregate_expression.hpp +3 -0
  328. package/src/duckdb/src/include/duckdb/planner/expression_binder/base_select_binder.hpp +64 -0
  329. package/src/duckdb/src/include/duckdb/planner/expression_binder/having_binder.hpp +2 -2
  330. package/src/duckdb/src/include/duckdb/planner/expression_binder/order_binder.hpp +4 -1
  331. package/src/duckdb/src/include/duckdb/planner/expression_binder/qualify_binder.hpp +2 -2
  332. package/src/duckdb/src/include/duckdb/planner/expression_binder/select_binder.hpp +9 -38
  333. package/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +1 -1
  334. package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +1 -0
  335. package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +1 -0
  336. package/src/duckdb/src/include/duckdb/planner/operator/logical_asof_join.hpp +22 -0
  337. package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +5 -2
  338. package/src/duckdb/src/include/duckdb/planner/operator/logical_distinct.hpp +3 -0
  339. package/src/duckdb/src/include/duckdb/planner/query_node/bound_select_node.hpp +8 -2
  340. package/src/duckdb/src/include/duckdb/storage/buffer/block_handle.hpp +2 -0
  341. package/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp +76 -44
  342. package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp +3 -2
  343. package/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp +1 -1
  344. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_compress.hpp +2 -2
  345. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_fetch.hpp +1 -1
  346. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_scan.hpp +2 -1
  347. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_compress.hpp +2 -2
  348. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_fetch.hpp +1 -1
  349. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_scan.hpp +2 -1
  350. package/src/duckdb/src/include/duckdb/storage/data_pointer.hpp +4 -3
  351. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +4 -3
  352. package/src/duckdb/src/include/duckdb/storage/index.hpp +5 -4
  353. package/src/duckdb/src/include/duckdb/storage/meta_block_reader.hpp +7 -0
  354. package/src/duckdb/src/include/duckdb/storage/statistics/base_statistics.hpp +93 -29
  355. package/src/duckdb/src/include/duckdb/storage/statistics/column_statistics.hpp +22 -3
  356. package/src/duckdb/src/include/duckdb/storage/statistics/distinct_statistics.hpp +8 -6
  357. package/src/duckdb/src/include/duckdb/storage/statistics/list_stats.hpp +41 -0
  358. package/src/duckdb/src/include/duckdb/storage/statistics/node_statistics.hpp +26 -0
  359. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats.hpp +114 -0
  360. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats_union.hpp +62 -0
  361. package/src/duckdb/src/include/duckdb/storage/statistics/segment_statistics.hpp +2 -7
  362. package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +74 -0
  363. package/src/duckdb/src/include/duckdb/storage/statistics/struct_stats.hpp +42 -0
  364. package/src/duckdb/src/include/duckdb/storage/string_uncompressed.hpp +2 -3
  365. package/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp +2 -1
  366. package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +21 -7
  367. package/src/duckdb/src/include/duckdb/storage/table/column_data_checkpointer.hpp +3 -2
  368. package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +5 -6
  369. package/src/duckdb/src/include/duckdb/storage/table/column_segment_tree.hpp +18 -0
  370. package/src/duckdb/src/include/duckdb/storage/table/list_column_data.hpp +1 -1
  371. package/src/duckdb/src/include/duckdb/storage/table/persistent_table_data.hpp +6 -3
  372. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +41 -45
  373. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +23 -7
  374. package/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp +35 -0
  375. package/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp +21 -29
  376. package/src/duckdb/src/include/duckdb/storage/table/segment_base.hpp +6 -6
  377. package/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +281 -26
  378. package/src/duckdb/src/include/duckdb/storage/table/standard_column_data.hpp +0 -4
  379. package/src/duckdb/src/include/duckdb/storage/table/table_statistics.hpp +5 -0
  380. package/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +0 -1
  381. package/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +1 -1
  382. package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +6 -3
  383. package/src/duckdb/src/include/duckdb.h +71 -2
  384. package/src/duckdb/src/include/duckdb.hpp +0 -1
  385. package/src/duckdb/src/main/capi/pending-c.cpp +16 -3
  386. package/src/duckdb/src/main/capi/result-c.cpp +27 -1
  387. package/src/duckdb/src/main/capi/stream-c.cpp +25 -0
  388. package/src/duckdb/src/main/capi/table_function-c.cpp +23 -0
  389. package/src/duckdb/src/main/client_context.cpp +38 -34
  390. package/src/duckdb/src/main/client_data.cpp +7 -6
  391. package/src/duckdb/src/main/config.cpp +70 -1
  392. package/src/duckdb/src/main/database.cpp +19 -2
  393. package/src/duckdb/src/main/extension/extension_install.cpp +7 -2
  394. package/src/duckdb/src/main/prepared_statement.cpp +4 -0
  395. package/src/duckdb/src/main/query_profiler.cpp +17 -15
  396. package/src/duckdb/src/main/relation/explain_relation.cpp +3 -3
  397. package/src/duckdb/src/main/relation.cpp +3 -2
  398. package/src/duckdb/src/main/settings/settings.cpp +20 -8
  399. package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +1 -0
  400. package/src/duckdb/src/optimizer/deliminator.cpp +1 -1
  401. package/src/duckdb/src/optimizer/filter_combiner.cpp +3 -6
  402. package/src/duckdb/src/optimizer/filter_pullup.cpp +3 -1
  403. package/src/duckdb/src/optimizer/filter_pushdown.cpp +14 -8
  404. package/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp +107 -71
  405. package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +32 -12
  406. package/src/duckdb/src/optimizer/optimizer.cpp +1 -0
  407. package/src/duckdb/src/optimizer/pullup/pullup_from_left.cpp +2 -2
  408. package/src/duckdb/src/optimizer/pushdown/pushdown_aggregate.cpp +33 -5
  409. package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +1 -1
  410. package/src/duckdb/src/optimizer/pushdown/pushdown_inner_join.cpp +3 -0
  411. package/src/duckdb/src/optimizer/pushdown/pushdown_left_join.cpp +5 -12
  412. package/src/duckdb/src/optimizer/pushdown/pushdown_mark_join.cpp +2 -2
  413. package/src/duckdb/src/optimizer/pushdown/pushdown_single_join.cpp +1 -1
  414. package/src/duckdb/src/optimizer/remove_unused_columns.cpp +1 -0
  415. package/src/duckdb/src/optimizer/rule/move_constants.cpp +10 -4
  416. package/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp +30 -0
  417. package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +9 -2
  418. package/src/duckdb/src/optimizer/statistics/expression/propagate_aggregate.cpp +9 -3
  419. package/src/duckdb/src/optimizer/statistics/expression/propagate_and_compress.cpp +6 -7
  420. package/src/duckdb/src/optimizer/statistics/expression/propagate_cast.cpp +14 -11
  421. package/src/duckdb/src/optimizer/statistics/expression/propagate_columnref.cpp +1 -1
  422. package/src/duckdb/src/optimizer/statistics/expression/propagate_comparison.cpp +13 -15
  423. package/src/duckdb/src/optimizer/statistics/expression/propagate_conjunction.cpp +0 -1
  424. package/src/duckdb/src/optimizer/statistics/expression/propagate_constant.cpp +3 -75
  425. package/src/duckdb/src/optimizer/statistics/expression/propagate_function.cpp +7 -2
  426. package/src/duckdb/src/optimizer/statistics/expression/propagate_operator.cpp +10 -0
  427. package/src/duckdb/src/optimizer/statistics/operator/propagate_aggregate.cpp +2 -3
  428. package/src/duckdb/src/optimizer/statistics/operator/propagate_filter.cpp +29 -32
  429. package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +5 -5
  430. package/src/duckdb/src/optimizer/statistics/operator/propagate_set_operation.cpp +3 -3
  431. package/src/duckdb/src/optimizer/statistics_propagator.cpp +2 -1
  432. package/src/duckdb/src/optimizer/unnest_rewriter.cpp +2 -2
  433. package/src/duckdb/src/parallel/meta_pipeline.cpp +0 -7
  434. package/src/duckdb/src/parser/common_table_expression_info.cpp +19 -0
  435. package/src/duckdb/src/parser/expression/between_expression.cpp +17 -0
  436. package/src/duckdb/src/parser/expression/case_expression.cpp +28 -0
  437. package/src/duckdb/src/parser/expression/cast_expression.cpp +17 -0
  438. package/src/duckdb/src/parser/expression/collate_expression.cpp +16 -0
  439. package/src/duckdb/src/parser/expression/columnref_expression.cpp +15 -0
  440. package/src/duckdb/src/parser/expression/comparison_expression.cpp +16 -0
  441. package/src/duckdb/src/parser/expression/conjunction_expression.cpp +17 -0
  442. package/src/duckdb/src/parser/expression/constant_expression.cpp +14 -0
  443. package/src/duckdb/src/parser/expression/default_expression.cpp +7 -0
  444. package/src/duckdb/src/parser/expression/function_expression.cpp +35 -0
  445. package/src/duckdb/src/parser/expression/lambda_expression.cpp +16 -0
  446. package/src/duckdb/src/parser/expression/operator_expression.cpp +15 -0
  447. package/src/duckdb/src/parser/expression/parameter_expression.cpp +15 -0
  448. package/src/duckdb/src/parser/expression/positional_reference_expression.cpp +14 -0
  449. package/src/duckdb/src/parser/expression/star_expression.cpp +26 -6
  450. package/src/duckdb/src/parser/expression/subquery_expression.cpp +20 -0
  451. package/src/duckdb/src/parser/expression/window_expression.cpp +43 -0
  452. package/src/duckdb/src/parser/parsed_data/alter_info.cpp +7 -3
  453. package/src/duckdb/src/parser/parsed_data/alter_scalar_function_info.cpp +56 -0
  454. package/src/duckdb/src/parser/parsed_data/alter_table_function_info.cpp +51 -0
  455. package/src/duckdb/src/parser/parsed_data/create_scalar_function_info.cpp +3 -2
  456. package/src/duckdb/src/parser/parsed_data/create_table_function_info.cpp +6 -0
  457. package/src/duckdb/src/parser/parsed_data/sample_options.cpp +22 -10
  458. package/src/duckdb/src/parser/parsed_expression.cpp +72 -0
  459. package/src/duckdb/src/parser/parsed_expression_iterator.cpp +15 -1
  460. package/src/duckdb/src/parser/query_node/recursive_cte_node.cpp +21 -0
  461. package/src/duckdb/src/parser/query_node/select_node.cpp +31 -0
  462. package/src/duckdb/src/parser/query_node/set_operation_node.cpp +17 -0
  463. package/src/duckdb/src/parser/query_node.cpp +51 -1
  464. package/src/duckdb/src/parser/result_modifier.cpp +78 -0
  465. package/src/duckdb/src/parser/statement/multi_statement.cpp +18 -0
  466. package/src/duckdb/src/parser/statement/select_statement.cpp +12 -0
  467. package/src/duckdb/src/parser/tableref/basetableref.cpp +21 -0
  468. package/src/duckdb/src/parser/tableref/emptytableref.cpp +4 -0
  469. package/src/duckdb/src/parser/tableref/expressionlistref.cpp +17 -0
  470. package/src/duckdb/src/parser/tableref/joinref.cpp +29 -0
  471. package/src/duckdb/src/parser/tableref/pivotref.cpp +373 -0
  472. package/src/duckdb/src/parser/tableref/subqueryref.cpp +15 -0
  473. package/src/duckdb/src/parser/tableref/table_function.cpp +17 -0
  474. package/src/duckdb/src/parser/tableref.cpp +49 -0
  475. package/src/duckdb/src/parser/transform/expression/transform_array_access.cpp +11 -0
  476. package/src/duckdb/src/parser/transform/expression/transform_bool_expr.cpp +1 -1
  477. package/src/duckdb/src/parser/transform/expression/transform_columnref.cpp +17 -2
  478. package/src/duckdb/src/parser/transform/expression/transform_function.cpp +85 -42
  479. package/src/duckdb/src/parser/transform/expression/transform_operator.cpp +1 -1
  480. package/src/duckdb/src/parser/transform/expression/transform_subquery.cpp +1 -1
  481. package/src/duckdb/src/parser/transform/helpers/transform_alias.cpp +12 -6
  482. package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +24 -0
  483. package/src/duckdb/src/parser/transform/helpers/transform_groupby.cpp +7 -0
  484. package/src/duckdb/src/parser/transform/helpers/transform_orderby.cpp +0 -7
  485. package/src/duckdb/src/parser/transform/helpers/transform_typename.cpp +3 -2
  486. package/src/duckdb/src/parser/transform/statement/transform_create_function.cpp +4 -0
  487. package/src/duckdb/src/parser/transform/statement/transform_create_view.cpp +4 -0
  488. package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +179 -0
  489. package/src/duckdb/src/parser/transform/statement/transform_rename.cpp +3 -4
  490. package/src/duckdb/src/parser/transform/statement/transform_select.cpp +8 -0
  491. package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +2 -3
  492. package/src/duckdb/src/parser/transform/tableref/transform_join.cpp +12 -1
  493. package/src/duckdb/src/parser/transform/tableref/transform_pivot.cpp +121 -0
  494. package/src/duckdb/src/parser/transform/tableref/transform_tableref.cpp +2 -0
  495. package/src/duckdb/src/parser/transformer.cpp +15 -3
  496. package/src/duckdb/src/planner/bind_context.cpp +18 -25
  497. package/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp +9 -7
  498. package/src/duckdb/src/planner/binder/expression/bind_columnref_expression.cpp +4 -3
  499. package/src/duckdb/src/planner/binder/expression/bind_function_expression.cpp +23 -12
  500. package/src/duckdb/src/planner/binder/expression/bind_lambda.cpp +3 -2
  501. package/src/duckdb/src/planner/binder/expression/bind_star_expression.cpp +176 -0
  502. package/src/duckdb/src/planner/binder/expression/bind_subquery_expression.cpp +4 -0
  503. package/src/duckdb/src/planner/binder/expression/bind_unnest_expression.cpp +163 -24
  504. package/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp +2 -2
  505. package/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +109 -94
  506. package/src/duckdb/src/planner/binder/query_node/plan_query_node.cpp +11 -0
  507. package/src/duckdb/src/planner/binder/query_node/plan_select_node.cpp +9 -4
  508. package/src/duckdb/src/planner/binder/statement/bind_copy.cpp +5 -3
  509. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +3 -2
  510. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +10 -1
  511. package/src/duckdb/src/planner/binder/statement/bind_delete.cpp +1 -1
  512. package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +12 -8
  513. package/src/duckdb/src/planner/binder/statement/bind_logical_plan.cpp +17 -0
  514. package/src/duckdb/src/planner/binder/statement/bind_update.cpp +4 -2
  515. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +19 -3
  516. package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +366 -0
  517. package/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp +11 -1
  518. package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -0
  519. package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +61 -13
  520. package/src/duckdb/src/planner/binder.cpp +19 -24
  521. package/src/duckdb/src/planner/bound_result_modifier.cpp +27 -1
  522. package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +9 -2
  523. package/src/duckdb/src/planner/expression/bound_expression.cpp +4 -0
  524. package/src/duckdb/src/planner/expression/bound_window_expression.cpp +1 -1
  525. package/src/duckdb/src/planner/expression_binder/base_select_binder.cpp +146 -0
  526. package/src/duckdb/src/planner/expression_binder/having_binder.cpp +6 -3
  527. package/src/duckdb/src/planner/expression_binder/qualify_binder.cpp +3 -3
  528. package/src/duckdb/src/planner/expression_binder/select_binder.cpp +1 -132
  529. package/src/duckdb/src/planner/expression_binder.cpp +10 -3
  530. package/src/duckdb/src/planner/expression_iterator.cpp +17 -10
  531. package/src/duckdb/src/planner/filter/constant_filter.cpp +4 -6
  532. package/src/duckdb/src/planner/logical_operator.cpp +7 -2
  533. package/src/duckdb/src/planner/logical_operator_visitor.cpp +6 -0
  534. package/src/duckdb/src/planner/operator/logical_asof_join.cpp +8 -0
  535. package/src/duckdb/src/planner/operator/logical_distinct.cpp +3 -0
  536. package/src/duckdb/src/planner/planner.cpp +2 -1
  537. package/src/duckdb/src/planner/pragma_handler.cpp +10 -2
  538. package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +3 -1
  539. package/src/duckdb/src/storage/buffer_manager.cpp +44 -46
  540. package/src/duckdb/src/storage/checkpoint/row_group_writer.cpp +1 -1
  541. package/src/duckdb/src/storage/checkpoint/table_data_reader.cpp +4 -15
  542. package/src/duckdb/src/storage/checkpoint/table_data_writer.cpp +10 -4
  543. package/src/duckdb/src/storage/checkpoint_manager.cpp +9 -3
  544. package/src/duckdb/src/storage/compression/bitpacking.cpp +29 -25
  545. package/src/duckdb/src/storage/compression/fixed_size_uncompressed.cpp +45 -46
  546. package/src/duckdb/src/storage/compression/numeric_constant.cpp +10 -11
  547. package/src/duckdb/src/storage/compression/patas.cpp +1 -1
  548. package/src/duckdb/src/storage/compression/rle.cpp +20 -15
  549. package/src/duckdb/src/storage/compression/validity_uncompressed.cpp +6 -6
  550. package/src/duckdb/src/storage/data_table.cpp +23 -23
  551. package/src/duckdb/src/storage/index.cpp +12 -1
  552. package/src/duckdb/src/storage/local_storage.cpp +27 -23
  553. package/src/duckdb/src/storage/meta_block_reader.cpp +22 -0
  554. package/src/duckdb/src/storage/statistics/base_statistics.cpp +373 -128
  555. package/src/duckdb/src/storage/statistics/column_statistics.cpp +57 -3
  556. package/src/duckdb/src/storage/statistics/distinct_statistics.cpp +8 -9
  557. package/src/duckdb/src/storage/statistics/list_stats.cpp +121 -0
  558. package/src/duckdb/src/storage/statistics/numeric_stats.cpp +591 -0
  559. package/src/duckdb/src/storage/statistics/numeric_stats_union.cpp +65 -0
  560. package/src/duckdb/src/storage/statistics/segment_statistics.cpp +2 -11
  561. package/src/duckdb/src/storage/statistics/string_stats.cpp +273 -0
  562. package/src/duckdb/src/storage/statistics/struct_stats.cpp +133 -0
  563. package/src/duckdb/src/storage/storage_info.cpp +2 -2
  564. package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +4 -10
  565. package/src/duckdb/src/storage/table/column_data.cpp +118 -62
  566. package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +10 -9
  567. package/src/duckdb/src/storage/table/column_segment.cpp +30 -45
  568. package/src/duckdb/src/storage/table/list_column_data.cpp +50 -71
  569. package/src/duckdb/src/storage/table/persistent_table_data.cpp +2 -1
  570. package/src/duckdb/src/storage/table/row_group.cpp +213 -143
  571. package/src/duckdb/src/storage/table/row_group_collection.cpp +151 -105
  572. package/src/duckdb/src/storage/table/scan_state.cpp +45 -33
  573. package/src/duckdb/src/storage/table/standard_column_data.cpp +11 -12
  574. package/src/duckdb/src/storage/table/struct_column_data.cpp +27 -34
  575. package/src/duckdb/src/storage/table/table_statistics.cpp +27 -7
  576. package/src/duckdb/src/storage/table/update_segment.cpp +23 -18
  577. package/src/duckdb/src/storage/wal_replay.cpp +8 -5
  578. package/src/duckdb/src/storage/write_ahead_log.cpp +2 -2
  579. package/src/duckdb/src/transaction/commit_state.cpp +11 -7
  580. package/src/duckdb/src/verification/deserialized_statement_verifier.cpp +0 -1
  581. package/src/duckdb/third_party/libpg_query/include/nodes/nodes.hpp +35 -0
  582. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +36 -2
  583. package/src/duckdb/third_party/libpg_query/include/nodes/primnodes.hpp +3 -3
  584. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +1022 -530
  585. package/src/duckdb/third_party/libpg_query/include/parser/kwlist.hpp +8 -0
  586. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +24462 -22828
  587. package/src/duckdb/third_party/re2/re2/re2.cc +9 -0
  588. package/src/duckdb/third_party/re2/re2/re2.h +2 -0
  589. package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +4 -4
  590. package/src/duckdb/ub_extension_json_json_functions.cpp +2 -0
  591. package/src/duckdb/ub_src_common_serializer.cpp +2 -0
  592. package/src/duckdb/ub_src_common_types.cpp +2 -0
  593. package/src/duckdb/ub_src_execution_physical_plan.cpp +2 -0
  594. package/src/duckdb/ub_src_function_aggregate_distributive.cpp +2 -0
  595. package/src/duckdb/ub_src_function_scalar_bit.cpp +2 -0
  596. package/src/duckdb/ub_src_function_scalar_map.cpp +4 -0
  597. package/src/duckdb/ub_src_function_scalar_string.cpp +2 -0
  598. package/src/duckdb/ub_src_function_scalar_string_regexp.cpp +4 -0
  599. package/src/duckdb/ub_src_main_capi.cpp +2 -0
  600. package/src/duckdb/ub_src_optimizer_rule.cpp +2 -0
  601. package/src/duckdb/ub_src_parser.cpp +2 -0
  602. package/src/duckdb/ub_src_parser_parsed_data.cpp +4 -2
  603. package/src/duckdb/ub_src_parser_statement.cpp +2 -0
  604. package/src/duckdb/ub_src_parser_tableref.cpp +2 -0
  605. package/src/duckdb/ub_src_parser_transform_statement.cpp +2 -0
  606. package/src/duckdb/ub_src_parser_transform_tableref.cpp +2 -0
  607. package/src/duckdb/ub_src_planner_binder_expression.cpp +2 -0
  608. package/src/duckdb/ub_src_planner_binder_tableref.cpp +2 -0
  609. package/src/duckdb/ub_src_planner_expression_binder.cpp +2 -0
  610. package/src/duckdb/ub_src_planner_operator.cpp +2 -0
  611. package/src/duckdb/ub_src_storage_statistics.cpp +6 -6
  612. package/src/duckdb/ub_src_storage_table.cpp +0 -2
  613. package/src/duckdb_node.hpp +2 -1
  614. package/src/statement.cpp +5 -5
  615. package/src/utils.cpp +27 -2
  616. package/test/extension.test.ts +44 -26
  617. package/test/syntax_error.test.ts +3 -1
  618. package/filelist.cache +0 -0
  619. package/src/duckdb/src/include/duckdb/main/loadable_extension.hpp +0 -59
  620. package/src/duckdb/src/include/duckdb/storage/statistics/list_statistics.hpp +0 -36
  621. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_statistics.hpp +0 -75
  622. package/src/duckdb/src/include/duckdb/storage/statistics/string_statistics.hpp +0 -49
  623. package/src/duckdb/src/include/duckdb/storage/statistics/struct_statistics.hpp +0 -36
  624. package/src/duckdb/src/include/duckdb/storage/statistics/validity_statistics.hpp +0 -45
  625. package/src/duckdb/src/parser/parsed_data/alter_function_info.cpp +0 -55
  626. package/src/duckdb/src/storage/statistics/list_statistics.cpp +0 -94
  627. package/src/duckdb/src/storage/statistics/numeric_statistics.cpp +0 -307
  628. package/src/duckdb/src/storage/statistics/string_statistics.cpp +0 -220
  629. package/src/duckdb/src/storage/statistics/struct_statistics.cpp +0 -108
  630. package/src/duckdb/src/storage/statistics/validity_statistics.cpp +0 -91
  631. package/src/duckdb/src/storage/table/segment_tree.cpp +0 -179
@@ -3,21 +3,86 @@
3
3
  #include "duckdb/parser/expression/function_expression.hpp"
4
4
  #include "duckdb/planner/expression/bound_aggregate_expression.hpp"
5
5
  #include "duckdb/planner/expression/bound_columnref_expression.hpp"
6
+ #include "duckdb/planner/expression/bound_constant_expression.hpp"
7
+ #include "duckdb/planner/expression/bound_function_expression.hpp"
6
8
  #include "duckdb/planner/expression/bound_parameter_expression.hpp"
7
9
  #include "duckdb/planner/expression_binder/aggregate_binder.hpp"
8
10
  #include "duckdb/planner/expression_binder/select_binder.hpp"
9
11
  #include "duckdb/planner/query_node/bound_select_node.hpp"
10
12
  #include "duckdb/planner/expression/bound_unnest_expression.hpp"
11
13
  #include "duckdb/planner/binder.hpp"
14
+ #include "duckdb/function/scalar/nested_functions.hpp"
15
+ #include "duckdb/execution/expression_executor.hpp"
12
16
 
13
17
  namespace duckdb {
14
18
 
15
- BindResult SelectBinder::BindUnnest(FunctionExpression &function, idx_t depth) {
19
+ unique_ptr<Expression> CreateBoundStructExtract(ClientContext &context, unique_ptr<Expression> expr, string key) {
20
+ vector<unique_ptr<Expression>> arguments;
21
+ arguments.push_back(std::move(expr));
22
+ arguments.push_back(make_unique<BoundConstantExpression>(Value(key)));
23
+ auto extract_function = StructExtractFun::GetFunction();
24
+ auto bind_info = extract_function.bind(context, extract_function, arguments);
25
+ auto return_type = extract_function.return_type;
26
+ auto result = make_unique<BoundFunctionExpression>(return_type, std::move(extract_function), std::move(arguments),
27
+ std::move(bind_info));
28
+ result->alias = std::move(key);
29
+ return std::move(result);
30
+ }
31
+
32
+ BindResult SelectBinder::BindUnnest(FunctionExpression &function, idx_t depth, bool root_expression) {
16
33
  // bind the children of the function expression
34
+ if (depth > 0) {
35
+ return BindResult(binder.FormatError(function, "UNNEST() for correlated expressions is not supported yet"));
36
+ }
17
37
  string error;
38
+ if (function.children.empty()) {
39
+ return BindResult(binder.FormatError(function, "UNNEST() requires a single argument"));
40
+ }
41
+ idx_t max_depth = 1;
18
42
  if (function.children.size() != 1) {
19
- return BindResult(binder.FormatError(function, "Unnest() needs exactly one child expressions"));
43
+ bool has_parameter = false;
44
+ bool supported_argument = false;
45
+ for (idx_t i = 1; i < function.children.size(); i++) {
46
+ if (has_parameter) {
47
+ return BindResult(binder.FormatError(function, "UNNEST() only supports a single additional argument"));
48
+ }
49
+ if (function.children[i]->HasParameter()) {
50
+ throw ParameterNotAllowedException("Parameter not allowed in unnest parameter");
51
+ }
52
+ if (!function.children[i]->IsScalar()) {
53
+ break;
54
+ }
55
+ auto alias = function.children[i]->alias;
56
+ BindChild(function.children[i], depth, error);
57
+ if (!error.empty()) {
58
+ return BindResult(error);
59
+ }
60
+ auto &const_child = (BoundExpression &)*function.children[i];
61
+ auto value = ExpressionExecutor::EvaluateScalar(context, *const_child.expr, true);
62
+ if (alias == "recursive") {
63
+ auto recursive = value.GetValue<bool>();
64
+ if (recursive) {
65
+ max_depth = NumericLimits<idx_t>::Maximum();
66
+ }
67
+ } else if (alias == "max_depth") {
68
+ max_depth = value.GetValue<uint32_t>();
69
+ if (max_depth == 0) {
70
+ throw BinderException("UNNEST cannot have a max depth of 0");
71
+ }
72
+ } else if (!alias.empty()) {
73
+ throw BinderException("Unsupported parameter \"%s\" for unnest", alias);
74
+ } else {
75
+ break;
76
+ }
77
+ has_parameter = true;
78
+ supported_argument = true;
79
+ }
80
+ if (!supported_argument) {
81
+ return BindResult(binder.FormatError(function, "UNNEST - unsupported extra argument, unnest only supports "
82
+ "recursive := [true/false] or max_depth := #"));
83
+ }
20
84
  }
85
+ unnest_level++;
21
86
  BindChild(function.children[0], depth, error);
22
87
  if (!error.empty()) {
23
88
  // failed to bind
@@ -30,37 +95,111 @@ BindResult SelectBinder::BindUnnest(FunctionExpression &function, idx_t depth) {
30
95
  }
31
96
  auto &child = (BoundExpression &)*function.children[0];
32
97
  auto &child_type = child.expr->return_type;
98
+ unnest_level--;
33
99
 
34
- if (child_type.id() != LogicalTypeId::LIST && child_type.id() != LogicalTypeId::SQLNULL &&
35
- child_type.id() != LogicalTypeId::UNKNOWN) {
36
- return BindResult(binder.FormatError(function, "Unnest() can only be applied to lists and NULL"));
37
- }
38
-
39
- if (depth > 0) {
40
- throw BinderException(binder.FormatError(function, "Unnest() for correlated expressions is not supported yet"));
100
+ if (unnest_level > 0) {
101
+ throw BinderException(
102
+ "Nested UNNEST calls are not supported - use UNNEST(x, recursive := true) to unnest multiple levels");
41
103
  }
42
104
 
43
- auto return_type = LogicalType(LogicalTypeId::SQLNULL);
44
- if (child_type.id() == LogicalTypeId::LIST) {
45
- return_type = ListType::GetChildType(child_type);
46
- } else if (child_type.id() == LogicalTypeId::UNKNOWN) {
105
+ switch (child_type.id()) {
106
+ case LogicalTypeId::UNKNOWN:
47
107
  throw ParameterNotResolvedException();
108
+ case LogicalTypeId::LIST:
109
+ case LogicalTypeId::STRUCT:
110
+ case LogicalTypeId::SQLNULL:
111
+ break;
112
+ default:
113
+ return BindResult(binder.FormatError(function, "UNNEST() can only be applied to lists, structs and NULL"));
48
114
  }
49
115
 
50
- auto result = make_unique<BoundUnnestExpression>(return_type);
51
- result->child = std::move(child.expr);
116
+ idx_t list_unnests;
117
+ idx_t struct_unnests = 0;
52
118
 
53
- auto unnest_index = node.unnests.size();
54
- node.unnests.push_back(std::move(result));
55
-
56
- // TODO what if we have multiple unnests in the same projection list? ignore for now
119
+ auto unnest_expr = std::move(child.expr);
120
+ if (child_type.id() == LogicalTypeId::SQLNULL) {
121
+ list_unnests = 1;
122
+ } else {
123
+ // first do all of the list unnests
124
+ auto type = child_type;
125
+ list_unnests = 0;
126
+ while (type.id() == LogicalTypeId::LIST) {
127
+ type = ListType::GetChildType(type);
128
+ list_unnests++;
129
+ if (list_unnests >= max_depth) {
130
+ break;
131
+ }
132
+ }
133
+ // unnest structs all the way afterwards, if there are any
134
+ if (type.id() == LogicalTypeId::STRUCT) {
135
+ struct_unnests = max_depth - list_unnests;
136
+ }
137
+ }
138
+ if (struct_unnests > 0 && !root_expression) {
139
+ return BindResult(binder.FormatError(
140
+ function, "UNNEST() on a struct column can only be applied as the root element of a SELECT expression"));
141
+ }
142
+ // perform all of the list unnests first
143
+ auto return_type = child_type;
144
+ for (idx_t current_depth = 0; current_depth < list_unnests; current_depth++) {
145
+ if (return_type.id() == LogicalTypeId::LIST) {
146
+ return_type = ListType::GetChildType(return_type);
147
+ }
148
+ auto result = make_unique<BoundUnnestExpression>(return_type);
149
+ result->child = std::move(unnest_expr);
150
+ auto alias = function.alias.empty() ? result->ToString() : function.alias;
57
151
 
58
- // now create a column reference referring to the unnest
59
- auto colref = make_unique<BoundColumnRefExpression>(
60
- function.alias.empty() ? node.unnests[unnest_index]->ToString() : function.alias, return_type,
61
- ColumnBinding(node.unnest_index, unnest_index), depth);
152
+ auto current_level = unnest_level + list_unnests - current_depth - 1;
153
+ auto entry = node.unnests.find(current_level);
154
+ idx_t unnest_table_index;
155
+ idx_t unnest_column_index;
156
+ if (entry == node.unnests.end()) {
157
+ BoundUnnestNode unnest_node;
158
+ unnest_node.index = binder.GenerateTableIndex();
159
+ unnest_node.expressions.push_back(std::move(result));
160
+ unnest_table_index = unnest_node.index;
161
+ unnest_column_index = 0;
162
+ node.unnests.insert(make_pair(current_level, std::move(unnest_node)));
163
+ } else {
164
+ unnest_table_index = entry->second.index;
165
+ unnest_column_index = entry->second.expressions.size();
166
+ entry->second.expressions.push_back(std::move(result));
167
+ }
168
+ // now create a column reference referring to the unnest
169
+ unnest_expr = make_unique<BoundColumnRefExpression>(
170
+ std::move(alias), return_type, ColumnBinding(unnest_table_index, unnest_column_index), depth);
171
+ }
172
+ // now perform struct unnests, if any
173
+ if (struct_unnests > 0) {
174
+ vector<unique_ptr<Expression>> struct_expressions;
175
+ struct_expressions.push_back(std::move(unnest_expr));
62
176
 
63
- return BindResult(std::move(colref));
177
+ for (idx_t i = 0; i < struct_unnests; i++) {
178
+ vector<unique_ptr<Expression>> new_expressions;
179
+ // check if there are any structs left
180
+ bool has_structs = false;
181
+ for (auto &expr : struct_expressions) {
182
+ if (expr->return_type.id() == LogicalTypeId::STRUCT) {
183
+ // struct! push a struct_extract
184
+ auto &child_types = StructType::GetChildTypes(expr->return_type);
185
+ for (auto &entry : child_types) {
186
+ new_expressions.push_back(CreateBoundStructExtract(context, expr->Copy(), entry.first));
187
+ }
188
+ has_structs = true;
189
+ } else {
190
+ // not a struct - push as-is
191
+ new_expressions.push_back(std::move(expr));
192
+ }
193
+ }
194
+ struct_expressions = std::move(new_expressions);
195
+ if (!has_structs) {
196
+ break;
197
+ }
198
+ }
199
+ expanded_expressions = std::move(struct_expressions);
200
+ unnest_expr = make_unique<BoundConstantExpression>(Value(42));
201
+ }
202
+ return BindResult(std::move(unnest_expr));
64
203
  }
65
204
 
66
205
  } // namespace duckdb
@@ -119,10 +119,10 @@ static LogicalType BindRangeExpression(ClientContext &context, const string &nam
119
119
  return bound.expr->return_type;
120
120
  }
121
121
 
122
- BindResult SelectBinder::BindWindow(WindowExpression &window, idx_t depth) {
122
+ BindResult BaseSelectBinder::BindWindow(WindowExpression &window, idx_t depth) {
123
123
  auto name = window.GetName();
124
124
 
125
- QueryErrorContext error_context(binder.root_statement, window.query_location);
125
+ QueryErrorContext error_context(binder.GetRootStatement(), window.query_location);
126
126
  if (inside_window) {
127
127
  throw BinderException(error_context.FormatError("window function calls cannot be nested"));
128
128
  }
@@ -19,8 +19,7 @@
19
19
  #include "duckdb/planner/expression_binder/select_binder.hpp"
20
20
  #include "duckdb/planner/expression_binder/where_binder.hpp"
21
21
  #include "duckdb/planner/query_node/bound_select_node.hpp"
22
- #include "duckdb/planner/expression_binder/aggregate_binder.hpp"
23
- #include "duckdb/parser/parsed_expression_iterator.hpp"
22
+ #include "duckdb/parser/expression/conjunction_expression.hpp"
24
23
 
25
24
  namespace duckdb {
26
25
 
@@ -136,31 +135,39 @@ void Binder::BindModifiers(OrderBinder &order_binder, QueryNode &statement, Boun
136
135
  auto bound_order = make_unique<BoundOrderModifier>();
137
136
  auto &config = DBConfig::GetConfig(context);
138
137
  D_ASSERT(!order.orders.empty());
139
- if (order.orders[0].expression->type == ExpressionType::STAR) {
140
- // ORDER BY ALL
141
- // replace the order list with the maximum order by count
142
- D_ASSERT(order.orders.size() == 1);
143
- auto order_type = order.orders[0].type;
144
- auto null_order = order.orders[0].null_order;
145
-
146
- vector<OrderByNode> new_orders;
147
- for (idx_t i = 0; i < order_binder.MaxCount(); i++) {
148
- new_orders.emplace_back(order_type, null_order,
149
- make_unique<ConstantExpression>(Value::INTEGER(i + 1)));
138
+ auto &order_binders = order_binder.GetBinders();
139
+ if (order.orders.size() == 1 && order.orders[0].expression->type == ExpressionType::STAR) {
140
+ auto star = (StarExpression *)order.orders[0].expression.get();
141
+ if (star->exclude_list.empty() && star->replace_list.empty() && !star->expr) {
142
+ // ORDER BY ALL
143
+ // replace the order list with the all elements in the SELECT list
144
+ auto order_type = order.orders[0].type;
145
+ auto null_order = order.orders[0].null_order;
146
+
147
+ vector<OrderByNode> new_orders;
148
+ for (idx_t i = 0; i < order_binder.MaxCount(); i++) {
149
+ new_orders.emplace_back(order_type, null_order,
150
+ make_unique<ConstantExpression>(Value::INTEGER(i + 1)));
151
+ }
152
+ order.orders = std::move(new_orders);
150
153
  }
151
- order.orders = std::move(new_orders);
152
154
  }
153
155
  for (auto &order_node : order.orders) {
154
- auto order_expression = BindOrderExpression(order_binder, std::move(order_node.expression));
155
- if (!order_expression) {
156
- continue;
157
- }
156
+ vector<unique_ptr<ParsedExpression>> order_list;
157
+ order_binders[0]->ExpandStarExpression(std::move(order_node.expression), order_list);
158
+
158
159
  auto type =
159
160
  order_node.type == OrderType::ORDER_DEFAULT ? config.options.default_order_type : order_node.type;
160
161
  auto null_order = order_node.null_order == OrderByNullType::ORDER_DEFAULT
161
162
  ? config.options.default_null_order
162
163
  : order_node.null_order;
163
- bound_order->orders.emplace_back(type, null_order, std::move(order_expression));
164
+ for (auto &order_expr : order_list) {
165
+ auto bound_expr = BindOrderExpression(order_binder, std::move(order_expr));
166
+ if (!bound_expr) {
167
+ continue;
168
+ }
169
+ bound_order->orders.emplace_back(type, null_order, std::move(bound_expr));
170
+ }
164
171
  }
165
172
  if (!bound_order->orders.empty()) {
166
173
  bound_modifier = std::move(bound_order);
@@ -264,82 +271,54 @@ void Binder::BindModifierTypes(BoundQueryNode &result, const vector<LogicalType>
264
271
  }
265
272
  }
266
273
 
267
- bool Binder::FindStarExpression(ParsedExpression &expr, StarExpression **star) {
268
- if (expr.GetExpressionClass() == ExpressionClass::STAR) {
269
- auto current_star = (StarExpression *)&expr;
270
- if (*star) {
271
- // we can have multiple
272
- if (!StarExpression::Equal(*star, current_star)) {
273
- throw BinderException(
274
- FormatError(expr, "Multiple different STAR/COLUMNS in the same expression are not supported"));
275
- }
276
- return true;
277
- }
278
- *star = current_star;
279
- return true;
280
- }
281
- bool has_star = false;
282
- ParsedExpressionIterator::EnumerateChildren(expr, [&](ParsedExpression &child_expr) {
283
- if (FindStarExpression(child_expr, star)) {
284
- has_star = true;
285
- }
286
- });
287
- return has_star;
288
- }
289
-
290
- void Binder::ReplaceStarExpression(unique_ptr<ParsedExpression> &expr, unique_ptr<ParsedExpression> &replacement) {
291
- D_ASSERT(expr);
292
- if (expr->GetExpressionClass() == ExpressionClass::STAR) {
293
- D_ASSERT(replacement);
294
- expr = replacement->Copy();
295
- return;
296
- }
297
- ParsedExpressionIterator::EnumerateChildren(
298
- *expr, [&](unique_ptr<ParsedExpression> &child_expr) { ReplaceStarExpression(child_expr, replacement); });
274
+ unique_ptr<BoundQueryNode> Binder::BindNode(SelectNode &statement) {
275
+ D_ASSERT(statement.from_table);
276
+ // first bind the FROM table statement
277
+ auto from = std::move(statement.from_table);
278
+ auto from_table = Bind(*from);
279
+ return BindSelectNode(statement, std::move(from_table));
299
280
  }
300
281
 
301
- void Binder::ExpandStarExpression(unique_ptr<ParsedExpression> expr,
302
- vector<unique_ptr<ParsedExpression>> &new_select_list) {
303
- StarExpression *star = nullptr;
304
- if (!FindStarExpression(*expr, &star)) {
305
- // no star expression: add it as-is
306
- D_ASSERT(!star);
307
- new_select_list.push_back(std::move(expr));
282
+ void Binder::BindWhereStarExpression(unique_ptr<ParsedExpression> &expr) {
283
+ // expand any expressions in the upper AND recursively
284
+ if (expr->type == ExpressionType::CONJUNCTION_AND) {
285
+ auto &conj = (ConjunctionExpression &)*expr;
286
+ for (auto &child : conj.children) {
287
+ BindWhereStarExpression(child);
288
+ }
308
289
  return;
309
290
  }
310
- D_ASSERT(star);
311
- vector<unique_ptr<ParsedExpression>> star_list;
312
- // we have star expressions! expand the list of star expressions
313
- bind_context.GenerateAllColumnExpressions(*star, star_list);
314
-
315
- // now perform the replacement
316
- for (idx_t i = 0; i < star_list.size(); i++) {
317
- auto new_expr = expr->Copy();
318
- ReplaceStarExpression(new_expr, star_list[i]);
319
- new_select_list.push_back(std::move(new_expr));
291
+ if (expr->type == ExpressionType::STAR) {
292
+ auto &star = (StarExpression &)*expr;
293
+ if (!star.columns) {
294
+ throw ParserException("STAR expression is not allowed in the WHERE clause. Use COLUMNS(*) instead.");
295
+ }
320
296
  }
321
- }
322
-
323
- void Binder::ExpandStarExpressions(vector<unique_ptr<ParsedExpression>> &select_list,
324
- vector<unique_ptr<ParsedExpression>> &new_select_list) {
325
- for (auto &select_element : select_list) {
326
- ExpandStarExpression(std::move(select_element), new_select_list);
297
+ // expand the stars for this expression
298
+ vector<unique_ptr<ParsedExpression>> new_conditions;
299
+ ExpandStarExpression(std::move(expr), new_conditions);
300
+
301
+ // set up an AND conjunction between the expanded conditions
302
+ expr = std::move(new_conditions[0]);
303
+ for (idx_t i = 1; i < new_conditions.size(); i++) {
304
+ auto and_conj = make_unique<ConjunctionExpression>(ExpressionType::CONJUNCTION_AND, std::move(expr),
305
+ std::move(new_conditions[i]));
306
+ expr = std::move(and_conj);
327
307
  }
328
308
  }
329
309
 
330
- unique_ptr<BoundQueryNode> Binder::BindNode(SelectNode &statement) {
310
+ unique_ptr<BoundQueryNode> Binder::BindSelectNode(SelectNode &statement, unique_ptr<BoundTableRef> from_table) {
311
+ D_ASSERT(from_table);
312
+ D_ASSERT(!statement.from_table);
331
313
  auto result = make_unique<BoundSelectNode>();
332
314
  result->projection_index = GenerateTableIndex();
333
315
  result->group_index = GenerateTableIndex();
334
316
  result->aggregate_index = GenerateTableIndex();
335
317
  result->groupings_index = GenerateTableIndex();
336
318
  result->window_index = GenerateTableIndex();
337
- result->unnest_index = GenerateTableIndex();
338
319
  result->prune_index = GenerateTableIndex();
339
320
 
340
- // first bind the FROM table statement
341
- result->from_table = Bind(*statement.from_table);
342
-
321
+ result->from_table = std::move(from_table);
343
322
  // bind the sample clause
344
323
  if (statement.sample) {
345
324
  result->sample_options = std::move(statement.sample);
@@ -373,6 +352,9 @@ unique_ptr<BoundQueryNode> Binder::BindNode(SelectNode &statement) {
373
352
  // first visit the WHERE clause
374
353
  // the WHERE clause happens before the GROUP BY, PROJECTION or HAVING clauses
375
354
  if (statement.where_clause) {
355
+ // bind any star expressions in the WHERE clause
356
+ BindWhereStarExpression(statement.where_clause);
357
+
376
358
  ColumnAliasBinder alias_binder(*result, alias_map);
377
359
  WhereBinder where_binder(*this, context, &alias_binder);
378
360
  unique_ptr<ParsedExpression> condition = std::move(statement.where_clause);
@@ -443,12 +425,34 @@ unique_ptr<BoundQueryNode> Binder::BindNode(SelectNode &statement) {
443
425
  // after that, we bind to the SELECT list
444
426
  SelectBinder select_binder(*this, context, *result, info, alias_map);
445
427
  vector<LogicalType> internal_sql_types;
428
+ vector<idx_t> group_by_all_indexes;
429
+ vector<string> new_names;
446
430
  for (idx_t i = 0; i < statement.select_list.size(); i++) {
447
431
  bool is_window = statement.select_list[i]->IsWindow();
448
432
  idx_t unnest_count = result->unnests.size();
449
433
  LogicalType result_type;
450
- auto expr = select_binder.Bind(statement.select_list[i], &result_type);
451
- if (statement.aggregate_handling == AggregateHandling::FORCE_AGGREGATES && select_binder.HasBoundColumns()) {
434
+ auto expr = select_binder.Bind(statement.select_list[i], &result_type, true);
435
+ bool is_original_column = i < result->column_count;
436
+ bool can_group_by_all =
437
+ statement.aggregate_handling == AggregateHandling::FORCE_AGGREGATES && is_original_column;
438
+ if (select_binder.HasExpandedExpressions()) {
439
+ if (!is_original_column) {
440
+ throw InternalException("Only original columns can have expanded expressions");
441
+ }
442
+ if (statement.aggregate_handling == AggregateHandling::FORCE_AGGREGATES) {
443
+ throw BinderException("UNNEST of struct cannot be combined with GROUP BY ALL");
444
+ }
445
+ auto &struct_expressions = select_binder.ExpandedExpressions();
446
+ D_ASSERT(!struct_expressions.empty());
447
+ for (auto &struct_expr : struct_expressions) {
448
+ new_names.push_back(struct_expr->GetName());
449
+ result->types.push_back(struct_expr->return_type);
450
+ result->select_list.push_back(std::move(struct_expr));
451
+ }
452
+ struct_expressions.clear();
453
+ continue;
454
+ }
455
+ if (can_group_by_all && select_binder.HasBoundColumns()) {
452
456
  if (select_binder.BoundAggregates()) {
453
457
  throw BinderException("Cannot mix aggregates with non-aggregated columns!");
454
458
  }
@@ -460,20 +464,28 @@ unique_ptr<BoundQueryNode> Binder::BindNode(SelectNode &statement) {
460
464
  }
461
465
  // we are forcing aggregates, and the node has columns bound
462
466
  // this entry becomes a group
463
- auto group_ref = make_unique<BoundColumnRefExpression>(
464
- expr->return_type, ColumnBinding(result->group_index, result->groups.group_expressions.size()));
465
- result->groups.group_expressions.push_back(std::move(expr));
466
- expr = std::move(group_ref);
467
+ group_by_all_indexes.push_back(i);
467
468
  }
468
469
  result->select_list.push_back(std::move(expr));
469
- if (i < result->column_count) {
470
+ if (is_original_column) {
471
+ new_names.push_back(std::move(result->names[i]));
470
472
  result->types.push_back(result_type);
471
473
  }
472
474
  internal_sql_types.push_back(result_type);
473
- if (statement.aggregate_handling == AggregateHandling::FORCE_AGGREGATES) {
475
+ if (can_group_by_all) {
474
476
  select_binder.ResetBindings();
475
477
  }
476
478
  }
479
+ // push the GROUP BY ALL expressions into the group set
480
+ for (auto &group_by_all_index : group_by_all_indexes) {
481
+ auto &expr = result->select_list[group_by_all_index];
482
+ auto group_ref = make_unique<BoundColumnRefExpression>(
483
+ expr->return_type, ColumnBinding(result->group_index, result->groups.group_expressions.size()));
484
+ result->groups.group_expressions.push_back(std::move(expr));
485
+ expr = std::move(group_ref);
486
+ }
487
+ result->column_count = new_names.size();
488
+ result->names = std::move(new_names);
477
489
  result->need_prune = result->select_list.size() > result->column_count;
478
490
 
479
491
  // in the normal select binder, we bind columns as if there is no aggregation
@@ -484,16 +496,19 @@ unique_ptr<BoundQueryNode> Binder::BindNode(SelectNode &statement) {
484
496
  !result->groups.grouping_sets.empty()) {
485
497
  if (statement.aggregate_handling == AggregateHandling::NO_AGGREGATES_ALLOWED) {
486
498
  throw BinderException("Aggregates cannot be present in a Project relation!");
487
- } else if (statement.aggregate_handling == AggregateHandling::STANDARD_HANDLING) {
488
- if (select_binder.HasBoundColumns()) {
489
- auto &bound_columns = select_binder.GetBoundColumns();
490
- string error;
491
- error = "column \"%s\" must appear in the GROUP BY clause or must be part of an aggregate function.";
499
+ } else if (select_binder.HasBoundColumns()) {
500
+ auto &bound_columns = select_binder.GetBoundColumns();
501
+ string error;
502
+ error = "column \"%s\" must appear in the GROUP BY clause or must be part of an aggregate function.";
503
+ if (statement.aggregate_handling == AggregateHandling::FORCE_AGGREGATES) {
504
+ error += "\nGROUP BY ALL will only group entries in the SELECT list. Add it to the SELECT list or "
505
+ "GROUP BY this entry explicitly.";
506
+ } else {
492
507
  error += "\nEither add it to the GROUP BY list, or use \"ANY_VALUE(%s)\" if the exact value of \"%s\" "
493
508
  "is not important.";
494
- throw BinderException(FormatError(bound_columns[0].query_location, error, bound_columns[0].name,
495
- bound_columns[0].name, bound_columns[0].name));
496
509
  }
510
+ throw BinderException(FormatError(bound_columns[0].query_location, error, bound_columns[0].name,
511
+ bound_columns[0].name, bound_columns[0].name));
497
512
  }
498
513
  }
499
514
 
@@ -4,6 +4,7 @@
4
4
  #include "duckdb/planner/operator/logical_limit.hpp"
5
5
  #include "duckdb/planner/operator/logical_limit_percent.hpp"
6
6
  #include "duckdb/planner/operator/logical_order.hpp"
7
+ #include "duckdb/planner/bound_result_modifier.hpp"
7
8
 
8
9
  namespace duckdb {
9
10
 
@@ -20,6 +21,16 @@ unique_ptr<LogicalOperator> Binder::VisitQueryNode(BoundQueryNode &node, unique_
20
21
  }
21
22
  case ResultModifierType::ORDER_MODIFIER: {
22
23
  auto &bound = (BoundOrderModifier &)*mod;
24
+ if (root->type == LogicalOperatorType::LOGICAL_DISTINCT) {
25
+ auto &distinct = (LogicalDistinct &)*root;
26
+ if (!distinct.distinct_targets.empty()) {
27
+ auto order_by = make_unique<BoundOrderModifier>();
28
+ for (auto &order_node : bound.orders) {
29
+ order_by->orders.push_back(order_node.Copy());
30
+ }
31
+ distinct.order_by = std::move(order_by);
32
+ }
33
+ }
23
34
  auto order = make_unique<LogicalOrder>(std::move(bound.orders));
24
35
  order->AddChild(std::move(root));
25
36
  root = std::move(order);
@@ -88,9 +88,15 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundSelectNode &statement) {
88
88
  root = std::move(qualify);
89
89
  }
90
90
 
91
- if (!statement.unnests.empty()) {
92
- auto unnest = make_unique<LogicalUnnest>(statement.unnest_index);
93
- unnest->expressions = std::move(statement.unnests);
91
+ for (idx_t i = statement.unnests.size(); i > 0; i--) {
92
+ auto unnest_level = i - 1;
93
+ auto entry = statement.unnests.find(unnest_level);
94
+ if (entry == statement.unnests.end()) {
95
+ throw InternalException("unnests specified at level %d but none were found", unnest_level);
96
+ }
97
+ auto &unnest_node = entry->second;
98
+ auto unnest = make_unique<LogicalUnnest>(unnest_node.index);
99
+ unnest->expressions = std::move(unnest_node.expressions);
94
100
  // visit the unnest expressions
95
101
  for (auto &expr : unnest->expressions) {
96
102
  PlanSubqueries(&expr, &root);
@@ -104,7 +110,6 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundSelectNode &statement) {
104
110
  PlanSubqueries(&expr, &root);
105
111
  }
106
112
 
107
- // create the projection
108
113
  auto proj = make_unique<LogicalProjection>(statement.projection_index, std::move(statement.select_list));
109
114
  auto &projection = *proj;
110
115
  proj->AddChild(std::move(root));
@@ -158,7 +158,9 @@ BoundStatement Binder::BindCopyFrom(CopyStatement &stmt) {
158
158
  result.types = {LogicalType::BIGINT};
159
159
  result.names = {"Count"};
160
160
 
161
- D_ASSERT(!stmt.info->table.empty());
161
+ if (stmt.info->table.empty()) {
162
+ throw ParserException("COPY FROM requires a table name to be specified");
163
+ }
162
164
  // COPY FROM a file
163
165
  // generate an insert statement for the the to-be-inserted table
164
166
  InsertStatement insert;
@@ -185,7 +187,7 @@ BoundStatement Binder::BindCopyFrom(CopyStatement &stmt) {
185
187
  vector<string> expected_names;
186
188
  if (!bound_insert.column_index_map.empty()) {
187
189
  expected_names.resize(bound_insert.expected_types.size());
188
- for (auto &col : table->GetColumns().Logical()) {
190
+ for (auto &col : table->GetColumns().Physical()) {
189
191
  auto i = col.Physical();
190
192
  if (bound_insert.column_index_map[i] != DConstants::INVALID_INDEX) {
191
193
  expected_names[bound_insert.column_index_map[i]] = col.Name();
@@ -193,7 +195,7 @@ BoundStatement Binder::BindCopyFrom(CopyStatement &stmt) {
193
195
  }
194
196
  } else {
195
197
  expected_names.reserve(bound_insert.expected_types.size());
196
- for (auto &col : table->GetColumns().Logical()) {
198
+ for (auto &col : table->GetColumns().Physical()) {
197
199
  expected_names.push_back(col.Name());
198
200
  }
199
201
  }
@@ -441,8 +441,9 @@ unique_ptr<LogicalOperator> DuckCatalog::BindCreateIndex(Binder &binder, CreateS
441
441
 
442
442
  auto &get = (LogicalGet &)*plan;
443
443
  // bind the index expressions
444
- vector<unique_ptr<Expression>> expressions;
445
444
  IndexBinder index_binder(binder, binder.context);
445
+ vector<unique_ptr<Expression>> expressions;
446
+ expressions.reserve(base.expressions.size());
446
447
  for (auto &expr : base.expressions) {
447
448
  expressions.push_back(index_binder.Bind(expr));
448
449
  }
@@ -467,7 +468,6 @@ BoundStatement Binder::Bind(CreateStatement &stmt) {
467
468
  BoundStatement result;
468
469
  result.names = {"Count"};
469
470
  result.types = {LogicalType::BIGINT};
470
- properties.return_type = StatementReturnType::NOTHING;
471
471
 
472
472
  auto catalog_type = stmt.info->type;
473
473
  switch (catalog_type) {
@@ -675,6 +675,7 @@ BoundStatement Binder::Bind(CreateStatement &stmt) {
675
675
  default:
676
676
  throw Exception("Unrecognized type!");
677
677
  }
678
+ properties.return_type = StatementReturnType::NOTHING;
678
679
  properties.allow_stream_result = false;
679
680
  return result;
680
681
  }