duckdb 0.8.2-dev150.0 → 0.8.2-dev1559.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 +12 -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 +44 -31
  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
@@ -17,6 +17,9 @@ class SubqueryRef : public TableRef {
17
17
  public:
18
18
  static constexpr const TableReferenceType TYPE = TableReferenceType::SUBQUERY;
19
19
 
20
+ private:
21
+ SubqueryRef();
22
+
20
23
  public:
21
24
  DUCKDB_API explicit SubqueryRef(unique_ptr<SelectStatement> subquery, string alias = string());
22
25
 
@@ -50,6 +50,7 @@ class QueryNode;
50
50
  class SelectNode;
51
51
  class SetOperationNode;
52
52
  class RecursiveCTENode;
53
+ class CTENode;
53
54
 
54
55
  //===--------------------------------------------------------------------===//
55
56
  // Expressions
@@ -8,20 +8,20 @@
8
8
 
9
9
  #pragma once
10
10
 
11
+ #include "duckdb/common/case_insensitive_map.hpp"
11
12
  #include "duckdb/common/constants.hpp"
12
13
  #include "duckdb/common/enums/expression_type.hpp"
13
14
  #include "duckdb/common/types.hpp"
14
15
  #include "duckdb/common/unordered_map.hpp"
15
- #include "duckdb/parser/qualified_name.hpp"
16
- #include "duckdb/parser/tokens.hpp"
17
- #include "duckdb/parser/parsed_data/create_info.hpp"
18
16
  #include "duckdb/parser/group_by_node.hpp"
17
+ #include "duckdb/parser/parsed_data/create_info.hpp"
18
+ #include "duckdb/parser/qualified_name.hpp"
19
19
  #include "duckdb/parser/query_node.hpp"
20
- #include "duckdb/common/case_insensitive_map.hpp"
21
-
22
- #include "pg_definitions.hpp"
20
+ #include "duckdb/parser/query_node/cte_node.hpp"
21
+ #include "duckdb/parser/tokens.hpp"
23
22
  #include "nodes/parsenodes.hpp"
24
23
  #include "nodes/primnodes.hpp"
24
+ #include "pg_definitions.hpp"
25
25
 
26
26
  namespace duckdb {
27
27
 
@@ -232,6 +232,9 @@ private:
232
232
  unique_ptr<ParsedExpression> TransformParamRef(duckdb_libpgquery::PGParamRef &node);
233
233
  unique_ptr<ParsedExpression> TransformNamedArg(duckdb_libpgquery::PGNamedArgExpr &root);
234
234
 
235
+ //! Transform multi assignment reference into an Expression
236
+ unique_ptr<ParsedExpression> TransformMultiAssignRef(duckdb_libpgquery::PGMultiAssignRef &root);
237
+
235
238
  unique_ptr<ParsedExpression> TransformSQLValueFunction(duckdb_libpgquery::PGSQLValueFunction &node);
236
239
 
237
240
  unique_ptr<ParsedExpression> TransformSubquery(duckdb_libpgquery::PGSubLink &root);
@@ -269,13 +272,17 @@ private:
269
272
  OnCreateConflict TransformOnConflict(duckdb_libpgquery::PGOnCreateConflict conflict);
270
273
  string TransformAlias(duckdb_libpgquery::PGAlias *root, vector<string> &column_name_alias);
271
274
  vector<string> TransformStringList(duckdb_libpgquery::PGList *list);
272
- void TransformCTE(duckdb_libpgquery::PGWithClause &de_with_clause, CommonTableExpressionMap &cte_map);
273
- unique_ptr<SelectStatement> TransformRecursiveCTE(duckdb_libpgquery::PGCommonTableExpr &cte,
275
+ void TransformCTE(duckdb_libpgquery::PGWithClause &de_with_clause, CommonTableExpressionMap &cte_map,
276
+ vector<unique_ptr<CTENode>> &materialized_ctes);
277
+ static unique_ptr<QueryNode> TransformMaterializedCTE(unique_ptr<QueryNode> root,
278
+ vector<unique_ptr<CTENode>> &materialized_ctes);
279
+ unique_ptr<SelectStatement> TransformRecursiveCTE(duckdb_libpgquery::PGCommonTableExpr &node,
274
280
  CommonTableExpressionInfo &info);
275
281
 
276
282
  unique_ptr<ParsedExpression> TransformUnaryOperator(const string &op, unique_ptr<ParsedExpression> child);
277
283
  unique_ptr<ParsedExpression> TransformBinaryOperator(string op, unique_ptr<ParsedExpression> left,
278
284
  unique_ptr<ParsedExpression> right);
285
+ static bool ConstructConstantFromExpression(const ParsedExpression &expr, Value &value);
279
286
  //===--------------------------------------------------------------------===//
280
287
  // TableRef transform
281
288
  //===--------------------------------------------------------------------===//
@@ -21,6 +21,7 @@
21
21
  #include "duckdb/planner/bound_tokens.hpp"
22
22
  #include "duckdb/planner/expression/bound_columnref_expression.hpp"
23
23
  #include "duckdb/planner/logical_operator.hpp"
24
+ #include "duckdb/planner/joinside.hpp"
24
25
  #include "duckdb/common/reference_map.hpp"
25
26
 
26
27
  namespace duckdb {
@@ -75,7 +76,7 @@ struct CorrelatedColumnInfo {
75
76
  */
76
77
  class Binder : public std::enable_shared_from_this<Binder> {
77
78
  friend class ExpressionBinder;
78
- friend class RecursiveSubqueryPlanner;
79
+ friend class RecursiveDependentJoinPlanner;
79
80
 
80
81
  public:
81
82
  DUCKDB_API static shared_ptr<Binder> CreateBinder(ClientContext &context, optional_ptr<Binder> parent = nullptr,
@@ -199,10 +200,10 @@ private:
199
200
  vector<reference<ExpressionBinder>> active_binders;
200
201
  //! The count of bound_tables
201
202
  idx_t bound_tables;
202
- //! Whether or not the binder has any unplanned subqueries that still need to be planned
203
- bool has_unplanned_subqueries = false;
204
- //! Whether or not subqueries should be planned already
205
- bool plan_subquery = true;
203
+ //! Whether or not the binder has any unplanned dependent joins that still need to be planned/flattened
204
+ bool has_unplanned_dependent_joins = false;
205
+ //! Whether or not outside dependent joins have been planned and flattened
206
+ bool is_outside_flattened = true;
206
207
  //! Whether CTEs should reference the parent binder (if it exists)
207
208
  bool inherit_ctes = true;
208
209
  //! Whether or not the binder can contain NULLs as the root of expressions
@@ -217,6 +218,10 @@ private:
217
218
  reference_set_t<ViewCatalogEntry> bound_views;
218
219
 
219
220
  private:
221
+ //! Get the root binder (binder with no parent)
222
+ Binder *GetRootBinder();
223
+ //! Determine the depth of the binder
224
+ idx_t GetBinderDepth() const;
220
225
  //! Bind the expressions of generated columns to check for errors
221
226
  void BindGeneratedColumns(BoundCreateTableInfo &info);
222
227
  //! Bind the default values of the columns of a table
@@ -265,10 +270,12 @@ private:
265
270
  unique_ptr<BoundQueryNode> BindNode(SelectNode &node);
266
271
  unique_ptr<BoundQueryNode> BindNode(SetOperationNode &node);
267
272
  unique_ptr<BoundQueryNode> BindNode(RecursiveCTENode &node);
273
+ unique_ptr<BoundQueryNode> BindNode(CTENode &node);
268
274
  unique_ptr<BoundQueryNode> BindNode(QueryNode &node);
269
275
 
270
276
  unique_ptr<LogicalOperator> VisitQueryNode(BoundQueryNode &node, unique_ptr<LogicalOperator> root);
271
277
  unique_ptr<LogicalOperator> CreatePlan(BoundRecursiveCTENode &node);
278
+ unique_ptr<LogicalOperator> CreatePlan(BoundCTENode &node);
272
279
  unique_ptr<LogicalOperator> CreatePlan(BoundSelectNode &statement);
273
280
  unique_ptr<LogicalOperator> CreatePlan(BoundSetOperationNode &node);
274
281
  unique_ptr<LogicalOperator> CreatePlan(BoundQueryNode &node);
@@ -17,6 +17,7 @@ class BoundQueryNode;
17
17
  class BoundSelectNode;
18
18
  class BoundSetOperationNode;
19
19
  class BoundRecursiveCTENode;
20
+ class BoundCTENode;
20
21
 
21
22
  //===--------------------------------------------------------------------===//
22
23
  // Expressions
@@ -32,6 +32,10 @@ struct ColumnBinding {
32
32
  bool operator==(const ColumnBinding &rhs) const {
33
33
  return table_index == rhs.table_index && column_index == rhs.column_index;
34
34
  }
35
+
36
+ bool operator!=(const ColumnBinding &rhs) const {
37
+ return !(*this == rhs);
38
+ }
35
39
  };
36
40
 
37
41
  } // namespace duckdb
@@ -23,9 +23,9 @@ public:
23
23
  : BoundConstraint(ConstraintType::UNIQUE), keys(std::move(keys)), key_set(std::move(key_set)),
24
24
  is_primary_key(is_primary_key) {
25
25
  #ifdef DEBUG
26
- D_ASSERT(keys.size() == key_set.size());
27
- for (auto &key : keys) {
28
- D_ASSERT(key_set.find(key) != key_set.end());
26
+ D_ASSERT(this->keys.size() == this->key_set.size());
27
+ for (auto &key : this->keys) {
28
+ D_ASSERT(this->key_set.find(key) != this->key_set.end());
29
29
  }
30
30
  #endif
31
31
  }
@@ -20,8 +20,6 @@ class LateralBinder : public ExpressionBinder {
20
20
  public:
21
21
  LateralBinder(Binder &binder, ClientContext &context);
22
22
 
23
- //! Extract the correlated lateral join columns and remove them from the targeted binder
24
- vector<CorrelatedColumnInfo> ExtractCorrelatedColumns(Binder &binder);
25
23
  bool HasCorrelatedColumns() const {
26
24
  return !correlated_columns.empty();
27
25
  }
@@ -46,6 +46,7 @@ class LogicalPragma;
46
46
  class LogicalPrepare;
47
47
  class LogicalProjection;
48
48
  class LogicalRecursiveCTE;
49
+ class LogicalMaterializedCTE;
49
50
  class LogicalSetOperation;
50
51
  class LogicalSample;
51
52
  class LogicalShow;
@@ -25,6 +25,7 @@
25
25
  #include "duckdb/planner/operator/logical_join.hpp"
26
26
  #include "duckdb/planner/operator/logical_limit.hpp"
27
27
  #include "duckdb/planner/operator/logical_limit_percent.hpp"
28
+ #include "duckdb/planner/operator/logical_materialized_cte.hpp"
28
29
  #include "duckdb/planner/operator/logical_order.hpp"
29
30
  #include "duckdb/planner/operator/logical_pivot.hpp"
30
31
  #include "duckdb/planner/operator/logical_positional_join.hpp"
@@ -32,9 +33,9 @@
32
33
  #include "duckdb/planner/operator/logical_prepare.hpp"
33
34
  #include "duckdb/planner/operator/logical_projection.hpp"
34
35
  #include "duckdb/planner/operator/logical_recursive_cte.hpp"
36
+ #include "duckdb/planner/operator/logical_reset.hpp"
35
37
  #include "duckdb/planner/operator/logical_sample.hpp"
36
38
  #include "duckdb/planner/operator/logical_set.hpp"
37
- #include "duckdb/planner/operator/logical_reset.hpp"
38
39
  #include "duckdb/planner/operator/logical_set_operation.hpp"
39
40
  #include "duckdb/planner/operator/logical_show.hpp"
40
41
  #include "duckdb/planner/operator/logical_simple.hpp"
@@ -38,25 +38,25 @@ public:
38
38
  FieldReader &reader);
39
39
 
40
40
  public:
41
- static unique_ptr<LogicalOperator> CreateJoin(JoinType type, JoinRefType ref_type,
41
+ static unique_ptr<LogicalOperator> CreateJoin(ClientContext &context, JoinType type, JoinRefType ref_type,
42
42
  unique_ptr<LogicalOperator> left_child,
43
43
  unique_ptr<LogicalOperator> right_child,
44
44
  unique_ptr<Expression> condition);
45
- static unique_ptr<LogicalOperator> CreateJoin(JoinType type, JoinRefType ref_type,
45
+ static unique_ptr<LogicalOperator> CreateJoin(ClientContext &context, JoinType type, JoinRefType ref_type,
46
46
  unique_ptr<LogicalOperator> left_child,
47
47
  unique_ptr<LogicalOperator> right_child,
48
48
  vector<JoinCondition> conditions,
49
49
  vector<unique_ptr<Expression>> arbitrary_expressions);
50
50
 
51
- static void ExtractJoinConditions(JoinType type, unique_ptr<LogicalOperator> &left_child,
51
+ static void ExtractJoinConditions(ClientContext &context, JoinType type, unique_ptr<LogicalOperator> &left_child,
52
52
  unique_ptr<LogicalOperator> &right_child, unique_ptr<Expression> condition,
53
53
  vector<JoinCondition> &conditions,
54
54
  vector<unique_ptr<Expression>> &arbitrary_expressions);
55
- static void ExtractJoinConditions(JoinType type, unique_ptr<LogicalOperator> &left_child,
55
+ static void ExtractJoinConditions(ClientContext &context, JoinType type, unique_ptr<LogicalOperator> &left_child,
56
56
  unique_ptr<LogicalOperator> &right_child,
57
57
  vector<unique_ptr<Expression>> &expressions, vector<JoinCondition> &conditions,
58
58
  vector<unique_ptr<Expression>> &arbitrary_expressions);
59
- static void ExtractJoinConditions(JoinType type, unique_ptr<LogicalOperator> &left_child,
59
+ static void ExtractJoinConditions(ClientContext &context, JoinType type, unique_ptr<LogicalOperator> &left_child,
60
60
  unique_ptr<LogicalOperator> &right_child,
61
61
  const unordered_set<idx_t> &left_bindings,
62
62
  const unordered_set<idx_t> &right_bindings,
@@ -10,6 +10,7 @@
10
10
 
11
11
  #include "duckdb/common/types/chunk_collection.hpp"
12
12
  #include "duckdb/planner/logical_operator.hpp"
13
+ #include "duckdb/common/enums/cte_materialize.hpp"
13
14
 
14
15
  namespace duckdb {
15
16
 
@@ -19,8 +20,10 @@ public:
19
20
  static constexpr const LogicalOperatorType TYPE = LogicalOperatorType::LOGICAL_CTE_REF;
20
21
 
21
22
  public:
22
- LogicalCTERef(idx_t table_index, idx_t cte_index, vector<LogicalType> types, vector<string> colnames)
23
- : LogicalOperator(LogicalOperatorType::LOGICAL_CTE_REF), table_index(table_index), cte_index(cte_index) {
23
+ LogicalCTERef(idx_t table_index, idx_t cte_index, vector<LogicalType> types, vector<string> colnames,
24
+ CTEMaterialize materialized_cte)
25
+ : LogicalOperator(LogicalOperatorType::LOGICAL_CTE_REF), table_index(table_index), cte_index(cte_index),
26
+ materialized_cte(materialized_cte) {
24
27
  D_ASSERT(types.size() > 0);
25
28
  chunk_types = types;
26
29
  bound_columns = colnames;
@@ -33,6 +36,8 @@ public:
33
36
  idx_t cte_index;
34
37
  //! The types of the chunk
35
38
  vector<LogicalType> chunk_types;
39
+ //! Does this operator read a materialized CTE?
40
+ CTEMaterialize materialized_cte;
36
41
 
37
42
  public:
38
43
  vector<ColumnBinding> GetColumnBindings() override {
@@ -0,0 +1,43 @@
1
+ //===----------------------------------------------------------------------===//
2
+ // DuckDB
3
+ //
4
+ // duckdb/planner/operator/logical_dependent_join.hpp
5
+ //
6
+ // logical_dependent_join represents a logical operator for lateral joins that
7
+ // is planned but not yet flattened
8
+ //
9
+ // This construct only exists during planning and should not exist in the plan
10
+ // once flattening is complete. Although the same information can be kept in the
11
+ // join itself, creating a new construct makes the code cleaner and easier to
12
+ // understand.
13
+ //
14
+ //===----------------------------------------------------------------------===//
15
+
16
+ #pragma once
17
+
18
+ #include "duckdb/planner/binder.hpp"
19
+ #include "duckdb/planner/operator/logical_comparison_join.hpp"
20
+
21
+ namespace duckdb {
22
+
23
+ class LogicalDependentJoin : public LogicalComparisonJoin {
24
+ public:
25
+ static constexpr const LogicalOperatorType TYPE = LogicalOperatorType::LOGICAL_DEPENDENT_JOIN;
26
+
27
+ public:
28
+ explicit LogicalDependentJoin(unique_ptr<LogicalOperator> left, unique_ptr<LogicalOperator> right,
29
+ vector<CorrelatedColumnInfo> correlated_columns, JoinType type,
30
+ unique_ptr<Expression> condition);
31
+
32
+ //! The conditions of the join
33
+ unique_ptr<Expression> join_condition;
34
+ //! The list of columns that have correlations with the right
35
+ vector<CorrelatedColumnInfo> correlated_columns;
36
+
37
+ public:
38
+ static unique_ptr<LogicalOperator> Create(unique_ptr<LogicalOperator> left, unique_ptr<LogicalOperator> right,
39
+ vector<CorrelatedColumnInfo> correlated_columns, JoinType type,
40
+ unique_ptr<Expression> condition);
41
+ void Serialize(FieldWriter &writer) const override;
42
+ };
43
+ } // namespace duckdb
@@ -11,6 +11,7 @@
11
11
  #include "duckdb/function/table_function.hpp"
12
12
  #include "duckdb/planner/logical_operator.hpp"
13
13
  #include "duckdb/planner/table_filter.hpp"
14
+ #include "duckdb/common/extra_operator_info.hpp"
14
15
 
15
16
  namespace duckdb {
16
17
 
@@ -49,6 +50,9 @@ public:
49
50
  vector<string> input_table_names;
50
51
  //! For a table-in-out function, the set of projected input columns
51
52
  vector<column_t> projected_input;
53
+ //! Currently stores File Filters (as strings) applied by hive partitioning/complex filter pushdown
54
+ //! Stored so the can be included in explain output
55
+ ExtraOperatorInfo extra_info;
52
56
 
53
57
  string GetName() const override;
54
58
  string ParamsToString() const override;
@@ -0,0 +1,49 @@
1
+ //===----------------------------------------------------------------------===//
2
+ // DuckDB
3
+ //
4
+ // duckdb/planner/operator/logical_materialized_cte.hpp
5
+ //
6
+ //
7
+ //===----------------------------------------------------------------------===//
8
+
9
+ #pragma once
10
+
11
+ #include "duckdb/planner/logical_operator.hpp"
12
+
13
+ namespace duckdb {
14
+
15
+ class LogicalMaterializedCTE : public LogicalOperator {
16
+ LogicalMaterializedCTE(idx_t table_index)
17
+ : LogicalOperator(LogicalOperatorType::LOGICAL_MATERIALIZED_CTE), table_index(table_index) {
18
+ }
19
+
20
+ public:
21
+ static constexpr const LogicalOperatorType TYPE = LogicalOperatorType::LOGICAL_MATERIALIZED_CTE;
22
+
23
+ public:
24
+ LogicalMaterializedCTE(string ctename, idx_t table_index, idx_t column_count, unique_ptr<LogicalOperator> cte,
25
+ unique_ptr<LogicalOperator> child)
26
+ : LogicalOperator(LogicalOperatorType::LOGICAL_MATERIALIZED_CTE), table_index(table_index),
27
+ column_count(column_count), ctename(ctename) {
28
+ children.push_back(std::move(cte));
29
+ children.push_back(std::move(child));
30
+ }
31
+
32
+ idx_t table_index;
33
+ idx_t column_count;
34
+ string ctename;
35
+
36
+ public:
37
+ vector<ColumnBinding> GetColumnBindings() override {
38
+ return children[1]->GetColumnBindings();
39
+ }
40
+ void Serialize(FieldWriter &writer) const override;
41
+ static unique_ptr<LogicalOperator> Deserialize(LogicalDeserializationState &state, FieldReader &reader);
42
+ vector<idx_t> GetTableIndex() const override;
43
+
44
+ protected:
45
+ void ResolveTypes() override {
46
+ types = children[1]->types;
47
+ }
48
+ };
49
+ } // namespace duckdb
@@ -22,15 +22,16 @@ public:
22
22
  static constexpr const LogicalOperatorType TYPE = LogicalOperatorType::LOGICAL_RECURSIVE_CTE;
23
23
 
24
24
  public:
25
- LogicalRecursiveCTE(idx_t table_index, idx_t column_count, bool union_all, unique_ptr<LogicalOperator> top,
26
- unique_ptr<LogicalOperator> bottom)
27
- : LogicalOperator(LogicalOperatorType::LOGICAL_RECURSIVE_CTE), union_all(union_all), table_index(table_index),
28
- column_count(column_count) {
25
+ LogicalRecursiveCTE(string ctename, idx_t table_index, idx_t column_count, bool union_all,
26
+ unique_ptr<LogicalOperator> top, unique_ptr<LogicalOperator> bottom)
27
+ : LogicalOperator(LogicalOperatorType::LOGICAL_RECURSIVE_CTE), union_all(union_all), ctename(ctename),
28
+ table_index(table_index), column_count(column_count) {
29
29
  children.push_back(std::move(top));
30
30
  children.push_back(std::move(bottom));
31
31
  }
32
32
 
33
33
  bool union_all;
34
+ string ctename;
34
35
  idx_t table_index;
35
36
  idx_t column_count;
36
37
 
@@ -0,0 +1,44 @@
1
+ //===----------------------------------------------------------------------===//
2
+ // DuckDB
3
+ //
4
+ // duckdb/planner/query_node/bound_cte_node.hpp
5
+ //
6
+ //
7
+ //===----------------------------------------------------------------------===//
8
+
9
+ #pragma once
10
+
11
+ #include "duckdb/planner/binder.hpp"
12
+ #include "duckdb/planner/bound_query_node.hpp"
13
+
14
+ namespace duckdb {
15
+
16
+ class BoundCTENode : public BoundQueryNode {
17
+ public:
18
+ static constexpr const QueryNodeType TYPE = QueryNodeType::CTE_NODE;
19
+
20
+ public:
21
+ BoundCTENode() : BoundQueryNode(QueryNodeType::CTE_NODE) {
22
+ }
23
+
24
+ //! Keep track of the CTE name this node represents
25
+ string ctename;
26
+
27
+ //! The cte node
28
+ unique_ptr<BoundQueryNode> query;
29
+ //! The child node
30
+ unique_ptr<BoundQueryNode> child;
31
+ //! Index used by the set operation
32
+ idx_t setop_index;
33
+ //! The binder used by the query side of the CTE
34
+ shared_ptr<Binder> query_binder;
35
+ //! The binder used by the child side of the CTE
36
+ shared_ptr<Binder> child_binder;
37
+
38
+ public:
39
+ idx_t GetRootIndex() override {
40
+ return child->GetRootIndex();
41
+ }
42
+ };
43
+
44
+ } // namespace duckdb
@@ -1,3 +1,4 @@
1
1
  #include "duckdb/planner/query_node/bound_recursive_cte_node.hpp"
2
+ #include "duckdb/planner/query_node/bound_cte_node.hpp"
2
3
  #include "duckdb/planner/query_node/bound_select_node.hpp"
3
4
  #include "duckdb/planner/query_node/bound_set_operation_node.hpp"
@@ -23,7 +23,7 @@ struct FlattenDependentJoins {
23
23
 
24
24
  //! Detects which Logical Operators have correlated expressions that they are dependent upon, filling the
25
25
  //! has_correlated_expressions map.
26
- bool DetectCorrelatedExpressions(LogicalOperator *op, bool lateral = false);
26
+ bool DetectCorrelatedExpressions(LogicalOperator *op, bool lateral = false, idx_t lateral_depth = 0);
27
27
 
28
28
  //! Push the dependent join down a LogicalOperator
29
29
  unique_ptr<LogicalOperator> PushDownDependentJoin(unique_ptr<LogicalOperator> plan);
@@ -43,7 +43,7 @@ struct FlattenDependentJoins {
43
43
 
44
44
  private:
45
45
  unique_ptr<LogicalOperator> PushDownDependentJoinInternal(unique_ptr<LogicalOperator> plan,
46
- bool &parent_propagate_null_values);
46
+ bool &parent_propagate_null_values, idx_t lateral_depth);
47
47
  };
48
48
 
49
49
  } // namespace duckdb
@@ -16,7 +16,8 @@ namespace duckdb {
16
16
  //! Helper class to recursively detect correlated expressions inside a single LogicalOperator
17
17
  class HasCorrelatedExpressions : public LogicalOperatorVisitor {
18
18
  public:
19
- explicit HasCorrelatedExpressions(const vector<CorrelatedColumnInfo> &correlated, bool lateral = false);
19
+ explicit HasCorrelatedExpressions(const vector<CorrelatedColumnInfo> &correlated, bool lateral = false,
20
+ idx_t lateral_depth = 0);
20
21
 
21
22
  void VisitOperator(LogicalOperator &op) override;
22
23
 
@@ -28,6 +29,8 @@ protected:
28
29
  unique_ptr<Expression> VisitReplace(BoundSubqueryExpression &expr, unique_ptr<Expression> *expr_ptr) override;
29
30
 
30
31
  const vector<CorrelatedColumnInfo> &correlated_columns;
32
+ // Tracks number of nested laterals
33
+ idx_t lateral_depth;
31
34
  };
32
35
 
33
36
  } // namespace duckdb
@@ -0,0 +1,31 @@
1
+ //===----------------------------------------------------------------------===//
2
+ // DuckDB
3
+ //
4
+ // duckdb/planner/subquery/recursive_dependent_join_planner.hpp
5
+ //
6
+ //
7
+ //===----------------------------------------------------------------------===//
8
+
9
+ #pragma once
10
+
11
+ #include "duckdb/planner/logical_operator_visitor.hpp"
12
+
13
+ namespace duckdb {
14
+
15
+ class Binder;
16
+
17
+ /*
18
+ * Recursively plan subqueries and flatten dependent joins from outermost to innermost (like peeling an onion).
19
+ */
20
+ class RecursiveDependentJoinPlanner : public LogicalOperatorVisitor {
21
+ public:
22
+ explicit RecursiveDependentJoinPlanner(Binder &binder) : binder(binder) {
23
+ }
24
+ void VisitOperator(LogicalOperator &op) override;
25
+ unique_ptr<Expression> VisitReplace(BoundSubqueryExpression &expr, unique_ptr<Expression> *expr_ptr) override;
26
+
27
+ private:
28
+ unique_ptr<LogicalOperator> root;
29
+ Binder &binder;
30
+ };
31
+ } // namespace duckdb
@@ -17,7 +17,8 @@ namespace duckdb {
17
17
  //! Helper class to rewrite correlated expressions within a single LogicalOperator
18
18
  class RewriteCorrelatedExpressions : public LogicalOperatorVisitor {
19
19
  public:
20
- RewriteCorrelatedExpressions(ColumnBinding base_binding, column_binding_map_t<idx_t> &correlated_map);
20
+ RewriteCorrelatedExpressions(ColumnBinding base_binding, column_binding_map_t<idx_t> &correlated_map,
21
+ idx_t lateral_depth, bool recursive_rewrite = false);
21
22
 
22
23
  void VisitOperator(LogicalOperator &op) override;
23
24
 
@@ -31,7 +32,7 @@ private:
31
32
  public:
32
33
  RewriteCorrelatedRecursive(BoundSubqueryExpression &parent, ColumnBinding base_binding,
33
34
  column_binding_map_t<idx_t> &correlated_map);
34
-
35
+ void RewriteJoinRefRecursive(BoundTableRef &ref);
35
36
  void RewriteCorrelatedSubquery(BoundSubqueryExpression &expr);
36
37
  void RewriteCorrelatedExpressions(Expression &child);
37
38
 
@@ -43,6 +44,11 @@ private:
43
44
  private:
44
45
  ColumnBinding base_binding;
45
46
  column_binding_map_t<idx_t> &correlated_map;
47
+ // To keep track of the number of dependent joins encountered
48
+ idx_t lateral_depth;
49
+ // This flag is used to determine if the rewrite should recursively update the bindings for all
50
+ // bound columns ref in the plan, and update the depths to match the new source
51
+ bool recursive_rewrite;
46
52
  };
47
53
 
48
54
  //! Helper class that rewrites COUNT aggregates into a CASE expression turning NULL into 0 after a LEFT OUTER JOIN
@@ -17,8 +17,9 @@ public:
17
17
  static constexpr const TableReferenceType TYPE = TableReferenceType::CTE;
18
18
 
19
19
  public:
20
- BoundCTERef(idx_t bind_index, idx_t cte_index)
21
- : BoundTableRef(TableReferenceType::CTE), bind_index(bind_index), cte_index(cte_index) {
20
+ BoundCTERef(idx_t bind_index, idx_t cte_index, CTEMaterialize materialized_cte)
21
+ : BoundTableRef(TableReferenceType::CTE), bind_index(bind_index), cte_index(cte_index),
22
+ materialized_cte(materialized_cte) {
22
23
  }
23
24
 
24
25
  //! The set of columns bound to this base table reference
@@ -29,5 +30,7 @@ public:
29
30
  idx_t bind_index;
30
31
  //! The index of the cte
31
32
  idx_t cte_index;
33
+ //! Is this a reference to a materialized CTE?
34
+ CTEMaterialize materialized_cte;
32
35
  };
33
36
  } // namespace duckdb
@@ -45,7 +45,7 @@ public:
45
45
  DUCKDB_API ArenaChunk *GetHead();
46
46
  DUCKDB_API ArenaChunk *GetTail();
47
47
 
48
- DUCKDB_API bool IsEmpty();
48
+ DUCKDB_API bool IsEmpty() const;
49
49
 
50
50
  //! Returns an "Allocator" wrapper for this arena allocator
51
51
  Allocator &GetAllocator() {
@@ -65,6 +65,9 @@ public:
65
65
  //! Returns the number of free blocks
66
66
  virtual idx_t FreeBlocks() = 0;
67
67
 
68
+ //! Truncate the underlying database file after a checkpoint
69
+ virtual void Truncate();
70
+
68
71
  //! Register a block with the given block id in the base file
69
72
  shared_ptr<BlockHandle> RegisterBlock(block_id_t block_id, bool is_meta_block = false);
70
73
  //! Clear cached handles for meta blocks
@@ -74,9 +77,6 @@ public:
74
77
 
75
78
  void UnregisterBlock(block_id_t block_id, bool can_destroy);
76
79
 
77
- static BlockManager &GetBlockManager(ClientContext &context);
78
- static BlockManager &GetBlockManager(DatabaseInstance &db);
79
-
80
80
  private:
81
81
  //! The lock for the set of blocks
82
82
  mutex blocks_lock;
@@ -51,7 +51,7 @@ public:
51
51
  const string &table, vector<ColumnDefinition> column_definitions_p,
52
52
  unique_ptr<PersistentTableData> data = nullptr);
53
53
  //! Constructs a DataTable as a delta on an existing data table with a newly added column
54
- DataTable(ClientContext &context, DataTable &parent, ColumnDefinition &new_column, Expression *default_value);
54
+ DataTable(ClientContext &context, DataTable &parent, ColumnDefinition &new_column, Expression &default_value);
55
55
  //! Constructs a DataTable as a delta on an existing data table but with one column removed
56
56
  DataTable(ClientContext &context, DataTable &parent, idx_t removed_column);
57
57
  //! Constructs a DataTable as a delta on an existing data table but with one column changed type
@@ -47,11 +47,33 @@ public:
47
47
  return std::static_pointer_cast<T, ObjectCacheEntry>(object);
48
48
  }
49
49
 
50
+ template <class T, class... Args>
51
+ shared_ptr<T> GetOrCreate(const string &key, Args &&...args) {
52
+ lock_guard<mutex> glock(lock);
53
+
54
+ auto entry = cache.find(key);
55
+ if (entry == cache.end()) {
56
+ auto value = make_shared<T>(args...);
57
+ cache[key] = value;
58
+ return value;
59
+ }
60
+ auto object = entry->second;
61
+ if (!object || object->GetObjectType() != T::ObjectType()) {
62
+ return nullptr;
63
+ }
64
+ return std::static_pointer_cast<T, ObjectCacheEntry>(object);
65
+ }
66
+
50
67
  void Put(string key, shared_ptr<ObjectCacheEntry> value) {
51
68
  lock_guard<mutex> glock(lock);
52
69
  cache[key] = std::move(value);
53
70
  }
54
71
 
72
+ void Delete(const string &key) {
73
+ lock_guard<mutex> glock(lock);
74
+ cache.erase(key);
75
+ }
76
+
55
77
  DUCKDB_API static ObjectCache &GetObjectCache(ClientContext &context);
56
78
  DUCKDB_API static bool ObjectCacheEnabled(ClientContext &context);
57
79