duckdb 0.8.2-dev11.0 → 0.8.2-dev1212.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (396) hide show
  1. package/binding.gyp +14 -12
  2. package/binding.gyp.in +1 -1
  3. package/configure.py +1 -1
  4. package/duckdb_extension_config.cmake +10 -0
  5. package/lib/duckdb.d.ts +59 -0
  6. package/lib/duckdb.js +21 -0
  7. package/package.json +1 -1
  8. package/src/duckdb/extension/icu/icu-dateadd.cpp +2 -2
  9. package/src/duckdb/extension/icu/icu-datefunc.cpp +1 -1
  10. package/src/duckdb/extension/icu/icu-datepart.cpp +2 -2
  11. package/src/duckdb/extension/icu/icu-datesub.cpp +2 -2
  12. package/src/duckdb/extension/icu/icu-datetrunc.cpp +1 -1
  13. package/src/duckdb/extension/icu/icu-list-range.cpp +1 -1
  14. package/src/duckdb/extension/icu/icu-makedate.cpp +7 -0
  15. package/src/duckdb/extension/icu/icu-strptime.cpp +4 -4
  16. package/src/duckdb/extension/icu/icu-table-range.cpp +5 -5
  17. package/src/duckdb/extension/icu/icu-timebucket.cpp +16 -16
  18. package/src/duckdb/extension/icu/icu-timezone.cpp +8 -8
  19. package/src/duckdb/extension/icu/icu_extension.cpp +5 -7
  20. package/src/duckdb/extension/json/include/json_common.hpp +47 -231
  21. package/src/duckdb/extension/json/include/json_executors.hpp +49 -13
  22. package/src/duckdb/extension/json/include/json_functions.hpp +2 -1
  23. package/src/duckdb/extension/json/json_common.cpp +272 -40
  24. package/src/duckdb/extension/json/json_functions/json_structure.cpp +1 -1
  25. package/src/duckdb/extension/json/json_functions/json_transform.cpp +17 -37
  26. package/src/duckdb/extension/json/json_functions/json_type.cpp +1 -1
  27. package/src/duckdb/extension/json/json_functions.cpp +24 -24
  28. package/src/duckdb/extension/json/json_scan.cpp +3 -6
  29. package/src/duckdb/extension/parquet/column_reader.cpp +19 -21
  30. package/src/duckdb/extension/parquet/column_writer.cpp +77 -61
  31. package/src/duckdb/extension/parquet/include/cast_column_reader.hpp +2 -2
  32. package/src/duckdb/extension/parquet/include/column_reader.hpp +14 -16
  33. package/src/duckdb/extension/parquet/include/column_writer.hpp +9 -7
  34. package/src/duckdb/extension/parquet/include/list_column_reader.hpp +2 -2
  35. package/src/duckdb/extension/parquet/include/parquet_dbp_decoder.hpp +3 -3
  36. package/src/duckdb/extension/parquet/include/parquet_decimal_utils.hpp +3 -3
  37. package/src/duckdb/extension/parquet/include/parquet_file_metadata_cache.hpp +2 -2
  38. package/src/duckdb/extension/parquet/include/parquet_statistics.hpp +2 -2
  39. package/src/duckdb/extension/parquet/include/parquet_support.hpp +9 -11
  40. package/src/duckdb/extension/parquet/include/parquet_writer.hpp +24 -5
  41. package/src/duckdb/extension/parquet/include/string_column_reader.hpp +1 -1
  42. package/src/duckdb/extension/parquet/include/struct_column_reader.hpp +2 -3
  43. package/src/duckdb/extension/parquet/include/zstd_file_system.hpp +2 -2
  44. package/src/duckdb/extension/parquet/parquet_extension.cpp +191 -19
  45. package/src/duckdb/extension/parquet/parquet_reader.cpp +6 -6
  46. package/src/duckdb/extension/parquet/parquet_statistics.cpp +7 -6
  47. package/src/duckdb/extension/parquet/parquet_writer.cpp +79 -16
  48. package/src/duckdb/extension/parquet/zstd_file_system.cpp +2 -2
  49. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +1 -1
  50. package/src/duckdb/src/catalog/default/default_functions.cpp +16 -0
  51. package/src/duckdb/src/common/adbc/adbc.cpp +75 -10
  52. package/src/duckdb/src/common/adbc/driver_manager.cpp +6 -11
  53. package/src/duckdb/src/common/allocator.cpp +14 -2
  54. package/src/duckdb/src/common/arrow/arrow_appender.cpp +5 -11
  55. package/src/duckdb/src/common/arrow/arrow_wrapper.cpp +0 -12
  56. package/src/duckdb/src/common/assert.cpp +3 -0
  57. package/src/duckdb/src/common/enum_util.cpp +42 -5
  58. package/src/duckdb/src/common/enums/logical_operator_type.cpp +4 -0
  59. package/src/duckdb/src/common/enums/optimizer_type.cpp +2 -0
  60. package/src/duckdb/src/common/enums/physical_operator_type.cpp +4 -0
  61. package/src/duckdb/src/common/exception.cpp +2 -2
  62. package/src/duckdb/src/common/file_system.cpp +15 -0
  63. package/src/duckdb/src/common/local_file_system.cpp +2 -2
  64. package/src/duckdb/src/common/multi_file_reader.cpp +181 -18
  65. package/src/duckdb/src/common/radix_partitioning.cpp +27 -9
  66. package/src/duckdb/src/common/re2_regex.cpp +1 -1
  67. package/src/duckdb/src/common/row_operations/row_external.cpp +1 -1
  68. package/src/duckdb/src/common/sort/merge_sorter.cpp +9 -16
  69. package/src/duckdb/src/common/sort/partition_state.cpp +44 -11
  70. package/src/duckdb/src/common/types/batched_data_collection.cpp +7 -2
  71. package/src/duckdb/src/common/types/column/column_data_allocator.cpp +9 -6
  72. package/src/duckdb/src/common/types/column/column_data_collection.cpp +17 -2
  73. package/src/duckdb/src/common/types/column/column_data_collection_segment.cpp +15 -6
  74. package/src/duckdb/src/common/types/column/partitioned_column_data.cpp +2 -2
  75. package/src/duckdb/src/common/types/data_chunk.cpp +2 -2
  76. package/src/duckdb/src/common/types/date.cpp +9 -0
  77. package/src/duckdb/src/common/types/list_segment.cpp +24 -74
  78. package/src/duckdb/src/common/types/row/partitioned_tuple_data.cpp +3 -9
  79. package/src/duckdb/src/common/types/row/tuple_data_collection.cpp +2 -0
  80. package/src/duckdb/src/common/types/row/tuple_data_scatter_gather.cpp +2 -2
  81. package/src/duckdb/src/common/types/uuid.cpp +2 -2
  82. package/src/duckdb/src/common/types/validity_mask.cpp +33 -0
  83. package/src/duckdb/src/common/types/vector.cpp +15 -14
  84. package/src/duckdb/src/common/vector_operations/is_distinct_from.cpp +6 -4
  85. package/src/duckdb/src/core_functions/aggregate/holistic/reservoir_quantile.cpp +2 -0
  86. package/src/duckdb/src/core_functions/aggregate/nested/list.cpp +2 -2
  87. package/src/duckdb/src/core_functions/aggregate/regression/regr_avg.cpp +4 -4
  88. package/src/duckdb/src/core_functions/aggregate/regression/regr_intercept.cpp +4 -4
  89. package/src/duckdb/src/core_functions/aggregate/regression/regr_r2.cpp +5 -4
  90. package/src/duckdb/src/core_functions/aggregate/regression/regr_sxx_syy.cpp +8 -8
  91. package/src/duckdb/src/core_functions/aggregate/regression/regr_sxy.cpp +4 -3
  92. package/src/duckdb/src/core_functions/function_list.cpp +4 -2
  93. package/src/duckdb/src/core_functions/scalar/date/date_part.cpp +208 -42
  94. package/src/duckdb/src/core_functions/scalar/date/epoch.cpp +0 -17
  95. package/src/duckdb/src/core_functions/scalar/date/make_date.cpp +19 -4
  96. package/src/duckdb/src/core_functions/scalar/list/list_aggregates.cpp +4 -2
  97. package/src/duckdb/src/execution/aggregate_hashtable.cpp +34 -18
  98. package/src/duckdb/src/execution/expression_executor.cpp +1 -1
  99. package/src/duckdb/src/execution/index/art/art.cpp +149 -139
  100. package/src/duckdb/src/execution/index/art/fixed_size_allocator.cpp +1 -1
  101. package/src/duckdb/src/execution/index/art/iterator.cpp +129 -207
  102. package/src/duckdb/src/execution/index/art/leaf.cpp +8 -37
  103. package/src/duckdb/src/execution/index/art/node.cpp +113 -120
  104. package/src/duckdb/src/execution/index/art/node16.cpp +1 -10
  105. package/src/duckdb/src/execution/index/art/node256.cpp +1 -9
  106. package/src/duckdb/src/execution/index/art/node4.cpp +12 -13
  107. package/src/duckdb/src/execution/index/art/node48.cpp +1 -11
  108. package/src/duckdb/src/execution/index/art/prefix.cpp +228 -350
  109. package/src/duckdb/src/execution/join_hashtable.cpp +4 -4
  110. package/src/duckdb/src/execution/operator/aggregate/aggregate_object.cpp +1 -0
  111. package/src/duckdb/src/execution/operator/aggregate/physical_streaming_window.cpp +8 -3
  112. package/src/duckdb/src/execution/operator/aggregate/physical_ungrouped_aggregate.cpp +32 -22
  113. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +512 -300
  114. package/src/duckdb/src/execution/operator/helper/physical_batch_collector.cpp +4 -3
  115. package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +5 -5
  116. package/src/duckdb/src/execution/operator/join/physical_asof_join.cpp +414 -283
  117. package/src/duckdb/src/execution/operator/join/physical_comparison_join.cpp +1 -1
  118. package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +21 -10
  119. package/src/duckdb/src/execution/operator/join/physical_join.cpp +1 -1
  120. package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +22 -3
  121. package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +2 -2
  122. package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +100 -13
  123. package/src/duckdb/src/execution/operator/persistent/csv_file_handle.cpp +1 -1
  124. package/src/duckdb/src/execution/operator/persistent/csv_reader_options.cpp +20 -0
  125. package/src/duckdb/src/execution/operator/persistent/csv_rejects_table.cpp +48 -0
  126. package/src/duckdb/src/execution/operator/persistent/parallel_csv_reader.cpp +2 -3
  127. package/src/duckdb/src/execution/operator/persistent/physical_batch_copy_to_file.cpp +6 -4
  128. package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +3 -2
  129. package/src/duckdb/src/execution/operator/persistent/physical_fixed_batch_copy.cpp +3 -3
  130. package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +1 -1
  131. package/src/duckdb/src/execution/operator/projection/physical_pivot.cpp +2 -1
  132. package/src/duckdb/src/execution/operator/scan/physical_column_data_scan.cpp +19 -0
  133. package/src/duckdb/src/execution/operator/set/physical_cte.cpp +160 -0
  134. package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +15 -5
  135. package/src/duckdb/src/execution/partitionable_hashtable.cpp +41 -6
  136. package/src/duckdb/src/execution/perfect_aggregate_hashtable.cpp +30 -5
  137. package/src/duckdb/src/execution/physical_operator.cpp +17 -14
  138. package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +43 -10
  139. package/src/duckdb/src/execution/physical_plan/plan_cte.cpp +33 -0
  140. package/src/duckdb/src/execution/physical_plan/plan_recursive_cte.cpp +25 -4
  141. package/src/duckdb/src/execution/physical_plan_generator.cpp +4 -0
  142. package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +290 -43
  143. package/src/duckdb/src/execution/window_segment_tree.cpp +286 -129
  144. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +2 -1
  145. package/src/duckdb/src/function/function.cpp +3 -1
  146. package/src/duckdb/src/function/scalar/compressed_materialization/compress_integral.cpp +212 -0
  147. package/src/duckdb/src/function/scalar/compressed_materialization/compress_string.cpp +249 -0
  148. package/src/duckdb/src/function/scalar/compressed_materialization_functions.cpp +29 -0
  149. package/src/duckdb/src/function/scalar/list/list_resize.cpp +162 -0
  150. package/src/duckdb/src/function/scalar/nested_functions.cpp +1 -0
  151. package/src/duckdb/src/function/scalar/string/like.cpp +12 -4
  152. package/src/duckdb/src/function/scalar/system/aggregate_export.cpp +12 -5
  153. package/src/duckdb/src/function/table/copy_csv.cpp +8 -1
  154. package/src/duckdb/src/function/table/read_csv.cpp +100 -17
  155. package/src/duckdb/src/function/table/system/test_all_types.cpp +38 -18
  156. package/src/duckdb/src/function/table/table_scan.cpp +9 -0
  157. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  158. package/src/duckdb/src/include/duckdb/common/adbc/adbc.hpp +1 -0
  159. package/src/duckdb/src/include/duckdb/common/allocator.hpp +2 -0
  160. package/src/duckdb/src/include/duckdb/common/bswap.hpp +42 -0
  161. package/src/duckdb/src/include/duckdb/common/enum_util.hpp +8 -0
  162. package/src/duckdb/src/include/duckdb/common/enums/cte_materialize.hpp +21 -0
  163. package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +2 -1
  164. package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +2 -0
  165. package/src/duckdb/src/include/duckdb/common/enums/optimizer_type.hpp +2 -0
  166. package/src/duckdb/src/include/duckdb/common/enums/physical_operator_type.hpp +2 -0
  167. package/src/duckdb/src/include/duckdb/common/multi_file_reader.hpp +6 -4
  168. package/src/duckdb/src/include/duckdb/common/multi_file_reader_options.hpp +10 -42
  169. package/src/duckdb/src/include/duckdb/common/mutex.hpp +3 -0
  170. package/src/duckdb/src/include/duckdb/common/radix.hpp +9 -20
  171. package/src/duckdb/src/include/duckdb/common/radix_partitioning.hpp +6 -21
  172. package/src/duckdb/src/include/duckdb/common/row_operations/row_operations.hpp +3 -3
  173. package/src/duckdb/src/include/duckdb/common/sort/partition_state.hpp +13 -0
  174. package/src/duckdb/src/include/duckdb/common/types/batched_data_collection.hpp +3 -1
  175. package/src/duckdb/src/include/duckdb/common/types/column/column_data_allocator.hpp +1 -1
  176. package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection.hpp +6 -1
  177. package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection_segment.hpp +1 -1
  178. package/src/duckdb/src/include/duckdb/common/types/column/column_data_scan_states.hpp +3 -1
  179. package/src/duckdb/src/include/duckdb/common/types/data_chunk.hpp +1 -1
  180. package/src/duckdb/src/include/duckdb/common/types/date.hpp +7 -5
  181. package/src/duckdb/src/include/duckdb/common/types/list_segment.hpp +6 -8
  182. package/src/duckdb/src/include/duckdb/common/types/row/partitioned_tuple_data.hpp +0 -1
  183. package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_collection.hpp +1 -0
  184. package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_states.hpp +3 -0
  185. package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +9 -0
  186. package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/corr.hpp +4 -4
  187. package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/covar.hpp +3 -1
  188. package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_count.hpp +1 -0
  189. package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_slope.hpp +3 -3
  190. package/src/duckdb/src/include/duckdb/core_functions/scalar/date_functions.hpp +24 -6
  191. package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +21 -3
  192. package/src/duckdb/src/include/duckdb/execution/executor.hpp +3 -0
  193. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +4 -5
  194. package/src/duckdb/src/include/duckdb/execution/index/art/iterator.hpp +31 -27
  195. package/src/duckdb/src/include/duckdb/execution/index/art/leaf.hpp +6 -14
  196. package/src/duckdb/src/include/duckdb/execution/index/art/node.hpp +4 -10
  197. package/src/duckdb/src/include/duckdb/execution/index/art/node16.hpp +3 -6
  198. package/src/duckdb/src/include/duckdb/execution/index/art/node256.hpp +3 -6
  199. package/src/duckdb/src/include/duckdb/execution/index/art/node4.hpp +5 -8
  200. package/src/duckdb/src/include/duckdb/execution/index/art/node48.hpp +3 -6
  201. package/src/duckdb/src/include/duckdb/execution/index/art/prefix.hpp +63 -52
  202. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_asof_join.hpp +2 -10
  203. package/src/duckdb/src/include/duckdb/execution/operator/persistent/base_csv_reader.hpp +2 -2
  204. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_line_info.hpp +4 -3
  205. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +8 -1
  206. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_rejects_table.hpp +36 -0
  207. package/src/duckdb/src/include/duckdb/execution/operator/persistent/parallel_csv_reader.hpp +1 -1
  208. package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_column_data_scan.hpp +10 -0
  209. package/src/duckdb/src/include/duckdb/execution/operator/set/physical_cte.hpp +62 -0
  210. package/src/duckdb/src/include/duckdb/execution/operator/set/physical_recursive_cte.hpp +8 -2
  211. package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +5 -1
  212. package/src/duckdb/src/include/duckdb/execution/physical_operator.hpp +3 -0
  213. package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +3 -0
  214. package/src/duckdb/src/include/duckdb/execution/radix_partitioned_hashtable.hpp +10 -3
  215. package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +51 -40
  216. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +1 -1
  217. package/src/duckdb/src/include/duckdb/function/aggregate_state.hpp +2 -2
  218. package/src/duckdb/src/include/duckdb/function/built_in_functions.hpp +1 -0
  219. package/src/duckdb/src/include/duckdb/function/scalar/compressed_materialization_functions.hpp +49 -0
  220. package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +1 -1
  221. package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +5 -0
  222. package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +2 -0
  223. package/src/duckdb/src/include/duckdb/function/table/system_functions.hpp +1 -1
  224. package/src/duckdb/src/include/duckdb/main/client_config.hpp +3 -0
  225. package/src/duckdb/src/include/duckdb/main/config.hpp +2 -0
  226. package/src/duckdb/src/include/duckdb/main/connection.hpp +1 -2
  227. package/src/duckdb/src/include/duckdb/main/settings.hpp +21 -1
  228. package/src/duckdb/src/include/duckdb/optimizer/column_binding_replacer.hpp +47 -0
  229. package/src/duckdb/src/include/duckdb/optimizer/compressed_materialization.hpp +132 -0
  230. package/src/duckdb/src/include/duckdb/optimizer/deliminator.hpp +13 -16
  231. package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +3 -0
  232. package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +1 -1
  233. package/src/duckdb/src/include/duckdb/optimizer/join_order/estimated_properties.hpp +10 -1
  234. package/src/duckdb/src/include/duckdb/optimizer/join_order/join_order_optimizer.hpp +1 -1
  235. package/src/duckdb/src/include/duckdb/optimizer/join_order/join_relation.hpp +1 -1
  236. package/src/duckdb/src/include/duckdb/optimizer/join_order/query_graph.hpp +3 -0
  237. package/src/duckdb/src/include/duckdb/optimizer/matcher/set_matcher.hpp +13 -0
  238. package/src/duckdb/src/include/duckdb/optimizer/optimizer.hpp +3 -0
  239. package/src/duckdb/src/include/duckdb/optimizer/remove_duplicate_groups.hpp +40 -0
  240. package/src/duckdb/src/include/duckdb/optimizer/statistics_propagator.hpp +11 -3
  241. package/src/duckdb/src/include/duckdb/optimizer/topn_optimizer.hpp +2 -0
  242. package/src/duckdb/src/include/duckdb/parallel/pipeline.hpp +2 -0
  243. package/src/duckdb/src/include/duckdb/parallel/task_scheduler.hpp +5 -0
  244. package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +2 -0
  245. package/src/duckdb/src/include/duckdb/parser/query_node/cte_node.hpp +54 -0
  246. package/src/duckdb/src/include/duckdb/parser/query_node/list.hpp +1 -0
  247. package/src/duckdb/src/include/duckdb/parser/query_node.hpp +2 -1
  248. package/src/duckdb/src/include/duckdb/parser/tokens.hpp +1 -0
  249. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +15 -8
  250. package/src/duckdb/src/include/duckdb/planner/binder.hpp +8 -5
  251. package/src/duckdb/src/include/duckdb/planner/bound_tokens.hpp +1 -0
  252. package/src/duckdb/src/include/duckdb/planner/column_binding.hpp +4 -0
  253. package/src/duckdb/src/include/duckdb/planner/constraints/bound_unique_constraint.hpp +3 -3
  254. package/src/duckdb/src/include/duckdb/planner/expression_binder/lateral_binder.hpp +0 -2
  255. package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +1 -0
  256. package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +2 -1
  257. package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +5 -5
  258. package/src/duckdb/src/include/duckdb/planner/operator/logical_cteref.hpp +7 -2
  259. package/src/duckdb/src/include/duckdb/planner/operator/logical_dependent_join.hpp +43 -0
  260. package/src/duckdb/src/include/duckdb/planner/operator/logical_materialized_cte.hpp +49 -0
  261. package/src/duckdb/src/include/duckdb/planner/operator/logical_recursive_cte.hpp +5 -4
  262. package/src/duckdb/src/include/duckdb/planner/query_node/bound_cte_node.hpp +44 -0
  263. package/src/duckdb/src/include/duckdb/planner/query_node/list.hpp +1 -0
  264. package/src/duckdb/src/include/duckdb/planner/subquery/flatten_dependent_join.hpp +2 -2
  265. package/src/duckdb/src/include/duckdb/planner/subquery/has_correlated_expressions.hpp +4 -1
  266. package/src/duckdb/src/include/duckdb/planner/subquery/recursive_dependent_join_planner.hpp +31 -0
  267. package/src/duckdb/src/include/duckdb/planner/subquery/rewrite_correlated_expressions.hpp +8 -2
  268. package/src/duckdb/src/include/duckdb/planner/tableref/bound_cteref.hpp +5 -2
  269. package/src/duckdb/src/include/duckdb/storage/arena_allocator.hpp +1 -1
  270. package/src/duckdb/src/include/duckdb/storage/block_manager.hpp +3 -3
  271. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +1 -1
  272. package/src/duckdb/src/include/duckdb/storage/object_cache.hpp +22 -0
  273. package/src/duckdb/src/include/duckdb/storage/single_file_block_manager.hpp +2 -0
  274. package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +4 -0
  275. package/src/duckdb/src/include/duckdb/storage/table/chunk_info.hpp +3 -0
  276. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +3 -2
  277. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +1 -3
  278. package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +2 -3
  279. package/src/duckdb/src/include/duckdb.h +28 -0
  280. package/src/duckdb/src/main/capi/arrow-c.cpp +155 -1
  281. package/src/duckdb/src/main/capi/duckdb_value-c.cpp +1 -1
  282. package/src/duckdb/src/main/config.cpp +2 -0
  283. package/src/duckdb/src/main/database.cpp +1 -1
  284. package/src/duckdb/src/main/extension/extension_helper.cpp +96 -89
  285. package/src/duckdb/src/main/settings/settings.cpp +40 -18
  286. package/src/duckdb/src/optimizer/column_binding_replacer.cpp +43 -0
  287. package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +1 -2
  288. package/src/duckdb/src/optimizer/compressed_materialization/compress_aggregate.cpp +140 -0
  289. package/src/duckdb/src/optimizer/compressed_materialization/compress_distinct.cpp +42 -0
  290. package/src/duckdb/src/optimizer/compressed_materialization/compress_order.cpp +65 -0
  291. package/src/duckdb/src/optimizer/compressed_materialization.cpp +478 -0
  292. package/src/duckdb/src/optimizer/deliminator.cpp +176 -321
  293. package/src/duckdb/src/optimizer/filter_pushdown.cpp +9 -0
  294. package/src/duckdb/src/optimizer/join_order/estimated_properties.cpp +7 -0
  295. package/src/duckdb/src/optimizer/join_order/join_node.cpp +2 -2
  296. package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +113 -82
  297. package/src/duckdb/src/optimizer/join_order/join_relation_set.cpp +2 -6
  298. package/src/duckdb/src/optimizer/join_order/query_graph.cpp +22 -14
  299. package/src/duckdb/src/optimizer/optimizer.cpp +51 -14
  300. package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +5 -5
  301. package/src/duckdb/src/optimizer/pushdown/pushdown_get.cpp +0 -1
  302. package/src/duckdb/src/optimizer/remove_duplicate_groups.cpp +127 -0
  303. package/src/duckdb/src/optimizer/remove_unused_columns.cpp +4 -0
  304. package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +154 -15
  305. package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +65 -8
  306. package/src/duckdb/src/optimizer/statistics/operator/propagate_order.cpp +1 -1
  307. package/src/duckdb/src/optimizer/statistics_propagator.cpp +7 -5
  308. package/src/duckdb/src/optimizer/topn_optimizer.cpp +20 -10
  309. package/src/duckdb/src/parallel/executor.cpp +15 -0
  310. package/src/duckdb/src/parallel/pipeline_executor.cpp +7 -6
  311. package/src/duckdb/src/parallel/task_scheduler.cpp +11 -2
  312. package/src/duckdb/src/parser/common_table_expression_info.cpp +2 -0
  313. package/src/duckdb/src/parser/expression/lambda_expression.cpp +1 -1
  314. package/src/duckdb/src/parser/parsed_expression_iterator.cpp +7 -0
  315. package/src/duckdb/src/parser/query_node/cte_node.cpp +75 -0
  316. package/src/duckdb/src/parser/query_node.cpp +18 -1
  317. package/src/duckdb/src/parser/tableref/joinref.cpp +3 -0
  318. package/src/duckdb/src/parser/transform/expression/transform_constant.cpp +55 -3
  319. package/src/duckdb/src/parser/transform/expression/transform_expression.cpp +2 -0
  320. package/src/duckdb/src/parser/transform/expression/transform_multi_assign_reference.cpp +44 -0
  321. package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +19 -1
  322. package/src/duckdb/src/parser/transform/statement/transform_copy.cpp +13 -0
  323. package/src/duckdb/src/parser/transform/statement/transform_delete.cpp +6 -1
  324. package/src/duckdb/src/parser/transform/statement/transform_insert.cpp +6 -1
  325. package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +7 -2
  326. package/src/duckdb/src/parser/transform/statement/transform_pragma.cpp +14 -11
  327. package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +11 -2
  328. package/src/duckdb/src/parser/transform/statement/transform_update.cpp +6 -1
  329. package/src/duckdb/src/parser/transformer.cpp +15 -0
  330. package/src/duckdb/src/planner/binder/query_node/bind_cte_node.cpp +64 -0
  331. package/src/duckdb/src/planner/binder/query_node/plan_cte_node.cpp +26 -0
  332. package/src/duckdb/src/planner/binder/query_node/plan_recursive_cte_node.cpp +5 -5
  333. package/src/duckdb/src/planner/binder/query_node/plan_setop.cpp +4 -4
  334. package/src/duckdb/src/planner/binder/query_node/plan_subquery.cpp +32 -29
  335. package/src/duckdb/src/planner/binder/tableref/bind_basetableref.cpp +11 -2
  336. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +32 -5
  337. package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +116 -50
  338. package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -1
  339. package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +61 -26
  340. package/src/duckdb/src/planner/binder/tableref/plan_subqueryref.cpp +3 -3
  341. package/src/duckdb/src/planner/binder.cpp +5 -0
  342. package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +1 -1
  343. package/src/duckdb/src/planner/expression_binder/lateral_binder.cpp +4 -31
  344. package/src/duckdb/src/planner/expression_binder.cpp +3 -0
  345. package/src/duckdb/src/planner/expression_iterator.cpp +6 -0
  346. package/src/duckdb/src/planner/logical_operator.cpp +5 -0
  347. package/src/duckdb/src/planner/logical_operator_visitor.cpp +2 -0
  348. package/src/duckdb/src/planner/operator/logical_cteref.cpp +3 -1
  349. package/src/duckdb/src/planner/operator/logical_dependent_join.cpp +26 -0
  350. package/src/duckdb/src/planner/operator/logical_materialized_cte.cpp +21 -0
  351. package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +90 -38
  352. package/src/duckdb/src/planner/subquery/has_correlated_expressions.cpp +22 -7
  353. package/src/duckdb/src/planner/subquery/rewrite_correlated_expressions.cpp +65 -7
  354. package/src/duckdb/src/storage/arena_allocator.cpp +1 -2
  355. package/src/duckdb/src/storage/buffer/block_manager.cpp +3 -0
  356. package/src/duckdb/src/storage/checkpoint_manager.cpp +3 -0
  357. package/src/duckdb/src/storage/compression/rle.cpp +0 -1
  358. package/src/duckdb/src/storage/data_table.cpp +1 -1
  359. package/src/duckdb/src/storage/local_storage.cpp +3 -3
  360. package/src/duckdb/src/storage/single_file_block_manager.cpp +23 -0
  361. package/src/duckdb/src/storage/statistics/string_stats.cpp +21 -2
  362. package/src/duckdb/src/storage/storage_info.cpp +1 -1
  363. package/src/duckdb/src/storage/storage_manager.cpp +7 -2
  364. package/src/duckdb/src/storage/table/chunk_info.cpp +17 -0
  365. package/src/duckdb/src/storage/table/row_group.cpp +25 -9
  366. package/src/duckdb/src/storage/table/row_group_collection.cpp +19 -18
  367. package/src/duckdb/third_party/concurrentqueue/concurrentqueue.h +2 -2
  368. package/src/duckdb/third_party/concurrentqueue/lightweightsemaphore.h +76 -0
  369. package/src/duckdb/third_party/fast_float/fast_float/fast_float.h +2 -0
  370. package/src/duckdb/third_party/httplib/httplib.hpp +10 -1
  371. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +9 -0
  372. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +2 -1
  373. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +12487 -12331
  374. package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +6 -6
  375. package/src/duckdb/ub_src_execution_index_art.cpp +0 -2
  376. package/src/duckdb/ub_src_execution_operator_persistent.cpp +2 -0
  377. package/src/duckdb/ub_src_execution_operator_set.cpp +2 -0
  378. package/src/duckdb/ub_src_execution_physical_plan.cpp +2 -0
  379. package/src/duckdb/ub_src_function_scalar.cpp +2 -0
  380. package/src/duckdb/ub_src_function_scalar_compressed_materialization.cpp +4 -0
  381. package/src/duckdb/ub_src_function_scalar_list.cpp +2 -0
  382. package/src/duckdb/ub_src_optimizer.cpp +6 -0
  383. package/src/duckdb/ub_src_optimizer_compressed_materialization.cpp +6 -0
  384. package/src/duckdb/ub_src_optimizer_statistics_expression.cpp +0 -2
  385. package/src/duckdb/ub_src_parser_query_node.cpp +2 -0
  386. package/src/duckdb/ub_src_parser_transform_expression.cpp +2 -0
  387. package/src/duckdb/ub_src_planner_binder_query_node.cpp +4 -0
  388. package/src/duckdb/ub_src_planner_operator.cpp +4 -0
  389. package/src/duckdb_node.hpp +1 -0
  390. package/src/statement.cpp +104 -4
  391. package/test/columns.test.ts +243 -0
  392. package/test/test_all_types.test.ts +233 -0
  393. package/tsconfig.json +1 -0
  394. package/src/duckdb/src/execution/index/art/prefix_segment.cpp +0 -42
  395. package/src/duckdb/src/include/duckdb/execution/index/art/prefix_segment.hpp +0 -40
  396. package/src/duckdb/src/optimizer/statistics/expression/propagate_and_compress.cpp +0 -118
@@ -74,7 +74,6 @@ public:
74
74
  RowGroupCollection &GetCollection() {
75
75
  return collection.get();
76
76
  }
77
- DatabaseInstance &GetDatabase();
78
77
  BlockManager &GetBlockManager();
79
78
  DataTableInfo &GetTableInfo();
80
79
 
@@ -82,7 +81,7 @@ public:
82
81
  ExpressionExecutor &executor, CollectionScanState &scan_state,
83
82
  DataChunk &scan_chunk);
84
83
  unique_ptr<RowGroup> AddColumn(RowGroupCollection &collection, ColumnDefinition &new_column,
85
- ExpressionExecutor &executor, Expression *default_value, Vector &intermediate);
84
+ ExpressionExecutor &executor, Expression &default_value, Vector &intermediate);
86
85
  unique_ptr<RowGroup> RemoveColumn(RowGroupCollection &collection, idx_t removed_column);
87
86
 
88
87
  void CommitDrop();
@@ -123,6 +122,7 @@ public:
123
122
  idx_t Delete(TransactionData transaction, DataTable &table, row_t *row_ids, idx_t count);
124
123
 
125
124
  RowGroupWriteData WriteToDisk(PartialBlockManager &manager, const vector<CompressionType> &compression_types);
125
+ bool AllDeleted();
126
126
  RowGroupPointer Checkpoint(RowGroupWriter &writer, TableStatistics &global_stats);
127
127
  static void Serialize(RowGroupPointer &pointer, Serializer &serializer);
128
128
  static RowGroupPointer Deserialize(Deserializer &source, const vector<LogicalType> &columns);
@@ -170,6 +170,7 @@ struct VersionNode {
170
170
  unique_ptr<ChunkInfo> info[RowGroup::ROW_GROUP_VECTOR_COUNT];
171
171
 
172
172
  void SetStart(idx_t start);
173
+ idx_t GetCommittedDeletedCount(idx_t count);
173
174
  };
174
175
 
175
176
  } // namespace duckdb
@@ -45,7 +45,6 @@ public:
45
45
  void AppendRowGroup(SegmentLock &l, idx_t start_row);
46
46
  //! Get the nth row-group, negative numbers start from the back (so -1 is the last row group, etc)
47
47
  RowGroup *GetRowGroup(int64_t index);
48
- idx_t RowGroupCount();
49
48
  void Verify();
50
49
 
51
50
  void InitializeScan(CollectionScanState &state, const vector<column_t> &column_ids, TableFilterSet *table_filters);
@@ -93,7 +92,7 @@ public:
93
92
  const vector<LogicalType> &GetTypes() const;
94
93
 
95
94
  shared_ptr<RowGroupCollection> AddColumn(ClientContext &context, ColumnDefinition &new_column,
96
- Expression *default_value);
95
+ Expression &default_value);
97
96
  shared_ptr<RowGroupCollection> RemoveColumn(idx_t col_idx);
98
97
  shared_ptr<RowGroupCollection> AlterType(ClientContext &context, idx_t changed_idx, const LogicalType &target_type,
99
98
  vector<column_t> bound_columns, Expression &cast_expr);
@@ -104,7 +103,6 @@ public:
104
103
  void SetDistinct(column_t column_id, unique_ptr<DistinctStatistics> distinct_stats);
105
104
 
106
105
  AttachedDatabase &GetAttached();
107
- DatabaseInstance &GetDatabase();
108
106
  BlockManager &GetBlockManager() {
109
107
  return block_manager;
110
108
  }
@@ -32,7 +32,7 @@ public:
32
32
  LocalTableStorage(DataTable &table, LocalTableStorage &parent, idx_t drop_idx);
33
33
  // Create a LocalTableStorage from an ADD COLUMN
34
34
  LocalTableStorage(ClientContext &context, DataTable &table, LocalTableStorage &parent, ColumnDefinition &new_column,
35
- optional_ptr<Expression> default_value);
35
+ Expression &default_value);
36
36
  ~LocalTableStorage();
37
37
 
38
38
  reference<DataTable> table_ref;
@@ -143,8 +143,7 @@ public:
143
143
 
144
144
  idx_t AddedRows(DataTable &table);
145
145
 
146
- void AddColumn(DataTable &old_dt, DataTable &new_dt, ColumnDefinition &new_column,
147
- optional_ptr<Expression> default_value);
146
+ void AddColumn(DataTable &old_dt, DataTable &new_dt, ColumnDefinition &new_column, Expression &default_value);
148
147
  void DropColumn(DataTable &old_dt, DataTable &new_dt, idx_t removed_column);
149
148
  void ChangeType(DataTable &old_dt, DataTable &new_dt, idx_t changed_idx, const LogicalType &target_type,
150
149
  const vector<column_t> &bound_columns, Expression &cast_expr);
@@ -279,6 +279,9 @@ typedef struct _duckdb_appender {
279
279
  typedef struct _duckdb_arrow {
280
280
  void *__arrw;
281
281
  } * duckdb_arrow;
282
+ typedef struct _duckdb_arrow_stream {
283
+ void *__arrwstr;
284
+ } * duckdb_arrow_stream;
282
285
  typedef struct _duckdb_config {
283
286
  void *__cnfg;
284
287
  } * duckdb_config;
@@ -1078,6 +1081,31 @@ Executes the prepared statement with the given bound parameters, and returns an
1078
1081
  DUCKDB_API duckdb_state duckdb_execute_prepared_arrow(duckdb_prepared_statement prepared_statement,
1079
1082
  duckdb_arrow *out_result);
1080
1083
 
1084
+ /*!
1085
+ Scans the Arrow stream and creates a view with the given name.
1086
+
1087
+ * connection: The connection on which to execute the scan.
1088
+ * table_name: Name of the temporary view to create.
1089
+ * arrow: Arrow stream wrapper.
1090
+ * returns: `DuckDBSuccess` on success or `DuckDBError` on failure.
1091
+ */
1092
+ DUCKDB_API duckdb_state duckdb_arrow_scan(duckdb_connection connection, const char *table_name,
1093
+ duckdb_arrow_stream arrow);
1094
+
1095
+ /*!
1096
+ Scans the Arrow array and creates a view with the given name.
1097
+
1098
+ * connection: The connection on which to execute the scan.
1099
+ * table_name: Name of the temporary view to create.
1100
+ * arrow_schema: Arrow schema wrapper.
1101
+ * arrow_array: Arrow array wrapper.
1102
+ * out_stream: Output array stream that wraps around the passed schema, for releasing/deleting once done.
1103
+ * returns: `DuckDBSuccess` on success or `DuckDBError` on failure.
1104
+ */
1105
+ DUCKDB_API duckdb_state duckdb_arrow_array_scan(duckdb_connection connection, const char *table_name,
1106
+ duckdb_arrow_schema arrow_schema, duckdb_arrow_array arrow_array,
1107
+ duckdb_arrow_stream *out_stream);
1108
+
1081
1109
  //===--------------------------------------------------------------------===//
1082
1110
  // Extract Statements
1083
1111
  //===--------------------------------------------------------------------===//
@@ -1,5 +1,6 @@
1
- #include "duckdb/main/capi/capi_internal.hpp"
2
1
  #include "duckdb/common/arrow/arrow_converter.hpp"
2
+ #include "duckdb/function/table/arrow.hpp"
3
+ #include "duckdb/main/capi/capi_internal.hpp"
3
4
 
4
5
  using duckdb::ArrowConverter;
5
6
  using duckdb::ArrowResultWrapper;
@@ -108,3 +109,156 @@ duckdb_state duckdb_execute_prepared_arrow(duckdb_prepared_statement prepared_st
108
109
  *out_result = reinterpret_cast<duckdb_arrow>(arrow_wrapper);
109
110
  return !arrow_wrapper->result->HasError() ? DuckDBSuccess : DuckDBError;
110
111
  }
112
+
113
+ namespace arrow_array_stream_wrapper {
114
+ namespace {
115
+ struct PrivateData {
116
+ ArrowSchema *schema;
117
+ ArrowArray *array;
118
+ bool done = false;
119
+ };
120
+
121
+ // LCOV_EXCL_START
122
+ // This function is never called, but used to set ArrowSchema's release functions to a non-null NOOP.
123
+ void EmptySchemaRelease(ArrowSchema *) {
124
+ }
125
+ // LCOV_EXCL_STOP
126
+
127
+ void EmptyArrayRelease(ArrowArray *) {
128
+ }
129
+
130
+ void EmptyStreamRelease(ArrowArrayStream *) {
131
+ }
132
+
133
+ void FactoryGetSchema(uintptr_t stream_factory_ptr, duckdb::ArrowSchemaWrapper &schema) {
134
+ auto private_data =
135
+ reinterpret_cast<PrivateData *>(reinterpret_cast<ArrowArrayStream *>(stream_factory_ptr)->private_data);
136
+ schema.arrow_schema = *private_data->schema;
137
+
138
+ // Need to nullify the root schema's release function here, because streams don't allow us to set the release
139
+ // function. For the schema's children, we nullify the release functions in `duckdb_arrow_scan`, so we don't need to
140
+ // handle them again here. We set this to nullptr and not EmptySchemaRelease to prevent ArrowSchemaWrapper's
141
+ // destructor from destroying the schema (it's the caller's responsibility).
142
+ schema.arrow_schema.release = nullptr;
143
+ }
144
+
145
+ int GetSchema(struct ArrowArrayStream *stream, struct ArrowSchema *out) {
146
+ auto private_data = static_cast<arrow_array_stream_wrapper::PrivateData *>((stream->private_data));
147
+ if (private_data->schema == nullptr) {
148
+ return DuckDBError;
149
+ }
150
+
151
+ *out = *private_data->schema;
152
+ out->release = EmptySchemaRelease;
153
+ return DuckDBSuccess;
154
+ }
155
+
156
+ int GetNext(struct ArrowArrayStream *stream, struct ArrowArray *out) {
157
+ auto private_data = static_cast<arrow_array_stream_wrapper::PrivateData *>((stream->private_data));
158
+ *out = *private_data->array;
159
+ if (private_data->done) {
160
+ out->release = nullptr;
161
+ } else {
162
+ out->release = EmptyArrayRelease;
163
+ }
164
+
165
+ private_data->done = true;
166
+ return DuckDBSuccess;
167
+ }
168
+
169
+ duckdb::unique_ptr<duckdb::ArrowArrayStreamWrapper> FactoryGetNext(uintptr_t stream_factory_ptr,
170
+ duckdb::ArrowStreamParameters &parameters) {
171
+ auto stream = reinterpret_cast<ArrowArrayStream *>(stream_factory_ptr);
172
+ auto ret = duckdb::make_uniq<duckdb::ArrowArrayStreamWrapper>();
173
+ ret->arrow_array_stream = *stream;
174
+ ret->arrow_array_stream.release = EmptyStreamRelease;
175
+ return ret;
176
+ }
177
+
178
+ // LCOV_EXCL_START
179
+ // This function is never be called, because it's used to construct a stream wrapping around a caller-supplied
180
+ // ArrowArray. Thus, the stream itself cannot produce an error.
181
+ const char *GetLastError(struct ArrowArrayStream *stream) {
182
+ return nullptr;
183
+ }
184
+ // LCOV_EXCL_STOP
185
+
186
+ void Release(struct ArrowArrayStream *stream) {
187
+ if (stream->private_data != nullptr) {
188
+ delete reinterpret_cast<PrivateData *>(stream->private_data);
189
+ }
190
+
191
+ stream->private_data = nullptr;
192
+ stream->release = nullptr;
193
+ }
194
+
195
+ duckdb_state Ingest(duckdb_connection connection, const char *table_name, struct ArrowArrayStream *input) {
196
+ try {
197
+ auto cconn = reinterpret_cast<duckdb::Connection *>(connection);
198
+ cconn
199
+ ->TableFunction("arrow_scan", {duckdb::Value::POINTER((uintptr_t)input),
200
+ duckdb::Value::POINTER((uintptr_t)FactoryGetNext),
201
+ duckdb::Value::POINTER((uintptr_t)FactoryGetSchema)})
202
+ ->CreateView(table_name, true, false);
203
+ } catch (...) { // LCOV_EXCL_START
204
+ // Tried covering this in tests, but it proved harder than expected. At the time of writing:
205
+ // - Passing any name to `CreateView` worked without throwing an exception
206
+ // - Passing a null Arrow array worked without throwing an exception
207
+ // - Passing an invalid schema (without any columns) led to an InternalException with SIGABRT, which is meant to
208
+ // be un-catchable. This case likely needs to be handled gracefully within `arrow_scan`.
209
+ // Ref: https://discord.com/channels/909674491309850675/921100573732909107/1115230468699336785
210
+ return DuckDBError;
211
+ } // LCOV_EXCL_STOP
212
+
213
+ return DuckDBSuccess;
214
+ }
215
+ } // namespace
216
+ } // namespace arrow_array_stream_wrapper
217
+
218
+ duckdb_state duckdb_arrow_scan(duckdb_connection connection, const char *table_name, duckdb_arrow_stream arrow) {
219
+ auto stream = reinterpret_cast<ArrowArrayStream *>(arrow);
220
+
221
+ // Backup release functions - we nullify children schema release functions because we don't want to release on
222
+ // behalf of the caller, downstream in our code. Note that Arrow releases target immediate children, but aren't
223
+ // recursive. So we only back up immediate children here and restore their functions.
224
+ ArrowSchema schema;
225
+ if (stream->get_schema(stream, &schema) == DuckDBError) {
226
+ return DuckDBError;
227
+ }
228
+
229
+ typedef void (*release_fn_t)(ArrowSchema *);
230
+ std::vector<release_fn_t> release_fns(schema.n_children);
231
+ for (int64_t i = 0; i < schema.n_children; i++) {
232
+ auto child = schema.children[i];
233
+ release_fns[i] = child->release;
234
+ child->release = arrow_array_stream_wrapper::EmptySchemaRelease;
235
+ }
236
+
237
+ auto ret = arrow_array_stream_wrapper::Ingest(connection, table_name, stream);
238
+
239
+ // Restore release functions.
240
+ for (int64_t i = 0; i < schema.n_children; i++) {
241
+ schema.children[i]->release = release_fns[i];
242
+ }
243
+
244
+ return ret;
245
+ }
246
+
247
+ duckdb_state duckdb_arrow_array_scan(duckdb_connection connection, const char *table_name,
248
+ duckdb_arrow_schema arrow_schema, duckdb_arrow_array arrow_array,
249
+ duckdb_arrow_stream *out_stream) {
250
+ auto private_data = new arrow_array_stream_wrapper::PrivateData;
251
+ private_data->schema = reinterpret_cast<ArrowSchema *>(arrow_schema);
252
+ private_data->array = reinterpret_cast<ArrowArray *>(arrow_array);
253
+ private_data->done = false;
254
+
255
+ ArrowArrayStream *stream = new ArrowArrayStream;
256
+ *out_stream = reinterpret_cast<duckdb_arrow_stream>(stream);
257
+ stream->get_schema = arrow_array_stream_wrapper::GetSchema;
258
+ stream->get_next = arrow_array_stream_wrapper::GetNext;
259
+ stream->get_last_error = arrow_array_stream_wrapper::GetLastError;
260
+ stream->release = arrow_array_stream_wrapper::Release;
261
+ stream->private_data = private_data;
262
+
263
+ return duckdb_arrow_scan(connection, table_name, reinterpret_cast<duckdb_arrow_stream>(stream));
264
+ }
@@ -26,7 +26,7 @@ char *duckdb_get_varchar(duckdb_value value) {
26
26
  auto str_val = val->DefaultCastAs(duckdb::LogicalType::VARCHAR);
27
27
  auto &str = duckdb::StringValue::Get(str_val);
28
28
 
29
- auto result = reinterpret_cast<char *>(malloc(sizeof(char *) * (str.size() + 1)));
29
+ auto result = reinterpret_cast<char *>(malloc(sizeof(char) * (str.size() + 1)));
30
30
  memcpy(result, str.c_str(), str.size());
31
31
  result[str.size()] = '\0';
32
32
  return result;
@@ -92,6 +92,7 @@ static ConfigurationOption internal_options[] = {DUCKDB_GLOBAL(AccessModeSetting
92
92
  DUCKDB_LOCAL(OrderedAggregateThreshold),
93
93
  DUCKDB_GLOBAL(PasswordSetting),
94
94
  DUCKDB_LOCAL(PerfectHashThresholdSetting),
95
+ DUCKDB_LOCAL(PivotFilterThreshold),
95
96
  DUCKDB_LOCAL(PivotLimitSetting),
96
97
  DUCKDB_LOCAL(PreserveIdentifierCase),
97
98
  DUCKDB_GLOBAL(PreserveInsertionOrder),
@@ -109,6 +110,7 @@ static ConfigurationOption internal_options[] = {DUCKDB_GLOBAL(AccessModeSetting
109
110
  DUCKDB_GLOBAL_ALIAS("user", UsernameSetting),
110
111
  DUCKDB_GLOBAL_ALIAS("wal_autocheckpoint", CheckpointThresholdSetting),
111
112
  DUCKDB_GLOBAL_ALIAS("worker_threads", ThreadsSetting),
113
+ DUCKDB_GLOBAL(FlushAllocatorSetting),
112
114
  FINAL_SETTING};
113
115
 
114
116
  vector<ConfigurationOption> DBConfig::GetOptions() {
@@ -178,7 +178,7 @@ void DatabaseInstance::CreateMainDatabase() {
178
178
  void ThrowExtensionSetUnrecognizedOptions(const unordered_map<string, Value> &unrecognized_options) {
179
179
  auto unrecognized_options_iter = unrecognized_options.begin();
180
180
  string unrecognized_option_keys = unrecognized_options_iter->first;
181
- for (; unrecognized_options_iter == unrecognized_options.end(); ++unrecognized_options_iter) {
181
+ while (++unrecognized_options_iter != unrecognized_options.end()) {
182
182
  unrecognized_option_keys = "," + unrecognized_options_iter->first;
183
183
  }
184
184
  throw InvalidInputException("Unrecognized configuration property \"%s\"", unrecognized_option_keys);
@@ -6,88 +6,85 @@
6
6
  #include "duckdb/main/client_context.hpp"
7
7
  #include "duckdb/main/database.hpp"
8
8
 
9
- #if defined(BUILD_ICU_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
10
- #define ICU_STATICALLY_LOADED true
11
- #include "icu_extension.hpp"
12
- #else
13
- #define ICU_STATICALLY_LOADED false
9
+ // Note that c++ preprocessor doesn't have a nice way to clean this up so we need to set the defines we use to false
10
+ // explicitly when they are undefined
11
+ #ifndef DUCKDB_EXTENSION_ICU_LINKED
12
+ #define DUCKDB_EXTENSION_ICU_LINKED false
14
13
  #endif
15
14
 
16
- #if defined(BUILD_PARQUET_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
17
- #define PARQUET_STATICALLY_LOADED true
18
- #include "parquet_extension.hpp"
19
- #else
20
- #define PARQUET_STATICALLY_LOADED false
15
+ #ifndef DUCKDB_EXTENSION_PARQUET_LINKED
16
+ #define DUCKDB_EXTENSION_PARQUET_LINKED false
21
17
  #endif
22
18
 
23
- #if defined(BUILD_TPCH_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
24
- #define TPCH_STATICALLY_LOADED true
25
- #include "tpch_extension.hpp"
26
- #else
27
- #define TPCH_STATICALLY_LOADED false
19
+ #ifndef DUCKDB_EXTENSION_TPCH_LINKED
20
+ #define DUCKDB_EXTENSION_TPCH_LINKED false
28
21
  #endif
29
22
 
30
- #if defined(BUILD_TPCDS_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
31
- #define TPCDS_STATICALLY_LOADED true
32
- #include "tpcds_extension.hpp"
33
- #else
34
- #define TPCDS_STATICALLY_LOADED false
23
+ #ifndef DUCKDB_EXTENSION_TPCDS_LINKED
24
+ #define DUCKDB_EXTENSION_TPCDS_LINKED false
35
25
  #endif
36
26
 
37
- #if defined(BUILD_FTS_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
38
- #define FTS_STATICALLY_LOADED true
39
- #include "fts_extension.hpp"
40
- #else
41
- #define FTS_STATICALLY_LOADED false
27
+ #ifndef DUCKDB_EXTENSION_FTS_LINKED
28
+ #define DUCKDB_EXTENSION_FTS_LINKED false
42
29
  #endif
43
30
 
44
- #if defined(BUILD_HTTPFS_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
45
- #define HTTPFS_STATICALLY_LOADED true
46
- #include "httpfs_extension.hpp"
47
- #else
48
- #define HTTPFS_STATICALLY_LOADED false
31
+ #ifndef DUCKDB_EXTENSION_HTTPFS_LINKED
32
+ #define DUCKDB_EXTENSION_HTTPFS_LINKED false
49
33
  #endif
50
34
 
51
- #if defined(BUILD_VISUALIZER_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
52
- #include "visualizer_extension.hpp"
35
+ #ifndef DUCKDB_EXTENSION_JSON_LINKED
36
+ #define DUCKDB_EXTENSION_JSON_LINKED false
53
37
  #endif
54
38
 
55
- #if defined(BUILD_JSON_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
56
- #define JSON_STATICALLY_LOADED true
57
- #include "json_extension.hpp"
58
- #else
59
- #define JSON_STATICALLY_LOADED false
39
+ #ifndef DUCKDB_EXTENSION_JEMALLOC_LINKED
40
+ #define DUCKDB_EXTENSION_JEMALLOC_LINKED false
60
41
  #endif
61
42
 
62
- #if defined(BUILD_JEMALLOC_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
63
- #define JEMALLOC_STATICALLY_LOADED true
64
- #include "jemalloc_extension.hpp"
43
+ #ifndef DUCKDB_EXTENSION_AUTOCOMPLETE_LINKED
44
+ #define DUCKDB_EXTENSION_AUTOCOMPLETE_LINKED false
45
+ #endif
46
+
47
+ // Load the generated header file containing our list of extension headers
48
+ #if defined(GENERATED_EXTENSION_HEADERS) && GENERATED_EXTENSION_HEADERS && !defined(DUCKDB_AMALGAMATION)
49
+ #include "generated_extension_loader.hpp"
65
50
  #else
66
- #define JEMALLOC_STATICALLY_LOADED false
51
+ // TODO: rewrite package_build.py to allow also loading out-of-tree extensions in non-cmake builds, after that
52
+ // these can be removed
53
+ #if DUCKDB_EXTENSION_ICU_LINKED
54
+ #include "icu_extension.hpp"
67
55
  #endif
68
56
 
69
- #if defined(BUILD_EXCEL_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
70
- #include "excel_extension.hpp"
57
+ #if DUCKDB_EXTENSION_PARQUET_LINKED
58
+ #include "parquet_extension.hpp"
71
59
  #endif
72
60
 
73
- #if defined(BUILD_SQLSMITH_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
74
- #include "sqlsmith_extension.hpp"
61
+ #if DUCKDB_EXTENSION_TPCH_LINKED
62
+ #include "tpch_extension.hpp"
75
63
  #endif
76
64
 
77
- #if defined(BUILD_INET_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
78
- #include "inet_extension.hpp"
65
+ #if DUCKDB_EXTENSION_TPCDS_LINKED
66
+ #include "tpcds_extension.hpp"
79
67
  #endif
80
68
 
81
- #if defined(BUILD_AUTOCOMPLETE_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
82
- #define AUTOCOMPLETE_STATICALLY_LOADED true
83
- #include "autocomplete_extension.hpp"
84
- #else
85
- #define AUTOCOMPLETE_STATICALLY_LOADED false
69
+ #if DUCKDB_EXTENSION_FTS_LINKED
70
+ #include "fts_extension.hpp"
86
71
  #endif
87
72
 
88
- // Load the generated header file containing our list of extension headers
89
- #if defined(OOTE_HEADERS_AVAILABLE) && OOTE_HEADERS_AVAILABLE
90
- #include "extension_oote_loader.hpp"
73
+ #if DUCKDB_EXTENSION_HTTPFS_LINKED
74
+ #include "httpfs_extension.hpp"
75
+ #endif
76
+
77
+ #if DUCKDB_EXTENSION_JSON_LINKED
78
+ #include "json_extension.hpp"
79
+ #endif
80
+
81
+ #if DUCKDB_EXTENSION_JEMALLOC_LINKED
82
+ #include "jemalloc_extension.hpp"
83
+ #endif
84
+
85
+ #if DUCKDB_EXTENSION_AUTOCOMPLETE_LINKED
86
+ #include "autocomplete_extension.hpp"
87
+ #endif
91
88
  #endif
92
89
 
93
90
  namespace duckdb {
@@ -96,15 +93,15 @@ namespace duckdb {
96
93
  // Default Extensions
97
94
  //===--------------------------------------------------------------------===//
98
95
  static DefaultExtension internal_extensions[] = {
99
- {"icu", "Adds support for time zones and collations using the ICU library", ICU_STATICALLY_LOADED},
100
- {"parquet", "Adds support for reading and writing parquet files", PARQUET_STATICALLY_LOADED},
101
- {"tpch", "Adds TPC-H data generation and query support", TPCH_STATICALLY_LOADED},
102
- {"tpcds", "Adds TPC-DS data generation and query support", TPCDS_STATICALLY_LOADED},
103
- {"fts", "Adds support for Full-Text Search Indexes", FTS_STATICALLY_LOADED},
104
- {"httpfs", "Adds support for reading and writing files over a HTTP(S) connection", HTTPFS_STATICALLY_LOADED},
105
- {"json", "Adds support for JSON operations", JSON_STATICALLY_LOADED},
106
- {"jemalloc", "Overwrites system allocator with JEMalloc", JEMALLOC_STATICALLY_LOADED},
107
- {"autocomplete", "Add supports for autocomplete in the shell", AUTOCOMPLETE_STATICALLY_LOADED},
96
+ {"icu", "Adds support for time zones and collations using the ICU library", DUCKDB_EXTENSION_ICU_LINKED},
97
+ {"parquet", "Adds support for reading and writing parquet files", DUCKDB_EXTENSION_PARQUET_LINKED},
98
+ {"tpch", "Adds TPC-H data generation and query support", DUCKDB_EXTENSION_TPCH_LINKED},
99
+ {"tpcds", "Adds TPC-DS data generation and query support", DUCKDB_EXTENSION_TPCDS_LINKED},
100
+ {"fts", "Adds support for Full-Text Search Indexes", DUCKDB_EXTENSION_FTS_LINKED},
101
+ {"httpfs", "Adds support for reading and writing files over a HTTP(S) connection", DUCKDB_EXTENSION_HTTPFS_LINKED},
102
+ {"json", "Adds support for JSON operations", DUCKDB_EXTENSION_JSON_LINKED},
103
+ {"jemalloc", "Overwrites system allocator with JEMalloc", DUCKDB_EXTENSION_JEMALLOC_LINKED},
104
+ {"autocomplete", "Add supports for autocomplete in the shell", DUCKDB_EXTENSION_AUTOCOMPLETE_LINKED},
108
105
  {"motherduck", "Enables motherduck integration with the system", false},
109
106
  {"sqlite_scanner", "Adds support for reading SQLite database files", false},
110
107
  {"postgres_scanner", "Adds support for reading from a Postgres database", false},
@@ -143,15 +140,20 @@ bool ExtensionHelper::AllowAutoInstall(const string &extension) {
143
140
  // Load Statically Compiled Extension
144
141
  //===--------------------------------------------------------------------===//
145
142
  void ExtensionHelper::LoadAllExtensions(DuckDB &db) {
143
+ // The in-tree extensions that we check. Non-cmake builds are currently limited to these for static linking
144
+ // TODO: rewrite package_build.py to allow also loading out-of-tree extensions in non-cmake builds, after that
145
+ // these can be removed
146
146
  unordered_set<string> extensions {"parquet", "icu", "tpch", "tpcds", "fts", "httpfs", "visualizer",
147
147
  "json", "excel", "sqlsmith", "inet", "jemalloc", "autocomplete"};
148
148
  for (auto &ext : extensions) {
149
149
  LoadExtensionInternal(db, ext, true);
150
150
  }
151
151
 
152
- #if defined(OOTE_HEADERS_AVAILABLE) && OOTE_HEADERS_AVAILABLE
153
- for (auto &ext : OOT_EXTENSIONS) {
154
- LoadExtensionInternal(db, ext, true);
152
+ #if defined(GENERATED_EXTENSION_HEADERS) && GENERATED_EXTENSION_HEADERS
153
+ for (auto &ext : LINKED_EXTENSIONS) {
154
+ if (extensions.find(ext) != extensions.end()) {
155
+ LoadExtensionInternal(db, ext, true);
156
+ }
155
157
  }
156
158
  #endif
157
159
  }
@@ -178,105 +180,110 @@ ExtensionLoadResult ExtensionHelper::LoadExtensionInternal(DuckDB &db, const std
178
180
  return ExtensionLoadResult::LOADED_EXTENSION;
179
181
  }
180
182
  #endif
183
+
184
+ // This is the main extension loading mechanism that loads the extension that are statically linked.
185
+ #if defined(GENERATED_EXTENSION_HEADERS) && GENERATED_EXTENSION_HEADERS
186
+ if (TryLoadLinkedExtension(db, extension)) {
187
+ return ExtensionLoadResult::LOADED_EXTENSION;
188
+ } else {
189
+ return ExtensionLoadResult::NOT_LOADED;
190
+ }
191
+ #endif
192
+
193
+ // This is the fallback to the "old" extension loading mechanism for non-cmake builds
194
+ // TODO: rewrite package_build.py to allow also loading out-of-tree extensions in non-cmake builds
181
195
  if (extension == "parquet") {
182
- #if PARQUET_STATICALLY_LOADED
196
+ #if DUCKDB_EXTENSION_PARQUET_LINKED
183
197
  db.LoadExtension<ParquetExtension>();
184
198
  #else
185
199
  // parquet extension required but not build: skip this test
186
200
  return ExtensionLoadResult::NOT_LOADED;
187
201
  #endif
188
202
  } else if (extension == "icu") {
189
- #if ICU_STATICALLY_LOADED
203
+ #if DUCKDB_EXTENSION_ICU_LINKED
190
204
  db.LoadExtension<IcuExtension>();
191
205
  #else
192
206
  // icu extension required but not build: skip this test
193
207
  return ExtensionLoadResult::NOT_LOADED;
194
208
  #endif
195
209
  } else if (extension == "tpch") {
196
- #if TPCH_STATICALLY_LOADED
210
+ #if DUCKDB_EXTENSION_TPCH_LINKED
197
211
  db.LoadExtension<TpchExtension>();
198
212
  #else
199
213
  // icu extension required but not build: skip this test
200
214
  return ExtensionLoadResult::NOT_LOADED;
201
215
  #endif
202
216
  } else if (extension == "tpcds") {
203
- #if TPCDS_STATICALLY_LOADED
217
+ #if DUCKDB_EXTENSION_TPCDS_LINKED
204
218
  db.LoadExtension<TpcdsExtension>();
205
219
  #else
206
220
  // icu extension required but not build: skip this test
207
221
  return ExtensionLoadResult::NOT_LOADED;
208
222
  #endif
209
223
  } else if (extension == "fts") {
210
- #if FTS_STATICALLY_LOADED
211
- db.LoadExtension<FtsExtension>();
224
+ #if DUCKDB_EXTENSION_FTS_LINKED
225
+ // db.LoadExtension<FtsExtension>();
212
226
  #else
213
227
  // fts extension required but not build: skip this test
214
228
  return ExtensionLoadResult::NOT_LOADED;
215
229
  #endif
216
230
  } else if (extension == "httpfs") {
217
- #if HTTPFS_STATICALLY_LOADED
231
+ #if DUCKDB_EXTENSION_HTTPFS_LINKED
218
232
  db.LoadExtension<HttpfsExtension>();
219
233
  #else
220
234
  return ExtensionLoadResult::NOT_LOADED;
221
235
  #endif
222
236
  } else if (extension == "visualizer") {
223
- #if defined(BUILD_VISUALIZER_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
237
+ #if DUCKDB_EXTENSION_VISUALIZER_LINKED
224
238
  db.LoadExtension<VisualizerExtension>();
225
239
  #else
226
240
  // visualizer extension required but not build: skip this test
227
241
  return ExtensionLoadResult::NOT_LOADED;
228
242
  #endif
229
243
  } else if (extension == "json") {
230
- #if JSON_STATICALLY_LOADED
244
+ #if DUCKDB_EXTENSION_JSON_LINKED
231
245
  db.LoadExtension<JsonExtension>();
232
246
  #else
233
247
  // json extension required but not build: skip this test
234
248
  return ExtensionLoadResult::NOT_LOADED;
235
249
  #endif
236
250
  } else if (extension == "excel") {
237
- #if defined(BUILD_EXCEL_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
251
+ #if DUCKDB_EXTENSION_EXCEL_LINKED
238
252
  db.LoadExtension<ExcelExtension>();
239
253
  #else
240
254
  // excel extension required but not build: skip this test
241
255
  return ExtensionLoadResult::NOT_LOADED;
242
256
  #endif
243
257
  } else if (extension == "sqlsmith") {
244
- #if defined(BUILD_SQLSMITH_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
258
+ #if DUCKDB_EXTENSION_SQLSMITH_LINKED
245
259
  db.LoadExtension<SqlsmithExtension>();
246
260
  #else
247
261
  // excel extension required but not build: skip this test
248
262
  return ExtensionLoadResult::NOT_LOADED;
249
263
  #endif
250
264
  } else if (extension == "jemalloc") {
251
- #if defined(BUILD_JEMALLOC_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
265
+ #if DUCKDB_EXTENSION_JEMALLOC_LINKED
252
266
  db.LoadExtension<JemallocExtension>();
253
267
  #else
254
268
  // jemalloc extension required but not build: skip this test
255
269
  return ExtensionLoadResult::NOT_LOADED;
256
270
  #endif
257
271
  } else if (extension == "autocomplete") {
258
- #if defined(BUILD_AUTOCOMPLETE_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
272
+ #if DUCKDB_EXTENSION_AUTOCOMPLETE_LINKED
259
273
  db.LoadExtension<AutocompleteExtension>();
260
274
  #else
261
275
  // autocomplete extension required but not build: skip this test
262
276
  return ExtensionLoadResult::NOT_LOADED;
263
277
  #endif
264
278
  } else if (extension == "inet") {
265
- #if defined(BUILD_INET_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
279
+ #if DUCKDB_EXTENSION_INET_LINKED
266
280
  db.LoadExtension<InetExtension>();
267
281
  #else
268
282
  // inet extension required but not build: skip this test
269
283
  return ExtensionLoadResult::NOT_LOADED;
270
284
  #endif
271
- } else {
272
-
273
- #if defined(OOTE_HEADERS_AVAILABLE) && OOTE_HEADERS_AVAILABLE
274
- if (TryLoadLinkedExtension(db, extension)) {
275
- return ExtensionLoadResult::LOADED_EXTENSION;
276
- }
277
- #endif
278
- return ExtensionLoadResult::EXTENSION_UNKNOWN;
279
285
  }
286
+
280
287
  return ExtensionLoadResult::LOADED_EXTENSION;
281
288
  }
282
289