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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (590) hide show
  1. package/binding.gyp +12 -7
  2. package/lib/duckdb.d.ts +55 -2
  3. package/lib/duckdb.js +20 -1
  4. package/package.json +1 -1
  5. package/src/connection.cpp +1 -2
  6. package/src/database.cpp +1 -1
  7. package/src/duckdb/extension/icu/icu-extension.cpp +4 -0
  8. package/src/duckdb/extension/icu/icu-list-range.cpp +207 -0
  9. package/src/duckdb/extension/icu/icu-table-range.cpp +194 -0
  10. package/src/duckdb/extension/icu/include/icu-list-range.hpp +17 -0
  11. package/src/duckdb/extension/icu/include/icu-table-range.hpp +17 -0
  12. package/src/duckdb/extension/json/include/json_common.hpp +1 -0
  13. package/src/duckdb/extension/json/include/json_functions.hpp +2 -0
  14. package/src/duckdb/extension/json/include/json_serializer.hpp +77 -0
  15. package/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp +147 -0
  16. package/src/duckdb/extension/json/json_functions/read_json.cpp +6 -5
  17. package/src/duckdb/extension/json/json_functions.cpp +12 -4
  18. package/src/duckdb/extension/json/json_scan.cpp +2 -2
  19. package/src/duckdb/extension/json/json_serializer.cpp +217 -0
  20. package/src/duckdb/extension/parquet/column_reader.cpp +94 -15
  21. package/src/duckdb/extension/parquet/column_writer.cpp +0 -1
  22. package/src/duckdb/extension/parquet/include/column_reader.hpp +1 -2
  23. package/src/duckdb/extension/parquet/include/decode_utils.hpp +5 -4
  24. package/src/duckdb/extension/parquet/include/generated_column_reader.hpp +1 -11
  25. package/src/duckdb/extension/parquet/include/parquet_timestamp.hpp +2 -1
  26. package/src/duckdb/extension/parquet/parquet-extension.cpp +12 -2
  27. package/src/duckdb/extension/parquet/parquet_reader.cpp +1 -1
  28. package/src/duckdb/extension/parquet/parquet_statistics.cpp +26 -32
  29. package/src/duckdb/extension/parquet/parquet_timestamp.cpp +16 -6
  30. package/src/duckdb/src/catalog/catalog.cpp +34 -5
  31. package/src/duckdb/src/catalog/catalog_entry/duck_schema_entry.cpp +4 -0
  32. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +2 -21
  33. package/src/duckdb/src/catalog/catalog_entry/scalar_function_catalog_entry.cpp +7 -6
  34. package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +3 -3
  35. package/src/duckdb/src/catalog/catalog_entry/table_function_catalog_entry.cpp +20 -1
  36. package/src/duckdb/src/catalog/catalog_entry/type_catalog_entry.cpp +8 -2
  37. package/src/duckdb/src/catalog/catalog_set.cpp +1 -0
  38. package/src/duckdb/src/catalog/default/default_functions.cpp +3 -0
  39. package/src/duckdb/src/catalog/dependency_list.cpp +12 -0
  40. package/src/duckdb/src/catalog/duck_catalog.cpp +34 -7
  41. package/src/duckdb/src/common/arrow/arrow_appender.cpp +48 -4
  42. package/src/duckdb/src/common/arrow/arrow_converter.cpp +1 -1
  43. package/src/duckdb/src/common/box_renderer.cpp +109 -23
  44. package/src/duckdb/src/common/enums/expression_type.cpp +8 -222
  45. package/src/duckdb/src/common/enums/join_type.cpp +3 -22
  46. package/src/duckdb/src/common/enums/logical_operator_type.cpp +2 -0
  47. package/src/duckdb/src/common/enums/statement_type.cpp +2 -0
  48. package/src/duckdb/src/common/exception.cpp +15 -1
  49. package/src/duckdb/src/common/field_writer.cpp +1 -0
  50. package/src/duckdb/src/common/operator/cast_operators.cpp +1 -1
  51. package/src/duckdb/src/common/preserved_error.cpp +7 -5
  52. package/src/duckdb/src/common/serializer/buffered_deserializer.cpp +4 -0
  53. package/src/duckdb/src/common/serializer/buffered_file_reader.cpp +15 -2
  54. package/src/duckdb/src/common/serializer/enum_serializer.cpp +1176 -0
  55. package/src/duckdb/src/common/sort/sort_state.cpp +5 -7
  56. package/src/duckdb/src/common/sort/sorted_block.cpp +0 -1
  57. package/src/duckdb/src/common/string_util.cpp +4 -1
  58. package/src/duckdb/src/common/types/bit.cpp +166 -87
  59. package/src/duckdb/src/common/types/blob.cpp +1 -1
  60. package/src/duckdb/src/common/types/chunk_collection.cpp +2 -2
  61. package/src/duckdb/src/common/types/column_data_collection.cpp +39 -2
  62. package/src/duckdb/src/common/types/column_data_collection_segment.cpp +11 -6
  63. package/src/duckdb/src/common/types/data_chunk.cpp +1 -1
  64. package/src/duckdb/src/common/types/time.cpp +13 -0
  65. package/src/duckdb/src/common/types/value.cpp +320 -154
  66. package/src/duckdb/src/common/types/vector.cpp +155 -127
  67. package/src/duckdb/src/common/types.cpp +313 -153
  68. package/src/duckdb/src/common/vector_operations/vector_cast.cpp +2 -1
  69. package/src/duckdb/src/execution/aggregate_hashtable.cpp +10 -5
  70. package/src/duckdb/src/execution/column_binding_resolver.cpp +21 -5
  71. package/src/duckdb/src/execution/expression_executor/execute_cast.cpp +2 -1
  72. package/src/duckdb/src/execution/index/art/art.cpp +6 -5
  73. package/src/duckdb/src/execution/operator/aggregate/physical_perfecthash_aggregate.cpp +4 -5
  74. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +117 -26
  75. package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +3 -0
  76. package/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp +5 -3
  77. package/src/duckdb/src/execution/operator/join/physical_blockwise_nl_join.cpp +64 -17
  78. package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +2 -2
  79. package/src/duckdb/src/execution/operator/join/physical_index_join.cpp +12 -4
  80. package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +6 -11
  81. package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +3 -1
  82. package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +6 -3
  83. package/src/duckdb/src/execution/operator/persistent/buffered_csv_reader.cpp +6 -14
  84. package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +2 -2
  85. package/src/duckdb/src/execution/operator/projection/physical_projection.cpp +34 -0
  86. package/src/duckdb/src/execution/operator/scan/physical_positional_scan.cpp +20 -5
  87. package/src/duckdb/src/execution/operator/schema/physical_create_type.cpp +20 -40
  88. package/src/duckdb/src/execution/partitionable_hashtable.cpp +14 -2
  89. package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +21 -16
  90. package/src/duckdb/src/execution/physical_plan/plan_asof_join.cpp +97 -0
  91. package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +95 -47
  92. package/src/duckdb/src/execution/physical_plan/plan_distinct.cpp +5 -8
  93. package/src/duckdb/src/execution/physical_plan/plan_positional_join.cpp +14 -5
  94. package/src/duckdb/src/execution/physical_plan_generator.cpp +3 -0
  95. package/src/duckdb/src/execution/window_segment_tree.cpp +173 -1
  96. package/src/duckdb/src/function/aggregate/algebraic/avg.cpp +0 -6
  97. package/src/duckdb/src/function/aggregate/distributive/bitagg.cpp +99 -95
  98. package/src/duckdb/src/function/aggregate/distributive/bitstring_agg.cpp +269 -0
  99. package/src/duckdb/src/function/aggregate/distributive/bool.cpp +2 -0
  100. package/src/duckdb/src/function/aggregate/distributive/count.cpp +3 -4
  101. package/src/duckdb/src/function/aggregate/distributive/first.cpp +1 -0
  102. package/src/duckdb/src/function/aggregate/distributive/minmax.cpp +2 -0
  103. package/src/duckdb/src/function/aggregate/distributive/sum.cpp +19 -16
  104. package/src/duckdb/src/function/aggregate/distributive_functions.cpp +1 -0
  105. package/src/duckdb/src/function/aggregate/holistic/approximate_quantile.cpp +5 -2
  106. package/src/duckdb/src/function/aggregate/holistic/mode.cpp +1 -1
  107. package/src/duckdb/src/function/aggregate/holistic/quantile.cpp +16 -1
  108. package/src/duckdb/src/function/aggregate/nested/list.cpp +8 -8
  109. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +58 -16
  110. package/src/duckdb/src/function/cast/bit_cast.cpp +0 -2
  111. package/src/duckdb/src/function/cast/blob_cast.cpp +0 -1
  112. package/src/duckdb/src/function/cast/cast_function_set.cpp +1 -1
  113. package/src/duckdb/src/function/cast/enum_casts.cpp +25 -3
  114. package/src/duckdb/src/function/cast/list_casts.cpp +17 -4
  115. package/src/duckdb/src/function/cast/map_cast.cpp +5 -2
  116. package/src/duckdb/src/function/cast/string_cast.cpp +36 -10
  117. package/src/duckdb/src/function/cast/struct_cast.cpp +24 -4
  118. package/src/duckdb/src/function/cast/time_casts.cpp +2 -2
  119. package/src/duckdb/src/function/cast/union_casts.cpp +33 -7
  120. package/src/duckdb/src/function/function_binder.cpp +1 -8
  121. package/src/duckdb/src/function/scalar/bit/bitstring.cpp +100 -0
  122. package/src/duckdb/src/function/scalar/date/current.cpp +0 -2
  123. package/src/duckdb/src/function/scalar/date/date_diff.cpp +0 -1
  124. package/src/duckdb/src/function/scalar/date/date_part.cpp +18 -26
  125. package/src/duckdb/src/function/scalar/date/date_sub.cpp +0 -1
  126. package/src/duckdb/src/function/scalar/date/date_trunc.cpp +10 -14
  127. package/src/duckdb/src/function/scalar/generic/stats.cpp +2 -4
  128. package/src/duckdb/src/function/scalar/list/contains_or_position.cpp +4 -146
  129. package/src/duckdb/src/function/scalar/list/flatten.cpp +5 -12
  130. package/src/duckdb/src/function/scalar/list/list_aggregates.cpp +1 -1
  131. package/src/duckdb/src/function/scalar/list/list_concat.cpp +8 -12
  132. package/src/duckdb/src/function/scalar/list/list_extract.cpp +5 -12
  133. package/src/duckdb/src/function/scalar/list/list_lambdas.cpp +7 -3
  134. package/src/duckdb/src/function/scalar/list/list_value.cpp +6 -10
  135. package/src/duckdb/src/function/scalar/map/map.cpp +47 -1
  136. package/src/duckdb/src/function/scalar/map/map_entries.cpp +61 -0
  137. package/src/duckdb/src/function/scalar/map/map_extract.cpp +68 -26
  138. package/src/duckdb/src/function/scalar/map/map_keys_values.cpp +97 -0
  139. package/src/duckdb/src/function/scalar/math/numeric.cpp +101 -17
  140. package/src/duckdb/src/function/scalar/math_functions.cpp +3 -0
  141. package/src/duckdb/src/function/scalar/nested_functions.cpp +3 -0
  142. package/src/duckdb/src/function/scalar/operators/add.cpp +0 -9
  143. package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +29 -48
  144. package/src/duckdb/src/function/scalar/operators/bitwise.cpp +0 -63
  145. package/src/duckdb/src/function/scalar/operators/multiply.cpp +5 -6
  146. package/src/duckdb/src/function/scalar/operators/subtract.cpp +0 -6
  147. package/src/duckdb/src/function/scalar/string/caseconvert.cpp +2 -6
  148. package/src/duckdb/src/function/scalar/string/hex.cpp +201 -0
  149. package/src/duckdb/src/function/scalar/string/instr.cpp +2 -6
  150. package/src/duckdb/src/function/scalar/string/length.cpp +2 -6
  151. package/src/duckdb/src/function/scalar/string/like.cpp +2 -6
  152. package/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp +243 -0
  153. package/src/duckdb/src/function/scalar/string/regexp/regexp_util.cpp +79 -0
  154. package/src/duckdb/src/function/scalar/string/regexp.cpp +21 -80
  155. package/src/duckdb/src/function/scalar/string/substring.cpp +2 -6
  156. package/src/duckdb/src/function/scalar/string_functions.cpp +2 -0
  157. package/src/duckdb/src/function/scalar/struct/struct_extract.cpp +5 -10
  158. package/src/duckdb/src/function/scalar/struct/struct_insert.cpp +11 -14
  159. package/src/duckdb/src/function/scalar/struct/struct_pack.cpp +6 -7
  160. package/src/duckdb/src/function/table/arrow.cpp +5 -2
  161. package/src/duckdb/src/function/table/arrow_conversion.cpp +25 -1
  162. package/src/duckdb/src/function/table/checkpoint.cpp +5 -1
  163. package/src/duckdb/src/function/table/read_csv.cpp +55 -0
  164. package/src/duckdb/src/function/table/system/duckdb_constraints.cpp +2 -2
  165. package/src/duckdb/src/function/table/system/test_all_types.cpp +2 -2
  166. package/src/duckdb/src/function/table/table_scan.cpp +1 -1
  167. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  168. package/src/duckdb/src/function/table_function.cpp +30 -11
  169. package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +6 -0
  170. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_table_entry.hpp +1 -1
  171. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_function_catalog_entry.hpp +6 -8
  172. package/src/duckdb/src/include/duckdb/catalog/dependency_list.hpp +3 -0
  173. package/src/duckdb/src/include/duckdb/catalog/duck_catalog.hpp +2 -1
  174. package/src/duckdb/src/include/duckdb/common/box_renderer.hpp +8 -2
  175. package/src/duckdb/src/include/duckdb/common/constants.hpp +0 -19
  176. package/src/duckdb/src/include/duckdb/common/enums/aggregate_handling.hpp +2 -0
  177. package/src/duckdb/src/include/duckdb/common/enums/expression_type.hpp +2 -3
  178. package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +7 -4
  179. package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +1 -0
  180. package/src/duckdb/src/include/duckdb/common/enums/order_type.hpp +2 -0
  181. package/src/duckdb/src/include/duckdb/common/enums/set_operation_type.hpp +2 -1
  182. package/src/duckdb/src/include/duckdb/common/enums/statement_type.hpp +2 -1
  183. package/src/duckdb/src/include/duckdb/common/enums/tableref_type.hpp +2 -1
  184. package/src/duckdb/src/include/duckdb/common/exception.hpp +69 -2
  185. package/src/duckdb/src/include/duckdb/common/field_writer.hpp +12 -4
  186. package/src/duckdb/src/include/duckdb/common/{http_stats.hpp → http_state.hpp} +18 -4
  187. package/src/duckdb/src/include/duckdb/common/operator/multiply.hpp +2 -0
  188. package/src/duckdb/src/include/duckdb/common/optional_ptr.hpp +45 -0
  189. package/src/duckdb/src/include/duckdb/common/preserved_error.hpp +6 -1
  190. package/src/duckdb/src/include/duckdb/common/serializer/buffered_deserializer.hpp +4 -2
  191. package/src/duckdb/src/include/duckdb/common/serializer/buffered_file_reader.hpp +8 -2
  192. package/src/duckdb/src/include/duckdb/common/serializer/enum_serializer.hpp +113 -0
  193. package/src/duckdb/src/include/duckdb/common/serializer/format_deserializer.hpp +336 -0
  194. package/src/duckdb/src/include/duckdb/common/serializer/format_serializer.hpp +268 -0
  195. package/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp +126 -0
  196. package/src/duckdb/src/include/duckdb/common/serializer.hpp +13 -0
  197. package/src/duckdb/src/include/duckdb/common/string_util.hpp +25 -0
  198. package/src/duckdb/src/include/duckdb/common/types/bit.hpp +12 -7
  199. package/src/duckdb/src/include/duckdb/common/types/time.hpp +3 -0
  200. package/src/duckdb/src/include/duckdb/common/types/value.hpp +17 -48
  201. package/src/duckdb/src/include/duckdb/common/types/value_map.hpp +1 -1
  202. package/src/duckdb/src/include/duckdb/common/types/vector.hpp +3 -1
  203. package/src/duckdb/src/include/duckdb/common/types.hpp +45 -8
  204. package/src/duckdb/src/include/duckdb/common/vector_operations/unary_executor.hpp +2 -2
  205. package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +1 -0
  206. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +2 -2
  207. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_perfecthash_aggregate.hpp +1 -1
  208. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_cross_product.hpp +2 -0
  209. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_file_handle.hpp +1 -0
  210. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +6 -0
  211. package/src/duckdb/src/include/duckdb/execution/operator/projection/physical_projection.hpp +5 -0
  212. package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +3 -0
  213. package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +1 -3
  214. package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +54 -0
  215. package/src/duckdb/src/include/duckdb/function/aggregate/distributive_functions.hpp +5 -0
  216. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +18 -6
  217. package/src/duckdb/src/include/duckdb/function/cast/bound_cast_data.hpp +84 -0
  218. package/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp +2 -2
  219. package/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp +28 -64
  220. package/src/duckdb/src/include/duckdb/function/function_binder.hpp +3 -6
  221. package/src/duckdb/src/include/duckdb/function/scalar/bit_functions.hpp +4 -0
  222. package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +138 -0
  223. package/src/duckdb/src/include/duckdb/function/scalar/math_functions.hpp +8 -0
  224. package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +59 -0
  225. package/src/duckdb/src/include/duckdb/function/scalar/regexp.hpp +81 -1
  226. package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +4 -0
  227. package/src/duckdb/src/include/duckdb/function/scalar_function.hpp +2 -2
  228. package/src/duckdb/src/include/duckdb/function/table/arrow.hpp +12 -1
  229. package/src/duckdb/src/include/duckdb/function/table_function.hpp +10 -0
  230. package/src/duckdb/src/include/duckdb/main/capi/capi_internal.hpp +2 -0
  231. package/src/duckdb/src/include/duckdb/main/client_data.hpp +3 -3
  232. package/src/duckdb/src/include/duckdb/main/config.hpp +3 -0
  233. package/src/duckdb/src/include/duckdb/main/connection_manager.hpp +2 -0
  234. package/src/duckdb/src/include/duckdb/main/database.hpp +1 -0
  235. package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +2 -0
  236. package/src/duckdb/src/include/duckdb/main/prepared_statement.hpp +2 -0
  237. package/src/duckdb/src/include/duckdb/main/relation/explain_relation.hpp +2 -1
  238. package/src/duckdb/src/include/duckdb/main/relation.hpp +2 -1
  239. package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +2 -0
  240. package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +2 -2
  241. package/src/duckdb/src/include/duckdb/optimizer/rule/list.hpp +1 -0
  242. package/src/duckdb/src/include/duckdb/optimizer/rule/ordered_aggregate_optimizer.hpp +24 -0
  243. package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +4 -0
  244. package/src/duckdb/src/include/duckdb/parser/expression/between_expression.hpp +3 -0
  245. package/src/duckdb/src/include/duckdb/parser/expression/bound_expression.hpp +2 -0
  246. package/src/duckdb/src/include/duckdb/parser/expression/case_expression.hpp +5 -0
  247. package/src/duckdb/src/include/duckdb/parser/expression/cast_expression.hpp +2 -0
  248. package/src/duckdb/src/include/duckdb/parser/expression/collate_expression.hpp +2 -0
  249. package/src/duckdb/src/include/duckdb/parser/expression/columnref_expression.hpp +2 -0
  250. package/src/duckdb/src/include/duckdb/parser/expression/comparison_expression.hpp +2 -0
  251. package/src/duckdb/src/include/duckdb/parser/expression/conjunction_expression.hpp +2 -0
  252. package/src/duckdb/src/include/duckdb/parser/expression/constant_expression.hpp +3 -0
  253. package/src/duckdb/src/include/duckdb/parser/expression/default_expression.hpp +1 -0
  254. package/src/duckdb/src/include/duckdb/parser/expression/function_expression.hpp +4 -2
  255. package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +2 -0
  256. package/src/duckdb/src/include/duckdb/parser/expression/operator_expression.hpp +2 -0
  257. package/src/duckdb/src/include/duckdb/parser/expression/parameter_expression.hpp +2 -0
  258. package/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +2 -0
  259. package/src/duckdb/src/include/duckdb/parser/expression/star_expression.hpp +4 -2
  260. package/src/duckdb/src/include/duckdb/parser/expression/subquery_expression.hpp +2 -0
  261. package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +5 -0
  262. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_info.hpp +5 -1
  263. package/src/duckdb/src/include/duckdb/parser/parsed_data/{alter_function_info.hpp → alter_scalar_function_info.hpp} +13 -13
  264. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_function_info.hpp +47 -0
  265. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp +6 -0
  266. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_table_function_info.hpp +2 -1
  267. package/src/duckdb/src/include/duckdb/parser/parsed_data/sample_options.hpp +2 -0
  268. package/src/duckdb/src/include/duckdb/parser/parsed_expression.hpp +5 -0
  269. package/src/duckdb/src/include/duckdb/parser/query_node/recursive_cte_node.hpp +3 -0
  270. package/src/duckdb/src/include/duckdb/parser/query_node/select_node.hpp +5 -0
  271. package/src/duckdb/src/include/duckdb/parser/query_node/set_operation_node.hpp +3 -0
  272. package/src/duckdb/src/include/duckdb/parser/query_node.hpp +13 -2
  273. package/src/duckdb/src/include/duckdb/parser/result_modifier.hpp +24 -1
  274. package/src/duckdb/src/include/duckdb/parser/sql_statement.hpp +2 -1
  275. package/src/duckdb/src/include/duckdb/parser/statement/multi_statement.hpp +28 -0
  276. package/src/duckdb/src/include/duckdb/parser/statement/select_statement.hpp +6 -1
  277. package/src/duckdb/src/include/duckdb/parser/tableref/basetableref.hpp +4 -0
  278. package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +2 -0
  279. package/src/duckdb/src/include/duckdb/parser/tableref/expressionlistref.hpp +3 -0
  280. package/src/duckdb/src/include/duckdb/parser/tableref/joinref.hpp +3 -0
  281. package/src/duckdb/src/include/duckdb/parser/tableref/list.hpp +1 -0
  282. package/src/duckdb/src/include/duckdb/parser/tableref/pivotref.hpp +87 -0
  283. package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +3 -0
  284. package/src/duckdb/src/include/duckdb/parser/tableref/table_function_ref.hpp +3 -0
  285. package/src/duckdb/src/include/duckdb/parser/tableref.hpp +3 -1
  286. package/src/duckdb/src/include/duckdb/parser/tokens.hpp +2 -0
  287. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +33 -0
  288. package/src/duckdb/src/include/duckdb/planner/bind_context.hpp +2 -0
  289. package/src/duckdb/src/include/duckdb/planner/binder.hpp +15 -4
  290. package/src/duckdb/src/include/duckdb/planner/bound_result_modifier.hpp +3 -0
  291. package/src/duckdb/src/include/duckdb/planner/expression/bound_aggregate_expression.hpp +3 -0
  292. package/src/duckdb/src/include/duckdb/planner/expression_binder/base_select_binder.hpp +64 -0
  293. package/src/duckdb/src/include/duckdb/planner/expression_binder/having_binder.hpp +2 -2
  294. package/src/duckdb/src/include/duckdb/planner/expression_binder/order_binder.hpp +4 -1
  295. package/src/duckdb/src/include/duckdb/planner/expression_binder/qualify_binder.hpp +2 -2
  296. package/src/duckdb/src/include/duckdb/planner/expression_binder/select_binder.hpp +9 -38
  297. package/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +1 -1
  298. package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +1 -0
  299. package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +1 -0
  300. package/src/duckdb/src/include/duckdb/planner/operator/logical_asof_join.hpp +22 -0
  301. package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +5 -2
  302. package/src/duckdb/src/include/duckdb/planner/operator/logical_distinct.hpp +3 -0
  303. package/src/duckdb/src/include/duckdb/planner/query_node/bound_select_node.hpp +8 -2
  304. package/src/duckdb/src/include/duckdb/storage/buffer/block_handle.hpp +2 -0
  305. package/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp +76 -44
  306. package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp +3 -2
  307. package/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp +1 -1
  308. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_compress.hpp +2 -2
  309. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_fetch.hpp +1 -1
  310. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_scan.hpp +1 -1
  311. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_compress.hpp +2 -2
  312. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_fetch.hpp +1 -1
  313. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_scan.hpp +1 -1
  314. package/src/duckdb/src/include/duckdb/storage/data_pointer.hpp +5 -2
  315. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +3 -3
  316. package/src/duckdb/src/include/duckdb/storage/index.hpp +4 -3
  317. package/src/duckdb/src/include/duckdb/storage/meta_block_reader.hpp +7 -0
  318. package/src/duckdb/src/include/duckdb/storage/statistics/base_statistics.hpp +93 -29
  319. package/src/duckdb/src/include/duckdb/storage/statistics/column_statistics.hpp +22 -3
  320. package/src/duckdb/src/include/duckdb/storage/statistics/distinct_statistics.hpp +8 -6
  321. package/src/duckdb/src/include/duckdb/storage/statistics/list_stats.hpp +41 -0
  322. package/src/duckdb/src/include/duckdb/storage/statistics/node_statistics.hpp +26 -0
  323. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats.hpp +114 -0
  324. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats_union.hpp +62 -0
  325. package/src/duckdb/src/include/duckdb/storage/statistics/segment_statistics.hpp +2 -7
  326. package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +74 -0
  327. package/src/duckdb/src/include/duckdb/storage/statistics/struct_stats.hpp +42 -0
  328. package/src/duckdb/src/include/duckdb/storage/string_uncompressed.hpp +2 -3
  329. package/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp +2 -1
  330. package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +6 -3
  331. package/src/duckdb/src/include/duckdb/storage/table/column_data_checkpointer.hpp +3 -2
  332. package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +7 -5
  333. package/src/duckdb/src/include/duckdb/storage/table/list_column_data.hpp +1 -1
  334. package/src/duckdb/src/include/duckdb/storage/table/persistent_table_data.hpp +6 -2
  335. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +10 -6
  336. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +8 -5
  337. package/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp +37 -0
  338. package/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp +10 -1
  339. package/src/duckdb/src/include/duckdb/storage/table/segment_base.hpp +4 -3
  340. package/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +271 -26
  341. package/src/duckdb/src/include/duckdb/storage/table/table_statistics.hpp +5 -0
  342. package/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +0 -1
  343. package/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +1 -1
  344. package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +2 -2
  345. package/src/duckdb/src/include/duckdb.h +50 -2
  346. package/src/duckdb/src/include/duckdb.hpp +0 -1
  347. package/src/duckdb/src/main/capi/pending-c.cpp +16 -3
  348. package/src/duckdb/src/main/capi/result-c.cpp +27 -1
  349. package/src/duckdb/src/main/capi/stream-c.cpp +25 -0
  350. package/src/duckdb/src/main/client_context.cpp +38 -34
  351. package/src/duckdb/src/main/client_data.cpp +7 -6
  352. package/src/duckdb/src/main/config.cpp +70 -1
  353. package/src/duckdb/src/main/database.cpp +19 -2
  354. package/src/duckdb/src/main/extension/extension_install.cpp +7 -2
  355. package/src/duckdb/src/main/prepared_statement.cpp +4 -0
  356. package/src/duckdb/src/main/query_profiler.cpp +17 -15
  357. package/src/duckdb/src/main/relation/explain_relation.cpp +3 -3
  358. package/src/duckdb/src/main/relation.cpp +3 -2
  359. package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +1 -0
  360. package/src/duckdb/src/optimizer/deliminator.cpp +1 -1
  361. package/src/duckdb/src/optimizer/filter_combiner.cpp +1 -1
  362. package/src/duckdb/src/optimizer/filter_pullup.cpp +3 -1
  363. package/src/duckdb/src/optimizer/filter_pushdown.cpp +14 -8
  364. package/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp +105 -71
  365. package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +31 -12
  366. package/src/duckdb/src/optimizer/optimizer.cpp +1 -0
  367. package/src/duckdb/src/optimizer/pullup/pullup_from_left.cpp +2 -2
  368. package/src/duckdb/src/optimizer/pushdown/pushdown_aggregate.cpp +33 -5
  369. package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +1 -1
  370. package/src/duckdb/src/optimizer/pushdown/pushdown_inner_join.cpp +3 -0
  371. package/src/duckdb/src/optimizer/pushdown/pushdown_left_join.cpp +5 -12
  372. package/src/duckdb/src/optimizer/pushdown/pushdown_mark_join.cpp +2 -2
  373. package/src/duckdb/src/optimizer/pushdown/pushdown_single_join.cpp +1 -1
  374. package/src/duckdb/src/optimizer/remove_unused_columns.cpp +1 -0
  375. package/src/duckdb/src/optimizer/rule/move_constants.cpp +10 -4
  376. package/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp +30 -0
  377. package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +9 -2
  378. package/src/duckdb/src/optimizer/statistics/expression/propagate_aggregate.cpp +9 -3
  379. package/src/duckdb/src/optimizer/statistics/expression/propagate_and_compress.cpp +6 -7
  380. package/src/duckdb/src/optimizer/statistics/expression/propagate_cast.cpp +14 -11
  381. package/src/duckdb/src/optimizer/statistics/expression/propagate_columnref.cpp +1 -1
  382. package/src/duckdb/src/optimizer/statistics/expression/propagate_comparison.cpp +13 -15
  383. package/src/duckdb/src/optimizer/statistics/expression/propagate_conjunction.cpp +0 -1
  384. package/src/duckdb/src/optimizer/statistics/expression/propagate_constant.cpp +3 -75
  385. package/src/duckdb/src/optimizer/statistics/expression/propagate_function.cpp +7 -2
  386. package/src/duckdb/src/optimizer/statistics/expression/propagate_operator.cpp +10 -0
  387. package/src/duckdb/src/optimizer/statistics/operator/propagate_aggregate.cpp +2 -3
  388. package/src/duckdb/src/optimizer/statistics/operator/propagate_filter.cpp +29 -32
  389. package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +5 -5
  390. package/src/duckdb/src/optimizer/statistics/operator/propagate_set_operation.cpp +3 -3
  391. package/src/duckdb/src/optimizer/statistics_propagator.cpp +2 -1
  392. package/src/duckdb/src/optimizer/unnest_rewriter.cpp +2 -2
  393. package/src/duckdb/src/parallel/meta_pipeline.cpp +0 -4
  394. package/src/duckdb/src/parser/common_table_expression_info.cpp +19 -0
  395. package/src/duckdb/src/parser/expression/between_expression.cpp +17 -0
  396. package/src/duckdb/src/parser/expression/case_expression.cpp +28 -0
  397. package/src/duckdb/src/parser/expression/cast_expression.cpp +17 -0
  398. package/src/duckdb/src/parser/expression/collate_expression.cpp +16 -0
  399. package/src/duckdb/src/parser/expression/columnref_expression.cpp +15 -0
  400. package/src/duckdb/src/parser/expression/comparison_expression.cpp +16 -0
  401. package/src/duckdb/src/parser/expression/conjunction_expression.cpp +17 -0
  402. package/src/duckdb/src/parser/expression/constant_expression.cpp +14 -0
  403. package/src/duckdb/src/parser/expression/default_expression.cpp +7 -0
  404. package/src/duckdb/src/parser/expression/function_expression.cpp +35 -0
  405. package/src/duckdb/src/parser/expression/lambda_expression.cpp +16 -0
  406. package/src/duckdb/src/parser/expression/operator_expression.cpp +15 -0
  407. package/src/duckdb/src/parser/expression/parameter_expression.cpp +15 -0
  408. package/src/duckdb/src/parser/expression/positional_reference_expression.cpp +14 -0
  409. package/src/duckdb/src/parser/expression/star_expression.cpp +26 -6
  410. package/src/duckdb/src/parser/expression/subquery_expression.cpp +20 -0
  411. package/src/duckdb/src/parser/expression/window_expression.cpp +43 -0
  412. package/src/duckdb/src/parser/parsed_data/alter_info.cpp +7 -3
  413. package/src/duckdb/src/parser/parsed_data/alter_scalar_function_info.cpp +56 -0
  414. package/src/duckdb/src/parser/parsed_data/alter_table_function_info.cpp +51 -0
  415. package/src/duckdb/src/parser/parsed_data/create_scalar_function_info.cpp +3 -2
  416. package/src/duckdb/src/parser/parsed_data/create_table_function_info.cpp +6 -0
  417. package/src/duckdb/src/parser/parsed_data/sample_options.cpp +22 -10
  418. package/src/duckdb/src/parser/parsed_expression.cpp +72 -0
  419. package/src/duckdb/src/parser/parsed_expression_iterator.cpp +15 -1
  420. package/src/duckdb/src/parser/query_node/recursive_cte_node.cpp +21 -0
  421. package/src/duckdb/src/parser/query_node/select_node.cpp +31 -0
  422. package/src/duckdb/src/parser/query_node/set_operation_node.cpp +17 -0
  423. package/src/duckdb/src/parser/query_node.cpp +51 -1
  424. package/src/duckdb/src/parser/result_modifier.cpp +78 -0
  425. package/src/duckdb/src/parser/statement/multi_statement.cpp +18 -0
  426. package/src/duckdb/src/parser/statement/select_statement.cpp +12 -0
  427. package/src/duckdb/src/parser/tableref/basetableref.cpp +21 -0
  428. package/src/duckdb/src/parser/tableref/emptytableref.cpp +4 -0
  429. package/src/duckdb/src/parser/tableref/expressionlistref.cpp +17 -0
  430. package/src/duckdb/src/parser/tableref/joinref.cpp +29 -0
  431. package/src/duckdb/src/parser/tableref/pivotref.cpp +373 -0
  432. package/src/duckdb/src/parser/tableref/subqueryref.cpp +15 -0
  433. package/src/duckdb/src/parser/tableref/table_function.cpp +17 -0
  434. package/src/duckdb/src/parser/tableref.cpp +49 -0
  435. package/src/duckdb/src/parser/transform/expression/transform_array_access.cpp +11 -0
  436. package/src/duckdb/src/parser/transform/expression/transform_bool_expr.cpp +1 -1
  437. package/src/duckdb/src/parser/transform/expression/transform_columnref.cpp +17 -2
  438. package/src/duckdb/src/parser/transform/expression/transform_function.cpp +63 -42
  439. package/src/duckdb/src/parser/transform/expression/transform_operator.cpp +1 -1
  440. package/src/duckdb/src/parser/transform/expression/transform_subquery.cpp +1 -1
  441. package/src/duckdb/src/parser/transform/helpers/transform_alias.cpp +12 -6
  442. package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +24 -0
  443. package/src/duckdb/src/parser/transform/helpers/transform_groupby.cpp +7 -0
  444. package/src/duckdb/src/parser/transform/helpers/transform_orderby.cpp +0 -7
  445. package/src/duckdb/src/parser/transform/helpers/transform_typename.cpp +3 -2
  446. package/src/duckdb/src/parser/transform/statement/transform_create_function.cpp +4 -0
  447. package/src/duckdb/src/parser/transform/statement/transform_create_view.cpp +4 -0
  448. package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +179 -0
  449. package/src/duckdb/src/parser/transform/statement/transform_rename.cpp +3 -4
  450. package/src/duckdb/src/parser/transform/statement/transform_select.cpp +8 -0
  451. package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +2 -3
  452. package/src/duckdb/src/parser/transform/tableref/transform_join.cpp +12 -1
  453. package/src/duckdb/src/parser/transform/tableref/transform_pivot.cpp +121 -0
  454. package/src/duckdb/src/parser/transform/tableref/transform_tableref.cpp +2 -0
  455. package/src/duckdb/src/parser/transformer.cpp +15 -3
  456. package/src/duckdb/src/planner/bind_context.cpp +18 -25
  457. package/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp +9 -7
  458. package/src/duckdb/src/planner/binder/expression/bind_columnref_expression.cpp +4 -3
  459. package/src/duckdb/src/planner/binder/expression/bind_function_expression.cpp +23 -12
  460. package/src/duckdb/src/planner/binder/expression/bind_lambda.cpp +3 -2
  461. package/src/duckdb/src/planner/binder/expression/bind_star_expression.cpp +176 -0
  462. package/src/duckdb/src/planner/binder/expression/bind_subquery_expression.cpp +4 -0
  463. package/src/duckdb/src/planner/binder/expression/bind_unnest_expression.cpp +163 -24
  464. package/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp +2 -2
  465. package/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +109 -94
  466. package/src/duckdb/src/planner/binder/query_node/plan_query_node.cpp +11 -0
  467. package/src/duckdb/src/planner/binder/query_node/plan_select_node.cpp +9 -4
  468. package/src/duckdb/src/planner/binder/statement/bind_copy.cpp +5 -3
  469. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +3 -2
  470. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +9 -1
  471. package/src/duckdb/src/planner/binder/statement/bind_delete.cpp +1 -1
  472. package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +12 -8
  473. package/src/duckdb/src/planner/binder/statement/bind_logical_plan.cpp +17 -0
  474. package/src/duckdb/src/planner/binder/statement/bind_update.cpp +4 -2
  475. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +19 -3
  476. package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +366 -0
  477. package/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp +11 -1
  478. package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -0
  479. package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +61 -13
  480. package/src/duckdb/src/planner/binder.cpp +19 -24
  481. package/src/duckdb/src/planner/bound_result_modifier.cpp +27 -1
  482. package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +9 -2
  483. package/src/duckdb/src/planner/expression/bound_expression.cpp +4 -0
  484. package/src/duckdb/src/planner/expression/bound_window_expression.cpp +1 -1
  485. package/src/duckdb/src/planner/expression_binder/base_select_binder.cpp +146 -0
  486. package/src/duckdb/src/planner/expression_binder/having_binder.cpp +6 -3
  487. package/src/duckdb/src/planner/expression_binder/qualify_binder.cpp +3 -3
  488. package/src/duckdb/src/planner/expression_binder/select_binder.cpp +1 -132
  489. package/src/duckdb/src/planner/expression_binder.cpp +10 -3
  490. package/src/duckdb/src/planner/expression_iterator.cpp +17 -10
  491. package/src/duckdb/src/planner/filter/constant_filter.cpp +4 -6
  492. package/src/duckdb/src/planner/logical_operator.cpp +7 -2
  493. package/src/duckdb/src/planner/logical_operator_visitor.cpp +6 -0
  494. package/src/duckdb/src/planner/operator/logical_asof_join.cpp +8 -0
  495. package/src/duckdb/src/planner/operator/logical_distinct.cpp +3 -0
  496. package/src/duckdb/src/planner/planner.cpp +2 -1
  497. package/src/duckdb/src/planner/pragma_handler.cpp +10 -2
  498. package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +3 -1
  499. package/src/duckdb/src/storage/buffer_manager.cpp +44 -46
  500. package/src/duckdb/src/storage/checkpoint/row_group_writer.cpp +1 -1
  501. package/src/duckdb/src/storage/checkpoint/table_data_reader.cpp +4 -15
  502. package/src/duckdb/src/storage/checkpoint/table_data_writer.cpp +10 -4
  503. package/src/duckdb/src/storage/checkpoint_manager.cpp +9 -3
  504. package/src/duckdb/src/storage/compression/bitpacking.cpp +28 -24
  505. package/src/duckdb/src/storage/compression/fixed_size_uncompressed.cpp +43 -45
  506. package/src/duckdb/src/storage/compression/numeric_constant.cpp +9 -10
  507. package/src/duckdb/src/storage/compression/patas.cpp +1 -1
  508. package/src/duckdb/src/storage/compression/rle.cpp +19 -15
  509. package/src/duckdb/src/storage/compression/validity_uncompressed.cpp +5 -5
  510. package/src/duckdb/src/storage/data_table.cpp +20 -20
  511. package/src/duckdb/src/storage/index.cpp +12 -1
  512. package/src/duckdb/src/storage/local_storage.cpp +20 -23
  513. package/src/duckdb/src/storage/meta_block_reader.cpp +22 -0
  514. package/src/duckdb/src/storage/statistics/base_statistics.cpp +373 -128
  515. package/src/duckdb/src/storage/statistics/column_statistics.cpp +57 -3
  516. package/src/duckdb/src/storage/statistics/distinct_statistics.cpp +8 -9
  517. package/src/duckdb/src/storage/statistics/list_stats.cpp +121 -0
  518. package/src/duckdb/src/storage/statistics/numeric_stats.cpp +591 -0
  519. package/src/duckdb/src/storage/statistics/numeric_stats_union.cpp +65 -0
  520. package/src/duckdb/src/storage/statistics/segment_statistics.cpp +2 -11
  521. package/src/duckdb/src/storage/statistics/string_stats.cpp +273 -0
  522. package/src/duckdb/src/storage/statistics/struct_stats.cpp +133 -0
  523. package/src/duckdb/src/storage/storage_info.cpp +2 -2
  524. package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +4 -10
  525. package/src/duckdb/src/storage/table/column_data.cpp +45 -46
  526. package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +7 -8
  527. package/src/duckdb/src/storage/table/column_segment.cpp +13 -14
  528. package/src/duckdb/src/storage/table/list_column_data.cpp +41 -59
  529. package/src/duckdb/src/storage/table/persistent_table_data.cpp +2 -1
  530. package/src/duckdb/src/storage/table/row_group.cpp +38 -32
  531. package/src/duckdb/src/storage/table/row_group_collection.cpp +94 -78
  532. package/src/duckdb/src/storage/table/scan_state.cpp +22 -3
  533. package/src/duckdb/src/storage/table/standard_column_data.cpp +7 -6
  534. package/src/duckdb/src/storage/table/struct_column_data.cpp +16 -16
  535. package/src/duckdb/src/storage/table/table_statistics.cpp +27 -7
  536. package/src/duckdb/src/storage/table/update_segment.cpp +20 -18
  537. package/src/duckdb/src/storage/wal_replay.cpp +8 -5
  538. package/src/duckdb/src/storage/write_ahead_log.cpp +2 -2
  539. package/src/duckdb/src/transaction/commit_state.cpp +11 -7
  540. package/src/duckdb/src/verification/deserialized_statement_verifier.cpp +0 -1
  541. package/src/duckdb/third_party/libpg_query/include/nodes/nodes.hpp +35 -0
  542. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +36 -2
  543. package/src/duckdb/third_party/libpg_query/include/nodes/primnodes.hpp +3 -3
  544. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +1022 -530
  545. package/src/duckdb/third_party/libpg_query/include/parser/kwlist.hpp +8 -0
  546. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +24462 -22828
  547. package/src/duckdb/third_party/re2/re2/re2.cc +9 -0
  548. package/src/duckdb/third_party/re2/re2/re2.h +2 -0
  549. package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +4 -4
  550. package/src/duckdb/ub_extension_json_json_functions.cpp +2 -0
  551. package/src/duckdb/ub_src_common_serializer.cpp +2 -0
  552. package/src/duckdb/ub_src_execution_physical_plan.cpp +2 -0
  553. package/src/duckdb/ub_src_function_aggregate_distributive.cpp +2 -0
  554. package/src/duckdb/ub_src_function_scalar_bit.cpp +2 -0
  555. package/src/duckdb/ub_src_function_scalar_map.cpp +4 -0
  556. package/src/duckdb/ub_src_function_scalar_string.cpp +2 -0
  557. package/src/duckdb/ub_src_function_scalar_string_regexp.cpp +4 -0
  558. package/src/duckdb/ub_src_main_capi.cpp +2 -0
  559. package/src/duckdb/ub_src_optimizer_rule.cpp +2 -0
  560. package/src/duckdb/ub_src_parser.cpp +2 -0
  561. package/src/duckdb/ub_src_parser_parsed_data.cpp +4 -2
  562. package/src/duckdb/ub_src_parser_statement.cpp +2 -0
  563. package/src/duckdb/ub_src_parser_tableref.cpp +2 -0
  564. package/src/duckdb/ub_src_parser_transform_statement.cpp +2 -0
  565. package/src/duckdb/ub_src_parser_transform_tableref.cpp +2 -0
  566. package/src/duckdb/ub_src_planner_binder_expression.cpp +2 -0
  567. package/src/duckdb/ub_src_planner_binder_tableref.cpp +2 -0
  568. package/src/duckdb/ub_src_planner_expression_binder.cpp +2 -0
  569. package/src/duckdb/ub_src_planner_operator.cpp +2 -0
  570. package/src/duckdb/ub_src_storage_statistics.cpp +6 -6
  571. package/src/duckdb/ub_src_storage_table.cpp +0 -2
  572. package/src/duckdb_node.hpp +2 -1
  573. package/src/statement.cpp +5 -5
  574. package/src/utils.cpp +27 -2
  575. package/test/extension.test.ts +44 -26
  576. package/test/syntax_error.test.ts +3 -1
  577. package/filelist.cache +0 -0
  578. package/src/duckdb/src/include/duckdb/main/loadable_extension.hpp +0 -59
  579. package/src/duckdb/src/include/duckdb/storage/statistics/list_statistics.hpp +0 -36
  580. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_statistics.hpp +0 -75
  581. package/src/duckdb/src/include/duckdb/storage/statistics/string_statistics.hpp +0 -49
  582. package/src/duckdb/src/include/duckdb/storage/statistics/struct_statistics.hpp +0 -36
  583. package/src/duckdb/src/include/duckdb/storage/statistics/validity_statistics.hpp +0 -45
  584. package/src/duckdb/src/parser/parsed_data/alter_function_info.cpp +0 -55
  585. package/src/duckdb/src/storage/statistics/list_statistics.cpp +0 -94
  586. package/src/duckdb/src/storage/statistics/numeric_statistics.cpp +0 -307
  587. package/src/duckdb/src/storage/statistics/string_statistics.cpp +0 -220
  588. package/src/duckdb/src/storage/statistics/struct_statistics.cpp +0 -108
  589. package/src/duckdb/src/storage/statistics/validity_statistics.cpp +0 -91
  590. package/src/duckdb/src/storage/table/segment_tree.cpp +0 -179
@@ -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
  }
@@ -119,9 +119,15 @@ static void BindConstraints(Binder &binder, BoundCreateTableInfo &info) {
119
119
  fk.info.type == ForeignKeyType::FK_TYPE_SELF_REFERENCE_TABLE);
120
120
  physical_index_set_t fk_key_set, pk_key_set;
121
121
  for (idx_t i = 0; i < fk.info.pk_keys.size(); i++) {
122
+ if (pk_key_set.find(fk.info.pk_keys[i]) != pk_key_set.end()) {
123
+ throw BinderException("Duplicate primary key referenced in FOREIGN KEY constraint");
124
+ }
122
125
  pk_key_set.insert(fk.info.pk_keys[i]);
123
126
  }
124
127
  for (idx_t i = 0; i < fk.info.fk_keys.size(); i++) {
128
+ if (fk_key_set.find(fk.info.fk_keys[i]) != fk_key_set.end()) {
129
+ throw BinderException("Duplicate key specified in FOREIGN KEY constraint");
130
+ }
125
131
  fk_key_set.insert(fk.info.fk_keys[i]);
126
132
  }
127
133
  info.bound_constraints.push_back(
@@ -292,6 +298,7 @@ unique_ptr<BoundCreateTableInfo> Binder::BindCreateTableInfo(unique_ptr<CreateIn
292
298
  result->dependencies.AddDependency(type_dependency);
293
299
  }
294
300
  }
301
+ result->dependencies.VerifyDependencies(schema->catalog, result->Base().table);
295
302
  properties.allow_stream_result = false;
296
303
  return result;
297
304
  }
@@ -303,9 +310,10 @@ unique_ptr<BoundCreateTableInfo> Binder::BindCreateTableInfo(unique_ptr<CreateIn
303
310
  }
304
311
 
305
312
  vector<unique_ptr<Expression>> Binder::BindCreateIndexExpressions(TableCatalogEntry *table, CreateIndexInfo *info) {
306
- vector<unique_ptr<Expression>> expressions;
307
313
 
308
314
  auto index_binder = IndexBinder(*this, this->context, table, info);
315
+ vector<unique_ptr<Expression>> expressions;
316
+ expressions.reserve(info->expressions.size());
309
317
  for (auto &expr : info->expressions) {
310
318
  expressions.push_back(index_binder.Bind(expr));
311
319
  }
@@ -83,7 +83,7 @@ BoundStatement Binder::Bind(DeleteStatement &stmt) {
83
83
  del->table_index = update_table_index;
84
84
 
85
85
  unique_ptr<LogicalOperator> del_as_logicaloperator = std::move(del);
86
- return BindReturning(std::move(stmt.returning_list), table, update_table_index,
86
+ return BindReturning(std::move(stmt.returning_list), table, stmt.table->alias, update_table_index,
87
87
  std::move(del_as_logicaloperator), std::move(result));
88
88
  }
89
89
  result.plan = std::move(del);
@@ -335,6 +335,16 @@ void Binder::BindOnConflictClause(LogicalInsert &insert, TableCatalogEntry &tabl
335
335
  ReplaceColumnBindings(*insert.on_conflict_condition, table_index, projection_index);
336
336
  }
337
337
 
338
+ if (insert.action_type == OnConflictAction::REPLACE) {
339
+ D_ASSERT(on_conflict.set_info == nullptr);
340
+ on_conflict.set_info = CreateSetInfoForReplace(table, stmt);
341
+ insert.action_type = OnConflictAction::UPDATE;
342
+ }
343
+ if (on_conflict.set_info && on_conflict.set_info->columns.empty()) {
344
+ // if we are doing INSERT OR REPLACE on a table with no columns outside of the primary key column
345
+ // convert to INSERT OR IGNORE
346
+ insert.action_type = OnConflictAction::NOTHING;
347
+ }
338
348
  if (insert.action_type == OnConflictAction::NOTHING) {
339
349
  if (!insert.on_conflict_condition) {
340
350
  return;
@@ -346,15 +356,9 @@ void Binder::BindOnConflictClause(LogicalInsert &insert, TableCatalogEntry &tabl
346
356
  insert.columns_to_fetch = table_binding->GetBoundColumnIds();
347
357
  return;
348
358
  }
349
- if (insert.action_type == OnConflictAction::REPLACE) {
350
- D_ASSERT(on_conflict.set_info == nullptr);
351
- on_conflict.set_info = CreateSetInfoForReplace(table, stmt);
352
- insert.action_type = OnConflictAction::UPDATE;
353
- }
354
359
 
355
360
  D_ASSERT(on_conflict.set_info);
356
361
  auto &set_info = *on_conflict.set_info;
357
- D_ASSERT(!set_info.columns.empty());
358
362
  D_ASSERT(set_info.columns.size() == set_info.expressions.size());
359
363
 
360
364
  if (set_info.condition) {
@@ -505,8 +509,8 @@ BoundStatement Binder::Bind(InsertStatement &stmt) {
505
509
  insert->table_index = insert_table_index;
506
510
  unique_ptr<LogicalOperator> index_as_logicaloperator = std::move(insert);
507
511
 
508
- return BindReturning(std::move(stmt.returning_list), table, insert_table_index,
509
- std::move(index_as_logicaloperator), std::move(result));
512
+ return BindReturning(std::move(stmt.returning_list), table, stmt.table_ref ? stmt.table_ref->alias : string(),
513
+ insert_table_index, std::move(index_as_logicaloperator), std::move(result));
510
514
  }
511
515
 
512
516
  D_ASSERT(result.types.size() == result.names.size());
@@ -4,6 +4,19 @@
4
4
 
5
5
  namespace duckdb {
6
6
 
7
+ idx_t GetMaxTableIndex(LogicalOperator &op) {
8
+ idx_t result = 0;
9
+ for (auto &child : op.children) {
10
+ auto max_child_index = GetMaxTableIndex(*child);
11
+ result = MaxValue<idx_t>(result, max_child_index);
12
+ }
13
+ auto indexes = op.GetTableIndex();
14
+ for (auto &index : indexes) {
15
+ result = MaxValue<idx_t>(result, index);
16
+ }
17
+ return result;
18
+ }
19
+
7
20
  BoundStatement Binder::Bind(LogicalPlanStatement &stmt) {
8
21
  BoundStatement result;
9
22
  result.types = stmt.plan->types;
@@ -14,6 +27,10 @@ BoundStatement Binder::Bind(LogicalPlanStatement &stmt) {
14
27
  properties.allow_stream_result = true;
15
28
  properties.return_type = StatementReturnType::QUERY_RESULT; // TODO could also be something else
16
29
 
30
+ if (parent) {
31
+ throw InternalException("LogicalPlanStatement should be bound in root binder");
32
+ }
33
+ bound_tables = GetMaxTableIndex(*result.plan) + 1;
17
34
  return result;
18
35
  }
19
36
 
@@ -195,11 +195,13 @@ BoundStatement Binder::Bind(UpdateStatement &stmt) {
195
195
  AddCTEMap(stmt.cte_map);
196
196
 
197
197
  if (stmt.from_table) {
198
+ auto from_binder = Binder::CreateBinder(context, this);
198
199
  BoundJoinRef bound_crossproduct(JoinRefType::CROSS);
199
200
  bound_crossproduct.left = std::move(bound_table);
200
- bound_crossproduct.right = Bind(*stmt.from_table);
201
+ bound_crossproduct.right = from_binder->Bind(*stmt.from_table);
201
202
  root = CreatePlan(bound_crossproduct);
202
203
  get = (LogicalGet *)root->children[0].get();
204
+ bind_context.AddContext(std::move(from_binder->bind_context));
203
205
  } else {
204
206
  root = CreatePlan(*bound_table);
205
207
  get = (LogicalGet *)root.get();
@@ -251,7 +253,7 @@ BoundStatement Binder::Bind(UpdateStatement &stmt) {
251
253
  if (!stmt.returning_list.empty()) {
252
254
  unique_ptr<LogicalOperator> update_as_logicaloperator = std::move(update);
253
255
 
254
- return BindReturning(std::move(stmt.returning_list), table, update_table_index,
256
+ return BindReturning(std::move(stmt.returning_list), table, stmt.table->alias, update_table_index,
255
257
  std::move(update_as_logicaloperator), std::move(result));
256
258
  }
257
259
 
@@ -7,9 +7,11 @@
7
7
  #include "duckdb/parser/expression/constant_expression.hpp"
8
8
  #include "duckdb/parser/expression/conjunction_expression.hpp"
9
9
  #include "duckdb/parser/expression/bound_expression.hpp"
10
+ #include "duckdb/parser/expression/star_expression.hpp"
10
11
  #include "duckdb/common/string_util.hpp"
11
12
  #include "duckdb/common/case_insensitive_map.hpp"
12
13
  #include "duckdb/planner/expression_binder/lateral_binder.hpp"
14
+ #include "duckdb/planner/query_node/bound_select_node.hpp"
13
15
 
14
16
  namespace duckdb {
15
17
 
@@ -23,11 +25,11 @@ static unique_ptr<ParsedExpression> BindColumn(Binder &binder, ClientContext &co
23
25
 
24
26
  static unique_ptr<ParsedExpression> AddCondition(ClientContext &context, Binder &left_binder, Binder &right_binder,
25
27
  const string &left_alias, const string &right_alias,
26
- const string &column_name) {
28
+ const string &column_name, ExpressionType type) {
27
29
  ExpressionBinder expr_binder(left_binder, context);
28
30
  auto left = BindColumn(left_binder, context, left_alias, column_name);
29
31
  auto right = BindColumn(right_binder, context, right_alias, column_name);
30
- return make_unique<ComparisonExpression>(ExpressionType::COMPARE_EQUAL, std::move(left), std::move(right));
32
+ return make_unique<ComparisonExpression>(type, std::move(left), std::move(right));
31
33
  }
32
34
 
33
35
  bool Binder::TryFindBinding(const string &using_column, const string &join_side, string &result) {
@@ -196,12 +198,14 @@ unique_ptr<BoundTableRef> Binder::Bind(JoinRef &ref) {
196
198
  break;
197
199
  }
198
200
  case JoinRefType::REGULAR:
201
+ case JoinRefType::ASOF:
199
202
  if (!ref.using_columns.empty()) {
200
203
  // USING columns
201
204
  D_ASSERT(!result->condition);
202
205
  extra_using_columns = ref.using_columns;
203
206
  }
204
207
  break;
208
+
205
209
  case JoinRefType::CROSS:
206
210
  case JoinRefType::POSITIONAL:
207
211
  break;
@@ -239,8 +243,13 @@ unique_ptr<BoundTableRef> Binder::Bind(JoinRef &ref) {
239
243
  left_binding = RetrieveUsingBinding(left_binder, left_using_binding, using_column, "left", set.get());
240
244
  right_binding = RetrieveUsingBinding(right_binder, right_using_binding, using_column, "right", set.get());
241
245
 
246
+ // Last column of ASOF JOIN ... USING is >=
247
+ const auto type = (ref.ref_type == JoinRefType::ASOF && i == extra_using_columns.size() - 1)
248
+ ? ExpressionType::COMPARE_GREATERTHANOREQUALTO
249
+ : ExpressionType::COMPARE_EQUAL;
250
+
242
251
  extra_conditions.push_back(
243
- AddCondition(context, left_binder, right_binder, left_binding, right_binding, using_column));
252
+ AddCondition(context, left_binder, right_binder, left_binding, right_binding, using_column, type));
244
253
 
245
254
  AddUsingBindings(*set, left_using_binding, left_binding);
246
255
  AddUsingBindings(*set, right_using_binding, right_binding);
@@ -253,6 +262,8 @@ unique_ptr<BoundTableRef> Binder::Bind(JoinRef &ref) {
253
262
  }
254
263
  }
255
264
 
265
+ auto right_bindings_list_copy = right_binder.bind_context.GetBindingsList();
266
+
256
267
  bind_context.AddContext(std::move(left_binder.bind_context));
257
268
  bind_context.AddContext(std::move(right_binder.bind_context));
258
269
  MoveCorrelatedExpressions(left_binder);
@@ -269,6 +280,11 @@ unique_ptr<BoundTableRef> Binder::Bind(JoinRef &ref) {
269
280
  WhereBinder binder(*this, context);
270
281
  result->condition = binder.Bind(ref.condition);
271
282
  }
283
+
284
+ if (result->type == JoinType::SEMI || result->type == JoinType::ANTI) {
285
+ bind_context.RemoveContext(right_bindings_list_copy);
286
+ }
287
+
272
288
  return std::move(result);
273
289
  }
274
290