duckdb 0.8.2-dev11.0 → 0.8.2-dev1212.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 (396) hide show
  1. package/binding.gyp +14 -12
  2. package/binding.gyp.in +1 -1
  3. package/configure.py +1 -1
  4. package/duckdb_extension_config.cmake +10 -0
  5. package/lib/duckdb.d.ts +59 -0
  6. package/lib/duckdb.js +21 -0
  7. package/package.json +1 -1
  8. package/src/duckdb/extension/icu/icu-dateadd.cpp +2 -2
  9. package/src/duckdb/extension/icu/icu-datefunc.cpp +1 -1
  10. package/src/duckdb/extension/icu/icu-datepart.cpp +2 -2
  11. package/src/duckdb/extension/icu/icu-datesub.cpp +2 -2
  12. package/src/duckdb/extension/icu/icu-datetrunc.cpp +1 -1
  13. package/src/duckdb/extension/icu/icu-list-range.cpp +1 -1
  14. package/src/duckdb/extension/icu/icu-makedate.cpp +7 -0
  15. package/src/duckdb/extension/icu/icu-strptime.cpp +4 -4
  16. package/src/duckdb/extension/icu/icu-table-range.cpp +5 -5
  17. package/src/duckdb/extension/icu/icu-timebucket.cpp +16 -16
  18. package/src/duckdb/extension/icu/icu-timezone.cpp +8 -8
  19. package/src/duckdb/extension/icu/icu_extension.cpp +5 -7
  20. package/src/duckdb/extension/json/include/json_common.hpp +47 -231
  21. package/src/duckdb/extension/json/include/json_executors.hpp +49 -13
  22. package/src/duckdb/extension/json/include/json_functions.hpp +2 -1
  23. package/src/duckdb/extension/json/json_common.cpp +272 -40
  24. package/src/duckdb/extension/json/json_functions/json_structure.cpp +1 -1
  25. package/src/duckdb/extension/json/json_functions/json_transform.cpp +17 -37
  26. package/src/duckdb/extension/json/json_functions/json_type.cpp +1 -1
  27. package/src/duckdb/extension/json/json_functions.cpp +24 -24
  28. package/src/duckdb/extension/json/json_scan.cpp +3 -6
  29. package/src/duckdb/extension/parquet/column_reader.cpp +19 -21
  30. package/src/duckdb/extension/parquet/column_writer.cpp +77 -61
  31. package/src/duckdb/extension/parquet/include/cast_column_reader.hpp +2 -2
  32. package/src/duckdb/extension/parquet/include/column_reader.hpp +14 -16
  33. package/src/duckdb/extension/parquet/include/column_writer.hpp +9 -7
  34. package/src/duckdb/extension/parquet/include/list_column_reader.hpp +2 -2
  35. package/src/duckdb/extension/parquet/include/parquet_dbp_decoder.hpp +3 -3
  36. package/src/duckdb/extension/parquet/include/parquet_decimal_utils.hpp +3 -3
  37. package/src/duckdb/extension/parquet/include/parquet_file_metadata_cache.hpp +2 -2
  38. package/src/duckdb/extension/parquet/include/parquet_statistics.hpp +2 -2
  39. package/src/duckdb/extension/parquet/include/parquet_support.hpp +9 -11
  40. package/src/duckdb/extension/parquet/include/parquet_writer.hpp +24 -5
  41. package/src/duckdb/extension/parquet/include/string_column_reader.hpp +1 -1
  42. package/src/duckdb/extension/parquet/include/struct_column_reader.hpp +2 -3
  43. package/src/duckdb/extension/parquet/include/zstd_file_system.hpp +2 -2
  44. package/src/duckdb/extension/parquet/parquet_extension.cpp +191 -19
  45. package/src/duckdb/extension/parquet/parquet_reader.cpp +6 -6
  46. package/src/duckdb/extension/parquet/parquet_statistics.cpp +7 -6
  47. package/src/duckdb/extension/parquet/parquet_writer.cpp +79 -16
  48. package/src/duckdb/extension/parquet/zstd_file_system.cpp +2 -2
  49. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +1 -1
  50. package/src/duckdb/src/catalog/default/default_functions.cpp +16 -0
  51. package/src/duckdb/src/common/adbc/adbc.cpp +75 -10
  52. package/src/duckdb/src/common/adbc/driver_manager.cpp +6 -11
  53. package/src/duckdb/src/common/allocator.cpp +14 -2
  54. package/src/duckdb/src/common/arrow/arrow_appender.cpp +5 -11
  55. package/src/duckdb/src/common/arrow/arrow_wrapper.cpp +0 -12
  56. package/src/duckdb/src/common/assert.cpp +3 -0
  57. package/src/duckdb/src/common/enum_util.cpp +42 -5
  58. package/src/duckdb/src/common/enums/logical_operator_type.cpp +4 -0
  59. package/src/duckdb/src/common/enums/optimizer_type.cpp +2 -0
  60. package/src/duckdb/src/common/enums/physical_operator_type.cpp +4 -0
  61. package/src/duckdb/src/common/exception.cpp +2 -2
  62. package/src/duckdb/src/common/file_system.cpp +15 -0
  63. package/src/duckdb/src/common/local_file_system.cpp +2 -2
  64. package/src/duckdb/src/common/multi_file_reader.cpp +181 -18
  65. package/src/duckdb/src/common/radix_partitioning.cpp +27 -9
  66. package/src/duckdb/src/common/re2_regex.cpp +1 -1
  67. package/src/duckdb/src/common/row_operations/row_external.cpp +1 -1
  68. package/src/duckdb/src/common/sort/merge_sorter.cpp +9 -16
  69. package/src/duckdb/src/common/sort/partition_state.cpp +44 -11
  70. package/src/duckdb/src/common/types/batched_data_collection.cpp +7 -2
  71. package/src/duckdb/src/common/types/column/column_data_allocator.cpp +9 -6
  72. package/src/duckdb/src/common/types/column/column_data_collection.cpp +17 -2
  73. package/src/duckdb/src/common/types/column/column_data_collection_segment.cpp +15 -6
  74. package/src/duckdb/src/common/types/column/partitioned_column_data.cpp +2 -2
  75. package/src/duckdb/src/common/types/data_chunk.cpp +2 -2
  76. package/src/duckdb/src/common/types/date.cpp +9 -0
  77. package/src/duckdb/src/common/types/list_segment.cpp +24 -74
  78. package/src/duckdb/src/common/types/row/partitioned_tuple_data.cpp +3 -9
  79. package/src/duckdb/src/common/types/row/tuple_data_collection.cpp +2 -0
  80. package/src/duckdb/src/common/types/row/tuple_data_scatter_gather.cpp +2 -2
  81. package/src/duckdb/src/common/types/uuid.cpp +2 -2
  82. package/src/duckdb/src/common/types/validity_mask.cpp +33 -0
  83. package/src/duckdb/src/common/types/vector.cpp +15 -14
  84. package/src/duckdb/src/common/vector_operations/is_distinct_from.cpp +6 -4
  85. package/src/duckdb/src/core_functions/aggregate/holistic/reservoir_quantile.cpp +2 -0
  86. package/src/duckdb/src/core_functions/aggregate/nested/list.cpp +2 -2
  87. package/src/duckdb/src/core_functions/aggregate/regression/regr_avg.cpp +4 -4
  88. package/src/duckdb/src/core_functions/aggregate/regression/regr_intercept.cpp +4 -4
  89. package/src/duckdb/src/core_functions/aggregate/regression/regr_r2.cpp +5 -4
  90. package/src/duckdb/src/core_functions/aggregate/regression/regr_sxx_syy.cpp +8 -8
  91. package/src/duckdb/src/core_functions/aggregate/regression/regr_sxy.cpp +4 -3
  92. package/src/duckdb/src/core_functions/function_list.cpp +4 -2
  93. package/src/duckdb/src/core_functions/scalar/date/date_part.cpp +208 -42
  94. package/src/duckdb/src/core_functions/scalar/date/epoch.cpp +0 -17
  95. package/src/duckdb/src/core_functions/scalar/date/make_date.cpp +19 -4
  96. package/src/duckdb/src/core_functions/scalar/list/list_aggregates.cpp +4 -2
  97. package/src/duckdb/src/execution/aggregate_hashtable.cpp +34 -18
  98. package/src/duckdb/src/execution/expression_executor.cpp +1 -1
  99. package/src/duckdb/src/execution/index/art/art.cpp +149 -139
  100. package/src/duckdb/src/execution/index/art/fixed_size_allocator.cpp +1 -1
  101. package/src/duckdb/src/execution/index/art/iterator.cpp +129 -207
  102. package/src/duckdb/src/execution/index/art/leaf.cpp +8 -37
  103. package/src/duckdb/src/execution/index/art/node.cpp +113 -120
  104. package/src/duckdb/src/execution/index/art/node16.cpp +1 -10
  105. package/src/duckdb/src/execution/index/art/node256.cpp +1 -9
  106. package/src/duckdb/src/execution/index/art/node4.cpp +12 -13
  107. package/src/duckdb/src/execution/index/art/node48.cpp +1 -11
  108. package/src/duckdb/src/execution/index/art/prefix.cpp +228 -350
  109. package/src/duckdb/src/execution/join_hashtable.cpp +4 -4
  110. package/src/duckdb/src/execution/operator/aggregate/aggregate_object.cpp +1 -0
  111. package/src/duckdb/src/execution/operator/aggregate/physical_streaming_window.cpp +8 -3
  112. package/src/duckdb/src/execution/operator/aggregate/physical_ungrouped_aggregate.cpp +32 -22
  113. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +512 -300
  114. package/src/duckdb/src/execution/operator/helper/physical_batch_collector.cpp +4 -3
  115. package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +5 -5
  116. package/src/duckdb/src/execution/operator/join/physical_asof_join.cpp +414 -283
  117. package/src/duckdb/src/execution/operator/join/physical_comparison_join.cpp +1 -1
  118. package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +21 -10
  119. package/src/duckdb/src/execution/operator/join/physical_join.cpp +1 -1
  120. package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +22 -3
  121. package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +2 -2
  122. package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +100 -13
  123. package/src/duckdb/src/execution/operator/persistent/csv_file_handle.cpp +1 -1
  124. package/src/duckdb/src/execution/operator/persistent/csv_reader_options.cpp +20 -0
  125. package/src/duckdb/src/execution/operator/persistent/csv_rejects_table.cpp +48 -0
  126. package/src/duckdb/src/execution/operator/persistent/parallel_csv_reader.cpp +2 -3
  127. package/src/duckdb/src/execution/operator/persistent/physical_batch_copy_to_file.cpp +6 -4
  128. package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +3 -2
  129. package/src/duckdb/src/execution/operator/persistent/physical_fixed_batch_copy.cpp +3 -3
  130. package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +1 -1
  131. package/src/duckdb/src/execution/operator/projection/physical_pivot.cpp +2 -1
  132. package/src/duckdb/src/execution/operator/scan/physical_column_data_scan.cpp +19 -0
  133. package/src/duckdb/src/execution/operator/set/physical_cte.cpp +160 -0
  134. package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +15 -5
  135. package/src/duckdb/src/execution/partitionable_hashtable.cpp +41 -6
  136. package/src/duckdb/src/execution/perfect_aggregate_hashtable.cpp +30 -5
  137. package/src/duckdb/src/execution/physical_operator.cpp +17 -14
  138. package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +43 -10
  139. package/src/duckdb/src/execution/physical_plan/plan_cte.cpp +33 -0
  140. package/src/duckdb/src/execution/physical_plan/plan_recursive_cte.cpp +25 -4
  141. package/src/duckdb/src/execution/physical_plan_generator.cpp +4 -0
  142. package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +290 -43
  143. package/src/duckdb/src/execution/window_segment_tree.cpp +286 -129
  144. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +2 -1
  145. package/src/duckdb/src/function/function.cpp +3 -1
  146. package/src/duckdb/src/function/scalar/compressed_materialization/compress_integral.cpp +212 -0
  147. package/src/duckdb/src/function/scalar/compressed_materialization/compress_string.cpp +249 -0
  148. package/src/duckdb/src/function/scalar/compressed_materialization_functions.cpp +29 -0
  149. package/src/duckdb/src/function/scalar/list/list_resize.cpp +162 -0
  150. package/src/duckdb/src/function/scalar/nested_functions.cpp +1 -0
  151. package/src/duckdb/src/function/scalar/string/like.cpp +12 -4
  152. package/src/duckdb/src/function/scalar/system/aggregate_export.cpp +12 -5
  153. package/src/duckdb/src/function/table/copy_csv.cpp +8 -1
  154. package/src/duckdb/src/function/table/read_csv.cpp +100 -17
  155. package/src/duckdb/src/function/table/system/test_all_types.cpp +38 -18
  156. package/src/duckdb/src/function/table/table_scan.cpp +9 -0
  157. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  158. package/src/duckdb/src/include/duckdb/common/adbc/adbc.hpp +1 -0
  159. package/src/duckdb/src/include/duckdb/common/allocator.hpp +2 -0
  160. package/src/duckdb/src/include/duckdb/common/bswap.hpp +42 -0
  161. package/src/duckdb/src/include/duckdb/common/enum_util.hpp +8 -0
  162. package/src/duckdb/src/include/duckdb/common/enums/cte_materialize.hpp +21 -0
  163. package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +2 -1
  164. package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +2 -0
  165. package/src/duckdb/src/include/duckdb/common/enums/optimizer_type.hpp +2 -0
  166. package/src/duckdb/src/include/duckdb/common/enums/physical_operator_type.hpp +2 -0
  167. package/src/duckdb/src/include/duckdb/common/multi_file_reader.hpp +6 -4
  168. package/src/duckdb/src/include/duckdb/common/multi_file_reader_options.hpp +10 -42
  169. package/src/duckdb/src/include/duckdb/common/mutex.hpp +3 -0
  170. package/src/duckdb/src/include/duckdb/common/radix.hpp +9 -20
  171. package/src/duckdb/src/include/duckdb/common/radix_partitioning.hpp +6 -21
  172. package/src/duckdb/src/include/duckdb/common/row_operations/row_operations.hpp +3 -3
  173. package/src/duckdb/src/include/duckdb/common/sort/partition_state.hpp +13 -0
  174. package/src/duckdb/src/include/duckdb/common/types/batched_data_collection.hpp +3 -1
  175. package/src/duckdb/src/include/duckdb/common/types/column/column_data_allocator.hpp +1 -1
  176. package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection.hpp +6 -1
  177. package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection_segment.hpp +1 -1
  178. package/src/duckdb/src/include/duckdb/common/types/column/column_data_scan_states.hpp +3 -1
  179. package/src/duckdb/src/include/duckdb/common/types/data_chunk.hpp +1 -1
  180. package/src/duckdb/src/include/duckdb/common/types/date.hpp +7 -5
  181. package/src/duckdb/src/include/duckdb/common/types/list_segment.hpp +6 -8
  182. package/src/duckdb/src/include/duckdb/common/types/row/partitioned_tuple_data.hpp +0 -1
  183. package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_collection.hpp +1 -0
  184. package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_states.hpp +3 -0
  185. package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +9 -0
  186. package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/corr.hpp +4 -4
  187. package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/covar.hpp +3 -1
  188. package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_count.hpp +1 -0
  189. package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_slope.hpp +3 -3
  190. package/src/duckdb/src/include/duckdb/core_functions/scalar/date_functions.hpp +24 -6
  191. package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +21 -3
  192. package/src/duckdb/src/include/duckdb/execution/executor.hpp +3 -0
  193. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +4 -5
  194. package/src/duckdb/src/include/duckdb/execution/index/art/iterator.hpp +31 -27
  195. package/src/duckdb/src/include/duckdb/execution/index/art/leaf.hpp +6 -14
  196. package/src/duckdb/src/include/duckdb/execution/index/art/node.hpp +4 -10
  197. package/src/duckdb/src/include/duckdb/execution/index/art/node16.hpp +3 -6
  198. package/src/duckdb/src/include/duckdb/execution/index/art/node256.hpp +3 -6
  199. package/src/duckdb/src/include/duckdb/execution/index/art/node4.hpp +5 -8
  200. package/src/duckdb/src/include/duckdb/execution/index/art/node48.hpp +3 -6
  201. package/src/duckdb/src/include/duckdb/execution/index/art/prefix.hpp +63 -52
  202. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_asof_join.hpp +2 -10
  203. package/src/duckdb/src/include/duckdb/execution/operator/persistent/base_csv_reader.hpp +2 -2
  204. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_line_info.hpp +4 -3
  205. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +8 -1
  206. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_rejects_table.hpp +36 -0
  207. package/src/duckdb/src/include/duckdb/execution/operator/persistent/parallel_csv_reader.hpp +1 -1
  208. package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_column_data_scan.hpp +10 -0
  209. package/src/duckdb/src/include/duckdb/execution/operator/set/physical_cte.hpp +62 -0
  210. package/src/duckdb/src/include/duckdb/execution/operator/set/physical_recursive_cte.hpp +8 -2
  211. package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +5 -1
  212. package/src/duckdb/src/include/duckdb/execution/physical_operator.hpp +3 -0
  213. package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +3 -0
  214. package/src/duckdb/src/include/duckdb/execution/radix_partitioned_hashtable.hpp +10 -3
  215. package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +51 -40
  216. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +1 -1
  217. package/src/duckdb/src/include/duckdb/function/aggregate_state.hpp +2 -2
  218. package/src/duckdb/src/include/duckdb/function/built_in_functions.hpp +1 -0
  219. package/src/duckdb/src/include/duckdb/function/scalar/compressed_materialization_functions.hpp +49 -0
  220. package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +1 -1
  221. package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +5 -0
  222. package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +2 -0
  223. package/src/duckdb/src/include/duckdb/function/table/system_functions.hpp +1 -1
  224. package/src/duckdb/src/include/duckdb/main/client_config.hpp +3 -0
  225. package/src/duckdb/src/include/duckdb/main/config.hpp +2 -0
  226. package/src/duckdb/src/include/duckdb/main/connection.hpp +1 -2
  227. package/src/duckdb/src/include/duckdb/main/settings.hpp +21 -1
  228. package/src/duckdb/src/include/duckdb/optimizer/column_binding_replacer.hpp +47 -0
  229. package/src/duckdb/src/include/duckdb/optimizer/compressed_materialization.hpp +132 -0
  230. package/src/duckdb/src/include/duckdb/optimizer/deliminator.hpp +13 -16
  231. package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +3 -0
  232. package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +1 -1
  233. package/src/duckdb/src/include/duckdb/optimizer/join_order/estimated_properties.hpp +10 -1
  234. package/src/duckdb/src/include/duckdb/optimizer/join_order/join_order_optimizer.hpp +1 -1
  235. package/src/duckdb/src/include/duckdb/optimizer/join_order/join_relation.hpp +1 -1
  236. package/src/duckdb/src/include/duckdb/optimizer/join_order/query_graph.hpp +3 -0
  237. package/src/duckdb/src/include/duckdb/optimizer/matcher/set_matcher.hpp +13 -0
  238. package/src/duckdb/src/include/duckdb/optimizer/optimizer.hpp +3 -0
  239. package/src/duckdb/src/include/duckdb/optimizer/remove_duplicate_groups.hpp +40 -0
  240. package/src/duckdb/src/include/duckdb/optimizer/statistics_propagator.hpp +11 -3
  241. package/src/duckdb/src/include/duckdb/optimizer/topn_optimizer.hpp +2 -0
  242. package/src/duckdb/src/include/duckdb/parallel/pipeline.hpp +2 -0
  243. package/src/duckdb/src/include/duckdb/parallel/task_scheduler.hpp +5 -0
  244. package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +2 -0
  245. package/src/duckdb/src/include/duckdb/parser/query_node/cte_node.hpp +54 -0
  246. package/src/duckdb/src/include/duckdb/parser/query_node/list.hpp +1 -0
  247. package/src/duckdb/src/include/duckdb/parser/query_node.hpp +2 -1
  248. package/src/duckdb/src/include/duckdb/parser/tokens.hpp +1 -0
  249. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +15 -8
  250. package/src/duckdb/src/include/duckdb/planner/binder.hpp +8 -5
  251. package/src/duckdb/src/include/duckdb/planner/bound_tokens.hpp +1 -0
  252. package/src/duckdb/src/include/duckdb/planner/column_binding.hpp +4 -0
  253. package/src/duckdb/src/include/duckdb/planner/constraints/bound_unique_constraint.hpp +3 -3
  254. package/src/duckdb/src/include/duckdb/planner/expression_binder/lateral_binder.hpp +0 -2
  255. package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +1 -0
  256. package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +2 -1
  257. package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +5 -5
  258. package/src/duckdb/src/include/duckdb/planner/operator/logical_cteref.hpp +7 -2
  259. package/src/duckdb/src/include/duckdb/planner/operator/logical_dependent_join.hpp +43 -0
  260. package/src/duckdb/src/include/duckdb/planner/operator/logical_materialized_cte.hpp +49 -0
  261. package/src/duckdb/src/include/duckdb/planner/operator/logical_recursive_cte.hpp +5 -4
  262. package/src/duckdb/src/include/duckdb/planner/query_node/bound_cte_node.hpp +44 -0
  263. package/src/duckdb/src/include/duckdb/planner/query_node/list.hpp +1 -0
  264. package/src/duckdb/src/include/duckdb/planner/subquery/flatten_dependent_join.hpp +2 -2
  265. package/src/duckdb/src/include/duckdb/planner/subquery/has_correlated_expressions.hpp +4 -1
  266. package/src/duckdb/src/include/duckdb/planner/subquery/recursive_dependent_join_planner.hpp +31 -0
  267. package/src/duckdb/src/include/duckdb/planner/subquery/rewrite_correlated_expressions.hpp +8 -2
  268. package/src/duckdb/src/include/duckdb/planner/tableref/bound_cteref.hpp +5 -2
  269. package/src/duckdb/src/include/duckdb/storage/arena_allocator.hpp +1 -1
  270. package/src/duckdb/src/include/duckdb/storage/block_manager.hpp +3 -3
  271. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +1 -1
  272. package/src/duckdb/src/include/duckdb/storage/object_cache.hpp +22 -0
  273. package/src/duckdb/src/include/duckdb/storage/single_file_block_manager.hpp +2 -0
  274. package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +4 -0
  275. package/src/duckdb/src/include/duckdb/storage/table/chunk_info.hpp +3 -0
  276. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +3 -2
  277. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +1 -3
  278. package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +2 -3
  279. package/src/duckdb/src/include/duckdb.h +28 -0
  280. package/src/duckdb/src/main/capi/arrow-c.cpp +155 -1
  281. package/src/duckdb/src/main/capi/duckdb_value-c.cpp +1 -1
  282. package/src/duckdb/src/main/config.cpp +2 -0
  283. package/src/duckdb/src/main/database.cpp +1 -1
  284. package/src/duckdb/src/main/extension/extension_helper.cpp +96 -89
  285. package/src/duckdb/src/main/settings/settings.cpp +40 -18
  286. package/src/duckdb/src/optimizer/column_binding_replacer.cpp +43 -0
  287. package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +1 -2
  288. package/src/duckdb/src/optimizer/compressed_materialization/compress_aggregate.cpp +140 -0
  289. package/src/duckdb/src/optimizer/compressed_materialization/compress_distinct.cpp +42 -0
  290. package/src/duckdb/src/optimizer/compressed_materialization/compress_order.cpp +65 -0
  291. package/src/duckdb/src/optimizer/compressed_materialization.cpp +478 -0
  292. package/src/duckdb/src/optimizer/deliminator.cpp +176 -321
  293. package/src/duckdb/src/optimizer/filter_pushdown.cpp +9 -0
  294. package/src/duckdb/src/optimizer/join_order/estimated_properties.cpp +7 -0
  295. package/src/duckdb/src/optimizer/join_order/join_node.cpp +2 -2
  296. package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +113 -82
  297. package/src/duckdb/src/optimizer/join_order/join_relation_set.cpp +2 -6
  298. package/src/duckdb/src/optimizer/join_order/query_graph.cpp +22 -14
  299. package/src/duckdb/src/optimizer/optimizer.cpp +51 -14
  300. package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +5 -5
  301. package/src/duckdb/src/optimizer/pushdown/pushdown_get.cpp +0 -1
  302. package/src/duckdb/src/optimizer/remove_duplicate_groups.cpp +127 -0
  303. package/src/duckdb/src/optimizer/remove_unused_columns.cpp +4 -0
  304. package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +154 -15
  305. package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +65 -8
  306. package/src/duckdb/src/optimizer/statistics/operator/propagate_order.cpp +1 -1
  307. package/src/duckdb/src/optimizer/statistics_propagator.cpp +7 -5
  308. package/src/duckdb/src/optimizer/topn_optimizer.cpp +20 -10
  309. package/src/duckdb/src/parallel/executor.cpp +15 -0
  310. package/src/duckdb/src/parallel/pipeline_executor.cpp +7 -6
  311. package/src/duckdb/src/parallel/task_scheduler.cpp +11 -2
  312. package/src/duckdb/src/parser/common_table_expression_info.cpp +2 -0
  313. package/src/duckdb/src/parser/expression/lambda_expression.cpp +1 -1
  314. package/src/duckdb/src/parser/parsed_expression_iterator.cpp +7 -0
  315. package/src/duckdb/src/parser/query_node/cte_node.cpp +75 -0
  316. package/src/duckdb/src/parser/query_node.cpp +18 -1
  317. package/src/duckdb/src/parser/tableref/joinref.cpp +3 -0
  318. package/src/duckdb/src/parser/transform/expression/transform_constant.cpp +55 -3
  319. package/src/duckdb/src/parser/transform/expression/transform_expression.cpp +2 -0
  320. package/src/duckdb/src/parser/transform/expression/transform_multi_assign_reference.cpp +44 -0
  321. package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +19 -1
  322. package/src/duckdb/src/parser/transform/statement/transform_copy.cpp +13 -0
  323. package/src/duckdb/src/parser/transform/statement/transform_delete.cpp +6 -1
  324. package/src/duckdb/src/parser/transform/statement/transform_insert.cpp +6 -1
  325. package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +7 -2
  326. package/src/duckdb/src/parser/transform/statement/transform_pragma.cpp +14 -11
  327. package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +11 -2
  328. package/src/duckdb/src/parser/transform/statement/transform_update.cpp +6 -1
  329. package/src/duckdb/src/parser/transformer.cpp +15 -0
  330. package/src/duckdb/src/planner/binder/query_node/bind_cte_node.cpp +64 -0
  331. package/src/duckdb/src/planner/binder/query_node/plan_cte_node.cpp +26 -0
  332. package/src/duckdb/src/planner/binder/query_node/plan_recursive_cte_node.cpp +5 -5
  333. package/src/duckdb/src/planner/binder/query_node/plan_setop.cpp +4 -4
  334. package/src/duckdb/src/planner/binder/query_node/plan_subquery.cpp +32 -29
  335. package/src/duckdb/src/planner/binder/tableref/bind_basetableref.cpp +11 -2
  336. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +32 -5
  337. package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +116 -50
  338. package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -1
  339. package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +61 -26
  340. package/src/duckdb/src/planner/binder/tableref/plan_subqueryref.cpp +3 -3
  341. package/src/duckdb/src/planner/binder.cpp +5 -0
  342. package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +1 -1
  343. package/src/duckdb/src/planner/expression_binder/lateral_binder.cpp +4 -31
  344. package/src/duckdb/src/planner/expression_binder.cpp +3 -0
  345. package/src/duckdb/src/planner/expression_iterator.cpp +6 -0
  346. package/src/duckdb/src/planner/logical_operator.cpp +5 -0
  347. package/src/duckdb/src/planner/logical_operator_visitor.cpp +2 -0
  348. package/src/duckdb/src/planner/operator/logical_cteref.cpp +3 -1
  349. package/src/duckdb/src/planner/operator/logical_dependent_join.cpp +26 -0
  350. package/src/duckdb/src/planner/operator/logical_materialized_cte.cpp +21 -0
  351. package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +90 -38
  352. package/src/duckdb/src/planner/subquery/has_correlated_expressions.cpp +22 -7
  353. package/src/duckdb/src/planner/subquery/rewrite_correlated_expressions.cpp +65 -7
  354. package/src/duckdb/src/storage/arena_allocator.cpp +1 -2
  355. package/src/duckdb/src/storage/buffer/block_manager.cpp +3 -0
  356. package/src/duckdb/src/storage/checkpoint_manager.cpp +3 -0
  357. package/src/duckdb/src/storage/compression/rle.cpp +0 -1
  358. package/src/duckdb/src/storage/data_table.cpp +1 -1
  359. package/src/duckdb/src/storage/local_storage.cpp +3 -3
  360. package/src/duckdb/src/storage/single_file_block_manager.cpp +23 -0
  361. package/src/duckdb/src/storage/statistics/string_stats.cpp +21 -2
  362. package/src/duckdb/src/storage/storage_info.cpp +1 -1
  363. package/src/duckdb/src/storage/storage_manager.cpp +7 -2
  364. package/src/duckdb/src/storage/table/chunk_info.cpp +17 -0
  365. package/src/duckdb/src/storage/table/row_group.cpp +25 -9
  366. package/src/duckdb/src/storage/table/row_group_collection.cpp +19 -18
  367. package/src/duckdb/third_party/concurrentqueue/concurrentqueue.h +2 -2
  368. package/src/duckdb/third_party/concurrentqueue/lightweightsemaphore.h +76 -0
  369. package/src/duckdb/third_party/fast_float/fast_float/fast_float.h +2 -0
  370. package/src/duckdb/third_party/httplib/httplib.hpp +10 -1
  371. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +9 -0
  372. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +2 -1
  373. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +12487 -12331
  374. package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +6 -6
  375. package/src/duckdb/ub_src_execution_index_art.cpp +0 -2
  376. package/src/duckdb/ub_src_execution_operator_persistent.cpp +2 -0
  377. package/src/duckdb/ub_src_execution_operator_set.cpp +2 -0
  378. package/src/duckdb/ub_src_execution_physical_plan.cpp +2 -0
  379. package/src/duckdb/ub_src_function_scalar.cpp +2 -0
  380. package/src/duckdb/ub_src_function_scalar_compressed_materialization.cpp +4 -0
  381. package/src/duckdb/ub_src_function_scalar_list.cpp +2 -0
  382. package/src/duckdb/ub_src_optimizer.cpp +6 -0
  383. package/src/duckdb/ub_src_optimizer_compressed_materialization.cpp +6 -0
  384. package/src/duckdb/ub_src_optimizer_statistics_expression.cpp +0 -2
  385. package/src/duckdb/ub_src_parser_query_node.cpp +2 -0
  386. package/src/duckdb/ub_src_parser_transform_expression.cpp +2 -0
  387. package/src/duckdb/ub_src_planner_binder_query_node.cpp +4 -0
  388. package/src/duckdb/ub_src_planner_operator.cpp +4 -0
  389. package/src/duckdb_node.hpp +1 -0
  390. package/src/statement.cpp +104 -4
  391. package/test/columns.test.ts +243 -0
  392. package/test/test_all_types.test.ts +233 -0
  393. package/tsconfig.json +1 -0
  394. package/src/duckdb/src/execution/index/art/prefix_segment.cpp +0 -42
  395. package/src/duckdb/src/include/duckdb/execution/index/art/prefix_segment.hpp +0 -40
  396. package/src/duckdb/src/optimizer/statistics/expression/propagate_and_compress.cpp +0 -118
@@ -3,6 +3,7 @@
3
3
  #include "duckdb/parser/query_node/select_node.hpp"
4
4
  #include "duckdb/parser/query_node/set_operation_node.hpp"
5
5
  #include "duckdb/parser/query_node/recursive_cte_node.hpp"
6
+ #include "duckdb/parser/query_node/cte_node.hpp"
6
7
  #include "duckdb/common/limits.hpp"
7
8
  #include "duckdb/common/field_writer.hpp"
8
9
  #include "duckdb/common/serializer/format_serializer.hpp"
@@ -21,6 +22,7 @@ CommonTableExpressionMap CommonTableExpressionMap::Copy() const {
21
22
  kv_info->aliases.push_back(al);
22
23
  }
23
24
  kv_info->query = unique_ptr_cast<SQLStatement, SelectStatement>(kv.second->query->Copy());
25
+ kv_info->materialized = kv.second->materialized;
24
26
  res.map[kv.first] = std::move(kv_info);
25
27
  }
26
28
  return res;
@@ -59,7 +61,13 @@ string CommonTableExpressionMap::ToString() const {
59
61
  }
60
62
  result += ")";
61
63
  }
62
- result += " AS (";
64
+ if (kv.second->materialized == CTEMaterialize::CTE_MATERIALIZE_ALWAYS) {
65
+ result += " AS MATERIALIZED (";
66
+ } else if (kv.second->materialized == CTEMaterialize::CTE_MATERIALIZE_NEVER) {
67
+ result += " AS NOT MATERIALIZED (";
68
+ } else {
69
+ result += " AS (";
70
+ }
63
71
  result += cte.query->ToString();
64
72
  result += ")";
65
73
  first_cte = false;
@@ -159,6 +167,7 @@ void QueryNode::CopyProperties(QueryNode &other) const {
159
167
  kv_info->aliases.push_back(al);
160
168
  }
161
169
  kv_info->query = unique_ptr_cast<SQLStatement, SelectStatement>(kv.second->query->Copy());
170
+ kv_info->materialized = kv.second->materialized;
162
171
  other.cte_map.map[kv.first] = std::move(kv_info);
163
172
  }
164
173
  }
@@ -175,6 +184,7 @@ void QueryNode::Serialize(Serializer &main_serializer) const {
175
184
  serializer.WriteString(cte.first);
176
185
  serializer.WriteStringVector(cte.second->aliases);
177
186
  cte.second->query->Serialize(serializer);
187
+ writer.WriteField<CTEMaterialize>(cte.second->materialized);
178
188
  }
179
189
  Serialize(writer);
180
190
 
@@ -207,6 +217,9 @@ unique_ptr<QueryNode> QueryNode::FormatDeserialize(FormatDeserializer &deseriali
207
217
  case QueryNodeType::RECURSIVE_CTE_NODE:
208
218
  result = RecursiveCTENode::FormatDeserialize(deserializer);
209
219
  break;
220
+ case QueryNodeType::CTE_NODE:
221
+ result = CTENode::FormatDeserialize(deserializer);
222
+ break;
210
223
  default:
211
224
  throw SerializationException("Could not deserialize Query Node: unknown type!");
212
225
  }
@@ -231,6 +244,7 @@ unique_ptr<QueryNode> QueryNode::Deserialize(Deserializer &main_source) {
231
244
  auto info = make_uniq<CommonTableExpressionInfo>();
232
245
  source.ReadStringVector(info->aliases);
233
246
  info->query = SelectStatement::Deserialize(source);
247
+ info->materialized = reader.ReadField<CTEMaterialize>(CTEMaterialize::CTE_MATERIALIZE_DEFAULT);
234
248
  new_map[name] = std::move(info);
235
249
  }
236
250
  unique_ptr<QueryNode> result;
@@ -244,6 +258,9 @@ unique_ptr<QueryNode> QueryNode::Deserialize(Deserializer &main_source) {
244
258
  case QueryNodeType::RECURSIVE_CTE_NODE:
245
259
  result = RecursiveCTENode::Deserialize(reader);
246
260
  break;
261
+ case QueryNodeType::CTE_NODE:
262
+ result = CTENode::Deserialize(reader);
263
+ break;
247
264
  default:
248
265
  throw SerializationException("Could not deserialize Query Node: unknown type!");
249
266
  }
@@ -28,6 +28,9 @@ string JoinRef::ToString() const {
28
28
  case JoinRefType::POSITIONAL:
29
29
  result += "POSITIONAL JOIN ";
30
30
  break;
31
+ case JoinRefType::DEPENDENT:
32
+ result += "DEPENDENT JOIN ";
33
+ break;
31
34
  }
32
35
  result += right->ToString();
33
36
  if (condition) {
@@ -1,8 +1,11 @@
1
- #include "duckdb/parser/expression/constant_expression.hpp"
2
- #include "duckdb/parser/transformer.hpp"
3
- #include "duckdb/common/operator/cast_operators.hpp"
1
+ #include "duckdb/common/enum_util.hpp"
4
2
  #include "duckdb/common/limits.hpp"
3
+ #include "duckdb/common/operator/cast_operators.hpp"
5
4
  #include "duckdb/common/types/decimal.hpp"
5
+ #include "duckdb/parser/expression/cast_expression.hpp"
6
+ #include "duckdb/parser/expression/constant_expression.hpp"
7
+ #include "duckdb/parser/expression/function_expression.hpp"
8
+ #include "duckdb/parser/transformer.hpp"
6
9
 
7
10
  namespace duckdb {
8
11
 
@@ -76,4 +79,53 @@ unique_ptr<ParsedExpression> Transformer::TransformConstant(duckdb_libpgquery::P
76
79
  return TransformValue(c.val);
77
80
  }
78
81
 
82
+ bool Transformer::ConstructConstantFromExpression(const ParsedExpression &expr, Value &value) {
83
+ // We have to construct it like this because we don't have the ClientContext for binding/executing the expr here
84
+ switch (expr.type) {
85
+ case ExpressionType::FUNCTION: {
86
+ auto &function = expr.Cast<FunctionExpression>();
87
+ if (function.function_name == "struct_pack") {
88
+ unordered_set<string> unique_names;
89
+ child_list_t<Value> values;
90
+ values.reserve(function.children.size());
91
+ for (const auto &child : function.children) {
92
+ if (!unique_names.insert(child->alias).second) {
93
+ throw BinderException("Duplicate struct entry name \"%s\"", child->alias);
94
+ }
95
+ Value child_value;
96
+ if (!ConstructConstantFromExpression(*child, child_value)) {
97
+ return false;
98
+ }
99
+ values.emplace_back(child->alias, std::move(child_value));
100
+ }
101
+ value = Value::STRUCT(std::move(values));
102
+ return true;
103
+ } else {
104
+ return false;
105
+ }
106
+ }
107
+ case ExpressionType::VALUE_CONSTANT: {
108
+ auto &constant = expr.Cast<ConstantExpression>();
109
+ value = constant.value;
110
+ return true;
111
+ }
112
+ case ExpressionType::OPERATOR_CAST: {
113
+ auto &cast = expr.Cast<CastExpression>();
114
+ Value dummy_value;
115
+ if (!ConstructConstantFromExpression(*cast.child, dummy_value)) {
116
+ return false;
117
+ }
118
+
119
+ string error_message;
120
+ if (!dummy_value.DefaultTryCastAs(cast.cast_type, value, &error_message)) {
121
+ throw ConversionException("Unable to cast %s to %s", dummy_value.ToString(),
122
+ EnumUtil::ToString(cast.cast_type.id()));
123
+ }
124
+ return true;
125
+ }
126
+ default:
127
+ return false;
128
+ }
129
+ }
130
+
79
131
  } // namespace duckdb
@@ -75,6 +75,8 @@ unique_ptr<ParsedExpression> Transformer::TransformExpression(duckdb_libpgquery:
75
75
  return TransformStarExpression(PGCast<duckdb_libpgquery::PGAStar>(node));
76
76
  case duckdb_libpgquery::T_PGBooleanTest:
77
77
  return TransformBooleanTest(PGCast<duckdb_libpgquery::PGBooleanTest>(node));
78
+ case duckdb_libpgquery::T_PGMultiAssignRef:
79
+ return TransformMultiAssignRef(PGCast<duckdb_libpgquery::PGMultiAssignRef>(node));
78
80
 
79
81
  default:
80
82
  throw NotImplementedException("Expression type %s (%d)", NodetypeToString(node.type), (int)node.type);
@@ -0,0 +1,44 @@
1
+ #include "duckdb/parser/parsed_expression.hpp"
2
+ #include "duckdb/parser/transformer.hpp"
3
+
4
+ namespace duckdb {
5
+
6
+ unique_ptr<ParsedExpression> Transformer::TransformMultiAssignRef(duckdb_libpgquery::PGMultiAssignRef &root) {
7
+ // Multi assignment for the ROW function
8
+ if (root.source->type == duckdb_libpgquery::T_PGFuncCall) {
9
+ auto func = PGCast<duckdb_libpgquery::PGFuncCall>(*root.source);
10
+
11
+ // Explicitly only allow ROW function
12
+ char const *function_name =
13
+ PGPointerCast<duckdb_libpgquery::PGValue>(func.funcname->tail->data.ptr_value)->val.str;
14
+ if (function_name == nullptr || strlen(function_name) != 3 || strncmp(function_name, "row", 3) != 0) {
15
+ return TransformExpression(root.source);
16
+ }
17
+
18
+ // Too many columns (ie. (x, y) = (1, 2, 3) )
19
+ if (root.ncolumns < func.args->length) {
20
+ throw ParserException(
21
+ "Could not perform multiple assignment, target only expects %d values, %d were provided", root.ncolumns,
22
+ func.args->length);
23
+ }
24
+
25
+ // Get the expression corresponding with the current column
26
+ idx_t idx = 1;
27
+ auto list = func.args->head;
28
+ while (list && idx < static_cast<idx_t>(root.colno)) {
29
+ list = list->next;
30
+ ++idx;
31
+ }
32
+
33
+ // Not enough columns (ie. (x, y, z) = (1, 2) )
34
+ if (!list) {
35
+ throw ParserException(
36
+ "Could not perform multiple assignment, target expects %d values, only %d were provided", root.ncolumns,
37
+ func.args->length);
38
+ }
39
+ return TransformExpression(reinterpret_cast<duckdb_libpgquery::PGNode *>(list->data.ptr_value));
40
+ }
41
+ return TransformExpression(root.source);
42
+ }
43
+
44
+ } // namespace duckdb
@@ -3,6 +3,7 @@
3
3
  #include "duckdb/common/exception.hpp"
4
4
  #include "duckdb/parser/statement/select_statement.hpp"
5
5
  #include "duckdb/parser/query_node/recursive_cte_node.hpp"
6
+ #include "duckdb/parser/query_node/cte_node.hpp"
6
7
 
7
8
  namespace duckdb {
8
9
 
@@ -10,6 +11,7 @@ unique_ptr<CommonTableExpressionInfo> CommonTableExpressionInfo::Copy() {
10
11
  auto result = make_uniq<CommonTableExpressionInfo>();
11
12
  result->aliases = aliases;
12
13
  result->query = unique_ptr_cast<SQLStatement, SelectStatement>(query->Copy());
14
+ result->materialized = materialized;
13
15
  return result;
14
16
  }
15
17
 
@@ -29,7 +31,8 @@ void Transformer::ExtractCTEsRecursive(CommonTableExpressionMap &cte_map) {
29
31
  }
30
32
  }
31
33
 
32
- void Transformer::TransformCTE(duckdb_libpgquery::PGWithClause &de_with_clause, CommonTableExpressionMap &cte_map) {
34
+ void Transformer::TransformCTE(duckdb_libpgquery::PGWithClause &de_with_clause, CommonTableExpressionMap &cte_map,
35
+ vector<unique_ptr<CTENode>> &materialized_ctes) {
33
36
  // TODO: might need to update in case of future lawsuit
34
37
  stored_cte_map.push_back(&cte_map);
35
38
 
@@ -79,6 +82,21 @@ void Transformer::TransformCTE(duckdb_libpgquery::PGWithClause &de_with_clause,
79
82
  // can't have two CTEs with same name
80
83
  throw ParserException("Duplicate CTE name \"%s\"", cte_name);
81
84
  }
85
+
86
+ #ifdef DUCKDB_ALTERNATIVE_VERIFY
87
+ if (cte.ctematerialized == duckdb_libpgquery::PGCTEMaterializeDefault) {
88
+ #else
89
+ if (cte.ctematerialized == duckdb_libpgquery::PGCTEMaterializeAlways) {
90
+ #endif
91
+ auto materialize = make_uniq<CTENode>();
92
+ materialize->query = info->query->node->Copy();
93
+ materialize->ctename = cte_name;
94
+ materialize->aliases = info->aliases;
95
+ materialized_ctes.push_back(std::move(materialize));
96
+
97
+ info->materialized = CTEMaterialize::CTE_MATERIALIZE_ALWAYS;
98
+ }
99
+
82
100
  cte_map.map[cte_name] = std::move(info);
83
101
  }
84
102
  }
@@ -1,6 +1,8 @@
1
1
  #include "duckdb/common/string_util.hpp"
2
2
  #include "duckdb/common/types/value.hpp"
3
+ #include "duckdb/core_functions/scalar/struct_functions.hpp"
3
4
  #include "duckdb/parser/expression/constant_expression.hpp"
5
+ #include "duckdb/parser/expression/function_expression.hpp"
4
6
  #include "duckdb/parser/statement/copy_statement.hpp"
5
7
  #include "duckdb/parser/tableref/basetableref.hpp"
6
8
  #include "duckdb/parser/transformer.hpp"
@@ -47,6 +49,17 @@ void Transformer::TransformCopyOptions(CopyInfo &info, optional_ptr<duckdb_libpg
47
49
  case duckdb_libpgquery::T_PGAStar:
48
50
  info.options[def_elem->defname].push_back(Value("*"));
49
51
  break;
52
+ case duckdb_libpgquery::T_PGFuncCall: {
53
+ auto func_call = PGPointerCast<duckdb_libpgquery::PGFuncCall>(def_elem->arg);
54
+ auto func_expr = TransformFuncCall(*func_call);
55
+
56
+ Value value;
57
+ if (!Transformer::ConstructConstantFromExpression(*func_expr, value)) {
58
+ throw ParserException("Unsupported expression in COPY options: %s", func_expr->ToString());
59
+ }
60
+ info.options[def_elem->defname].push_back(std::move(value));
61
+ break;
62
+ }
50
63
  default: {
51
64
  auto val = PGPointerCast<duckdb_libpgquery::PGValue>(def_elem->arg);
52
65
  info.options[def_elem->defname].push_back(TransformValue(*val)->value);
@@ -5,8 +5,13 @@ namespace duckdb {
5
5
 
6
6
  unique_ptr<DeleteStatement> Transformer::TransformDelete(duckdb_libpgquery::PGDeleteStmt &stmt) {
7
7
  auto result = make_uniq<DeleteStatement>();
8
+ vector<unique_ptr<CTENode>> materialized_ctes;
8
9
  if (stmt.withClause) {
9
- TransformCTE(*PGPointerCast<duckdb_libpgquery::PGWithClause>(stmt.withClause), result->cte_map);
10
+ TransformCTE(*PGPointerCast<duckdb_libpgquery::PGWithClause>(stmt.withClause), result->cte_map,
11
+ materialized_ctes);
12
+ if (!materialized_ctes.empty()) {
13
+ throw NotImplementedException("Materialized CTEs are not implemented for delete.");
14
+ }
10
15
  }
11
16
 
12
17
  result->condition = TransformExpression(stmt.whereClause);
@@ -24,8 +24,13 @@ unique_ptr<TableRef> Transformer::TransformValuesList(duckdb_libpgquery::PGList
24
24
 
25
25
  unique_ptr<InsertStatement> Transformer::TransformInsert(duckdb_libpgquery::PGInsertStmt &stmt) {
26
26
  auto result = make_uniq<InsertStatement>();
27
+ vector<unique_ptr<CTENode>> materialized_ctes;
27
28
  if (stmt.withClause) {
28
- TransformCTE(*PGPointerCast<duckdb_libpgquery::PGWithClause>(stmt.withClause), result->cte_map);
29
+ TransformCTE(*PGPointerCast<duckdb_libpgquery::PGWithClause>(stmt.withClause), result->cte_map,
30
+ materialized_ctes);
31
+ if (!materialized_ctes.empty()) {
32
+ throw NotImplementedException("Materialized CTEs are not implemented for insert.");
33
+ }
29
34
  }
30
35
 
31
36
  // first check if there are any columns specified
@@ -128,9 +128,11 @@ unique_ptr<QueryNode> Transformer::TransformPivotStatement(duckdb_libpgquery::PG
128
128
  auto source = TransformTableRefNode(*pivot->source);
129
129
 
130
130
  auto select_node = make_uniq<SelectNode>();
131
+ vector<unique_ptr<CTENode>> materialized_ctes;
131
132
  // handle the CTEs
132
133
  if (select.withClause) {
133
- TransformCTE(*PGPointerCast<duckdb_libpgquery::PGWithClause>(select.withClause), select_node->cte_map);
134
+ TransformCTE(*PGPointerCast<duckdb_libpgquery::PGWithClause>(select.withClause), select_node->cte_map,
135
+ materialized_ctes);
134
136
  }
135
137
  if (!pivot->columns) {
136
138
  // no pivot columns - not actually a pivot
@@ -197,7 +199,10 @@ unique_ptr<QueryNode> Transformer::TransformPivotStatement(duckdb_libpgquery::PG
197
199
  select_node->from_table = std::move(pivot_ref);
198
200
  // transform order by/limit modifiers
199
201
  TransformModifiers(select, *select_node);
200
- return std::move(select_node);
202
+
203
+ auto node = Transformer::TransformMaterializedCTE(std::move(select_node), materialized_ctes);
204
+
205
+ return node;
201
206
  }
202
207
 
203
208
  } // namespace duckdb
@@ -1,11 +1,12 @@
1
- #include "duckdb/parser/statement/pragma_statement.hpp"
2
- #include "duckdb/parser/transformer.hpp"
3
- #include "duckdb/parser/expression/constant_expression.hpp"
4
- #include "duckdb/parser/expression/comparison_expression.hpp"
5
- #include "duckdb/execution/expression_executor.hpp"
6
- #include "duckdb/parser/statement/set_statement.hpp"
7
1
  #include "duckdb/common/case_insensitive_map.hpp"
2
+ #include "duckdb/common/enum_util.hpp"
3
+ #include "duckdb/execution/expression_executor.hpp"
8
4
  #include "duckdb/parser/expression/columnref_expression.hpp"
5
+ #include "duckdb/parser/expression/comparison_expression.hpp"
6
+ #include "duckdb/parser/expression/constant_expression.hpp"
7
+ #include "duckdb/parser/statement/pragma_statement.hpp"
8
+ #include "duckdb/parser/statement/set_statement.hpp"
9
+ #include "duckdb/parser/transformer.hpp"
9
10
 
10
11
  namespace duckdb {
11
12
 
@@ -22,15 +23,17 @@ unique_ptr<SQLStatement> Transformer::TransformPragma(duckdb_libpgquery::PGPragm
22
23
 
23
24
  if (expr->type == ExpressionType::COMPARE_EQUAL) {
24
25
  auto &comp = expr->Cast<ComparisonExpression>();
25
- if (comp.right->type != ExpressionType::VALUE_CONSTANT) {
26
- throw ParserException("Named parameter requires a constant on the RHS");
27
- }
28
26
  if (comp.left->type != ExpressionType::COLUMN_REF) {
29
27
  throw ParserException("Named parameter requires a column reference on the LHS");
30
28
  }
31
29
  auto &columnref = comp.left->Cast<ColumnRefExpression>();
32
- auto &constant = comp.right->Cast<ConstantExpression>();
33
- info.named_parameters[columnref.GetName()] = constant.value;
30
+
31
+ Value rhs_value;
32
+ if (!Transformer::ConstructConstantFromExpression(*comp.right, rhs_value)) {
33
+ throw ParserException("Named parameter requires a constant on the RHS");
34
+ }
35
+
36
+ info.named_parameters[columnref.GetName()] = rhs_value;
34
37
  } else if (node->type == duckdb_libpgquery::T_PGAConst) {
35
38
  auto constant = TransformConstant(*PGPointerCast<duckdb_libpgquery::PGAConst>(node.get()));
36
39
  info.parameters.push_back((constant->Cast<ConstantExpression>()).value);
@@ -5,6 +5,7 @@
5
5
  #include "duckdb/parser/query_node/set_operation_node.hpp"
6
6
  #include "duckdb/parser/statement/select_statement.hpp"
7
7
  #include "duckdb/parser/transformer.hpp"
8
+ #include "duckdb/parser/query_node/cte_node.hpp"
8
9
 
9
10
  namespace duckdb {
10
11
 
@@ -45,13 +46,15 @@ unique_ptr<QueryNode> Transformer::TransformSelectInternal(duckdb_libpgquery::PG
45
46
  auto stack_checker = StackCheck();
46
47
 
47
48
  unique_ptr<QueryNode> node;
49
+ vector<unique_ptr<CTENode>> materialized_ctes;
48
50
 
49
51
  switch (stmt.op) {
50
52
  case duckdb_libpgquery::PG_SETOP_NONE: {
51
53
  node = make_uniq<SelectNode>();
52
54
  auto &result = node->Cast<SelectNode>();
53
55
  if (stmt.withClause) {
54
- TransformCTE(*PGPointerCast<duckdb_libpgquery::PGWithClause>(stmt.withClause), node->cte_map);
56
+ TransformCTE(*PGPointerCast<duckdb_libpgquery::PGWithClause>(stmt.withClause), node->cte_map,
57
+ materialized_ctes);
55
58
  }
56
59
  if (stmt.windowClause) {
57
60
  for (auto window_ele = stmt.windowClause->head; window_ele != nullptr; window_ele = window_ele->next) {
@@ -113,7 +116,8 @@ unique_ptr<QueryNode> Transformer::TransformSelectInternal(duckdb_libpgquery::PG
113
116
  node = make_uniq<SetOperationNode>();
114
117
  auto &result = node->Cast<SetOperationNode>();
115
118
  if (stmt.withClause) {
116
- TransformCTE(*PGPointerCast<duckdb_libpgquery::PGWithClause>(stmt.withClause), node->cte_map);
119
+ TransformCTE(*PGPointerCast<duckdb_libpgquery::PGWithClause>(stmt.withClause), node->cte_map,
120
+ materialized_ctes);
117
121
  }
118
122
  result.left = TransformSelectNode(*stmt.larg);
119
123
  result.right = TransformSelectNode(*stmt.rarg);
@@ -151,7 +155,12 @@ unique_ptr<QueryNode> Transformer::TransformSelectInternal(duckdb_libpgquery::PG
151
155
  default:
152
156
  throw NotImplementedException("Statement type %d not implemented!", stmt.op);
153
157
  }
158
+
154
159
  TransformModifiers(stmt, *node);
160
+
161
+ // Handle materialized CTEs
162
+ node = Transformer::TransformMaterializedCTE(std::move(node), materialized_ctes);
163
+
155
164
  return node;
156
165
  }
157
166
 
@@ -19,8 +19,13 @@ unique_ptr<UpdateSetInfo> Transformer::TransformUpdateSetInfo(duckdb_libpgquery:
19
19
 
20
20
  unique_ptr<UpdateStatement> Transformer::TransformUpdate(duckdb_libpgquery::PGUpdateStmt &stmt) {
21
21
  auto result = make_uniq<UpdateStatement>();
22
+ vector<unique_ptr<CTENode>> materialized_ctes;
22
23
  if (stmt.withClause) {
23
- TransformCTE(*PGPointerCast<duckdb_libpgquery::PGWithClause>(stmt.withClause), result->cte_map);
24
+ TransformCTE(*PGPointerCast<duckdb_libpgquery::PGWithClause>(stmt.withClause), result->cte_map,
25
+ materialized_ctes);
26
+ if (!materialized_ctes.empty()) {
27
+ throw NotImplementedException("Materialized CTEs are not implemented for update.");
28
+ }
24
29
  }
25
30
 
26
31
  result->table = TransformRangeVar(*stmt.relation);
@@ -4,6 +4,7 @@
4
4
  #include "duckdb/parser/statement/list.hpp"
5
5
  #include "duckdb/parser/tableref/emptytableref.hpp"
6
6
  #include "duckdb/parser/query_node/select_node.hpp"
7
+ #include "duckdb/parser/query_node/cte_node.hpp"
7
8
  #include "duckdb/parser/parser_options.hpp"
8
9
 
9
10
  namespace duckdb {
@@ -209,4 +210,18 @@ unique_ptr<SQLStatement> Transformer::TransformStatementInternal(duckdb_libpgque
209
210
  }
210
211
  }
211
212
 
213
+ unique_ptr<QueryNode> Transformer::TransformMaterializedCTE(unique_ptr<QueryNode> root,
214
+ vector<unique_ptr<CTENode>> &materialized_ctes) {
215
+ while (!materialized_ctes.empty()) {
216
+ unique_ptr<CTENode> node_result;
217
+ node_result = std::move(materialized_ctes.back());
218
+ node_result->cte_map = root->cte_map.Copy();
219
+ node_result->child = std::move(root);
220
+ root = std::move(node_result);
221
+ materialized_ctes.pop_back();
222
+ }
223
+
224
+ return root;
225
+ }
226
+
212
227
  } // namespace duckdb
@@ -0,0 +1,64 @@
1
+ #include "duckdb/parser/expression/constant_expression.hpp"
2
+ #include "duckdb/parser/expression_map.hpp"
3
+ #include "duckdb/parser/query_node/select_node.hpp"
4
+ #include "duckdb/parser/query_node/cte_node.hpp"
5
+ #include "duckdb/planner/binder.hpp"
6
+ #include "duckdb/planner/query_node/bound_cte_node.hpp"
7
+ #include "duckdb/planner/query_node/bound_select_node.hpp"
8
+
9
+ namespace duckdb {
10
+
11
+ unique_ptr<BoundQueryNode> Binder::BindNode(CTENode &statement) {
12
+ auto result = make_uniq<BoundCTENode>();
13
+
14
+ // first recursively visit the materialized CTE operations
15
+ // the left side is visited first and is added to the BindContext of the right side
16
+ D_ASSERT(statement.query);
17
+ D_ASSERT(statement.child);
18
+
19
+ result->ctename = statement.ctename;
20
+ result->setop_index = GenerateTableIndex();
21
+
22
+ result->query_binder = Binder::CreateBinder(context, this);
23
+ result->query = result->query_binder->BindNode(*statement.query);
24
+
25
+ // the result types of the CTE are the types of the LHS
26
+ result->types = result->query->types;
27
+ // names are picked from the LHS, unless aliases are explicitly specified
28
+ result->names = result->query->names;
29
+ for (idx_t i = 0; i < statement.aliases.size() && i < result->names.size(); i++) {
30
+ result->names[i] = statement.aliases[i];
31
+ }
32
+
33
+ // This allows the right side to reference the CTE
34
+ bind_context.AddGenericBinding(result->setop_index, statement.ctename, result->names, result->types);
35
+
36
+ result->child_binder = Binder::CreateBinder(context, this);
37
+
38
+ // Move all modifiers to the child node.
39
+ for (auto &modifier : statement.modifiers) {
40
+ statement.child->modifiers.push_back(std::move(modifier));
41
+ }
42
+
43
+ statement.modifiers.clear();
44
+
45
+ // Add bindings of left side to temporary CTE bindings context
46
+ result->child_binder->bind_context.AddCTEBinding(result->setop_index, statement.ctename, result->names,
47
+ result->types);
48
+ result->child = result->child_binder->BindNode(*statement.child);
49
+
50
+ // the result types of the CTE are the types of the LHS
51
+ result->types = result->child->types;
52
+ // names are picked from the LHS, unless aliases are explicitly specified
53
+ result->names = result->child->names;
54
+ for (idx_t i = 0; i < statement.aliases.size() && i < result->names.size(); i++) {
55
+ result->names[i] = statement.aliases[i];
56
+ }
57
+
58
+ MoveCorrelatedExpressions(*result->query_binder);
59
+ MoveCorrelatedExpressions(*result->child_binder);
60
+
61
+ return std::move(result);
62
+ }
63
+
64
+ } // namespace duckdb
@@ -0,0 +1,26 @@
1
+ #include "duckdb/common/string_util.hpp"
2
+ #include "duckdb/planner/binder.hpp"
3
+ #include "duckdb/planner/expression/bound_cast_expression.hpp"
4
+ #include "duckdb/planner/operator/logical_materialized_cte.hpp"
5
+ #include "duckdb/planner/operator/logical_projection.hpp"
6
+ #include "duckdb/planner/operator/logical_set_operation.hpp"
7
+ #include "duckdb/planner/query_node/bound_cte_node.hpp"
8
+
9
+ namespace duckdb {
10
+
11
+ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundCTENode &node) {
12
+ // Generate the logical plan for the cte_query and child.
13
+ auto cte_query = CreatePlan(*node.query);
14
+ auto cte_child = CreatePlan(*node.child);
15
+
16
+ auto root = make_uniq<LogicalMaterializedCTE>(node.ctename, node.setop_index, node.types.size(),
17
+ std::move(cte_query), std::move(cte_child));
18
+
19
+ // check if there are any unplanned subqueries left in either child
20
+ has_unplanned_dependent_joins =
21
+ node.child_binder->has_unplanned_dependent_joins || node.query_binder->has_unplanned_dependent_joins;
22
+
23
+ return VisitQueryNode(node, std::move(root));
24
+ }
25
+
26
+ } // namespace duckdb
@@ -10,15 +10,15 @@ namespace duckdb {
10
10
 
11
11
  unique_ptr<LogicalOperator> Binder::CreatePlan(BoundRecursiveCTENode &node) {
12
12
  // Generate the logical plan for the left and right sides of the set operation
13
- node.left_binder->plan_subquery = plan_subquery;
14
- node.right_binder->plan_subquery = plan_subquery;
13
+ node.left_binder->is_outside_flattened = is_outside_flattened;
14
+ node.right_binder->is_outside_flattened = is_outside_flattened;
15
15
 
16
16
  auto left_node = node.left_binder->CreatePlan(*node.left);
17
17
  auto right_node = node.right_binder->CreatePlan(*node.right);
18
18
 
19
19
  // check if there are any unplanned subqueries left in either child
20
- has_unplanned_subqueries =
21
- node.left_binder->has_unplanned_subqueries || node.right_binder->has_unplanned_subqueries;
20
+ has_unplanned_dependent_joins =
21
+ node.left_binder->has_unplanned_dependent_joins || node.right_binder->has_unplanned_dependent_joins;
22
22
 
23
23
  // for both the left and right sides, cast them to the same types
24
24
  left_node = CastLogicalOperatorToTypes(node.left->types, node.types, std::move(left_node));
@@ -30,7 +30,7 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundRecursiveCTENode &node) {
30
30
  std::move(right_node), LogicalOperatorType::LOGICAL_UNION);
31
31
  return VisitQueryNode(node, std::move(root));
32
32
  }
33
- auto root = make_uniq<LogicalRecursiveCTE>(node.setop_index, node.types.size(), node.union_all,
33
+ auto root = make_uniq<LogicalRecursiveCTE>(node.ctename, node.setop_index, node.types.size(), node.union_all,
34
34
  std::move(left_node), std::move(right_node));
35
35
 
36
36
  return VisitQueryNode(node, std::move(root));
@@ -60,8 +60,8 @@ unique_ptr<LogicalOperator> Binder::CastLogicalOperatorToTypes(vector<LogicalTyp
60
60
 
61
61
  unique_ptr<LogicalOperator> Binder::CreatePlan(BoundSetOperationNode &node) {
62
62
  // Generate the logical plan for the left and right sides of the set operation
63
- node.left_binder->plan_subquery = plan_subquery;
64
- node.right_binder->plan_subquery = plan_subquery;
63
+ node.left_binder->is_outside_flattened = is_outside_flattened;
64
+ node.right_binder->is_outside_flattened = is_outside_flattened;
65
65
 
66
66
  auto left_node = node.left_binder->CreatePlan(*node.left);
67
67
  auto right_node = node.right_binder->CreatePlan(*node.right);
@@ -95,8 +95,8 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundSetOperationNode &node) {
95
95
  }
96
96
 
97
97
  // check if there are any unplanned subqueries left in either child
98
- has_unplanned_subqueries =
99
- node.left_binder->has_unplanned_subqueries || node.right_binder->has_unplanned_subqueries;
98
+ has_unplanned_dependent_joins =
99
+ node.left_binder->has_unplanned_dependent_joins || node.right_binder->has_unplanned_dependent_joins;
100
100
 
101
101
  // create actual logical ops for setops
102
102
  LogicalOperatorType logical_type;