duckdb 0.7.2-dev0.0 → 0.7.2-dev1138.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 (625) hide show
  1. package/binding.gyp +12 -7
  2. package/lib/duckdb.d.ts +55 -2
  3. package/lib/duckdb.js +20 -1
  4. package/package.json +1 -1
  5. package/src/connection.cpp +1 -2
  6. package/src/database.cpp +1 -1
  7. package/src/duckdb/extension/icu/icu-extension.cpp +4 -0
  8. package/src/duckdb/extension/icu/icu-list-range.cpp +207 -0
  9. package/src/duckdb/extension/icu/icu-table-range.cpp +194 -0
  10. package/src/duckdb/extension/icu/include/icu-list-range.hpp +17 -0
  11. package/src/duckdb/extension/icu/include/icu-table-range.hpp +17 -0
  12. package/src/duckdb/extension/icu/third_party/icu/stubdata/stubdata.cpp +1 -1
  13. package/src/duckdb/extension/json/include/json_common.hpp +1 -0
  14. package/src/duckdb/extension/json/include/json_functions.hpp +2 -0
  15. package/src/duckdb/extension/json/include/json_serializer.hpp +77 -0
  16. package/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp +147 -0
  17. package/src/duckdb/extension/json/json_functions/read_json.cpp +6 -5
  18. package/src/duckdb/extension/json/json_functions.cpp +12 -4
  19. package/src/duckdb/extension/json/json_scan.cpp +2 -2
  20. package/src/duckdb/extension/json/json_serializer.cpp +217 -0
  21. package/src/duckdb/extension/parquet/column_reader.cpp +94 -15
  22. package/src/duckdb/extension/parquet/column_writer.cpp +0 -1
  23. package/src/duckdb/extension/parquet/include/column_reader.hpp +1 -2
  24. package/src/duckdb/extension/parquet/include/decode_utils.hpp +5 -4
  25. package/src/duckdb/extension/parquet/include/generated_column_reader.hpp +1 -11
  26. package/src/duckdb/extension/parquet/include/parquet_timestamp.hpp +2 -1
  27. package/src/duckdb/extension/parquet/parquet-extension.cpp +12 -2
  28. package/src/duckdb/extension/parquet/parquet_reader.cpp +1 -1
  29. package/src/duckdb/extension/parquet/parquet_statistics.cpp +26 -32
  30. package/src/duckdb/extension/parquet/parquet_timestamp.cpp +16 -6
  31. package/src/duckdb/src/catalog/catalog.cpp +34 -5
  32. package/src/duckdb/src/catalog/catalog_entry/duck_schema_entry.cpp +4 -0
  33. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +2 -21
  34. package/src/duckdb/src/catalog/catalog_entry/scalar_function_catalog_entry.cpp +7 -6
  35. package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +3 -3
  36. package/src/duckdb/src/catalog/catalog_entry/table_function_catalog_entry.cpp +20 -1
  37. package/src/duckdb/src/catalog/catalog_entry/type_catalog_entry.cpp +8 -2
  38. package/src/duckdb/src/catalog/catalog_set.cpp +1 -0
  39. package/src/duckdb/src/catalog/default/default_functions.cpp +3 -0
  40. package/src/duckdb/src/catalog/dependency_list.cpp +12 -0
  41. package/src/duckdb/src/catalog/duck_catalog.cpp +34 -7
  42. package/src/duckdb/src/common/arrow/arrow_appender.cpp +48 -4
  43. package/src/duckdb/src/common/arrow/arrow_converter.cpp +1 -1
  44. package/src/duckdb/src/common/box_renderer.cpp +109 -23
  45. package/src/duckdb/src/common/enums/expression_type.cpp +8 -222
  46. package/src/duckdb/src/common/enums/join_type.cpp +3 -22
  47. package/src/duckdb/src/common/enums/logical_operator_type.cpp +2 -0
  48. package/src/duckdb/src/common/enums/statement_type.cpp +2 -0
  49. package/src/duckdb/src/common/exception.cpp +15 -1
  50. package/src/duckdb/src/common/field_writer.cpp +1 -0
  51. package/src/duckdb/src/common/hive_partitioning.cpp +3 -1
  52. package/src/duckdb/src/common/operator/cast_operators.cpp +1 -1
  53. package/src/duckdb/src/common/preserved_error.cpp +7 -5
  54. package/src/duckdb/src/common/progress_bar/progress_bar.cpp +7 -0
  55. package/src/duckdb/src/common/serializer/buffered_deserializer.cpp +4 -0
  56. package/src/duckdb/src/common/serializer/buffered_file_reader.cpp +15 -2
  57. package/src/duckdb/src/common/serializer/enum_serializer.cpp +1176 -0
  58. package/src/duckdb/src/common/sort/comparators.cpp +14 -5
  59. package/src/duckdb/src/common/sort/sort_state.cpp +5 -7
  60. package/src/duckdb/src/common/sort/sorted_block.cpp +0 -1
  61. package/src/duckdb/src/common/string_util.cpp +4 -1
  62. package/src/duckdb/src/common/types/bit.cpp +166 -87
  63. package/src/duckdb/src/common/types/blob.cpp +1 -1
  64. package/src/duckdb/src/common/types/chunk_collection.cpp +2 -2
  65. package/src/duckdb/src/common/types/column_data_collection.cpp +39 -2
  66. package/src/duckdb/src/common/types/column_data_collection_segment.cpp +11 -6
  67. package/src/duckdb/src/common/types/data_chunk.cpp +1 -1
  68. package/src/duckdb/src/common/types/interval.cpp +0 -41
  69. package/src/duckdb/src/common/types/list_segment.cpp +658 -0
  70. package/src/duckdb/src/common/types/string_heap.cpp +1 -1
  71. package/src/duckdb/src/common/types/string_type.cpp +1 -1
  72. package/src/duckdb/src/common/types/time.cpp +13 -0
  73. package/src/duckdb/src/common/types/value.cpp +320 -154
  74. package/src/duckdb/src/common/types/vector.cpp +156 -128
  75. package/src/duckdb/src/common/types.cpp +313 -153
  76. package/src/duckdb/src/common/value_operations/comparison_operations.cpp +14 -22
  77. package/src/duckdb/src/common/vector_operations/comparison_operators.cpp +10 -10
  78. package/src/duckdb/src/common/vector_operations/is_distinct_from.cpp +11 -10
  79. package/src/duckdb/src/common/vector_operations/vector_cast.cpp +2 -1
  80. package/src/duckdb/src/execution/aggregate_hashtable.cpp +10 -5
  81. package/src/duckdb/src/execution/column_binding_resolver.cpp +21 -5
  82. package/src/duckdb/src/execution/expression_executor/execute_cast.cpp +2 -1
  83. package/src/duckdb/src/execution/expression_executor/execute_comparison.cpp +2 -2
  84. package/src/duckdb/src/execution/index/art/art.cpp +19 -5
  85. package/src/duckdb/src/execution/operator/aggregate/physical_hash_aggregate.cpp +1 -1
  86. package/src/duckdb/src/execution/operator/aggregate/physical_perfecthash_aggregate.cpp +4 -5
  87. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +117 -26
  88. package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +3 -0
  89. package/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp +5 -3
  90. package/src/duckdb/src/execution/operator/join/physical_blockwise_nl_join.cpp +64 -17
  91. package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +2 -0
  92. package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +2 -2
  93. package/src/duckdb/src/execution/operator/join/physical_index_join.cpp +13 -4
  94. package/src/duckdb/src/execution/operator/join/physical_join.cpp +0 -3
  95. package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +6 -11
  96. package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +3 -1
  97. package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +11 -4
  98. package/src/duckdb/src/execution/operator/persistent/buffered_csv_reader.cpp +24 -19
  99. package/src/duckdb/src/execution/operator/persistent/csv_reader_options.cpp +3 -0
  100. package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +2 -1
  101. package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +2 -2
  102. package/src/duckdb/src/execution/operator/persistent/physical_delete.cpp +1 -3
  103. package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +1 -0
  104. package/src/duckdb/src/execution/operator/projection/physical_projection.cpp +34 -0
  105. package/src/duckdb/src/execution/operator/scan/physical_positional_scan.cpp +20 -5
  106. package/src/duckdb/src/execution/operator/schema/physical_create_type.cpp +20 -40
  107. package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +0 -4
  108. package/src/duckdb/src/execution/partitionable_hashtable.cpp +14 -2
  109. package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +22 -16
  110. package/src/duckdb/src/execution/physical_plan/plan_asof_join.cpp +97 -0
  111. package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +95 -47
  112. package/src/duckdb/src/execution/physical_plan/plan_create_index.cpp +2 -1
  113. package/src/duckdb/src/execution/physical_plan/plan_distinct.cpp +5 -8
  114. package/src/duckdb/src/execution/physical_plan/plan_positional_join.cpp +14 -5
  115. package/src/duckdb/src/execution/physical_plan_generator.cpp +3 -0
  116. package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +1 -0
  117. package/src/duckdb/src/execution/window_segment_tree.cpp +173 -1
  118. package/src/duckdb/src/function/aggregate/algebraic/avg.cpp +0 -6
  119. package/src/duckdb/src/function/aggregate/distributive/bitagg.cpp +99 -95
  120. package/src/duckdb/src/function/aggregate/distributive/bitstring_agg.cpp +269 -0
  121. package/src/duckdb/src/function/aggregate/distributive/bool.cpp +2 -0
  122. package/src/duckdb/src/function/aggregate/distributive/count.cpp +3 -4
  123. package/src/duckdb/src/function/aggregate/distributive/first.cpp +1 -0
  124. package/src/duckdb/src/function/aggregate/distributive/minmax.cpp +2 -0
  125. package/src/duckdb/src/function/aggregate/distributive/sum.cpp +19 -16
  126. package/src/duckdb/src/function/aggregate/distributive_functions.cpp +1 -0
  127. package/src/duckdb/src/function/aggregate/holistic/approximate_quantile.cpp +5 -2
  128. package/src/duckdb/src/function/aggregate/holistic/mode.cpp +1 -1
  129. package/src/duckdb/src/function/aggregate/holistic/quantile.cpp +16 -1
  130. package/src/duckdb/src/function/aggregate/nested/list.cpp +6 -712
  131. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +58 -16
  132. package/src/duckdb/src/function/cast/bit_cast.cpp +0 -2
  133. package/src/duckdb/src/function/cast/blob_cast.cpp +0 -1
  134. package/src/duckdb/src/function/cast/cast_function_set.cpp +1 -1
  135. package/src/duckdb/src/function/cast/enum_casts.cpp +25 -3
  136. package/src/duckdb/src/function/cast/list_casts.cpp +17 -4
  137. package/src/duckdb/src/function/cast/map_cast.cpp +5 -2
  138. package/src/duckdb/src/function/cast/string_cast.cpp +36 -10
  139. package/src/duckdb/src/function/cast/struct_cast.cpp +24 -4
  140. package/src/duckdb/src/function/cast/time_casts.cpp +2 -2
  141. package/src/duckdb/src/function/cast/union_casts.cpp +33 -7
  142. package/src/duckdb/src/function/function_binder.cpp +1 -8
  143. package/src/duckdb/src/function/scalar/bit/bitstring.cpp +100 -0
  144. package/src/duckdb/src/function/scalar/date/current.cpp +0 -2
  145. package/src/duckdb/src/function/scalar/date/date_diff.cpp +0 -1
  146. package/src/duckdb/src/function/scalar/date/date_part.cpp +18 -26
  147. package/src/duckdb/src/function/scalar/date/date_sub.cpp +0 -1
  148. package/src/duckdb/src/function/scalar/date/date_trunc.cpp +10 -14
  149. package/src/duckdb/src/function/scalar/generic/stats.cpp +2 -4
  150. package/src/duckdb/src/function/scalar/list/contains_or_position.cpp +4 -146
  151. package/src/duckdb/src/function/scalar/list/flatten.cpp +5 -12
  152. package/src/duckdb/src/function/scalar/list/list_aggregates.cpp +1 -1
  153. package/src/duckdb/src/function/scalar/list/list_concat.cpp +8 -12
  154. package/src/duckdb/src/function/scalar/list/list_extract.cpp +5 -12
  155. package/src/duckdb/src/function/scalar/list/list_lambdas.cpp +7 -3
  156. package/src/duckdb/src/function/scalar/list/list_sort.cpp +25 -18
  157. package/src/duckdb/src/function/scalar/list/list_value.cpp +6 -10
  158. package/src/duckdb/src/function/scalar/map/map.cpp +47 -1
  159. package/src/duckdb/src/function/scalar/map/map_entries.cpp +61 -0
  160. package/src/duckdb/src/function/scalar/map/map_extract.cpp +68 -26
  161. package/src/duckdb/src/function/scalar/map/map_keys_values.cpp +97 -0
  162. package/src/duckdb/src/function/scalar/math/numeric.cpp +101 -17
  163. package/src/duckdb/src/function/scalar/math_functions.cpp +3 -0
  164. package/src/duckdb/src/function/scalar/nested_functions.cpp +3 -0
  165. package/src/duckdb/src/function/scalar/operators/add.cpp +0 -9
  166. package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +29 -48
  167. package/src/duckdb/src/function/scalar/operators/bitwise.cpp +0 -63
  168. package/src/duckdb/src/function/scalar/operators/multiply.cpp +5 -6
  169. package/src/duckdb/src/function/scalar/operators/subtract.cpp +0 -6
  170. package/src/duckdb/src/function/scalar/string/caseconvert.cpp +2 -6
  171. package/src/duckdb/src/function/scalar/string/hex.cpp +201 -0
  172. package/src/duckdb/src/function/scalar/string/instr.cpp +2 -6
  173. package/src/duckdb/src/function/scalar/string/length.cpp +2 -6
  174. package/src/duckdb/src/function/scalar/string/like.cpp +2 -6
  175. package/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp +243 -0
  176. package/src/duckdb/src/function/scalar/string/regexp/regexp_util.cpp +79 -0
  177. package/src/duckdb/src/function/scalar/string/regexp.cpp +21 -80
  178. package/src/duckdb/src/function/scalar/string/substring.cpp +2 -6
  179. package/src/duckdb/src/function/scalar/string_functions.cpp +2 -0
  180. package/src/duckdb/src/function/scalar/struct/struct_extract.cpp +5 -10
  181. package/src/duckdb/src/function/scalar/struct/struct_insert.cpp +11 -14
  182. package/src/duckdb/src/function/scalar/struct/struct_pack.cpp +6 -7
  183. package/src/duckdb/src/function/table/arrow.cpp +5 -2
  184. package/src/duckdb/src/function/table/arrow_conversion.cpp +25 -1
  185. package/src/duckdb/src/function/table/checkpoint.cpp +5 -1
  186. package/src/duckdb/src/function/table/read_csv.cpp +60 -0
  187. package/src/duckdb/src/function/table/system/duckdb_constraints.cpp +2 -2
  188. package/src/duckdb/src/function/table/system/test_all_types.cpp +2 -2
  189. package/src/duckdb/src/function/table/table_scan.cpp +9 -12
  190. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  191. package/src/duckdb/src/function/table_function.cpp +30 -11
  192. package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +6 -0
  193. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_table_entry.hpp +1 -1
  194. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_function_catalog_entry.hpp +6 -8
  195. package/src/duckdb/src/include/duckdb/catalog/dependency_list.hpp +3 -0
  196. package/src/duckdb/src/include/duckdb/catalog/duck_catalog.hpp +2 -1
  197. package/src/duckdb/src/include/duckdb/common/box_renderer.hpp +8 -2
  198. package/src/duckdb/src/include/duckdb/common/constants.hpp +0 -19
  199. package/src/duckdb/src/include/duckdb/common/enums/aggregate_handling.hpp +2 -0
  200. package/src/duckdb/src/include/duckdb/common/enums/expression_type.hpp +2 -3
  201. package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +7 -4
  202. package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +1 -0
  203. package/src/duckdb/src/include/duckdb/common/enums/order_type.hpp +2 -0
  204. package/src/duckdb/src/include/duckdb/common/enums/set_operation_type.hpp +2 -1
  205. package/src/duckdb/src/include/duckdb/common/enums/statement_type.hpp +2 -1
  206. package/src/duckdb/src/include/duckdb/common/enums/tableref_type.hpp +2 -1
  207. package/src/duckdb/src/include/duckdb/common/exception.hpp +69 -2
  208. package/src/duckdb/src/include/duckdb/common/field_writer.hpp +12 -4
  209. package/src/duckdb/src/include/duckdb/common/helper.hpp +1 -1
  210. package/src/duckdb/src/include/duckdb/common/{http_stats.hpp → http_state.hpp} +18 -4
  211. package/src/duckdb/src/include/duckdb/common/operator/comparison_operators.hpp +45 -149
  212. package/src/duckdb/src/include/duckdb/common/operator/multiply.hpp +2 -0
  213. package/src/duckdb/src/include/duckdb/common/optional_ptr.hpp +45 -0
  214. package/src/duckdb/src/include/duckdb/common/preserved_error.hpp +6 -1
  215. package/src/duckdb/src/include/duckdb/common/progress_bar/progress_bar.hpp +2 -0
  216. package/src/duckdb/src/include/duckdb/common/serializer/buffered_deserializer.hpp +4 -2
  217. package/src/duckdb/src/include/duckdb/common/serializer/buffered_file_reader.hpp +8 -2
  218. package/src/duckdb/src/include/duckdb/common/serializer/enum_serializer.hpp +113 -0
  219. package/src/duckdb/src/include/duckdb/common/serializer/format_deserializer.hpp +336 -0
  220. package/src/duckdb/src/include/duckdb/common/serializer/format_serializer.hpp +268 -0
  221. package/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp +126 -0
  222. package/src/duckdb/src/include/duckdb/common/serializer.hpp +13 -0
  223. package/src/duckdb/src/include/duckdb/common/string_util.hpp +25 -0
  224. package/src/duckdb/src/include/duckdb/common/types/bit.hpp +12 -7
  225. package/src/duckdb/src/include/duckdb/common/types/interval.hpp +39 -3
  226. package/src/duckdb/src/include/duckdb/common/types/list_segment.hpp +70 -0
  227. package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +73 -3
  228. package/src/duckdb/src/include/duckdb/common/types/time.hpp +3 -0
  229. package/src/duckdb/src/include/duckdb/common/types/value.hpp +17 -48
  230. package/src/duckdb/src/include/duckdb/common/types/value_map.hpp +1 -1
  231. package/src/duckdb/src/include/duckdb/common/types/vector.hpp +3 -1
  232. package/src/duckdb/src/include/duckdb/common/types.hpp +45 -8
  233. package/src/duckdb/src/include/duckdb/common/vector_operations/unary_executor.hpp +2 -2
  234. package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +1 -0
  235. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +3 -14
  236. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_perfecthash_aggregate.hpp +1 -1
  237. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_cross_product.hpp +2 -0
  238. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_file_handle.hpp +1 -0
  239. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +10 -0
  240. package/src/duckdb/src/include/duckdb/execution/operator/projection/physical_projection.hpp +5 -0
  241. package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +3 -0
  242. package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +1 -3
  243. package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +54 -0
  244. package/src/duckdb/src/include/duckdb/function/aggregate/distributive_functions.hpp +5 -0
  245. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +18 -6
  246. package/src/duckdb/src/include/duckdb/function/cast/bound_cast_data.hpp +84 -0
  247. package/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp +2 -2
  248. package/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp +28 -64
  249. package/src/duckdb/src/include/duckdb/function/function_binder.hpp +3 -6
  250. package/src/duckdb/src/include/duckdb/function/scalar/bit_functions.hpp +4 -0
  251. package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +138 -0
  252. package/src/duckdb/src/include/duckdb/function/scalar/math_functions.hpp +8 -0
  253. package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +59 -0
  254. package/src/duckdb/src/include/duckdb/function/scalar/regexp.hpp +81 -1
  255. package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +4 -0
  256. package/src/duckdb/src/include/duckdb/function/scalar_function.hpp +2 -2
  257. package/src/duckdb/src/include/duckdb/function/table/arrow.hpp +12 -1
  258. package/src/duckdb/src/include/duckdb/function/table_function.hpp +10 -0
  259. package/src/duckdb/src/include/duckdb/main/capi/capi_internal.hpp +2 -0
  260. package/src/duckdb/src/include/duckdb/main/client_config.hpp +2 -0
  261. package/src/duckdb/src/include/duckdb/main/client_data.hpp +3 -3
  262. package/src/duckdb/src/include/duckdb/main/config.hpp +3 -0
  263. package/src/duckdb/src/include/duckdb/main/connection_manager.hpp +2 -0
  264. package/src/duckdb/src/include/duckdb/main/database.hpp +1 -0
  265. package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +2 -0
  266. package/src/duckdb/src/include/duckdb/main/prepared_statement.hpp +2 -0
  267. package/src/duckdb/src/include/duckdb/main/relation/explain_relation.hpp +2 -1
  268. package/src/duckdb/src/include/duckdb/main/relation.hpp +2 -1
  269. package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +2 -0
  270. package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +2 -2
  271. package/src/duckdb/src/include/duckdb/optimizer/rule/list.hpp +1 -0
  272. package/src/duckdb/src/include/duckdb/optimizer/rule/ordered_aggregate_optimizer.hpp +24 -0
  273. package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +4 -0
  274. package/src/duckdb/src/include/duckdb/parser/expression/between_expression.hpp +3 -0
  275. package/src/duckdb/src/include/duckdb/parser/expression/bound_expression.hpp +2 -0
  276. package/src/duckdb/src/include/duckdb/parser/expression/case_expression.hpp +5 -0
  277. package/src/duckdb/src/include/duckdb/parser/expression/cast_expression.hpp +2 -0
  278. package/src/duckdb/src/include/duckdb/parser/expression/collate_expression.hpp +2 -0
  279. package/src/duckdb/src/include/duckdb/parser/expression/columnref_expression.hpp +2 -0
  280. package/src/duckdb/src/include/duckdb/parser/expression/comparison_expression.hpp +2 -0
  281. package/src/duckdb/src/include/duckdb/parser/expression/conjunction_expression.hpp +2 -0
  282. package/src/duckdb/src/include/duckdb/parser/expression/constant_expression.hpp +3 -0
  283. package/src/duckdb/src/include/duckdb/parser/expression/default_expression.hpp +1 -0
  284. package/src/duckdb/src/include/duckdb/parser/expression/function_expression.hpp +4 -2
  285. package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +2 -0
  286. package/src/duckdb/src/include/duckdb/parser/expression/operator_expression.hpp +2 -0
  287. package/src/duckdb/src/include/duckdb/parser/expression/parameter_expression.hpp +2 -0
  288. package/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +2 -0
  289. package/src/duckdb/src/include/duckdb/parser/expression/star_expression.hpp +4 -2
  290. package/src/duckdb/src/include/duckdb/parser/expression/subquery_expression.hpp +2 -0
  291. package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +5 -0
  292. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_info.hpp +5 -1
  293. package/src/duckdb/src/include/duckdb/parser/parsed_data/{alter_function_info.hpp → alter_scalar_function_info.hpp} +13 -13
  294. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_function_info.hpp +47 -0
  295. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp +6 -0
  296. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_table_function_info.hpp +2 -1
  297. package/src/duckdb/src/include/duckdb/parser/parsed_data/sample_options.hpp +2 -0
  298. package/src/duckdb/src/include/duckdb/parser/parsed_expression.hpp +5 -0
  299. package/src/duckdb/src/include/duckdb/parser/query_node/recursive_cte_node.hpp +3 -0
  300. package/src/duckdb/src/include/duckdb/parser/query_node/select_node.hpp +5 -0
  301. package/src/duckdb/src/include/duckdb/parser/query_node/set_operation_node.hpp +3 -0
  302. package/src/duckdb/src/include/duckdb/parser/query_node.hpp +13 -2
  303. package/src/duckdb/src/include/duckdb/parser/result_modifier.hpp +24 -1
  304. package/src/duckdb/src/include/duckdb/parser/sql_statement.hpp +2 -1
  305. package/src/duckdb/src/include/duckdb/parser/statement/multi_statement.hpp +28 -0
  306. package/src/duckdb/src/include/duckdb/parser/statement/select_statement.hpp +6 -1
  307. package/src/duckdb/src/include/duckdb/parser/tableref/basetableref.hpp +4 -0
  308. package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +2 -0
  309. package/src/duckdb/src/include/duckdb/parser/tableref/expressionlistref.hpp +3 -0
  310. package/src/duckdb/src/include/duckdb/parser/tableref/joinref.hpp +3 -0
  311. package/src/duckdb/src/include/duckdb/parser/tableref/list.hpp +1 -0
  312. package/src/duckdb/src/include/duckdb/parser/tableref/pivotref.hpp +87 -0
  313. package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +3 -0
  314. package/src/duckdb/src/include/duckdb/parser/tableref/table_function_ref.hpp +3 -0
  315. package/src/duckdb/src/include/duckdb/parser/tableref.hpp +3 -1
  316. package/src/duckdb/src/include/duckdb/parser/tokens.hpp +2 -0
  317. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +33 -0
  318. package/src/duckdb/src/include/duckdb/planner/bind_context.hpp +2 -0
  319. package/src/duckdb/src/include/duckdb/planner/binder.hpp +15 -4
  320. package/src/duckdb/src/include/duckdb/planner/bound_result_modifier.hpp +3 -0
  321. package/src/duckdb/src/include/duckdb/planner/expression/bound_aggregate_expression.hpp +3 -0
  322. package/src/duckdb/src/include/duckdb/planner/expression_binder/base_select_binder.hpp +64 -0
  323. package/src/duckdb/src/include/duckdb/planner/expression_binder/having_binder.hpp +2 -2
  324. package/src/duckdb/src/include/duckdb/planner/expression_binder/order_binder.hpp +4 -1
  325. package/src/duckdb/src/include/duckdb/planner/expression_binder/qualify_binder.hpp +2 -2
  326. package/src/duckdb/src/include/duckdb/planner/expression_binder/select_binder.hpp +9 -38
  327. package/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +1 -1
  328. package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +1 -0
  329. package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +1 -0
  330. package/src/duckdb/src/include/duckdb/planner/operator/logical_asof_join.hpp +22 -0
  331. package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +5 -2
  332. package/src/duckdb/src/include/duckdb/planner/operator/logical_distinct.hpp +3 -0
  333. package/src/duckdb/src/include/duckdb/planner/query_node/bound_select_node.hpp +8 -2
  334. package/src/duckdb/src/include/duckdb/storage/buffer/block_handle.hpp +2 -0
  335. package/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp +76 -44
  336. package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp +3 -2
  337. package/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp +1 -1
  338. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_compress.hpp +2 -2
  339. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_fetch.hpp +1 -1
  340. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_scan.hpp +2 -1
  341. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_compress.hpp +2 -2
  342. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_fetch.hpp +1 -1
  343. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_scan.hpp +2 -1
  344. package/src/duckdb/src/include/duckdb/storage/data_pointer.hpp +4 -3
  345. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +4 -3
  346. package/src/duckdb/src/include/duckdb/storage/index.hpp +5 -4
  347. package/src/duckdb/src/include/duckdb/storage/meta_block_reader.hpp +7 -0
  348. package/src/duckdb/src/include/duckdb/storage/statistics/base_statistics.hpp +93 -29
  349. package/src/duckdb/src/include/duckdb/storage/statistics/column_statistics.hpp +22 -3
  350. package/src/duckdb/src/include/duckdb/storage/statistics/distinct_statistics.hpp +8 -6
  351. package/src/duckdb/src/include/duckdb/storage/statistics/list_stats.hpp +41 -0
  352. package/src/duckdb/src/include/duckdb/storage/statistics/node_statistics.hpp +26 -0
  353. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats.hpp +114 -0
  354. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats_union.hpp +62 -0
  355. package/src/duckdb/src/include/duckdb/storage/statistics/segment_statistics.hpp +2 -7
  356. package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +74 -0
  357. package/src/duckdb/src/include/duckdb/storage/statistics/struct_stats.hpp +42 -0
  358. package/src/duckdb/src/include/duckdb/storage/string_uncompressed.hpp +2 -3
  359. package/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp +2 -1
  360. package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +21 -7
  361. package/src/duckdb/src/include/duckdb/storage/table/column_data_checkpointer.hpp +3 -2
  362. package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +5 -6
  363. package/src/duckdb/src/include/duckdb/storage/table/column_segment_tree.hpp +18 -0
  364. package/src/duckdb/src/include/duckdb/storage/table/list_column_data.hpp +1 -1
  365. package/src/duckdb/src/include/duckdb/storage/table/persistent_table_data.hpp +6 -3
  366. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +41 -45
  367. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +23 -7
  368. package/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp +35 -0
  369. package/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp +21 -29
  370. package/src/duckdb/src/include/duckdb/storage/table/segment_base.hpp +6 -6
  371. package/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +281 -26
  372. package/src/duckdb/src/include/duckdb/storage/table/standard_column_data.hpp +0 -4
  373. package/src/duckdb/src/include/duckdb/storage/table/table_statistics.hpp +5 -0
  374. package/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +0 -1
  375. package/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +1 -1
  376. package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +6 -3
  377. package/src/duckdb/src/include/duckdb.h +71 -2
  378. package/src/duckdb/src/include/duckdb.hpp +0 -1
  379. package/src/duckdb/src/main/capi/pending-c.cpp +16 -3
  380. package/src/duckdb/src/main/capi/result-c.cpp +27 -1
  381. package/src/duckdb/src/main/capi/stream-c.cpp +25 -0
  382. package/src/duckdb/src/main/capi/table_function-c.cpp +23 -0
  383. package/src/duckdb/src/main/client_context.cpp +38 -34
  384. package/src/duckdb/src/main/client_data.cpp +7 -6
  385. package/src/duckdb/src/main/config.cpp +70 -1
  386. package/src/duckdb/src/main/database.cpp +19 -2
  387. package/src/duckdb/src/main/extension/extension_install.cpp +7 -2
  388. package/src/duckdb/src/main/prepared_statement.cpp +4 -0
  389. package/src/duckdb/src/main/query_profiler.cpp +17 -15
  390. package/src/duckdb/src/main/relation/explain_relation.cpp +3 -3
  391. package/src/duckdb/src/main/relation.cpp +3 -2
  392. package/src/duckdb/src/main/settings/settings.cpp +20 -8
  393. package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +1 -0
  394. package/src/duckdb/src/optimizer/deliminator.cpp +1 -1
  395. package/src/duckdb/src/optimizer/filter_combiner.cpp +3 -6
  396. package/src/duckdb/src/optimizer/filter_pullup.cpp +3 -1
  397. package/src/duckdb/src/optimizer/filter_pushdown.cpp +14 -8
  398. package/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp +107 -71
  399. package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +32 -12
  400. package/src/duckdb/src/optimizer/optimizer.cpp +1 -0
  401. package/src/duckdb/src/optimizer/pullup/pullup_from_left.cpp +2 -2
  402. package/src/duckdb/src/optimizer/pushdown/pushdown_aggregate.cpp +33 -5
  403. package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +1 -1
  404. package/src/duckdb/src/optimizer/pushdown/pushdown_inner_join.cpp +3 -0
  405. package/src/duckdb/src/optimizer/pushdown/pushdown_left_join.cpp +5 -12
  406. package/src/duckdb/src/optimizer/pushdown/pushdown_mark_join.cpp +2 -2
  407. package/src/duckdb/src/optimizer/pushdown/pushdown_single_join.cpp +1 -1
  408. package/src/duckdb/src/optimizer/remove_unused_columns.cpp +1 -0
  409. package/src/duckdb/src/optimizer/rule/move_constants.cpp +10 -4
  410. package/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp +30 -0
  411. package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +9 -2
  412. package/src/duckdb/src/optimizer/statistics/expression/propagate_aggregate.cpp +9 -3
  413. package/src/duckdb/src/optimizer/statistics/expression/propagate_and_compress.cpp +6 -7
  414. package/src/duckdb/src/optimizer/statistics/expression/propagate_cast.cpp +14 -11
  415. package/src/duckdb/src/optimizer/statistics/expression/propagate_columnref.cpp +1 -1
  416. package/src/duckdb/src/optimizer/statistics/expression/propagate_comparison.cpp +13 -15
  417. package/src/duckdb/src/optimizer/statistics/expression/propagate_conjunction.cpp +0 -1
  418. package/src/duckdb/src/optimizer/statistics/expression/propagate_constant.cpp +3 -75
  419. package/src/duckdb/src/optimizer/statistics/expression/propagate_function.cpp +7 -2
  420. package/src/duckdb/src/optimizer/statistics/expression/propagate_operator.cpp +10 -0
  421. package/src/duckdb/src/optimizer/statistics/operator/propagate_aggregate.cpp +2 -3
  422. package/src/duckdb/src/optimizer/statistics/operator/propagate_filter.cpp +29 -32
  423. package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +5 -5
  424. package/src/duckdb/src/optimizer/statistics/operator/propagate_set_operation.cpp +3 -3
  425. package/src/duckdb/src/optimizer/statistics_propagator.cpp +2 -1
  426. package/src/duckdb/src/optimizer/unnest_rewriter.cpp +2 -2
  427. package/src/duckdb/src/parallel/meta_pipeline.cpp +0 -7
  428. package/src/duckdb/src/parser/common_table_expression_info.cpp +19 -0
  429. package/src/duckdb/src/parser/expression/between_expression.cpp +17 -0
  430. package/src/duckdb/src/parser/expression/case_expression.cpp +28 -0
  431. package/src/duckdb/src/parser/expression/cast_expression.cpp +17 -0
  432. package/src/duckdb/src/parser/expression/collate_expression.cpp +16 -0
  433. package/src/duckdb/src/parser/expression/columnref_expression.cpp +15 -0
  434. package/src/duckdb/src/parser/expression/comparison_expression.cpp +16 -0
  435. package/src/duckdb/src/parser/expression/conjunction_expression.cpp +17 -0
  436. package/src/duckdb/src/parser/expression/constant_expression.cpp +14 -0
  437. package/src/duckdb/src/parser/expression/default_expression.cpp +7 -0
  438. package/src/duckdb/src/parser/expression/function_expression.cpp +35 -0
  439. package/src/duckdb/src/parser/expression/lambda_expression.cpp +16 -0
  440. package/src/duckdb/src/parser/expression/operator_expression.cpp +15 -0
  441. package/src/duckdb/src/parser/expression/parameter_expression.cpp +15 -0
  442. package/src/duckdb/src/parser/expression/positional_reference_expression.cpp +14 -0
  443. package/src/duckdb/src/parser/expression/star_expression.cpp +26 -6
  444. package/src/duckdb/src/parser/expression/subquery_expression.cpp +20 -0
  445. package/src/duckdb/src/parser/expression/window_expression.cpp +43 -0
  446. package/src/duckdb/src/parser/parsed_data/alter_info.cpp +7 -3
  447. package/src/duckdb/src/parser/parsed_data/alter_scalar_function_info.cpp +56 -0
  448. package/src/duckdb/src/parser/parsed_data/alter_table_function_info.cpp +51 -0
  449. package/src/duckdb/src/parser/parsed_data/create_scalar_function_info.cpp +3 -2
  450. package/src/duckdb/src/parser/parsed_data/create_table_function_info.cpp +6 -0
  451. package/src/duckdb/src/parser/parsed_data/sample_options.cpp +22 -10
  452. package/src/duckdb/src/parser/parsed_expression.cpp +72 -0
  453. package/src/duckdb/src/parser/parsed_expression_iterator.cpp +15 -1
  454. package/src/duckdb/src/parser/query_node/recursive_cte_node.cpp +21 -0
  455. package/src/duckdb/src/parser/query_node/select_node.cpp +31 -0
  456. package/src/duckdb/src/parser/query_node/set_operation_node.cpp +17 -0
  457. package/src/duckdb/src/parser/query_node.cpp +51 -1
  458. package/src/duckdb/src/parser/result_modifier.cpp +78 -0
  459. package/src/duckdb/src/parser/statement/multi_statement.cpp +18 -0
  460. package/src/duckdb/src/parser/statement/select_statement.cpp +12 -0
  461. package/src/duckdb/src/parser/tableref/basetableref.cpp +21 -0
  462. package/src/duckdb/src/parser/tableref/emptytableref.cpp +4 -0
  463. package/src/duckdb/src/parser/tableref/expressionlistref.cpp +17 -0
  464. package/src/duckdb/src/parser/tableref/joinref.cpp +29 -0
  465. package/src/duckdb/src/parser/tableref/pivotref.cpp +373 -0
  466. package/src/duckdb/src/parser/tableref/subqueryref.cpp +15 -0
  467. package/src/duckdb/src/parser/tableref/table_function.cpp +17 -0
  468. package/src/duckdb/src/parser/tableref.cpp +49 -0
  469. package/src/duckdb/src/parser/transform/expression/transform_array_access.cpp +11 -0
  470. package/src/duckdb/src/parser/transform/expression/transform_bool_expr.cpp +1 -1
  471. package/src/duckdb/src/parser/transform/expression/transform_columnref.cpp +17 -2
  472. package/src/duckdb/src/parser/transform/expression/transform_function.cpp +85 -42
  473. package/src/duckdb/src/parser/transform/expression/transform_operator.cpp +1 -1
  474. package/src/duckdb/src/parser/transform/expression/transform_subquery.cpp +1 -1
  475. package/src/duckdb/src/parser/transform/helpers/transform_alias.cpp +12 -6
  476. package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +24 -0
  477. package/src/duckdb/src/parser/transform/helpers/transform_groupby.cpp +7 -0
  478. package/src/duckdb/src/parser/transform/helpers/transform_orderby.cpp +0 -7
  479. package/src/duckdb/src/parser/transform/helpers/transform_typename.cpp +3 -2
  480. package/src/duckdb/src/parser/transform/statement/transform_create_function.cpp +4 -0
  481. package/src/duckdb/src/parser/transform/statement/transform_create_view.cpp +4 -0
  482. package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +179 -0
  483. package/src/duckdb/src/parser/transform/statement/transform_rename.cpp +3 -4
  484. package/src/duckdb/src/parser/transform/statement/transform_select.cpp +8 -0
  485. package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +2 -3
  486. package/src/duckdb/src/parser/transform/tableref/transform_join.cpp +12 -1
  487. package/src/duckdb/src/parser/transform/tableref/transform_pivot.cpp +121 -0
  488. package/src/duckdb/src/parser/transform/tableref/transform_tableref.cpp +2 -0
  489. package/src/duckdb/src/parser/transformer.cpp +15 -3
  490. package/src/duckdb/src/planner/bind_context.cpp +18 -25
  491. package/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp +9 -7
  492. package/src/duckdb/src/planner/binder/expression/bind_columnref_expression.cpp +4 -3
  493. package/src/duckdb/src/planner/binder/expression/bind_function_expression.cpp +23 -12
  494. package/src/duckdb/src/planner/binder/expression/bind_lambda.cpp +3 -2
  495. package/src/duckdb/src/planner/binder/expression/bind_star_expression.cpp +176 -0
  496. package/src/duckdb/src/planner/binder/expression/bind_subquery_expression.cpp +4 -0
  497. package/src/duckdb/src/planner/binder/expression/bind_unnest_expression.cpp +163 -24
  498. package/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp +2 -2
  499. package/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +109 -94
  500. package/src/duckdb/src/planner/binder/query_node/plan_query_node.cpp +11 -0
  501. package/src/duckdb/src/planner/binder/query_node/plan_select_node.cpp +9 -4
  502. package/src/duckdb/src/planner/binder/statement/bind_copy.cpp +5 -3
  503. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +3 -2
  504. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +10 -1
  505. package/src/duckdb/src/planner/binder/statement/bind_delete.cpp +1 -1
  506. package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +12 -8
  507. package/src/duckdb/src/planner/binder/statement/bind_logical_plan.cpp +17 -0
  508. package/src/duckdb/src/planner/binder/statement/bind_update.cpp +4 -2
  509. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +19 -3
  510. package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +366 -0
  511. package/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp +11 -1
  512. package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -0
  513. package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +61 -13
  514. package/src/duckdb/src/planner/binder.cpp +19 -24
  515. package/src/duckdb/src/planner/bound_result_modifier.cpp +27 -1
  516. package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +9 -2
  517. package/src/duckdb/src/planner/expression/bound_expression.cpp +4 -0
  518. package/src/duckdb/src/planner/expression/bound_window_expression.cpp +1 -1
  519. package/src/duckdb/src/planner/expression_binder/base_select_binder.cpp +146 -0
  520. package/src/duckdb/src/planner/expression_binder/having_binder.cpp +6 -3
  521. package/src/duckdb/src/planner/expression_binder/qualify_binder.cpp +3 -3
  522. package/src/duckdb/src/planner/expression_binder/select_binder.cpp +1 -132
  523. package/src/duckdb/src/planner/expression_binder.cpp +10 -3
  524. package/src/duckdb/src/planner/expression_iterator.cpp +17 -10
  525. package/src/duckdb/src/planner/filter/constant_filter.cpp +4 -6
  526. package/src/duckdb/src/planner/logical_operator.cpp +7 -2
  527. package/src/duckdb/src/planner/logical_operator_visitor.cpp +6 -0
  528. package/src/duckdb/src/planner/operator/logical_asof_join.cpp +8 -0
  529. package/src/duckdb/src/planner/operator/logical_distinct.cpp +3 -0
  530. package/src/duckdb/src/planner/planner.cpp +2 -1
  531. package/src/duckdb/src/planner/pragma_handler.cpp +10 -2
  532. package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +3 -1
  533. package/src/duckdb/src/storage/buffer_manager.cpp +44 -46
  534. package/src/duckdb/src/storage/checkpoint/row_group_writer.cpp +1 -1
  535. package/src/duckdb/src/storage/checkpoint/table_data_reader.cpp +4 -15
  536. package/src/duckdb/src/storage/checkpoint/table_data_writer.cpp +10 -4
  537. package/src/duckdb/src/storage/checkpoint_manager.cpp +9 -3
  538. package/src/duckdb/src/storage/compression/bitpacking.cpp +29 -25
  539. package/src/duckdb/src/storage/compression/fixed_size_uncompressed.cpp +45 -46
  540. package/src/duckdb/src/storage/compression/numeric_constant.cpp +10 -11
  541. package/src/duckdb/src/storage/compression/patas.cpp +1 -1
  542. package/src/duckdb/src/storage/compression/rle.cpp +20 -15
  543. package/src/duckdb/src/storage/compression/validity_uncompressed.cpp +6 -6
  544. package/src/duckdb/src/storage/data_table.cpp +23 -23
  545. package/src/duckdb/src/storage/index.cpp +12 -1
  546. package/src/duckdb/src/storage/local_storage.cpp +27 -23
  547. package/src/duckdb/src/storage/meta_block_reader.cpp +22 -0
  548. package/src/duckdb/src/storage/statistics/base_statistics.cpp +373 -128
  549. package/src/duckdb/src/storage/statistics/column_statistics.cpp +57 -3
  550. package/src/duckdb/src/storage/statistics/distinct_statistics.cpp +8 -9
  551. package/src/duckdb/src/storage/statistics/list_stats.cpp +121 -0
  552. package/src/duckdb/src/storage/statistics/numeric_stats.cpp +591 -0
  553. package/src/duckdb/src/storage/statistics/numeric_stats_union.cpp +65 -0
  554. package/src/duckdb/src/storage/statistics/segment_statistics.cpp +2 -11
  555. package/src/duckdb/src/storage/statistics/string_stats.cpp +273 -0
  556. package/src/duckdb/src/storage/statistics/struct_stats.cpp +133 -0
  557. package/src/duckdb/src/storage/storage_info.cpp +2 -2
  558. package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +4 -10
  559. package/src/duckdb/src/storage/table/column_data.cpp +118 -62
  560. package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +10 -9
  561. package/src/duckdb/src/storage/table/column_segment.cpp +30 -45
  562. package/src/duckdb/src/storage/table/list_column_data.cpp +50 -71
  563. package/src/duckdb/src/storage/table/persistent_table_data.cpp +2 -1
  564. package/src/duckdb/src/storage/table/row_group.cpp +213 -143
  565. package/src/duckdb/src/storage/table/row_group_collection.cpp +151 -105
  566. package/src/duckdb/src/storage/table/scan_state.cpp +45 -33
  567. package/src/duckdb/src/storage/table/standard_column_data.cpp +11 -12
  568. package/src/duckdb/src/storage/table/struct_column_data.cpp +27 -34
  569. package/src/duckdb/src/storage/table/table_statistics.cpp +27 -7
  570. package/src/duckdb/src/storage/table/update_segment.cpp +23 -18
  571. package/src/duckdb/src/storage/wal_replay.cpp +8 -5
  572. package/src/duckdb/src/storage/write_ahead_log.cpp +2 -2
  573. package/src/duckdb/src/transaction/commit_state.cpp +11 -7
  574. package/src/duckdb/src/verification/deserialized_statement_verifier.cpp +0 -1
  575. package/src/duckdb/third_party/libpg_query/include/nodes/nodes.hpp +35 -0
  576. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +36 -2
  577. package/src/duckdb/third_party/libpg_query/include/nodes/primnodes.hpp +3 -3
  578. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +1022 -530
  579. package/src/duckdb/third_party/libpg_query/include/parser/kwlist.hpp +8 -0
  580. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +24462 -22828
  581. package/src/duckdb/third_party/re2/re2/re2.cc +9 -0
  582. package/src/duckdb/third_party/re2/re2/re2.h +2 -0
  583. package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +4 -4
  584. package/src/duckdb/ub_extension_json_json_functions.cpp +2 -0
  585. package/src/duckdb/ub_src_common_serializer.cpp +2 -0
  586. package/src/duckdb/ub_src_common_types.cpp +2 -0
  587. package/src/duckdb/ub_src_execution_physical_plan.cpp +2 -0
  588. package/src/duckdb/ub_src_function_aggregate_distributive.cpp +2 -0
  589. package/src/duckdb/ub_src_function_scalar_bit.cpp +2 -0
  590. package/src/duckdb/ub_src_function_scalar_map.cpp +4 -0
  591. package/src/duckdb/ub_src_function_scalar_string.cpp +2 -0
  592. package/src/duckdb/ub_src_function_scalar_string_regexp.cpp +4 -0
  593. package/src/duckdb/ub_src_main_capi.cpp +2 -0
  594. package/src/duckdb/ub_src_optimizer_rule.cpp +2 -0
  595. package/src/duckdb/ub_src_parser.cpp +2 -0
  596. package/src/duckdb/ub_src_parser_parsed_data.cpp +4 -2
  597. package/src/duckdb/ub_src_parser_statement.cpp +2 -0
  598. package/src/duckdb/ub_src_parser_tableref.cpp +2 -0
  599. package/src/duckdb/ub_src_parser_transform_statement.cpp +2 -0
  600. package/src/duckdb/ub_src_parser_transform_tableref.cpp +2 -0
  601. package/src/duckdb/ub_src_planner_binder_expression.cpp +2 -0
  602. package/src/duckdb/ub_src_planner_binder_tableref.cpp +2 -0
  603. package/src/duckdb/ub_src_planner_expression_binder.cpp +2 -0
  604. package/src/duckdb/ub_src_planner_operator.cpp +2 -0
  605. package/src/duckdb/ub_src_storage_statistics.cpp +6 -6
  606. package/src/duckdb/ub_src_storage_table.cpp +0 -2
  607. package/src/duckdb_node.hpp +2 -1
  608. package/src/statement.cpp +5 -5
  609. package/src/utils.cpp +27 -2
  610. package/test/extension.test.ts +44 -26
  611. package/test/syntax_error.test.ts +3 -1
  612. package/filelist.cache +0 -0
  613. package/src/duckdb/src/include/duckdb/main/loadable_extension.hpp +0 -59
  614. package/src/duckdb/src/include/duckdb/storage/statistics/list_statistics.hpp +0 -36
  615. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_statistics.hpp +0 -75
  616. package/src/duckdb/src/include/duckdb/storage/statistics/string_statistics.hpp +0 -49
  617. package/src/duckdb/src/include/duckdb/storage/statistics/struct_statistics.hpp +0 -36
  618. package/src/duckdb/src/include/duckdb/storage/statistics/validity_statistics.hpp +0 -45
  619. package/src/duckdb/src/parser/parsed_data/alter_function_info.cpp +0 -55
  620. package/src/duckdb/src/storage/statistics/list_statistics.cpp +0 -94
  621. package/src/duckdb/src/storage/statistics/numeric_statistics.cpp +0 -307
  622. package/src/duckdb/src/storage/statistics/string_statistics.cpp +0 -220
  623. package/src/duckdb/src/storage/statistics/struct_statistics.cpp +0 -108
  624. package/src/duckdb/src/storage/statistics/validity_statistics.cpp +0 -91
  625. package/src/duckdb/src/storage/table/segment_tree.cpp +0 -179
@@ -35,7 +35,10 @@
35
35
  #endif
36
36
  #endif
37
37
 
38
- // duplicate of duckdb/common/constants.hpp
38
+ // API versions
39
+ // if no explicit API version is defined, the latest API version is used
40
+ // Note that using older API versions (i.e. not using DUCKDB_API_LATEST) is deprecated.
41
+ // These will not be supported long-term, and will be removed in future versions.
39
42
  #ifndef DUCKDB_API_0_3_1
40
43
  #define DUCKDB_API_0_3_1 1
41
44
  #endif
@@ -570,11 +573,19 @@ Use `duckdb_result_chunk_count` to figure out how many chunks there are in the r
570
573
  */
571
574
  DUCKDB_API duckdb_data_chunk duckdb_result_get_chunk(duckdb_result result, idx_t chunk_index);
572
575
 
576
+ /*!
577
+ Checks if the type of the internal result is StreamQueryResult.
578
+
579
+ * result: The result object to check.
580
+ * returns: Whether or not the result object is of the type StreamQueryResult
581
+ */
582
+ DUCKDB_API bool duckdb_result_is_streaming(duckdb_result result);
583
+
573
584
  /*!
574
585
  Returns the number of data chunks present in the result.
575
586
 
576
587
  * result: The result object
577
- * returns: The resulting data chunk. Returns `NULL` if the chunk index is out of bounds.
588
+ * returns: Number of data chunks present in the result.
578
589
  */
579
590
  DUCKDB_API idx_t duckdb_result_chunk_count(duckdb_result result);
580
591
 
@@ -1106,6 +1117,21 @@ Note that after calling `duckdb_pending_prepared`, the pending result should alw
1106
1117
  DUCKDB_API duckdb_state duckdb_pending_prepared(duckdb_prepared_statement prepared_statement,
1107
1118
  duckdb_pending_result *out_result);
1108
1119
 
1120
+ /*!
1121
+ Executes the prepared statement with the given bound parameters, and returns a pending result.
1122
+ This pending result will create a streaming duckdb_result when executed.
1123
+ The pending result represents an intermediate structure for a query that is not yet fully executed.
1124
+
1125
+ Note that after calling `duckdb_pending_prepared_streaming`, the pending result should always be destroyed using
1126
+ `duckdb_destroy_pending`, even if this function returns DuckDBError.
1127
+
1128
+ * prepared_statement: The prepared statement to execute.
1129
+ * out_result: The pending query result.
1130
+ * returns: `DuckDBSuccess` on success or `DuckDBError` on failure.
1131
+ */
1132
+ DUCKDB_API duckdb_state duckdb_pending_prepared_streaming(duckdb_prepared_statement prepared_statement,
1133
+ duckdb_pending_result *out_result);
1134
+
1109
1135
  /*!
1110
1136
  Closes the pending result and de-allocates all memory allocated for the result.
1111
1137
 
@@ -1684,6 +1710,16 @@ Adds a parameter to the table function.
1684
1710
  */
1685
1711
  DUCKDB_API void duckdb_table_function_add_parameter(duckdb_table_function table_function, duckdb_logical_type type);
1686
1712
 
1713
+ /*!
1714
+ Adds a named parameter to the table function.
1715
+
1716
+ * table_function: The table function
1717
+ * name: The name of the parameter
1718
+ * type: The type of the parameter to add.
1719
+ */
1720
+ DUCKDB_API void duckdb_table_function_add_named_parameter(duckdb_table_function table_function, const char *name,
1721
+ duckdb_logical_type type);
1722
+
1687
1723
  /*!
1688
1724
  Assigns extra information to the table function that can be fetched during binding, etc.
1689
1725
 
@@ -1792,6 +1828,17 @@ The result must be destroyed with `duckdb_destroy_value`.
1792
1828
  */
1793
1829
  DUCKDB_API duckdb_value duckdb_bind_get_parameter(duckdb_bind_info info, idx_t index);
1794
1830
 
1831
+ /*!
1832
+ Retrieves a named parameter with the given name.
1833
+
1834
+ The result must be destroyed with `duckdb_destroy_value`.
1835
+
1836
+ * info: The info object
1837
+ * name: The name of the parameter
1838
+ * returns: The value of the parameter. Must be destroyed with `duckdb_destroy_value`.
1839
+ */
1840
+ DUCKDB_API duckdb_value duckdb_bind_get_named_parameter(duckdb_bind_info info, const char *name);
1841
+
1795
1842
  /*!
1796
1843
  Sets the user-provided bind data in the bind object. This object can be retrieved again during execution.
1797
1844
 
@@ -2319,6 +2366,28 @@ Returns true if execution of the current query is finished.
2319
2366
  */
2320
2367
  DUCKDB_API bool duckdb_execution_is_finished(duckdb_connection con);
2321
2368
 
2369
+ //===--------------------------------------------------------------------===//
2370
+ // Streaming Result Interface
2371
+ //===--------------------------------------------------------------------===//
2372
+
2373
+ /*!
2374
+ Fetches a data chunk from the (streaming) duckdb_result. This function should be called repeatedly until the result is
2375
+ exhausted.
2376
+
2377
+ The result must be destroyed with `duckdb_destroy_data_chunk`.
2378
+
2379
+ This function can only be used on duckdb_results created with 'duckdb_pending_prepared_streaming'
2380
+
2381
+ If this function is used, none of the other result functions can be used and vice versa (i.e. this function cannot be
2382
+ mixed with the legacy result functions or the materialized result functions).
2383
+
2384
+ It is not known beforehand how many chunks will be returned by this result.
2385
+
2386
+ * result: The result object to fetch the data chunk from.
2387
+ * returns: The resulting data chunk. Returns `NULL` if the result has an error.
2388
+ */
2389
+ DUCKDB_API duckdb_data_chunk duckdb_stream_fetch_chunk(duckdb_result result);
2390
+
2322
2391
  #ifdef __cplusplus
2323
2392
  }
2324
2393
  #endif
@@ -11,5 +11,4 @@
11
11
  #include "duckdb/main/connection.hpp"
12
12
  #include "duckdb/main/database.hpp"
13
13
  #include "duckdb/main/query_result.hpp"
14
- #include "duckdb/main/loadable_extension.hpp"
15
14
  #include "duckdb/main/appender.hpp"
@@ -9,14 +9,16 @@ using duckdb::PendingQueryResult;
9
9
  using duckdb::PendingStatementWrapper;
10
10
  using duckdb::PreparedStatementWrapper;
11
11
 
12
- duckdb_state duckdb_pending_prepared(duckdb_prepared_statement prepared_statement, duckdb_pending_result *out_result) {
12
+ duckdb_state duckdb_pending_prepared_internal(duckdb_prepared_statement prepared_statement,
13
+ duckdb_pending_result *out_result, bool allow_streaming) {
13
14
  if (!prepared_statement || !out_result) {
14
15
  return DuckDBError;
15
16
  }
16
17
  auto wrapper = (PreparedStatementWrapper *)prepared_statement;
17
18
  auto result = new PendingStatementWrapper();
19
+ result->allow_streaming = allow_streaming;
18
20
  try {
19
- result->statement = wrapper->statement->PendingQuery(wrapper->values, false);
21
+ result->statement = wrapper->statement->PendingQuery(wrapper->values, allow_streaming);
20
22
  } catch (const duckdb::Exception &ex) {
21
23
  result->statement = make_unique<PendingQueryResult>(duckdb::PreservedError(ex));
22
24
  } catch (std::exception &ex) {
@@ -28,6 +30,15 @@ duckdb_state duckdb_pending_prepared(duckdb_prepared_statement prepared_statemen
28
30
  return return_value;
29
31
  }
30
32
 
33
+ duckdb_state duckdb_pending_prepared(duckdb_prepared_statement prepared_statement, duckdb_pending_result *out_result) {
34
+ return duckdb_pending_prepared_internal(prepared_statement, out_result, false);
35
+ }
36
+
37
+ duckdb_state duckdb_pending_prepared_streaming(duckdb_prepared_statement prepared_statement,
38
+ duckdb_pending_result *out_result) {
39
+ return duckdb_pending_prepared_internal(prepared_statement, out_result, true);
40
+ }
41
+
31
42
  void duckdb_destroy_pending(duckdb_pending_result *pending_result) {
32
43
  if (!pending_result || !*pending_result) {
33
44
  return;
@@ -90,7 +101,9 @@ duckdb_state duckdb_execute_pending(duckdb_pending_result pending_result, duckdb
90
101
  if (!wrapper->statement) {
91
102
  return DuckDBError;
92
103
  }
93
- auto result = wrapper->statement->Execute();
104
+
105
+ std::unique_ptr<duckdb::QueryResult> result;
106
+ result = wrapper->statement->Execute();
94
107
  wrapper->statement.reset();
95
108
  return duckdb_translate_result(std::move(result), out_result);
96
109
  }
@@ -292,6 +292,10 @@ bool deprecated_materialize_result(duckdb_result *result) {
292
292
  // already used as a new result set
293
293
  return false;
294
294
  }
295
+ if (result_data->result_set_type == CAPIResultSetType::CAPI_RESULT_TYPE_STREAMING) {
296
+ // already used as a streaming result
297
+ return false;
298
+ }
295
299
  // materialize as deprecated result set
296
300
  result_data->result_set_type = CAPIResultSetType::CAPI_RESULT_TYPE_DEPRECATED;
297
301
  auto column_count = result_data->result->ColumnCount();
@@ -413,6 +417,10 @@ idx_t duckdb_row_count(duckdb_result *result) {
413
417
  return 0;
414
418
  }
415
419
  auto &result_data = *((duckdb::DuckDBResultData *)result->internal_data);
420
+ if (result_data.result->type == duckdb::QueryResultType::STREAM_RESULT) {
421
+ // We can't know the row count beforehand
422
+ return 0;
423
+ }
416
424
  auto &materialized = (duckdb::MaterializedQueryResult &)*result_data.result;
417
425
  return materialized.RowCount();
418
426
  }
@@ -463,7 +471,10 @@ idx_t duckdb_result_chunk_count(duckdb_result result) {
463
471
  if (result_data.result_set_type == duckdb::CAPIResultSetType::CAPI_RESULT_TYPE_DEPRECATED) {
464
472
  return 0;
465
473
  }
466
- D_ASSERT(result_data.result->type == duckdb::QueryResultType::MATERIALIZED_RESULT);
474
+ if (result_data.result->type != duckdb::QueryResultType::MATERIALIZED_RESULT) {
475
+ // Can't know beforehand how many chunks are returned.
476
+ return 0;
477
+ }
467
478
  auto &materialized = (duckdb::MaterializedQueryResult &)*result_data.result;
468
479
  return materialized.Collection().ChunkCount();
469
480
  }
@@ -476,6 +487,10 @@ duckdb_data_chunk duckdb_result_get_chunk(duckdb_result result, idx_t chunk_idx)
476
487
  if (result_data.result_set_type == duckdb::CAPIResultSetType::CAPI_RESULT_TYPE_DEPRECATED) {
477
488
  return nullptr;
478
489
  }
490
+ if (result_data.result->type != duckdb::QueryResultType::MATERIALIZED_RESULT) {
491
+ // This API is only supported for materialized query results
492
+ return nullptr;
493
+ }
479
494
  result_data.result_set_type = duckdb::CAPIResultSetType::CAPI_RESULT_TYPE_MATERIALIZED;
480
495
  auto &materialized = (duckdb::MaterializedQueryResult &)*result_data.result;
481
496
  auto &collection = materialized.Collection();
@@ -487,3 +502,14 @@ duckdb_data_chunk duckdb_result_get_chunk(duckdb_result result, idx_t chunk_idx)
487
502
  collection.FetchChunk(chunk_idx, *chunk);
488
503
  return reinterpret_cast<duckdb_data_chunk>(chunk.release());
489
504
  }
505
+
506
+ bool duckdb_result_is_streaming(duckdb_result result) {
507
+ if (!result.internal_data) {
508
+ return false;
509
+ }
510
+ if (duckdb_result_error(&result) != nullptr) {
511
+ return false;
512
+ }
513
+ auto &result_data = *((duckdb::DuckDBResultData *)result.internal_data);
514
+ return result_data.result->type == duckdb::QueryResultType::STREAM_RESULT;
515
+ }
@@ -0,0 +1,25 @@
1
+ #include "duckdb/main/capi/capi_internal.hpp"
2
+ #include "duckdb/common/types/timestamp.hpp"
3
+ #include "duckdb/common/allocator.hpp"
4
+
5
+ duckdb_data_chunk duckdb_stream_fetch_chunk(duckdb_result result) {
6
+ if (!result.internal_data) {
7
+ return nullptr;
8
+ }
9
+ auto &result_data = *((duckdb::DuckDBResultData *)result.internal_data);
10
+ if (result_data.result_set_type == duckdb::CAPIResultSetType::CAPI_RESULT_TYPE_DEPRECATED) {
11
+ return nullptr;
12
+ }
13
+ if (result_data.result->type != duckdb::QueryResultType::STREAM_RESULT) {
14
+ // We can only fetch from a StreamQueryResult
15
+ return nullptr;
16
+ }
17
+ result_data.result_set_type = duckdb::CAPIResultSetType::CAPI_RESULT_TYPE_STREAMING;
18
+ auto &streaming = (duckdb::StreamQueryResult &)*result_data.result;
19
+ if (!streaming.IsOpen()) {
20
+ return nullptr;
21
+ }
22
+ // FetchRaw ? Do we care about flattening them?
23
+ auto chunk = streaming.Fetch();
24
+ return reinterpret_cast<duckdb_data_chunk>(chunk.release());
25
+ }
@@ -208,6 +208,16 @@ void duckdb_table_function_add_parameter(duckdb_table_function function, duckdb_
208
208
  tf->arguments.push_back(*logical_type);
209
209
  }
210
210
 
211
+ void duckdb_table_function_add_named_parameter(duckdb_table_function function, const char *name,
212
+ duckdb_logical_type type) {
213
+ if (!function || !type) {
214
+ return;
215
+ }
216
+ auto tf = (duckdb::TableFunction *)function;
217
+ auto logical_type = (duckdb::LogicalType *)type;
218
+ tf->named_parameters.insert({name, *logical_type});
219
+ }
220
+
211
221
  void duckdb_table_function_set_extra_info(duckdb_table_function function, void *extra_info,
212
222
  duckdb_delete_callback_t destroy) {
213
223
  if (!function) {
@@ -319,6 +329,19 @@ duckdb_value duckdb_bind_get_parameter(duckdb_bind_info info, idx_t index) {
319
329
  return reinterpret_cast<duckdb_value>(new duckdb::Value(bind_info->input.inputs[index]));
320
330
  }
321
331
 
332
+ duckdb_value duckdb_bind_get_named_parameter(duckdb_bind_info info, const char *name) {
333
+ if (!info || !name) {
334
+ return nullptr;
335
+ }
336
+ auto bind_info = (duckdb::CTableInternalBindInfo *)info;
337
+ auto t = bind_info->input.named_parameters.find(name);
338
+ if (t == bind_info->input.named_parameters.end()) {
339
+ return nullptr;
340
+ } else {
341
+ return reinterpret_cast<duckdb_value>(new duckdb::Value(t->second));
342
+ }
343
+ }
344
+
322
345
  void duckdb_bind_set_bind_data(duckdb_bind_info info, void *bind_data, duckdb_delete_callback_t destroy) {
323
346
  if (!info) {
324
347
  return;
@@ -1,52 +1,52 @@
1
1
  #include "duckdb/main/client_context.hpp"
2
2
 
3
- #include "duckdb/main/client_context_file_opener.hpp"
4
- #include "duckdb/main/query_profiler.hpp"
5
- #include "duckdb/catalog/catalog_entry/table_catalog_entry.hpp"
6
3
  #include "duckdb/catalog/catalog_entry/scalar_function_catalog_entry.hpp"
4
+ #include "duckdb/catalog/catalog_entry/table_catalog_entry.hpp"
7
5
  #include "duckdb/catalog/catalog_search_path.hpp"
6
+ #include "duckdb/common/file_system.hpp"
7
+ #include "duckdb/common/http_state.hpp"
8
+ #include "duckdb/common/preserved_error.hpp"
9
+ #include "duckdb/common/progress_bar/progress_bar.hpp"
8
10
  #include "duckdb/common/serializer/buffered_deserializer.hpp"
11
+ #include "duckdb/common/serializer/buffered_file_writer.hpp"
9
12
  #include "duckdb/common/serializer/buffered_serializer.hpp"
13
+ #include "duckdb/common/types/column_data_collection.hpp"
14
+ #include "duckdb/execution/column_binding_resolver.hpp"
15
+ #include "duckdb/execution/operator/helper/physical_result_collector.hpp"
10
16
  #include "duckdb/execution/physical_plan_generator.hpp"
17
+ #include "duckdb/main/appender.hpp"
18
+ #include "duckdb/main/attached_database.hpp"
19
+ #include "duckdb/main/client_context_file_opener.hpp"
20
+ #include "duckdb/main/client_data.hpp"
11
21
  #include "duckdb/main/database.hpp"
22
+ #include "duckdb/main/database_manager.hpp"
23
+ #include "duckdb/main/error_manager.hpp"
12
24
  #include "duckdb/main/materialized_query_result.hpp"
13
- #include "duckdb/main/client_data.hpp"
25
+ #include "duckdb/main/query_profiler.hpp"
14
26
  #include "duckdb/main/query_result.hpp"
27
+ #include "duckdb/main/relation.hpp"
15
28
  #include "duckdb/main/stream_query_result.hpp"
16
29
  #include "duckdb/optimizer/optimizer.hpp"
17
- #include "duckdb/parser/parser.hpp"
30
+ #include "duckdb/parallel/task_scheduler.hpp"
18
31
  #include "duckdb/parser/expression/constant_expression.hpp"
19
32
  #include "duckdb/parser/expression/parameter_expression.hpp"
20
33
  #include "duckdb/parser/parsed_data/create_function_info.hpp"
34
+ #include "duckdb/parser/parsed_expression_iterator.hpp"
35
+ #include "duckdb/parser/parser.hpp"
36
+ #include "duckdb/parser/query_node/select_node.hpp"
21
37
  #include "duckdb/parser/statement/drop_statement.hpp"
38
+ #include "duckdb/parser/statement/execute_statement.hpp"
22
39
  #include "duckdb/parser/statement/explain_statement.hpp"
40
+ #include "duckdb/parser/statement/prepare_statement.hpp"
41
+ #include "duckdb/parser/statement/relation_statement.hpp"
23
42
  #include "duckdb/parser/statement/select_statement.hpp"
24
43
  #include "duckdb/planner/operator/logical_execute.hpp"
25
44
  #include "duckdb/planner/planner.hpp"
26
- #include "duckdb/transaction/transaction_manager.hpp"
27
- #include "duckdb/transaction/transaction.hpp"
28
- #include "duckdb/storage/data_table.hpp"
29
- #include "duckdb/main/appender.hpp"
30
- #include "duckdb/main/relation.hpp"
31
- #include "duckdb/parser/statement/relation_statement.hpp"
32
- #include "duckdb/parallel/task_scheduler.hpp"
33
- #include "duckdb/common/serializer/buffered_file_writer.hpp"
34
45
  #include "duckdb/planner/pragma_handler.hpp"
35
- #include "duckdb/common/file_system.hpp"
36
- #include "duckdb/execution/column_binding_resolver.hpp"
37
- #include "duckdb/execution/operator/helper/physical_result_collector.hpp"
38
- #include "duckdb/parser/query_node/select_node.hpp"
39
- #include "duckdb/parser/parsed_expression_iterator.hpp"
40
- #include "duckdb/parser/statement/prepare_statement.hpp"
41
- #include "duckdb/parser/statement/execute_statement.hpp"
42
- #include "duckdb/common/types/column_data_collection.hpp"
43
- #include "duckdb/common/preserved_error.hpp"
44
- #include "duckdb/common/progress_bar/progress_bar.hpp"
45
- #include "duckdb/main/error_manager.hpp"
46
- #include "duckdb/main/database_manager.hpp"
46
+ #include "duckdb/storage/data_table.hpp"
47
47
  #include "duckdb/transaction/meta_transaction.hpp"
48
- #include "duckdb/common/http_stats.hpp"
49
- #include "duckdb/main/attached_database.hpp"
48
+ #include "duckdb/transaction/transaction.hpp"
49
+ #include "duckdb/transaction/transaction_manager.hpp"
50
50
 
51
51
  namespace duckdb {
52
52
 
@@ -156,8 +156,8 @@ void ClientContext::BeginQueryInternal(ClientContextLock &lock, const string &qu
156
156
  PreservedError ClientContext::EndQueryInternal(ClientContextLock &lock, bool success, bool invalidate_transaction) {
157
157
  client_data->profiler->EndQuery();
158
158
 
159
- if (client_data->http_stats) {
160
- client_data->http_stats->Reset();
159
+ if (client_data->http_state) {
160
+ client_data->http_state->Reset();
161
161
  }
162
162
 
163
163
  // Notify any registered state of query end
@@ -209,6 +209,7 @@ PreservedError ClientContext::EndQueryInternal(ClientContextLock &lock, bool suc
209
209
  }
210
210
 
211
211
  void ClientContext::CleanupInternal(ClientContextLock &lock, BaseQueryResult *result, bool invalidate_transaction) {
212
+ client_data->http_state = make_unique<HTTPState>();
212
213
  if (!active_query) {
213
214
  // no query currently active
214
215
  return;
@@ -717,10 +718,6 @@ unique_ptr<PendingQueryResult> ClientContext::PendingStatementOrPreparedStatemen
717
718
  auto &profiler = QueryProfiler::Get(*this);
718
719
  profiler.StartQuery(query, IsExplainAnalyze(statement ? statement.get() : prepared->unbound_statement.get()));
719
720
 
720
- if (IsExplainAnalyze(statement ? statement.get() : prepared->unbound_statement.get())) {
721
- client_data->http_stats = make_unique<HTTPStats>();
722
- }
723
-
724
721
  bool invalidate_query = true;
725
722
  try {
726
723
  if (statement) {
@@ -813,12 +810,14 @@ unique_ptr<QueryResult> ClientContext::Query(const string &query, bool allow_str
813
810
 
814
811
  unique_ptr<QueryResult> result;
815
812
  QueryResult *last_result = nullptr;
813
+ bool last_had_result = false;
816
814
  for (idx_t i = 0; i < statements.size(); i++) {
817
815
  auto &statement = statements[i];
818
816
  bool is_last_statement = i + 1 == statements.size();
819
817
  PendingQueryParameters parameters;
820
818
  parameters.allow_stream_result = allow_stream_result && is_last_statement;
821
819
  auto pending_query = PendingQueryInternal(*lock, std::move(statement), parameters);
820
+ auto has_result = pending_query->properties.return_type == StatementReturnType::QUERY_RESULT;
822
821
  unique_ptr<QueryResult> current_result;
823
822
  if (pending_query->HasError()) {
824
823
  current_result = make_unique<MaterializedQueryResult>(pending_query->GetErrorObject());
@@ -826,12 +825,17 @@ unique_ptr<QueryResult> ClientContext::Query(const string &query, bool allow_str
826
825
  current_result = ExecutePendingQueryInternal(*lock, *pending_query);
827
826
  }
828
827
  // now append the result to the list of results
829
- if (!last_result) {
828
+ if (!last_result || !last_had_result) {
830
829
  // first result of the query
831
830
  result = std::move(current_result);
832
831
  last_result = result.get();
832
+ last_had_result = has_result;
833
833
  } else {
834
834
  // later results; attach to the result chain
835
+ // but only if there is a result
836
+ if (!has_result) {
837
+ continue;
838
+ }
835
839
  last_result->next = std::move(current_result);
836
840
  last_result = last_result->next.get();
837
841
  }
@@ -1,15 +1,16 @@
1
1
  #include "duckdb/main/client_data.hpp"
2
- #include "duckdb/main/client_context.hpp"
3
- #include "duckdb/main/client_context_file_opener.hpp"
4
- #include "duckdb/main/query_profiler.hpp"
5
- #include "duckdb/common/http_stats.hpp"
6
- #include "duckdb/common/random_engine.hpp"
7
- #include "duckdb/catalog/catalog_search_path.hpp"
2
+
8
3
  #include "duckdb/catalog/catalog.hpp"
4
+ #include "duckdb/catalog/catalog_search_path.hpp"
5
+ #include "duckdb/common/http_state.hpp"
6
+ #include "duckdb/common/random_engine.hpp"
9
7
  #include "duckdb/common/serializer/buffered_file_writer.hpp"
10
8
  #include "duckdb/main/attached_database.hpp"
9
+ #include "duckdb/main/client_context.hpp"
10
+ #include "duckdb/main/client_context_file_opener.hpp"
11
11
  #include "duckdb/main/database.hpp"
12
12
  #include "duckdb/main/database_manager.hpp"
13
+ #include "duckdb/main/query_profiler.hpp"
13
14
 
14
15
  namespace duckdb {
15
16
 
@@ -9,6 +9,9 @@
9
9
  #include "duckdb/common/thread.hpp"
10
10
  #endif
11
11
 
12
+ #include <cstdio>
13
+ #include <inttypes.h>
14
+
12
15
  namespace duckdb {
13
16
 
14
17
  #define DUCKDB_GLOBAL(_PARAM) \
@@ -214,9 +217,75 @@ void DBConfig::SetDefaultMaxMemory() {
214
217
  }
215
218
  }
216
219
 
220
+ idx_t CGroupBandwidthQuota(idx_t physical_cores, FileSystem &fs) {
221
+ static constexpr const char *CPU_MAX = "/sys/fs/cgroup/cpu.max";
222
+ static constexpr const char *CFS_QUOTA = "/sys/fs/cgroup/cpu/cpu.cfs_quota_us";
223
+ static constexpr const char *CFS_PERIOD = "/sys/fs/cgroup/cpu/cpu.cfs_period_us";
224
+
225
+ int64_t quota, period;
226
+ char byte_buffer[1000];
227
+ unique_ptr<FileHandle> handle;
228
+ int64_t read_bytes;
229
+
230
+ if (fs.FileExists(CPU_MAX)) {
231
+ // cgroup v2
232
+ // https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html
233
+ handle =
234
+ fs.OpenFile(CPU_MAX, FileFlags::FILE_FLAGS_READ, FileSystem::DEFAULT_LOCK, FileSystem::DEFAULT_COMPRESSION);
235
+ read_bytes = fs.Read(*handle, (void *)byte_buffer, 999);
236
+ byte_buffer[read_bytes] = '\0';
237
+ if (std::sscanf(byte_buffer, "%" SCNd64 " %" SCNd64 "", &quota, &period) != 2) {
238
+ return physical_cores;
239
+ }
240
+ } else if (fs.FileExists(CFS_QUOTA) && fs.FileExists(CFS_PERIOD)) {
241
+ // cgroup v1
242
+ // https://www.kernel.org/doc/html/latest/scheduler/sched-bwc.html#management
243
+
244
+ // Read the quota, this indicates how many microseconds the CPU can be utilized by this cgroup per period
245
+ handle = fs.OpenFile(CFS_QUOTA, FileFlags::FILE_FLAGS_READ, FileSystem::DEFAULT_LOCK,
246
+ FileSystem::DEFAULT_COMPRESSION);
247
+ read_bytes = fs.Read(*handle, (void *)byte_buffer, 999);
248
+ byte_buffer[read_bytes] = '\0';
249
+ if (std::sscanf(byte_buffer, "%" SCNd64 "", &quota) != 1) {
250
+ return physical_cores;
251
+ }
252
+
253
+ // Read the time period, a cgroup can utilize the CPU up to quota microseconds every period
254
+ handle = fs.OpenFile(CFS_PERIOD, FileFlags::FILE_FLAGS_READ, FileSystem::DEFAULT_LOCK,
255
+ FileSystem::DEFAULT_COMPRESSION);
256
+ read_bytes = fs.Read(*handle, (void *)byte_buffer, 999);
257
+ byte_buffer[read_bytes] = '\0';
258
+ if (std::sscanf(byte_buffer, "%" SCNd64 "", &period) != 1) {
259
+ return physical_cores;
260
+ }
261
+ } else {
262
+ // No cgroup quota
263
+ return physical_cores;
264
+ }
265
+ if (quota > 0 && period > 0) {
266
+ return idx_t(std::ceil((double)quota / (double)period));
267
+ } else {
268
+ return physical_cores;
269
+ }
270
+ }
271
+
272
+ idx_t GetSystemMaxThreadsInternal(FileSystem &fs) {
273
+ #ifndef DUCKDB_NO_THREADS
274
+ idx_t physical_cores = std::thread::hardware_concurrency();
275
+ #ifdef __linux__
276
+ auto cores_available_per_period = CGroupBandwidthQuota(physical_cores, fs);
277
+ return MaxValue<idx_t>(cores_available_per_period, 1);
278
+ #else
279
+ return physical_cores;
280
+ #endif
281
+ #else
282
+ return 1;
283
+ #endif
284
+ }
285
+
217
286
  void DBConfig::SetDefaultMaxThreads() {
218
287
  #ifndef DUCKDB_NO_THREADS
219
- options.maximum_threads = std::thread::hardware_concurrency();
288
+ options.maximum_threads = GetSystemMaxThreadsInternal(*file_system);
220
289
  #else
221
290
  options.maximum_threads = 1;
222
291
  #endif
@@ -115,6 +115,15 @@ ConnectionManager &ConnectionManager::Get(DatabaseInstance &db) {
115
115
  return db.GetConnectionManager();
116
116
  }
117
117
 
118
+ ClientContext *ConnectionManager::GetConnection(DatabaseInstance *db) {
119
+ for (auto &conn : connections) {
120
+ if (conn.first->db.get() == db) {
121
+ return conn.first;
122
+ }
123
+ }
124
+ return nullptr;
125
+ }
126
+
118
127
  ConnectionManager &ConnectionManager::Get(ClientContext &context) {
119
128
  return ConnectionManager::Get(DatabaseInstance::GetDatabase(context));
120
129
  }
@@ -191,8 +200,7 @@ void DatabaseInstance::Initialize(const char *database_path, DBConfig *user_conf
191
200
  }
192
201
 
193
202
  db_manager = make_unique<DatabaseManager>(*this);
194
- buffer_manager =
195
- make_unique<BufferManager>(*this, config.options.temporary_directory, config.options.maximum_memory);
203
+ buffer_manager = make_unique<BufferManager>(*this, config.options.temporary_directory);
196
204
  scheduler = make_unique<TaskScheduler>(*this);
197
205
  object_cache = make_unique<ObjectCache>();
198
206
  connection_manager = make_unique<ConnectionManager>();
@@ -271,6 +279,10 @@ BufferManager &DatabaseInstance::GetBufferManager() {
271
279
  return *buffer_manager;
272
280
  }
273
281
 
282
+ BufferPool &DatabaseInstance::GetBufferPool() {
283
+ return *config.buffer_pool;
284
+ }
285
+
274
286
  DatabaseManager &DatabaseManager::Get(DatabaseInstance &db) {
275
287
  return db.GetDatabaseManager();
276
288
  }
@@ -340,6 +352,11 @@ void DatabaseInstance::Configure(DBConfig &new_config) {
340
352
  if (!config.default_allocator) {
341
353
  config.default_allocator = Allocator::DefaultAllocatorReference();
342
354
  }
355
+ if (new_config.buffer_pool) {
356
+ config.buffer_pool = std::move(new_config.buffer_pool);
357
+ } else {
358
+ config.buffer_pool = make_shared<BufferPool>(config.options.maximum_memory);
359
+ }
343
360
  }
344
361
 
345
362
  DBConfig &DBConfig::GetConfig(ClientContext &context) {
@@ -206,8 +206,13 @@ void ExtensionHelper::InstallExtensionInternal(DBConfig &config, ClientConfig *c
206
206
  if (exact_match) {
207
207
  message += "\nAre you using a development build? In this case, extensions might not (yet) be uploaded.";
208
208
  }
209
- throw IOException("Failed to download extension \"%s\" at URL \"%s%s\"\n%s", extension_name, url_base,
210
- url_local_part, message);
209
+ if (res.error() == duckdb_httplib::Error::Success) {
210
+ throw HTTPException(res.value(), "Failed to download extension \"%s\" at URL \"%s%s\"\n%s", extension_name,
211
+ url_base, url_local_part, message);
212
+ } else {
213
+ throw IOException("Failed to download extension \"%s\" at URL \"%s%s\"\n%s (ERROR %s)", extension_name,
214
+ url_base, url_local_part, message, to_string(res.error()));
215
+ }
211
216
  }
212
217
  auto decompressed_body = GZipFileSystem::UncompressGZIPString(res->body);
213
218
  std::ofstream out(temp_path, std::ios::binary);
@@ -23,6 +23,10 @@ const string &PreparedStatement::GetError() {
23
23
  return error.Message();
24
24
  }
25
25
 
26
+ PreservedError &PreparedStatement::GetErrorObject() {
27
+ return error;
28
+ }
29
+
26
30
  bool PreparedStatement::HasError() const {
27
31
  return !success;
28
32
  }