duckdb 0.8.2-dev150.0 → 0.8.2-dev1549.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 (489) hide show
  1. package/binding.gyp +15 -12
  2. package/binding.gyp.in +1 -1
  3. package/configure.py +1 -1
  4. package/duckdb_extension_config.cmake +10 -0
  5. package/package.json +1 -1
  6. package/src/duckdb/extension/icu/icu-dateadd.cpp +2 -2
  7. package/src/duckdb/extension/icu/icu-datefunc.cpp +1 -1
  8. package/src/duckdb/extension/icu/icu-datepart.cpp +2 -2
  9. package/src/duckdb/extension/icu/icu-datesub.cpp +2 -2
  10. package/src/duckdb/extension/icu/icu-datetrunc.cpp +1 -1
  11. package/src/duckdb/extension/icu/icu-list-range.cpp +1 -1
  12. package/src/duckdb/extension/icu/icu-makedate.cpp +7 -0
  13. package/src/duckdb/extension/icu/icu-strptime.cpp +4 -4
  14. package/src/duckdb/extension/icu/icu-table-range.cpp +5 -5
  15. package/src/duckdb/extension/icu/icu-timebucket.cpp +16 -16
  16. package/src/duckdb/extension/icu/icu-timezone.cpp +8 -8
  17. package/src/duckdb/extension/icu/icu_extension.cpp +3 -3
  18. package/src/duckdb/extension/json/include/json_common.hpp +47 -231
  19. package/src/duckdb/extension/json/include/json_executors.hpp +49 -13
  20. package/src/duckdb/extension/json/include/json_functions.hpp +2 -1
  21. package/src/duckdb/extension/json/json_common.cpp +272 -40
  22. package/src/duckdb/extension/json/json_functions/json_structure.cpp +1 -1
  23. package/src/duckdb/extension/json/json_functions/json_transform.cpp +17 -37
  24. package/src/duckdb/extension/json/json_functions/json_type.cpp +1 -1
  25. package/src/duckdb/extension/json/json_functions.cpp +24 -24
  26. package/src/duckdb/extension/json/json_scan.cpp +3 -6
  27. package/src/duckdb/extension/parquet/column_reader.cpp +19 -21
  28. package/src/duckdb/extension/parquet/column_writer.cpp +77 -61
  29. package/src/duckdb/extension/parquet/include/cast_column_reader.hpp +2 -2
  30. package/src/duckdb/extension/parquet/include/column_reader.hpp +14 -16
  31. package/src/duckdb/extension/parquet/include/column_writer.hpp +9 -7
  32. package/src/duckdb/extension/parquet/include/list_column_reader.hpp +2 -2
  33. package/src/duckdb/extension/parquet/include/parquet_dbp_decoder.hpp +3 -3
  34. package/src/duckdb/extension/parquet/include/parquet_decimal_utils.hpp +3 -3
  35. package/src/duckdb/extension/parquet/include/parquet_file_metadata_cache.hpp +2 -2
  36. package/src/duckdb/extension/parquet/include/parquet_statistics.hpp +2 -2
  37. package/src/duckdb/extension/parquet/include/parquet_support.hpp +9 -11
  38. package/src/duckdb/extension/parquet/include/parquet_writer.hpp +24 -5
  39. package/src/duckdb/extension/parquet/include/string_column_reader.hpp +1 -1
  40. package/src/duckdb/extension/parquet/include/struct_column_reader.hpp +2 -3
  41. package/src/duckdb/extension/parquet/include/zstd_file_system.hpp +2 -2
  42. package/src/duckdb/extension/parquet/parquet_extension.cpp +192 -20
  43. package/src/duckdb/extension/parquet/parquet_reader.cpp +6 -6
  44. package/src/duckdb/extension/parquet/parquet_statistics.cpp +7 -6
  45. package/src/duckdb/extension/parquet/parquet_writer.cpp +79 -16
  46. package/src/duckdb/extension/parquet/zstd_file_system.cpp +2 -2
  47. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +1 -1
  48. package/src/duckdb/src/catalog/catalog_search_path.cpp +5 -4
  49. package/src/duckdb/src/catalog/default/default_functions.cpp +16 -0
  50. package/src/duckdb/src/common/adbc/adbc.cpp +75 -10
  51. package/src/duckdb/src/common/adbc/driver_manager.cpp +6 -11
  52. package/src/duckdb/src/common/allocator.cpp +14 -2
  53. package/src/duckdb/src/common/arrow/arrow_appender.cpp +5 -11
  54. package/src/duckdb/src/common/assert.cpp +3 -0
  55. package/src/duckdb/src/common/enum_util.cpp +4619 -4446
  56. package/src/duckdb/src/common/enums/logical_operator_type.cpp +4 -0
  57. package/src/duckdb/src/common/enums/optimizer_type.cpp +2 -0
  58. package/src/duckdb/src/common/enums/physical_operator_type.cpp +4 -0
  59. package/src/duckdb/src/common/exception.cpp +2 -2
  60. package/src/duckdb/src/common/extra_type_info.cpp +506 -0
  61. package/src/duckdb/src/common/file_system.cpp +19 -0
  62. package/src/duckdb/src/common/hive_partitioning.cpp +10 -6
  63. package/src/duckdb/src/common/local_file_system.cpp +14 -14
  64. package/src/duckdb/src/common/multi_file_reader.cpp +184 -20
  65. package/src/duckdb/src/common/operator/cast_operators.cpp +35 -1
  66. package/src/duckdb/src/common/radix_partitioning.cpp +26 -8
  67. package/src/duckdb/src/common/re2_regex.cpp +1 -1
  68. package/src/duckdb/src/common/row_operations/row_external.cpp +1 -1
  69. package/src/duckdb/src/common/sort/merge_sorter.cpp +9 -16
  70. package/src/duckdb/src/common/sort/partition_state.cpp +44 -11
  71. package/src/duckdb/src/common/types/batched_data_collection.cpp +7 -2
  72. package/src/duckdb/src/common/types/bit.cpp +51 -0
  73. package/src/duckdb/src/common/types/column/column_data_allocator.cpp +9 -6
  74. package/src/duckdb/src/common/types/column/column_data_collection.cpp +17 -2
  75. package/src/duckdb/src/common/types/column/column_data_collection_segment.cpp +15 -6
  76. package/src/duckdb/src/common/types/column/partitioned_column_data.cpp +2 -2
  77. package/src/duckdb/src/common/types/data_chunk.cpp +2 -2
  78. package/src/duckdb/src/common/types/date.cpp +9 -0
  79. package/src/duckdb/src/common/types/list_segment.cpp +24 -74
  80. package/src/duckdb/src/common/types/row/partitioned_tuple_data.cpp +3 -9
  81. package/src/duckdb/src/common/types/row/tuple_data_collection.cpp +2 -0
  82. package/src/duckdb/src/common/types/row/tuple_data_scatter_gather.cpp +2 -2
  83. package/src/duckdb/src/common/types/uuid.cpp +2 -2
  84. package/src/duckdb/src/common/types/validity_mask.cpp +33 -0
  85. package/src/duckdb/src/common/types.cpp +8 -655
  86. package/src/duckdb/src/common/virtual_file_system.cpp +138 -1
  87. package/src/duckdb/src/core_functions/aggregate/holistic/reservoir_quantile.cpp +2 -0
  88. package/src/duckdb/src/core_functions/aggregate/nested/list.cpp +2 -2
  89. package/src/duckdb/src/core_functions/aggregate/regression/regr_avg.cpp +4 -4
  90. package/src/duckdb/src/core_functions/aggregate/regression/regr_intercept.cpp +4 -4
  91. package/src/duckdb/src/core_functions/aggregate/regression/regr_r2.cpp +5 -4
  92. package/src/duckdb/src/core_functions/aggregate/regression/regr_sxx_syy.cpp +8 -8
  93. package/src/duckdb/src/core_functions/aggregate/regression/regr_sxy.cpp +4 -3
  94. package/src/duckdb/src/core_functions/function_list.cpp +4 -2
  95. package/src/duckdb/src/core_functions/scalar/date/date_part.cpp +208 -42
  96. package/src/duckdb/src/core_functions/scalar/date/epoch.cpp +10 -24
  97. package/src/duckdb/src/core_functions/scalar/date/make_date.cpp +19 -4
  98. package/src/duckdb/src/core_functions/scalar/list/list_aggregates.cpp +4 -2
  99. package/src/duckdb/src/execution/aggregate_hashtable.cpp +34 -18
  100. package/src/duckdb/src/execution/expression_executor.cpp +1 -1
  101. package/src/duckdb/src/execution/index/art/art.cpp +149 -139
  102. package/src/duckdb/src/execution/index/art/fixed_size_allocator.cpp +1 -1
  103. package/src/duckdb/src/execution/index/art/iterator.cpp +129 -207
  104. package/src/duckdb/src/execution/index/art/leaf.cpp +8 -37
  105. package/src/duckdb/src/execution/index/art/node.cpp +113 -120
  106. package/src/duckdb/src/execution/index/art/node16.cpp +1 -10
  107. package/src/duckdb/src/execution/index/art/node256.cpp +1 -9
  108. package/src/duckdb/src/execution/index/art/node4.cpp +12 -13
  109. package/src/duckdb/src/execution/index/art/node48.cpp +1 -11
  110. package/src/duckdb/src/execution/index/art/prefix.cpp +228 -350
  111. package/src/duckdb/src/execution/join_hashtable.cpp +4 -4
  112. package/src/duckdb/src/execution/operator/aggregate/aggregate_object.cpp +1 -0
  113. package/src/duckdb/src/execution/operator/aggregate/physical_streaming_window.cpp +8 -3
  114. package/src/duckdb/src/execution/operator/aggregate/physical_ungrouped_aggregate.cpp +32 -22
  115. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +512 -300
  116. package/src/duckdb/src/execution/operator/helper/physical_batch_collector.cpp +4 -3
  117. package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +5 -5
  118. package/src/duckdb/src/execution/operator/join/physical_asof_join.cpp +414 -283
  119. package/src/duckdb/src/execution/operator/join/physical_comparison_join.cpp +1 -1
  120. package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +21 -10
  121. package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +28 -12
  122. package/src/duckdb/src/execution/operator/join/physical_join.cpp +1 -1
  123. package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +23 -4
  124. package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +41 -5
  125. package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +100 -13
  126. package/src/duckdb/src/execution/operator/persistent/csv_file_handle.cpp +1 -1
  127. package/src/duckdb/src/execution/operator/persistent/csv_reader_options.cpp +20 -0
  128. package/src/duckdb/src/execution/operator/persistent/csv_rejects_table.cpp +48 -0
  129. package/src/duckdb/src/execution/operator/persistent/parallel_csv_reader.cpp +2 -3
  130. package/src/duckdb/src/execution/operator/persistent/physical_batch_copy_to_file.cpp +6 -4
  131. package/src/duckdb/src/execution/operator/persistent/physical_fixed_batch_copy.cpp +3 -3
  132. package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +1 -1
  133. package/src/duckdb/src/execution/operator/projection/physical_pivot.cpp +2 -1
  134. package/src/duckdb/src/execution/operator/scan/physical_column_data_scan.cpp +19 -0
  135. package/src/duckdb/src/execution/operator/scan/physical_table_scan.cpp +7 -2
  136. package/src/duckdb/src/execution/operator/set/physical_cte.cpp +160 -0
  137. package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +15 -5
  138. package/src/duckdb/src/execution/partitionable_hashtable.cpp +41 -6
  139. package/src/duckdb/src/execution/perfect_aggregate_hashtable.cpp +30 -5
  140. package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +43 -10
  141. package/src/duckdb/src/execution/physical_plan/plan_asof_join.cpp +13 -22
  142. package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +17 -13
  143. package/src/duckdb/src/execution/physical_plan/plan_cte.cpp +33 -0
  144. package/src/duckdb/src/execution/physical_plan/plan_get.cpp +2 -2
  145. package/src/duckdb/src/execution/physical_plan/plan_recursive_cte.cpp +25 -4
  146. package/src/duckdb/src/execution/physical_plan_generator.cpp +4 -0
  147. package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +290 -43
  148. package/src/duckdb/src/execution/window_segment_tree.cpp +286 -129
  149. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +2 -1
  150. package/src/duckdb/src/function/cast/bit_cast.cpp +34 -2
  151. package/src/duckdb/src/function/cast/blob_cast.cpp +3 -0
  152. package/src/duckdb/src/function/cast/numeric_casts.cpp +2 -0
  153. package/src/duckdb/src/function/function.cpp +3 -1
  154. package/src/duckdb/src/function/scalar/compressed_materialization/compress_integral.cpp +212 -0
  155. package/src/duckdb/src/function/scalar/compressed_materialization/compress_string.cpp +249 -0
  156. package/src/duckdb/src/function/scalar/compressed_materialization_functions.cpp +29 -0
  157. package/src/duckdb/src/function/scalar/list/list_resize.cpp +162 -0
  158. package/src/duckdb/src/function/scalar/nested_functions.cpp +1 -0
  159. package/src/duckdb/src/function/scalar/string/like.cpp +12 -4
  160. package/src/duckdb/src/function/scalar/system/aggregate_export.cpp +12 -5
  161. package/src/duckdb/src/function/table/copy_csv.cpp +8 -1
  162. package/src/duckdb/src/function/table/read_csv.cpp +100 -17
  163. package/src/duckdb/src/function/table/table_scan.cpp +9 -0
  164. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  165. package/src/duckdb/src/include/duckdb/common/adbc/adbc.hpp +1 -0
  166. package/src/duckdb/src/include/duckdb/common/allocator.hpp +2 -0
  167. package/src/duckdb/src/include/duckdb/common/bswap.hpp +42 -0
  168. package/src/duckdb/src/include/duckdb/common/dl.hpp +3 -1
  169. package/src/duckdb/src/include/duckdb/common/enum_util.hpp +616 -584
  170. package/src/duckdb/src/include/duckdb/common/enums/cte_materialize.hpp +21 -0
  171. package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +2 -1
  172. package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +2 -0
  173. package/src/duckdb/src/include/duckdb/common/enums/optimizer_type.hpp +2 -0
  174. package/src/duckdb/src/include/duckdb/common/enums/physical_operator_type.hpp +2 -0
  175. package/src/duckdb/src/include/duckdb/common/extra_operator_info.hpp +27 -0
  176. package/src/duckdb/src/include/duckdb/common/extra_type_info.hpp +219 -0
  177. package/src/duckdb/src/include/duckdb/common/file_system.hpp +2 -0
  178. package/src/duckdb/src/include/duckdb/common/hive_partitioning.hpp +1 -1
  179. package/src/duckdb/src/include/duckdb/common/multi_file_reader.hpp +6 -4
  180. package/src/duckdb/src/include/duckdb/common/multi_file_reader_options.hpp +10 -42
  181. package/src/duckdb/src/include/duckdb/common/mutex.hpp +3 -0
  182. package/src/duckdb/src/include/duckdb/common/operator/cast_operators.hpp +43 -3
  183. package/src/duckdb/src/include/duckdb/common/operator/numeric_cast.hpp +10 -0
  184. package/src/duckdb/src/include/duckdb/common/radix.hpp +9 -20
  185. package/src/duckdb/src/include/duckdb/common/radix_partitioning.hpp +6 -21
  186. package/src/duckdb/src/include/duckdb/common/row_operations/row_operations.hpp +3 -3
  187. package/src/duckdb/src/include/duckdb/common/sort/partition_state.hpp +13 -0
  188. package/src/duckdb/src/include/duckdb/common/types/batched_data_collection.hpp +3 -1
  189. package/src/duckdb/src/include/duckdb/common/types/bit.hpp +81 -0
  190. package/src/duckdb/src/include/duckdb/common/types/column/column_data_allocator.hpp +1 -1
  191. package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection.hpp +6 -1
  192. package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection_segment.hpp +1 -1
  193. package/src/duckdb/src/include/duckdb/common/types/column/column_data_scan_states.hpp +3 -1
  194. package/src/duckdb/src/include/duckdb/common/types/data_chunk.hpp +1 -1
  195. package/src/duckdb/src/include/duckdb/common/types/date.hpp +7 -5
  196. package/src/duckdb/src/include/duckdb/common/types/list_segment.hpp +6 -8
  197. package/src/duckdb/src/include/duckdb/common/types/row/partitioned_tuple_data.hpp +0 -1
  198. package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_collection.hpp +1 -0
  199. package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_states.hpp +3 -0
  200. package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +9 -0
  201. package/src/duckdb/src/include/duckdb/common/types.hpp +1 -15
  202. package/src/duckdb/src/include/duckdb/common/virtual_file_system.hpp +38 -97
  203. package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/corr.hpp +4 -4
  204. package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/covar.hpp +3 -1
  205. package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic_functions.hpp +3 -1
  206. package/src/duckdb/src/include/duckdb/core_functions/aggregate/distributive_functions.hpp +3 -1
  207. package/src/duckdb/src/include/duckdb/core_functions/aggregate/holistic_functions.hpp +3 -1
  208. package/src/duckdb/src/include/duckdb/core_functions/aggregate/nested_functions.hpp +3 -1
  209. package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_count.hpp +1 -0
  210. package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_slope.hpp +3 -3
  211. package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression_functions.hpp +3 -1
  212. package/src/duckdb/src/include/duckdb/core_functions/scalar/bit_functions.hpp +3 -1
  213. package/src/duckdb/src/include/duckdb/core_functions/scalar/blob_functions.hpp +3 -1
  214. package/src/duckdb/src/include/duckdb/core_functions/scalar/date_functions.hpp +31 -11
  215. package/src/duckdb/src/include/duckdb/core_functions/scalar/enum_functions.hpp +3 -1
  216. package/src/duckdb/src/include/duckdb/core_functions/scalar/generic_functions.hpp +3 -1
  217. package/src/duckdb/src/include/duckdb/core_functions/scalar/list_functions.hpp +3 -1
  218. package/src/duckdb/src/include/duckdb/core_functions/scalar/map_functions.hpp +3 -1
  219. package/src/duckdb/src/include/duckdb/core_functions/scalar/math_functions.hpp +3 -1
  220. package/src/duckdb/src/include/duckdb/core_functions/scalar/operators_functions.hpp +3 -1
  221. package/src/duckdb/src/include/duckdb/core_functions/scalar/random_functions.hpp +3 -1
  222. package/src/duckdb/src/include/duckdb/core_functions/scalar/string_functions.hpp +3 -1
  223. package/src/duckdb/src/include/duckdb/core_functions/scalar/struct_functions.hpp +3 -1
  224. package/src/duckdb/src/include/duckdb/core_functions/scalar/union_functions.hpp +3 -1
  225. package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +21 -3
  226. package/src/duckdb/src/include/duckdb/execution/executor.hpp +3 -0
  227. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +4 -5
  228. package/src/duckdb/src/include/duckdb/execution/index/art/iterator.hpp +31 -27
  229. package/src/duckdb/src/include/duckdb/execution/index/art/leaf.hpp +6 -14
  230. package/src/duckdb/src/include/duckdb/execution/index/art/node.hpp +4 -10
  231. package/src/duckdb/src/include/duckdb/execution/index/art/node16.hpp +3 -6
  232. package/src/duckdb/src/include/duckdb/execution/index/art/node256.hpp +3 -6
  233. package/src/duckdb/src/include/duckdb/execution/index/art/node4.hpp +5 -8
  234. package/src/duckdb/src/include/duckdb/execution/index/art/node48.hpp +3 -6
  235. package/src/duckdb/src/include/duckdb/execution/index/art/prefix.hpp +63 -52
  236. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_asof_join.hpp +2 -10
  237. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_iejoin.hpp +1 -1
  238. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_piecewise_merge_join.hpp +1 -1
  239. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_range_join.hpp +12 -1
  240. package/src/duckdb/src/include/duckdb/execution/operator/persistent/base_csv_reader.hpp +2 -2
  241. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_line_info.hpp +4 -3
  242. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +8 -1
  243. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_rejects_table.hpp +36 -0
  244. package/src/duckdb/src/include/duckdb/execution/operator/persistent/parallel_csv_reader.hpp +1 -1
  245. package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_column_data_scan.hpp +10 -0
  246. package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_table_scan.hpp +5 -1
  247. package/src/duckdb/src/include/duckdb/execution/operator/set/physical_cte.hpp +62 -0
  248. package/src/duckdb/src/include/duckdb/execution/operator/set/physical_recursive_cte.hpp +8 -2
  249. package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +5 -1
  250. package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +3 -0
  251. package/src/duckdb/src/include/duckdb/execution/radix_partitioned_hashtable.hpp +10 -3
  252. package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +51 -40
  253. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +1 -1
  254. package/src/duckdb/src/include/duckdb/function/aggregate_state.hpp +2 -2
  255. package/src/duckdb/src/include/duckdb/function/built_in_functions.hpp +1 -0
  256. package/src/duckdb/src/include/duckdb/function/scalar/compressed_materialization_functions.hpp +49 -0
  257. package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +1 -1
  258. package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +5 -0
  259. package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +2 -0
  260. package/src/duckdb/src/include/duckdb/main/client_config.hpp +5 -0
  261. package/src/duckdb/src/include/duckdb/main/config.hpp +2 -0
  262. package/src/duckdb/src/include/duckdb/main/connection.hpp +1 -2
  263. package/src/duckdb/src/include/duckdb/main/relation/cross_product_relation.hpp +4 -1
  264. package/src/duckdb/src/include/duckdb/main/relation/join_relation.hpp +5 -2
  265. package/src/duckdb/src/include/duckdb/main/relation.hpp +4 -2
  266. package/src/duckdb/src/include/duckdb/main/settings.hpp +39 -1
  267. package/src/duckdb/src/include/duckdb/optimizer/column_binding_replacer.hpp +47 -0
  268. package/src/duckdb/src/include/duckdb/optimizer/compressed_materialization.hpp +132 -0
  269. package/src/duckdb/src/include/duckdb/optimizer/deliminator.hpp +13 -16
  270. package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +3 -0
  271. package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +1 -1
  272. package/src/duckdb/src/include/duckdb/optimizer/join_order/estimated_properties.hpp +10 -1
  273. package/src/duckdb/src/include/duckdb/optimizer/join_order/join_order_optimizer.hpp +1 -1
  274. package/src/duckdb/src/include/duckdb/optimizer/join_order/join_relation.hpp +1 -1
  275. package/src/duckdb/src/include/duckdb/optimizer/join_order/query_graph.hpp +3 -0
  276. package/src/duckdb/src/include/duckdb/optimizer/matcher/set_matcher.hpp +13 -0
  277. package/src/duckdb/src/include/duckdb/optimizer/optimizer.hpp +3 -0
  278. package/src/duckdb/src/include/duckdb/optimizer/remove_duplicate_groups.hpp +40 -0
  279. package/src/duckdb/src/include/duckdb/optimizer/statistics_propagator.hpp +11 -3
  280. package/src/duckdb/src/include/duckdb/optimizer/topn_optimizer.hpp +2 -0
  281. package/src/duckdb/src/include/duckdb/parallel/pipeline.hpp +2 -0
  282. package/src/duckdb/src/include/duckdb/parallel/task_scheduler.hpp +5 -0
  283. package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +2 -0
  284. package/src/duckdb/src/include/duckdb/parser/expression/between_expression.hpp +3 -0
  285. package/src/duckdb/src/include/duckdb/parser/expression/cast_expression.hpp +3 -0
  286. package/src/duckdb/src/include/duckdb/parser/expression/collate_expression.hpp +3 -0
  287. package/src/duckdb/src/include/duckdb/parser/expression/columnref_expression.hpp +3 -0
  288. package/src/duckdb/src/include/duckdb/parser/expression/comparison_expression.hpp +3 -0
  289. package/src/duckdb/src/include/duckdb/parser/expression/constant_expression.hpp +3 -0
  290. package/src/duckdb/src/include/duckdb/parser/expression/default_expression.hpp +1 -0
  291. package/src/duckdb/src/include/duckdb/parser/expression/function_expression.hpp +3 -0
  292. package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +3 -0
  293. package/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +3 -0
  294. package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +3 -0
  295. package/src/duckdb/src/include/duckdb/parser/query_node/cte_node.hpp +54 -0
  296. package/src/duckdb/src/include/duckdb/parser/query_node/list.hpp +1 -0
  297. package/src/duckdb/src/include/duckdb/parser/query_node.hpp +2 -1
  298. package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +1 -0
  299. package/src/duckdb/src/include/duckdb/parser/tableref/joinref.hpp +1 -1
  300. package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +3 -0
  301. package/src/duckdb/src/include/duckdb/parser/tokens.hpp +1 -0
  302. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +15 -8
  303. package/src/duckdb/src/include/duckdb/planner/binder.hpp +8 -5
  304. package/src/duckdb/src/include/duckdb/planner/bound_tokens.hpp +1 -0
  305. package/src/duckdb/src/include/duckdb/planner/column_binding.hpp +4 -0
  306. package/src/duckdb/src/include/duckdb/planner/constraints/bound_unique_constraint.hpp +3 -3
  307. package/src/duckdb/src/include/duckdb/planner/expression_binder/lateral_binder.hpp +0 -2
  308. package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +1 -0
  309. package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +2 -1
  310. package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +5 -5
  311. package/src/duckdb/src/include/duckdb/planner/operator/logical_cteref.hpp +7 -2
  312. package/src/duckdb/src/include/duckdb/planner/operator/logical_dependent_join.hpp +43 -0
  313. package/src/duckdb/src/include/duckdb/planner/operator/logical_get.hpp +4 -0
  314. package/src/duckdb/src/include/duckdb/planner/operator/logical_materialized_cte.hpp +49 -0
  315. package/src/duckdb/src/include/duckdb/planner/operator/logical_recursive_cte.hpp +5 -4
  316. package/src/duckdb/src/include/duckdb/planner/query_node/bound_cte_node.hpp +44 -0
  317. package/src/duckdb/src/include/duckdb/planner/query_node/list.hpp +1 -0
  318. package/src/duckdb/src/include/duckdb/planner/subquery/flatten_dependent_join.hpp +2 -2
  319. package/src/duckdb/src/include/duckdb/planner/subquery/has_correlated_expressions.hpp +4 -1
  320. package/src/duckdb/src/include/duckdb/planner/subquery/recursive_dependent_join_planner.hpp +31 -0
  321. package/src/duckdb/src/include/duckdb/planner/subquery/rewrite_correlated_expressions.hpp +8 -2
  322. package/src/duckdb/src/include/duckdb/planner/tableref/bound_cteref.hpp +5 -2
  323. package/src/duckdb/src/include/duckdb/storage/arena_allocator.hpp +1 -1
  324. package/src/duckdb/src/include/duckdb/storage/block_manager.hpp +3 -3
  325. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +1 -1
  326. package/src/duckdb/src/include/duckdb/storage/object_cache.hpp +22 -0
  327. package/src/duckdb/src/include/duckdb/storage/single_file_block_manager.hpp +2 -0
  328. package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +4 -0
  329. package/src/duckdb/src/include/duckdb/storage/table/chunk_info.hpp +3 -0
  330. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +3 -2
  331. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +1 -3
  332. package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +2 -3
  333. package/src/duckdb/src/include/duckdb.h +28 -0
  334. package/src/duckdb/src/main/capi/arrow-c.cpp +155 -1
  335. package/src/duckdb/src/main/capi/duckdb_value-c.cpp +1 -1
  336. package/src/duckdb/src/main/config.cpp +4 -0
  337. package/src/duckdb/src/main/database.cpp +1 -1
  338. package/src/duckdb/src/main/extension/extension_helper.cpp +96 -89
  339. package/src/duckdb/src/main/extension/extension_install.cpp +6 -0
  340. package/src/duckdb/src/main/extension/extension_load.cpp +10 -1
  341. package/src/duckdb/src/main/relation/cross_product_relation.cpp +4 -3
  342. package/src/duckdb/src/main/relation/join_relation.cpp +5 -5
  343. package/src/duckdb/src/main/relation.cpp +6 -5
  344. package/src/duckdb/src/main/settings/settings.cpp +79 -18
  345. package/src/duckdb/src/optimizer/column_binding_replacer.cpp +43 -0
  346. package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +1 -2
  347. package/src/duckdb/src/optimizer/compressed_materialization/compress_aggregate.cpp +140 -0
  348. package/src/duckdb/src/optimizer/compressed_materialization/compress_distinct.cpp +42 -0
  349. package/src/duckdb/src/optimizer/compressed_materialization/compress_order.cpp +65 -0
  350. package/src/duckdb/src/optimizer/compressed_materialization.cpp +478 -0
  351. package/src/duckdb/src/optimizer/deliminator.cpp +176 -321
  352. package/src/duckdb/src/optimizer/filter_pushdown.cpp +9 -0
  353. package/src/duckdb/src/optimizer/join_order/estimated_properties.cpp +7 -0
  354. package/src/duckdb/src/optimizer/join_order/join_node.cpp +2 -2
  355. package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +113 -82
  356. package/src/duckdb/src/optimizer/join_order/join_relation_set.cpp +2 -6
  357. package/src/duckdb/src/optimizer/join_order/query_graph.cpp +22 -14
  358. package/src/duckdb/src/optimizer/optimizer.cpp +51 -14
  359. package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +5 -5
  360. package/src/duckdb/src/optimizer/pushdown/pushdown_get.cpp +0 -1
  361. package/src/duckdb/src/optimizer/remove_duplicate_groups.cpp +127 -0
  362. package/src/duckdb/src/optimizer/remove_unused_columns.cpp +4 -0
  363. package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +154 -15
  364. package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +65 -8
  365. package/src/duckdb/src/optimizer/statistics/operator/propagate_order.cpp +1 -1
  366. package/src/duckdb/src/optimizer/statistics_propagator.cpp +7 -5
  367. package/src/duckdb/src/optimizer/topn_optimizer.cpp +20 -10
  368. package/src/duckdb/src/parallel/executor.cpp +15 -0
  369. package/src/duckdb/src/parallel/task_scheduler.cpp +11 -2
  370. package/src/duckdb/src/parser/common_table_expression_info.cpp +2 -0
  371. package/src/duckdb/src/parser/expression/between_expression.cpp +3 -15
  372. package/src/duckdb/src/parser/expression/case_expression.cpp +0 -13
  373. package/src/duckdb/src/parser/expression/cast_expression.cpp +3 -14
  374. package/src/duckdb/src/parser/expression/collate_expression.cpp +3 -13
  375. package/src/duckdb/src/parser/expression/columnref_expression.cpp +3 -12
  376. package/src/duckdb/src/parser/expression/comparison_expression.cpp +3 -13
  377. package/src/duckdb/src/parser/expression/conjunction_expression.cpp +0 -12
  378. package/src/duckdb/src/parser/expression/constant_expression.cpp +3 -11
  379. package/src/duckdb/src/parser/expression/default_expression.cpp +0 -4
  380. package/src/duckdb/src/parser/expression/function_expression.cpp +3 -32
  381. package/src/duckdb/src/parser/expression/lambda_expression.cpp +4 -14
  382. package/src/duckdb/src/parser/expression/operator_expression.cpp +0 -12
  383. package/src/duckdb/src/parser/expression/parameter_expression.cpp +0 -12
  384. package/src/duckdb/src/parser/expression/positional_reference_expression.cpp +4 -11
  385. package/src/duckdb/src/parser/expression/star_expression.cpp +0 -19
  386. package/src/duckdb/src/parser/expression/subquery_expression.cpp +0 -18
  387. package/src/duckdb/src/parser/expression/window_expression.cpp +3 -39
  388. package/src/duckdb/src/parser/parsed_expression.cpp +0 -70
  389. package/src/duckdb/src/parser/parsed_expression_iterator.cpp +7 -0
  390. package/src/duckdb/src/parser/parser.cpp +8 -2
  391. package/src/duckdb/src/parser/query_node/cte_node.cpp +58 -0
  392. package/src/duckdb/src/parser/query_node/recursive_cte_node.cpp +0 -19
  393. package/src/duckdb/src/parser/query_node/select_node.cpp +0 -29
  394. package/src/duckdb/src/parser/query_node/set_operation_node.cpp +0 -15
  395. package/src/duckdb/src/parser/query_node.cpp +15 -37
  396. package/src/duckdb/src/parser/result_modifier.cpp +0 -74
  397. package/src/duckdb/src/parser/tableref/basetableref.cpp +0 -19
  398. package/src/duckdb/src/parser/tableref/emptytableref.cpp +0 -4
  399. package/src/duckdb/src/parser/tableref/expressionlistref.cpp +0 -15
  400. package/src/duckdb/src/parser/tableref/joinref.cpp +3 -23
  401. package/src/duckdb/src/parser/tableref/pivotref.cpp +0 -23
  402. package/src/duckdb/src/parser/tableref/subqueryref.cpp +3 -13
  403. package/src/duckdb/src/parser/tableref/table_function.cpp +0 -15
  404. package/src/duckdb/src/parser/tableref.cpp +0 -44
  405. package/src/duckdb/src/parser/transform/expression/transform_constant.cpp +55 -3
  406. package/src/duckdb/src/parser/transform/expression/transform_expression.cpp +2 -0
  407. package/src/duckdb/src/parser/transform/expression/transform_multi_assign_reference.cpp +44 -0
  408. package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +19 -1
  409. package/src/duckdb/src/parser/transform/statement/transform_copy.cpp +13 -0
  410. package/src/duckdb/src/parser/transform/statement/transform_delete.cpp +6 -1
  411. package/src/duckdb/src/parser/transform/statement/transform_insert.cpp +6 -1
  412. package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +7 -2
  413. package/src/duckdb/src/parser/transform/statement/transform_pragma.cpp +14 -11
  414. package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +11 -2
  415. package/src/duckdb/src/parser/transform/statement/transform_update.cpp +6 -1
  416. package/src/duckdb/src/parser/transformer.cpp +15 -0
  417. package/src/duckdb/src/planner/binder/query_node/bind_cte_node.cpp +64 -0
  418. package/src/duckdb/src/planner/binder/query_node/plan_cte_node.cpp +26 -0
  419. package/src/duckdb/src/planner/binder/query_node/plan_recursive_cte_node.cpp +5 -5
  420. package/src/duckdb/src/planner/binder/query_node/plan_setop.cpp +4 -4
  421. package/src/duckdb/src/planner/binder/query_node/plan_subquery.cpp +32 -29
  422. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +5 -4
  423. package/src/duckdb/src/planner/binder/tableref/bind_basetableref.cpp +11 -2
  424. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +32 -5
  425. package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +116 -49
  426. package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -1
  427. package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +61 -26
  428. package/src/duckdb/src/planner/binder/tableref/plan_subqueryref.cpp +3 -3
  429. package/src/duckdb/src/planner/binder.cpp +5 -0
  430. package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +1 -1
  431. package/src/duckdb/src/planner/expression_binder/lateral_binder.cpp +4 -31
  432. package/src/duckdb/src/planner/expression_binder.cpp +3 -0
  433. package/src/duckdb/src/planner/expression_iterator.cpp +6 -0
  434. package/src/duckdb/src/planner/logical_operator.cpp +5 -0
  435. package/src/duckdb/src/planner/logical_operator_visitor.cpp +2 -0
  436. package/src/duckdb/src/planner/operator/logical_cteref.cpp +3 -1
  437. package/src/duckdb/src/planner/operator/logical_dependent_join.cpp +26 -0
  438. package/src/duckdb/src/planner/operator/logical_get.cpp +9 -4
  439. package/src/duckdb/src/planner/operator/logical_materialized_cte.cpp +21 -0
  440. package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +90 -38
  441. package/src/duckdb/src/planner/subquery/has_correlated_expressions.cpp +22 -7
  442. package/src/duckdb/src/planner/subquery/rewrite_correlated_expressions.cpp +65 -7
  443. package/src/duckdb/src/storage/arena_allocator.cpp +1 -2
  444. package/src/duckdb/src/storage/buffer/block_manager.cpp +3 -0
  445. package/src/duckdb/src/storage/checkpoint_manager.cpp +3 -0
  446. package/src/duckdb/src/storage/compression/rle.cpp +0 -1
  447. package/src/duckdb/src/storage/data_table.cpp +1 -1
  448. package/src/duckdb/src/storage/local_storage.cpp +3 -3
  449. package/src/duckdb/src/storage/serialization/serialize_parsed_expression.cpp +340 -0
  450. package/src/duckdb/src/storage/serialization/serialize_query_node.cpp +122 -0
  451. package/src/duckdb/src/storage/serialization/serialize_result_modifier.cpp +86 -0
  452. package/src/duckdb/src/storage/serialization/serialize_tableref.cpp +166 -0
  453. package/src/duckdb/src/storage/serialization/serialize_types.cpp +127 -0
  454. package/src/duckdb/src/storage/single_file_block_manager.cpp +23 -0
  455. package/src/duckdb/src/storage/statistics/string_stats.cpp +21 -2
  456. package/src/duckdb/src/storage/storage_info.cpp +1 -1
  457. package/src/duckdb/src/storage/table/chunk_info.cpp +17 -0
  458. package/src/duckdb/src/storage/table/row_group.cpp +25 -9
  459. package/src/duckdb/src/storage/table/row_group_collection.cpp +19 -18
  460. package/src/duckdb/third_party/concurrentqueue/concurrentqueue.h +2 -2
  461. package/src/duckdb/third_party/concurrentqueue/lightweightsemaphore.h +76 -0
  462. package/src/duckdb/third_party/fast_float/fast_float/fast_float.h +2 -0
  463. package/src/duckdb/third_party/httplib/httplib.hpp +10 -1
  464. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +9 -0
  465. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +2 -1
  466. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +12487 -12331
  467. package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +6 -6
  468. package/src/duckdb/ub_src_common.cpp +2 -0
  469. package/src/duckdb/ub_src_execution_index_art.cpp +0 -2
  470. package/src/duckdb/ub_src_execution_operator_persistent.cpp +2 -0
  471. package/src/duckdb/ub_src_execution_operator_set.cpp +2 -0
  472. package/src/duckdb/ub_src_execution_physical_plan.cpp +2 -0
  473. package/src/duckdb/ub_src_function_scalar.cpp +2 -0
  474. package/src/duckdb/ub_src_function_scalar_compressed_materialization.cpp +4 -0
  475. package/src/duckdb/ub_src_function_scalar_list.cpp +2 -0
  476. package/src/duckdb/ub_src_optimizer.cpp +6 -0
  477. package/src/duckdb/ub_src_optimizer_compressed_materialization.cpp +6 -0
  478. package/src/duckdb/ub_src_optimizer_statistics_expression.cpp +0 -2
  479. package/src/duckdb/ub_src_parser_query_node.cpp +2 -0
  480. package/src/duckdb/ub_src_parser_transform_expression.cpp +2 -0
  481. package/src/duckdb/ub_src_planner_binder_query_node.cpp +4 -0
  482. package/src/duckdb/ub_src_planner_operator.cpp +4 -0
  483. package/src/duckdb/ub_src_storage_serialization.cpp +10 -0
  484. package/src/statement.cpp +10 -3
  485. package/test/test_all_types.test.ts +233 -0
  486. package/tsconfig.json +1 -0
  487. package/src/duckdb/src/execution/index/art/prefix_segment.cpp +0 -42
  488. package/src/duckdb/src/include/duckdb/execution/index/art/prefix_segment.hpp +0 -40
  489. package/src/duckdb/src/optimizer/statistics/expression/propagate_and_compress.cpp +0 -118
@@ -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;
@@ -14,6 +14,10 @@
14
14
  #include "duckdb/planner/operator/logical_window.hpp"
15
15
  #include "duckdb/function/function_binder.hpp"
16
16
  #include "duckdb/planner/subquery/flatten_dependent_join.hpp"
17
+ #include "duckdb/common/enums/logical_operator_type.hpp"
18
+ #include "duckdb/planner/operator/logical_dependent_join.hpp"
19
+ #include "duckdb/planner/expression_binder/lateral_binder.hpp"
20
+ #include "duckdb/planner/subquery/recursive_dependent_join_planner.hpp"
17
21
 
18
22
  namespace duckdb {
19
23
 
@@ -327,43 +331,43 @@ static unique_ptr<Expression> PlanCorrelatedSubquery(Binder &binder, BoundSubque
327
331
  }
328
332
  }
329
333
 
330
- class RecursiveSubqueryPlanner : public LogicalOperatorVisitor {
331
- public:
332
- explicit RecursiveSubqueryPlanner(Binder &binder) : binder(binder) {
333
- }
334
- void VisitOperator(LogicalOperator &op) override {
335
- if (!op.children.empty()) {
336
- root = std::move(op.children[0]);
337
- D_ASSERT(root);
338
- VisitOperatorExpressions(op);
339
- op.children[0] = std::move(root);
340
- for (idx_t i = 0; i < op.children.size(); i++) {
341
- D_ASSERT(op.children[i]);
342
- VisitOperator(*op.children[i]);
343
- }
334
+ void RecursiveDependentJoinPlanner::VisitOperator(LogicalOperator &op) {
335
+ if (!op.children.empty()) {
336
+ root = std::move(op.children[0]);
337
+ D_ASSERT(root);
338
+ if (root->type == LogicalOperatorType::LOGICAL_DEPENDENT_JOIN) {
339
+ // Found a dependent join, flatten it
340
+ auto &new_root = root->Cast<LogicalDependentJoin>();
341
+ root = binder.PlanLateralJoin(std::move(new_root.children[0]), std::move(new_root.children[1]),
342
+ new_root.correlated_columns, new_root.join_type,
343
+ std::move(new_root.join_condition));
344
+ }
345
+ VisitOperatorExpressions(op);
346
+ op.children[0] = std::move(root);
347
+ for (idx_t i = 0; i < op.children.size(); i++) {
348
+ D_ASSERT(op.children[i]);
349
+ VisitOperator(*op.children[i]);
344
350
  }
345
351
  }
352
+ }
346
353
 
347
- unique_ptr<Expression> VisitReplace(BoundSubqueryExpression &expr, unique_ptr<Expression> *expr_ptr) override {
348
- return binder.PlanSubquery(expr, root);
349
- }
350
-
351
- private:
352
- unique_ptr<LogicalOperator> root;
353
- Binder &binder;
354
- };
354
+ unique_ptr<Expression> RecursiveDependentJoinPlanner::VisitReplace(BoundSubqueryExpression &expr,
355
+ unique_ptr<Expression> *expr_ptr) {
356
+ return binder.PlanSubquery(expr, root);
357
+ }
355
358
 
356
359
  unique_ptr<Expression> Binder::PlanSubquery(BoundSubqueryExpression &expr, unique_ptr<LogicalOperator> &root) {
357
360
  D_ASSERT(root);
358
361
  // first we translate the QueryNode of the subquery into a logical plan
359
362
  // note that we do not plan nested subqueries yet
360
363
  auto sub_binder = Binder::CreateBinder(context, this);
361
- sub_binder->plan_subquery = false;
364
+ sub_binder->is_outside_flattened = false;
362
365
  auto subquery_root = sub_binder->CreatePlan(*expr.subquery);
363
366
  D_ASSERT(subquery_root);
364
367
 
365
368
  // now we actually flatten the subquery
366
369
  auto plan = std::move(subquery_root);
370
+
367
371
  unique_ptr<Expression> result_expression;
368
372
  if (!expr.IsCorrelated()) {
369
373
  result_expression = PlanUncorrelatedSubquery(*this, expr, root, std::move(plan));
@@ -371,8 +375,8 @@ unique_ptr<Expression> Binder::PlanSubquery(BoundSubqueryExpression &expr, uniqu
371
375
  result_expression = PlanCorrelatedSubquery(*this, expr, root, std::move(plan));
372
376
  }
373
377
  // finally, we recursively plan the nested subqueries (if there are any)
374
- if (sub_binder->has_unplanned_subqueries) {
375
- RecursiveSubqueryPlanner plan(*this);
378
+ if (sub_binder->has_unplanned_dependent_joins) {
379
+ RecursiveDependentJoinPlanner plan(*this);
376
380
  plan.VisitOperator(*root);
377
381
  }
378
382
  return result_expression;
@@ -383,7 +387,6 @@ void Binder::PlanSubqueries(unique_ptr<Expression> &expr_ptr, unique_ptr<Logical
383
387
  return;
384
388
  }
385
389
  auto &expr = *expr_ptr;
386
-
387
390
  // first visit the children of the node, if any
388
391
  ExpressionIterator::EnumerateChildren(expr, [&](unique_ptr<Expression> &expr) { PlanSubqueries(expr, root); });
389
392
 
@@ -391,11 +394,11 @@ void Binder::PlanSubqueries(unique_ptr<Expression> &expr_ptr, unique_ptr<Logical
391
394
  if (expr.expression_class == ExpressionClass::BOUND_SUBQUERY) {
392
395
  auto &subquery = expr.Cast<BoundSubqueryExpression>();
393
396
  // subquery node! plan it
394
- if (subquery.IsCorrelated() && !plan_subquery) {
397
+ if (subquery.IsCorrelated() && !is_outside_flattened) {
395
398
  // detected a nested correlated subquery
396
399
  // we don't plan it yet here, we are currently planning a subquery
397
400
  // nested subqueries will only be planned AFTER the current subquery has been flattened entirely
398
- has_unplanned_subqueries = true;
401
+ has_unplanned_dependent_joins = true;
399
402
  return;
400
403
  }
401
404
  expr_ptr = PlanSubquery(subquery, root);
@@ -411,7 +414,7 @@ unique_ptr<LogicalOperator> Binder::PlanLateralJoin(unique_ptr<LogicalOperator>
411
414
  vector<unique_ptr<Expression>> arbitrary_expressions;
412
415
  if (condition) {
413
416
  // extract join conditions, if there are any
414
- LogicalComparisonJoin::ExtractJoinConditions(join_type, left, right, std::move(condition), conditions,
417
+ LogicalComparisonJoin::ExtractJoinConditions(context, join_type, left, right, std::move(condition), conditions,
415
418
  arbitrary_expressions);
416
419
  }
417
420
 
@@ -297,10 +297,9 @@ unique_ptr<BoundCreateTableInfo> Binder::BindCreateTableInfo(unique_ptr<CreateIn
297
297
 
298
298
  if (type_dependency) {
299
299
  // Only if the USER comes from a create type
300
- if (!schema.catalog.IsTemporaryCatalog()) {
301
- // If it is not a TEMP table we add a dependency
302
- result->dependencies.AddDependency(*type_dependency);
303
- } else {
300
+ if (schema.catalog.IsTemporaryCatalog() && column.Type().id() == LogicalTypeId::ENUM) {
301
+ // for enum types that are used in tables in the temp catalog, we need to
302
+ // make a copy of the enum type definition that is accessible there
304
303
  auto enum_type = type_dependency->user_type;
305
304
  auto &enum_entries = EnumType::GetValuesInsertOrder(enum_type);
306
305
  auto enum_size = EnumType::GetSize(enum_type);
@@ -313,6 +312,8 @@ unique_ptr<BoundCreateTableInfo> Binder::BindCreateTableInfo(unique_ptr<CreateIn
313
312
  }
314
313
  auto copy_type = LogicalType::ENUM(EnumType::GetTypeName(enum_type), copy_enum_entries_vec, enum_size);
315
314
  column.SetType(copy_type);
315
+ } else {
316
+ result->dependencies.AddDependency(*type_dependency);
316
317
  }
317
318
  }
318
319
  }
@@ -45,9 +45,18 @@ unique_ptr<BoundTableRef> Binder::Bind(BaseTableRef &ref) {
45
45
  return Bind(subquery, found_cte);
46
46
  } else {
47
47
  // There is a CTE binding in the BindContext.
48
- // This can only be the case if there is a recursive CTE present.
48
+ // This can only be the case if there is a recursive CTE,
49
+ // or a materialized CTE present.
49
50
  auto index = GenerateTableIndex();
50
- auto result = make_uniq<BoundCTERef>(index, ctebinding->index);
51
+ auto materialized = cte.materialized;
52
+ if (materialized == CTEMaterialize::CTE_MATERIALIZE_DEFAULT) {
53
+ #ifdef DUCKDB_ALTERNATIVE_VERIFY
54
+ materialized = CTEMaterialize::CTE_MATERIALIZE_ALWAYS;
55
+ #else
56
+ materialized = CTEMaterialize::CTE_MATERIALIZE_NEVER;
57
+ #endif
58
+ }
59
+ auto result = make_uniq<BoundCTERef>(index, ctebinding->index, materialized);
51
60
  auto b = ctebinding;
52
61
  auto alias = ref.alias.empty() ? ref.table_name : ref.alias;
53
62
  auto names = BindContext::AliasColumnNames(alias, b->names, ref.column_name_alias);
@@ -130,9 +130,19 @@ unique_ptr<BoundTableRef> Binder::Bind(JoinRef &ref) {
130
130
  {
131
131
  LateralBinder binder(left_binder, context);
132
132
  result->right = right_binder.Bind(*ref.right);
133
- result->correlated_columns = binder.ExtractCorrelatedColumns(right_binder);
134
-
135
- result->lateral = binder.HasCorrelatedColumns();
133
+ bool is_lateral = false;
134
+ // Store the correlated columns in the right binder in bound ref for planning of LATERALs
135
+ // Ignore the correlated columns in the left binder, flattening handles those correlations
136
+ result->correlated_columns = right_binder.correlated_columns;
137
+ // Find correlations for the current join
138
+ for (auto &cor_col : result->correlated_columns) {
139
+ if (cor_col.depth == 1) {
140
+ // Depth 1 indicates columns binding from the left indicating a lateral join
141
+ is_lateral = true;
142
+ break;
143
+ }
144
+ }
145
+ result->lateral = is_lateral;
136
146
  if (result->lateral) {
137
147
  // lateral join: can only be an INNER or LEFT join
138
148
  if (ref.type != JoinType::INNER && ref.type != JoinType::LEFT) {
@@ -210,6 +220,7 @@ unique_ptr<BoundTableRef> Binder::Bind(JoinRef &ref) {
210
220
 
211
221
  case JoinRefType::CROSS:
212
222
  case JoinRefType::POSITIONAL:
223
+ case JoinRefType::DEPENDENT:
213
224
  break;
214
225
  }
215
226
  extra_using_columns = RemoveDuplicateUsingColumns(extra_using_columns);
@@ -268,8 +279,24 @@ unique_ptr<BoundTableRef> Binder::Bind(JoinRef &ref) {
268
279
 
269
280
  bind_context.AddContext(std::move(left_binder.bind_context));
270
281
  bind_context.AddContext(std::move(right_binder.bind_context));
271
- MoveCorrelatedExpressions(left_binder);
272
- MoveCorrelatedExpressions(right_binder);
282
+
283
+ // Update the correlated columns for the parent binder
284
+ // For the left binder, depth >= 1 indicates correlations from the parent binder
285
+ for (const auto &col : left_binder.correlated_columns) {
286
+ if (col.depth >= 1) {
287
+ AddCorrelatedColumn(col);
288
+ }
289
+ }
290
+ // For the right binder, depth > 1 indicates correlations from the parent binder
291
+ // (depth = 1 indicates correlations from the left side of the join)
292
+ for (auto col : right_binder.correlated_columns) {
293
+ if (col.depth > 1) {
294
+ // Decrement the depth to account for the effect of the lateral binder
295
+ col.depth--;
296
+ AddCorrelatedColumn(col);
297
+ }
298
+ }
299
+
273
300
  for (auto &condition : extra_conditions) {
274
301
  if (ref.condition) {
275
302
  ref.condition = make_uniq<ConjunctionExpression>(ExpressionType::CONJUNCTION_AND, std::move(ref.condition),