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
@@ -117,6 +117,9 @@ unique_ptr<BoundQueryNode> Binder::BindNode(QueryNode &node) {
117
117
  case QueryNodeType::RECURSIVE_CTE_NODE:
118
118
  result = BindNode(node.Cast<RecursiveCTENode>());
119
119
  break;
120
+ case QueryNodeType::CTE_NODE:
121
+ result = BindNode(node.Cast<CTENode>());
122
+ break;
120
123
  default:
121
124
  D_ASSERT(node.type == QueryNodeType::SET_OPERATION_NODE);
122
125
  result = BindNode(node.Cast<SetOperationNode>());
@@ -145,6 +148,8 @@ unique_ptr<LogicalOperator> Binder::CreatePlan(BoundQueryNode &node) {
145
148
  return CreatePlan(node.Cast<BoundSetOperationNode>());
146
149
  case QueryNodeType::RECURSIVE_CTE_NODE:
147
150
  return CreatePlan(node.Cast<BoundRecursiveCTENode>());
151
+ case QueryNodeType::CTE_NODE:
152
+ return CreatePlan(node.Cast<BoundCTENode>());
148
153
  default:
149
154
  throw InternalException("Unsupported bound query node type");
150
155
  }
@@ -15,7 +15,7 @@ BoundAggregateExpression::BoundAggregateExpression(AggregateFunction function, v
15
15
  : Expression(ExpressionType::BOUND_AGGREGATE, ExpressionClass::BOUND_AGGREGATE, function.return_type),
16
16
  function(std::move(function)), children(std::move(children)), bind_info(std::move(bind_info)),
17
17
  aggr_type(aggr_type), filter(std::move(filter)) {
18
- D_ASSERT(!function.name.empty());
18
+ D_ASSERT(!this->function.name.empty());
19
19
  }
20
20
 
21
21
  string BoundAggregateExpression::ToString() const {
@@ -31,41 +31,10 @@ BindResult LateralBinder::BindColumnRef(unique_ptr<ParsedExpression> &expr_ptr,
31
31
  if (result.HasError()) {
32
32
  return result;
33
33
  }
34
- if (depth > 1) {
35
- throw BinderException("Nested lateral joins are not supported yet");
36
- }
37
34
  ExtractCorrelatedColumns(*result.expression);
38
35
  return result;
39
36
  }
40
37
 
41
- vector<CorrelatedColumnInfo> LateralBinder::ExtractCorrelatedColumns(Binder &binder) {
42
-
43
- if (correlated_columns.empty()) {
44
- return binder.correlated_columns;
45
- }
46
-
47
- // clear outer
48
- correlated_columns.clear();
49
- auto all_correlated_columns = binder.correlated_columns;
50
-
51
- // remove outer from inner
52
- for (auto &corr_column : correlated_columns) {
53
- auto entry = std::find(binder.correlated_columns.begin(), binder.correlated_columns.end(), corr_column);
54
- if (entry != binder.correlated_columns.end()) {
55
- binder.correlated_columns.erase(entry);
56
- }
57
- }
58
-
59
- // add inner to outer
60
- for (auto &corr_column : binder.correlated_columns) {
61
- correlated_columns.push_back(corr_column);
62
- }
63
-
64
- // clear inner
65
- binder.correlated_columns.clear();
66
- return all_correlated_columns;
67
- }
68
-
69
38
  BindResult LateralBinder::BindExpression(unique_ptr<ParsedExpression> &expr_ptr, idx_t depth, bool root_expression) {
70
39
  auto &expr = *expr_ptr;
71
40
  switch (expr.GetExpressionClass()) {
@@ -125,7 +94,11 @@ protected:
125
94
  ReduceColumnRefDepth(expr.Cast<BoundColumnRefExpression>());
126
95
  }
127
96
  if (expr.GetExpressionClass() == ExpressionClass::BOUND_SUBQUERY) {
97
+ auto &subquery_ref = expr.Cast<BoundSubqueryExpression>();
128
98
  ReduceExpressionSubquery(expr.Cast<BoundSubqueryExpression>());
99
+ // Recursively update the depth in the bindings of the children nodes
100
+ ExpressionIterator::EnumerateQueryNodeChildren(
101
+ *subquery_ref.subquery, [&](Expression &child_expr) { ReduceExpressionDepth(child_expr); });
129
102
  }
130
103
  }
131
104
 
@@ -79,9 +79,12 @@ bool ExpressionBinder::BindCorrelatedColumns(unique_ptr<ParsedExpression> &expr)
79
79
  auto &active_binders = binder.GetActiveBinders();
80
80
  // make a copy of the set of binders, so we can restore it later
81
81
  auto binders = active_binders;
82
+
83
+ // we already failed with the current binder
82
84
  active_binders.pop_back();
83
85
  idx_t depth = 1;
84
86
  bool success = false;
87
+
85
88
  while (!active_binders.empty()) {
86
89
  auto &next_binder = active_binders.back().get();
87
90
  ExpressionBinder::QualifyColumnNames(next_binder.binder, expr);
@@ -5,6 +5,7 @@
5
5
  #include "duckdb/planner/query_node/bound_select_node.hpp"
6
6
  #include "duckdb/planner/query_node/bound_set_operation_node.hpp"
7
7
  #include "duckdb/planner/query_node/bound_recursive_cte_node.hpp"
8
+ #include "duckdb/planner/query_node/bound_cte_node.hpp"
8
9
  #include "duckdb/planner/tableref/list.hpp"
9
10
 
10
11
  namespace duckdb {
@@ -198,6 +199,11 @@ void ExpressionIterator::EnumerateQueryNodeChildren(BoundQueryNode &node,
198
199
  EnumerateQueryNodeChildren(*cte_node.right, callback);
199
200
  break;
200
201
  }
202
+ case QueryNodeType::CTE_NODE: {
203
+ auto &cte_node = node.Cast<BoundCTENode>();
204
+ EnumerateQueryNodeChildren(*cte_node.child, callback);
205
+ break;
206
+ }
201
207
  case QueryNodeType::SELECT_NODE: {
202
208
  auto &bound_select = node.Cast<BoundSelectNode>();
203
209
  for (auto &expr : bound_select.select_list) {
@@ -8,6 +8,7 @@
8
8
  #include "duckdb/parser/parser.hpp"
9
9
  #include "duckdb/planner/operator/list.hpp"
10
10
  #include "duckdb/planner/operator/logical_extension_operator.hpp"
11
+ #include "duckdb/planner/operator/logical_dependent_join.hpp"
11
12
 
12
13
  namespace duckdb {
13
14
 
@@ -283,6 +284,9 @@ unique_ptr<LogicalOperator> LogicalOperator::Deserialize(Deserializer &deseriali
283
284
  case LogicalOperatorType::LOGICAL_RECURSIVE_CTE:
284
285
  result = LogicalRecursiveCTE::Deserialize(state, reader);
285
286
  break;
287
+ case LogicalOperatorType::LOGICAL_MATERIALIZED_CTE:
288
+ result = LogicalMaterializedCTE::Deserialize(state, reader);
289
+ break;
286
290
  case LogicalOperatorType::LOGICAL_INSERT:
287
291
  result = LogicalInsert::Deserialize(state, reader);
288
292
  break;
@@ -352,6 +356,7 @@ unique_ptr<LogicalOperator> LogicalOperator::Deserialize(Deserializer &deseriali
352
356
  case LogicalOperatorType::LOGICAL_PIVOT:
353
357
  result = LogicalPivot::Deserialize(state, reader);
354
358
  break;
359
+ case LogicalOperatorType::LOGICAL_DEPENDENT_JOIN:
355
360
  case LogicalOperatorType::LOGICAL_INVALID:
356
361
  /* no default here to trigger a warning if we forget to implement deserialize for a new operator */
357
362
  throw SerializationException("Invalid type for operator deserialization");
@@ -19,6 +19,7 @@ void LogicalOperatorVisitor::VisitOperatorChildren(LogicalOperator &op) {
19
19
 
20
20
  void LogicalOperatorVisitor::EnumerateExpressions(LogicalOperator &op,
21
21
  const std::function<void(unique_ptr<Expression> *child)> &callback) {
22
+
22
23
  switch (op.type) {
23
24
  case LogicalOperatorType::LOGICAL_EXPRESSION_GET: {
24
25
  auto &get = op.Cast<LogicalExpressionGet>();
@@ -67,6 +68,7 @@ void LogicalOperatorVisitor::EnumerateExpressions(LogicalOperator &op,
67
68
  }
68
69
  case LogicalOperatorType::LOGICAL_ASOF_JOIN:
69
70
  case LogicalOperatorType::LOGICAL_DELIM_JOIN:
71
+ case LogicalOperatorType::LOGICAL_DEPENDENT_JOIN:
70
72
  case LogicalOperatorType::LOGICAL_COMPARISON_JOIN: {
71
73
  if (op.type == LogicalOperatorType::LOGICAL_DELIM_JOIN) {
72
74
  auto &delim_join = op.Cast<LogicalDelimJoin>();
@@ -10,6 +10,7 @@ void LogicalCTERef::Serialize(FieldWriter &writer) const {
10
10
  writer.WriteField(cte_index);
11
11
  writer.WriteRegularSerializableList(chunk_types);
12
12
  writer.WriteList<string>(bound_columns);
13
+ writer.WriteField(materialized_cte);
13
14
  }
14
15
 
15
16
  unique_ptr<LogicalOperator> LogicalCTERef::Deserialize(LogicalDeserializationState &state, FieldReader &reader) {
@@ -17,7 +18,8 @@ unique_ptr<LogicalOperator> LogicalCTERef::Deserialize(LogicalDeserializationSta
17
18
  auto cte_index = reader.ReadRequired<idx_t>();
18
19
  auto chunk_types = reader.ReadRequiredSerializableList<LogicalType, LogicalType>();
19
20
  auto bound_columns = reader.ReadRequiredList<string>();
20
- return make_uniq<LogicalCTERef>(table_index, cte_index, chunk_types, bound_columns);
21
+ auto materialized_cte = reader.ReadField<CTEMaterialize>(CTEMaterialize::CTE_MATERIALIZE_DEFAULT);
22
+ return make_uniq<LogicalCTERef>(table_index, cte_index, chunk_types, bound_columns, materialized_cte);
21
23
  }
22
24
 
23
25
  vector<idx_t> LogicalCTERef::GetTableIndex() const {
@@ -0,0 +1,26 @@
1
+ #include "duckdb/planner/operator/logical_dependent_join.hpp"
2
+
3
+ namespace duckdb {
4
+
5
+ LogicalDependentJoin::LogicalDependentJoin(unique_ptr<LogicalOperator> left, unique_ptr<LogicalOperator> right,
6
+ vector<CorrelatedColumnInfo> correlated_columns, JoinType type,
7
+ unique_ptr<Expression> condition)
8
+ : LogicalComparisonJoin(type, LogicalOperatorType::LOGICAL_DEPENDENT_JOIN), join_condition(std::move(condition)),
9
+ correlated_columns(std::move(correlated_columns)) {
10
+ children.push_back(std::move(left));
11
+ children.push_back(std::move(right));
12
+ }
13
+
14
+ unique_ptr<LogicalOperator> LogicalDependentJoin::Create(unique_ptr<LogicalOperator> left,
15
+ unique_ptr<LogicalOperator> right,
16
+ vector<CorrelatedColumnInfo> correlated_columns, JoinType type,
17
+ unique_ptr<Expression> condition) {
18
+ return make_uniq<LogicalDependentJoin>(std::move(left), std::move(right), std::move(correlated_columns), type,
19
+ std::move(condition));
20
+ }
21
+
22
+ void LogicalDependentJoin::Serialize(FieldWriter &writer) const {
23
+ throw InternalException("LogicalDependentJoin should not exist in any plan");
24
+ }
25
+
26
+ } // namespace duckdb
@@ -0,0 +1,21 @@
1
+ #include "duckdb/planner/operator/logical_materialized_cte.hpp"
2
+
3
+ #include "duckdb/common/field_writer.hpp"
4
+
5
+ namespace duckdb {
6
+
7
+ void LogicalMaterializedCTE::Serialize(FieldWriter &writer) const {
8
+ writer.WriteField(table_index);
9
+ }
10
+
11
+ unique_ptr<LogicalOperator> LogicalMaterializedCTE::Deserialize(LogicalDeserializationState &state,
12
+ FieldReader &reader) {
13
+ auto table_index = reader.ReadRequired<idx_t>();
14
+ return unique_ptr<LogicalMaterializedCTE>(new LogicalMaterializedCTE(table_index));
15
+ }
16
+
17
+ vector<idx_t> LogicalMaterializedCTE::GetTableIndex() const {
18
+ return vector<idx_t> {table_index};
19
+ }
20
+
21
+ } // namespace duckdb
@@ -10,6 +10,7 @@
10
10
  #include "duckdb/planner/operator/list.hpp"
11
11
  #include "duckdb/planner/subquery/has_correlated_expressions.hpp"
12
12
  #include "duckdb/planner/subquery/rewrite_correlated_expressions.hpp"
13
+ #include "duckdb/planner/operator/logical_dependent_join.hpp"
13
14
 
14
15
  namespace duckdb {
15
16
 
@@ -24,20 +25,32 @@ FlattenDependentJoins::FlattenDependentJoins(Binder &binder, const vector<Correl
24
25
  }
25
26
  }
26
27
 
27
- bool FlattenDependentJoins::DetectCorrelatedExpressions(LogicalOperator *op, bool lateral) {
28
+ bool FlattenDependentJoins::DetectCorrelatedExpressions(LogicalOperator *op, bool lateral, idx_t lateral_depth) {
29
+
30
+ bool is_lateral_join = false;
31
+
28
32
  D_ASSERT(op);
29
33
  // check if this entry has correlated expressions
30
- HasCorrelatedExpressions visitor(correlated_columns, lateral);
34
+ if (op->type == LogicalOperatorType::LOGICAL_DEPENDENT_JOIN) {
35
+ is_lateral_join = true;
36
+ }
37
+ HasCorrelatedExpressions visitor(correlated_columns, lateral, lateral_depth);
31
38
  visitor.VisitOperator(*op);
32
39
  bool has_correlation = visitor.has_correlated_expressions;
40
+ int child_idx = 0;
33
41
  // now visit the children of this entry and check if they have correlated expressions
34
42
  for (auto &child : op->children) {
43
+ auto new_lateral_depth = lateral_depth;
44
+ if (is_lateral_join && child_idx == 1) {
45
+ new_lateral_depth = lateral_depth + 1;
46
+ }
35
47
  // we OR the property with its children such that has_correlation is true if either
36
48
  // (1) this node has a correlated expression or
37
49
  // (2) one of its children has a correlated expression
38
- if (DetectCorrelatedExpressions(child.get(), lateral)) {
50
+ if (DetectCorrelatedExpressions(child.get(), lateral, new_lateral_depth)) {
39
51
  has_correlation = true;
40
52
  }
53
+ child_idx++;
41
54
  }
42
55
  // set the entry in the map
43
56
  has_correlated_expressions[op] = has_correlation;
@@ -46,7 +59,7 @@ bool FlattenDependentJoins::DetectCorrelatedExpressions(LogicalOperator *op, boo
46
59
 
47
60
  unique_ptr<LogicalOperator> FlattenDependentJoins::PushDownDependentJoin(unique_ptr<LogicalOperator> plan) {
48
61
  bool propagate_null_values = true;
49
- auto result = PushDownDependentJoinInternal(std::move(plan), propagate_null_values);
62
+ auto result = PushDownDependentJoinInternal(std::move(plan), propagate_null_values, 0);
50
63
  if (!replacement_map.empty()) {
51
64
  // check if we have to replace any COUNT aggregates into "CASE WHEN X IS NULL THEN 0 ELSE COUNT END"
52
65
  RewriteCountAggregates aggr(replacement_map);
@@ -70,8 +83,10 @@ bool SubqueryDependentFilter(Expression *expr) {
70
83
  }
71
84
  return false;
72
85
  }
86
+
73
87
  unique_ptr<LogicalOperator> FlattenDependentJoins::PushDownDependentJoinInternal(unique_ptr<LogicalOperator> plan,
74
- bool &parent_propagate_null_values) {
88
+ bool &parent_propagate_null_values,
89
+ idx_t lateral_depth) {
75
90
  // first check if the logical operator has correlated expressions
76
91
  auto entry = has_correlated_expressions.find(plan.get());
77
92
  D_ASSERT(entry != has_correlated_expressions.end());
@@ -95,10 +110,11 @@ unique_ptr<LogicalOperator> FlattenDependentJoins::PushDownDependentJoinInternal
95
110
  for (auto &expr : plan->expressions) {
96
111
  any_join |= SubqueryDependentFilter(expr.get());
97
112
  }
98
- plan->children[0] = PushDownDependentJoinInternal(std::move(plan->children[0]), parent_propagate_null_values);
113
+ plan->children[0] =
114
+ PushDownDependentJoinInternal(std::move(plan->children[0]), parent_propagate_null_values, lateral_depth);
99
115
 
100
116
  // then we replace any correlated expressions with the corresponding entry in the correlated_map
101
- RewriteCorrelatedExpressions rewriter(base_binding, correlated_map);
117
+ RewriteCorrelatedExpressions rewriter(base_binding, correlated_map, lateral_depth);
102
118
  rewriter.VisitOperator(*plan);
103
119
  return plan;
104
120
  }
@@ -108,10 +124,11 @@ unique_ptr<LogicalOperator> FlattenDependentJoins::PushDownDependentJoinInternal
108
124
  for (auto &expr : plan->expressions) {
109
125
  parent_propagate_null_values &= expr->PropagatesNullValues();
110
126
  }
111
- plan->children[0] = PushDownDependentJoinInternal(std::move(plan->children[0]), parent_propagate_null_values);
127
+ plan->children[0] =
128
+ PushDownDependentJoinInternal(std::move(plan->children[0]), parent_propagate_null_values, lateral_depth);
112
129
 
113
130
  // then we replace any correlated expressions with the corresponding entry in the correlated_map
114
- RewriteCorrelatedExpressions rewriter(base_binding, correlated_map);
131
+ RewriteCorrelatedExpressions rewriter(base_binding, correlated_map, lateral_depth);
115
132
  rewriter.VisitOperator(*plan);
116
133
  // now we add all the columns of the delim_scan to the projection list
117
134
  auto &proj = plan->Cast<LogicalProjection>();
@@ -134,9 +151,10 @@ unique_ptr<LogicalOperator> FlattenDependentJoins::PushDownDependentJoinInternal
134
151
  for (auto &expr : plan->expressions) {
135
152
  parent_propagate_null_values &= expr->PropagatesNullValues();
136
153
  }
137
- plan->children[0] = PushDownDependentJoinInternal(std::move(plan->children[0]), parent_propagate_null_values);
154
+ plan->children[0] =
155
+ PushDownDependentJoinInternal(std::move(plan->children[0]), parent_propagate_null_values, lateral_depth);
138
156
  // then we replace any correlated expressions with the corresponding entry in the correlated_map
139
- RewriteCorrelatedExpressions rewriter(base_binding, correlated_map);
157
+ RewriteCorrelatedExpressions rewriter(base_binding, correlated_map, lateral_depth);
140
158
  rewriter.VisitOperator(*plan);
141
159
  // now we add all the columns of the delim_scan to the grouping operators AND the projection list
142
160
  idx_t delim_table_index;
@@ -231,22 +249,24 @@ unique_ptr<LogicalOperator> FlattenDependentJoins::PushDownDependentJoinInternal
231
249
  bool right_has_correlation = has_correlated_expressions.find(plan->children[1].get())->second;
232
250
  if (!right_has_correlation) {
233
251
  // only left has correlation: push into left
234
- plan->children[0] =
235
- PushDownDependentJoinInternal(std::move(plan->children[0]), parent_propagate_null_values);
252
+ plan->children[0] = PushDownDependentJoinInternal(std::move(plan->children[0]),
253
+ parent_propagate_null_values, lateral_depth);
236
254
  return plan;
237
255
  }
238
256
  if (!left_has_correlation) {
239
257
  // only right has correlation: push into right
240
- plan->children[1] =
241
- PushDownDependentJoinInternal(std::move(plan->children[1]), parent_propagate_null_values);
258
+ plan->children[1] = PushDownDependentJoinInternal(std::move(plan->children[1]),
259
+ parent_propagate_null_values, lateral_depth);
242
260
  return plan;
243
261
  }
244
262
  // both sides have correlation
245
263
  // turn into an inner join
246
264
  auto join = make_uniq<LogicalComparisonJoin>(JoinType::INNER);
247
- plan->children[0] = PushDownDependentJoinInternal(std::move(plan->children[0]), parent_propagate_null_values);
265
+ plan->children[0] =
266
+ PushDownDependentJoinInternal(std::move(plan->children[0]), parent_propagate_null_values, lateral_depth);
248
267
  auto left_binding = this->base_binding;
249
- plan->children[1] = PushDownDependentJoinInternal(std::move(plan->children[1]), parent_propagate_null_values);
268
+ plan->children[1] =
269
+ PushDownDependentJoinInternal(std::move(plan->children[1]), parent_propagate_null_values, lateral_depth);
250
270
  // add the correlated columns to the join conditions
251
271
  for (idx_t i = 0; i < correlated_columns.size(); i++) {
252
272
  JoinCondition cond;
@@ -261,6 +281,26 @@ unique_ptr<LogicalOperator> FlattenDependentJoins::PushDownDependentJoinInternal
261
281
  join->children.push_back(std::move(plan->children[1]));
262
282
  return std::move(join);
263
283
  }
284
+ case LogicalOperatorType::LOGICAL_DEPENDENT_JOIN: {
285
+ auto &dependent_join = plan->Cast<LogicalJoin>();
286
+ if (!((dependent_join.join_type == JoinType::INNER) || (dependent_join.join_type == JoinType::LEFT))) {
287
+ throw Exception("Dependent join can only be INNER or LEFT type");
288
+ }
289
+ D_ASSERT(plan->children.size() == 2);
290
+ // Push all the bindings down to the left side so the right side knows where to refer DELIM_GET from
291
+ plan->children[0] =
292
+ PushDownDependentJoinInternal(std::move(plan->children[0]), parent_propagate_null_values, lateral_depth);
293
+
294
+ // Normal rewriter like in other joins
295
+ RewriteCorrelatedExpressions rewriter(this->base_binding, correlated_map, lateral_depth);
296
+ rewriter.VisitOperator(*plan);
297
+
298
+ // Recursive rewriter to visit right side of lateral join and update bindings from left
299
+ RewriteCorrelatedExpressions recursive_rewriter(this->base_binding, correlated_map, lateral_depth + 1, true);
300
+ recursive_rewriter.VisitOperator(*plan->children[1]);
301
+
302
+ return plan;
303
+ }
264
304
  case LogicalOperatorType::LOGICAL_ANY_JOIN:
265
305
  case LogicalOperatorType::LOGICAL_ASOF_JOIN:
266
306
  case LogicalOperatorType::LOGICAL_COMPARISON_JOIN: {
@@ -274,30 +314,33 @@ unique_ptr<LogicalOperator> FlattenDependentJoins::PushDownDependentJoinInternal
274
314
  // inner join
275
315
  if (!right_has_correlation) {
276
316
  // only left has correlation: push into left
277
- plan->children[0] =
278
- PushDownDependentJoinInternal(std::move(plan->children[0]), parent_propagate_null_values);
317
+ plan->children[0] = PushDownDependentJoinInternal(std::move(plan->children[0]),
318
+ parent_propagate_null_values, lateral_depth);
319
+ // Remove the correlated columns coming from outside for current join node
279
320
  return plan;
280
321
  }
281
322
  if (!left_has_correlation) {
282
323
  // only right has correlation: push into right
283
- plan->children[1] =
284
- PushDownDependentJoinInternal(std::move(plan->children[1]), parent_propagate_null_values);
324
+ plan->children[1] = PushDownDependentJoinInternal(std::move(plan->children[1]),
325
+ parent_propagate_null_values, lateral_depth);
326
+ // Remove the correlated columns coming from outside for current join node
285
327
  return plan;
286
328
  }
287
329
  } else if (join.join_type == JoinType::LEFT) {
288
330
  // left outer join
289
331
  if (!right_has_correlation) {
290
332
  // only left has correlation: push into left
291
- plan->children[0] =
292
- PushDownDependentJoinInternal(std::move(plan->children[0]), parent_propagate_null_values);
333
+ plan->children[0] = PushDownDependentJoinInternal(std::move(plan->children[0]),
334
+ parent_propagate_null_values, lateral_depth);
335
+ // Remove the correlated columns coming from outside for current join node
293
336
  return plan;
294
337
  }
295
338
  } else if (join.join_type == JoinType::RIGHT) {
296
339
  // left outer join
297
340
  if (!left_has_correlation) {
298
341
  // only right has correlation: push into right
299
- plan->children[1] =
300
- PushDownDependentJoinInternal(std::move(plan->children[1]), parent_propagate_null_values);
342
+ plan->children[1] = PushDownDependentJoinInternal(std::move(plan->children[1]),
343
+ parent_propagate_null_values, lateral_depth);
301
344
  return plan;
302
345
  }
303
346
  } else if (join.join_type == JoinType::MARK) {
@@ -305,10 +348,10 @@ unique_ptr<LogicalOperator> FlattenDependentJoins::PushDownDependentJoinInternal
305
348
  throw Exception("MARK join with correlation in RHS not supported");
306
349
  }
307
350
  // push the child into the LHS
308
- plan->children[0] =
309
- PushDownDependentJoinInternal(std::move(plan->children[0]), parent_propagate_null_values);
351
+ plan->children[0] = PushDownDependentJoinInternal(std::move(plan->children[0]),
352
+ parent_propagate_null_values, lateral_depth);
310
353
  // rewrite expressions in the join conditions
311
- RewriteCorrelatedExpressions rewriter(base_binding, correlated_map);
354
+ RewriteCorrelatedExpressions rewriter(base_binding, correlated_map, lateral_depth);
312
355
  rewriter.VisitOperator(*plan);
313
356
  return plan;
314
357
  } else {
@@ -316,9 +359,11 @@ unique_ptr<LogicalOperator> FlattenDependentJoins::PushDownDependentJoinInternal
316
359
  }
317
360
  // both sides have correlation
318
361
  // push into both sides
319
- plan->children[0] = PushDownDependentJoinInternal(std::move(plan->children[0]), parent_propagate_null_values);
362
+ plan->children[0] =
363
+ PushDownDependentJoinInternal(std::move(plan->children[0]), parent_propagate_null_values, lateral_depth);
320
364
  auto left_binding = this->base_binding;
321
- plan->children[1] = PushDownDependentJoinInternal(std::move(plan->children[1]), parent_propagate_null_values);
365
+ plan->children[1] =
366
+ PushDownDependentJoinInternal(std::move(plan->children[1]), parent_propagate_null_values, lateral_depth);
322
367
  auto right_binding = this->base_binding;
323
368
  // NOTE: for OUTER JOINS it matters what the BASE BINDING is after the join
324
369
  // for the LEFT OUTER JOIN, we want the LEFT side to be the base binding after we push
@@ -354,7 +399,7 @@ unique_ptr<LogicalOperator> FlattenDependentJoins::PushDownDependentJoinInternal
354
399
  }
355
400
  }
356
401
  // then we replace any correlated expressions with the corresponding entry in the correlated_map
357
- RewriteCorrelatedExpressions rewriter(right_binding, correlated_map);
402
+ RewriteCorrelatedExpressions rewriter(right_binding, correlated_map, lateral_depth);
358
403
  rewriter.VisitOperator(*plan);
359
404
  return plan;
360
405
  }
@@ -371,9 +416,11 @@ unique_ptr<LogicalOperator> FlattenDependentJoins::PushDownDependentJoinInternal
371
416
  // this is done for an optimization to avoid having to compute the total order
372
417
  if (plan->children[0]->type == LogicalOperatorType::LOGICAL_ORDER_BY) {
373
418
  order_by = unique_ptr_cast<LogicalOperator, LogicalOrder>(std::move(plan->children[0]));
374
- child = PushDownDependentJoinInternal(std::move(order_by->children[0]), parent_propagate_null_values);
419
+ child = PushDownDependentJoinInternal(std::move(order_by->children[0]), parent_propagate_null_values,
420
+ lateral_depth);
375
421
  } else {
376
- child = PushDownDependentJoinInternal(std::move(plan->children[0]), parent_propagate_null_values);
422
+ child = PushDownDependentJoinInternal(std::move(plan->children[0]), parent_propagate_null_values,
423
+ lateral_depth);
377
424
  }
378
425
  auto child_column_count = child->GetColumnBindings().size();
379
426
  // we push a row_number() OVER (PARTITION BY [correlated columns])
@@ -437,7 +484,8 @@ unique_ptr<LogicalOperator> FlattenDependentJoins::PushDownDependentJoinInternal
437
484
  case LogicalOperatorType::LOGICAL_WINDOW: {
438
485
  auto &window = plan->Cast<LogicalWindow>();
439
486
  // push into children
440
- plan->children[0] = PushDownDependentJoinInternal(std::move(plan->children[0]), parent_propagate_null_values);
487
+ plan->children[0] =
488
+ PushDownDependentJoinInternal(std::move(plan->children[0]), parent_propagate_null_values, lateral_depth);
441
489
  // add the correlated columns to the PARTITION BY clauses in the Window
442
490
  for (auto &expr : window.expressions) {
443
491
  D_ASSERT(expr->GetExpressionClass() == ExpressionClass::BOUND_WINDOW);
@@ -488,9 +536,10 @@ unique_ptr<LogicalOperator> FlattenDependentJoins::PushDownDependentJoinInternal
488
536
  case LogicalOperatorType::LOGICAL_EXPRESSION_GET: {
489
537
  // expression get
490
538
  // first we flatten the dependent join in the child
491
- plan->children[0] = PushDownDependentJoinInternal(std::move(plan->children[0]), parent_propagate_null_values);
539
+ plan->children[0] =
540
+ PushDownDependentJoinInternal(std::move(plan->children[0]), parent_propagate_null_values, lateral_depth);
492
541
  // then we replace any correlated expressions with the corresponding entry in the correlated_map
493
- RewriteCorrelatedExpressions rewriter(base_binding, correlated_map);
542
+ RewriteCorrelatedExpressions rewriter(base_binding, correlated_map, lateral_depth);
494
543
  rewriter.VisitOperator(*plan);
495
544
  // now we add all the correlated columns to each of the expressions of the expression scan
496
545
  auto &expr_get = plan->Cast<LogicalExpressionGet>();
@@ -519,7 +568,7 @@ unique_ptr<LogicalOperator> FlattenDependentJoins::PushDownDependentJoinInternal
519
568
  throw InternalException("Flatten dependent joins - logical get encountered without children");
520
569
  }
521
570
  plan->children[0] = PushDownDependentJoin(std::move(plan->children[0]));
522
- for (idx_t i = 0; i < (perform_delim ? correlated_columns.size() : 1); i++) {
571
+ for (idx_t i = 0; i < correlated_columns.size(); i++) {
523
572
  get.projected_input.push_back(this->delim_offset + i);
524
573
  }
525
574
  this->delim_offset = get.returned_types.size();
@@ -527,7 +576,10 @@ unique_ptr<LogicalOperator> FlattenDependentJoins::PushDownDependentJoinInternal
527
576
  return plan;
528
577
  }
529
578
  case LogicalOperatorType::LOGICAL_RECURSIVE_CTE: {
530
- throw BinderException("Recursive CTEs not supported in correlated subquery");
579
+ throw BinderException("Recursive CTEs not (yet) supported in correlated subquery");
580
+ }
581
+ case LogicalOperatorType::LOGICAL_MATERIALIZED_CTE: {
582
+ throw BinderException("Materialized CTEs not (yet) supported in correlated subquery");
531
583
  }
532
584
  case LogicalOperatorType::LOGICAL_DELIM_JOIN: {
533
585
  throw BinderException("Nested lateral joins or lateral joins in correlated subqueries are not (yet) supported");
@@ -7,8 +7,10 @@
7
7
 
8
8
  namespace duckdb {
9
9
 
10
- HasCorrelatedExpressions::HasCorrelatedExpressions(const vector<CorrelatedColumnInfo> &correlated, bool lateral)
11
- : has_correlated_expressions(false), lateral(lateral), correlated_columns(correlated) {
10
+ HasCorrelatedExpressions::HasCorrelatedExpressions(const vector<CorrelatedColumnInfo> &correlated, bool lateral,
11
+ idx_t lateral_depth)
12
+ : has_correlated_expressions(false), lateral(lateral), correlated_columns(correlated),
13
+ lateral_depth(lateral_depth) {
12
14
  }
13
15
 
14
16
  void HasCorrelatedExpressions::VisitOperator(LogicalOperator &op) {
@@ -17,18 +19,31 @@ void HasCorrelatedExpressions::VisitOperator(LogicalOperator &op) {
17
19
 
18
20
  unique_ptr<Expression> HasCorrelatedExpressions::VisitReplace(BoundColumnRefExpression &expr,
19
21
  unique_ptr<Expression> *expr_ptr) {
20
- if (expr.depth == 0) {
22
+ // Indicates local correlations (all correlations within a child) for the root
23
+ if (expr.depth <= lateral_depth) {
21
24
  return nullptr;
22
25
  }
23
- if (expr.depth > 1) {
26
+
27
+ // Should never happen
28
+ if (expr.depth > 1 + lateral_depth) {
24
29
  if (lateral) {
25
- throw BinderException("Nested lateral joins are not (yet) supported");
30
+ throw BinderException("Invalid lateral depth encountered for an expression");
26
31
  }
27
32
  throw InternalException("Expression with depth > 1 detected in non-lateral join");
28
33
  }
34
+ // Note: This is added, since we only want to set has_correlated_expressions to true when the
35
+ // BoundSubqueryExpression has the same bindings as one of the correlated_columns from the left hand side
36
+ // (correlated_columns is the correlated_columns from left hand side)
37
+ bool found_match = false;
38
+ for (idx_t i = 0; i < correlated_columns.size(); i++) {
39
+ if (correlated_columns[i].binding == expr.binding) {
40
+ found_match = true;
41
+ break;
42
+ }
43
+ }
29
44
  // correlated column reference
30
- D_ASSERT(expr.depth == 1);
31
- has_correlated_expressions = true;
45
+ D_ASSERT(expr.depth == lateral_depth + 1);
46
+ has_correlated_expressions = found_match;
32
47
  return nullptr;
33
48
  }
34
49