duckdb 0.7.2-dev12.0 → 0.7.2-dev1244.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 (631) 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 +14 -3
  28. package/src/duckdb/extension/parquet/parquet_reader.cpp +6 -1
  29. package/src/duckdb/extension/parquet/parquet_statistics.cpp +49 -36
  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/local_file_system.cpp +64 -7
  53. package/src/duckdb/src/common/operator/cast_operators.cpp +1 -1
  54. package/src/duckdb/src/common/preserved_error.cpp +7 -5
  55. package/src/duckdb/src/common/progress_bar/progress_bar.cpp +7 -0
  56. package/src/duckdb/src/common/serializer/buffered_deserializer.cpp +4 -0
  57. package/src/duckdb/src/common/serializer/buffered_file_reader.cpp +15 -2
  58. package/src/duckdb/src/common/serializer/enum_serializer.cpp +1176 -0
  59. package/src/duckdb/src/common/sort/comparators.cpp +14 -5
  60. package/src/duckdb/src/common/sort/sort_state.cpp +5 -7
  61. package/src/duckdb/src/common/sort/sorted_block.cpp +0 -1
  62. package/src/duckdb/src/common/string_util.cpp +18 -1
  63. package/src/duckdb/src/common/types/bit.cpp +166 -87
  64. package/src/duckdb/src/common/types/blob.cpp +1 -1
  65. package/src/duckdb/src/common/types/chunk_collection.cpp +2 -2
  66. package/src/duckdb/src/common/types/column_data_collection.cpp +39 -2
  67. package/src/duckdb/src/common/types/column_data_collection_segment.cpp +12 -10
  68. package/src/duckdb/src/common/types/data_chunk.cpp +1 -1
  69. package/src/duckdb/src/common/types/interval.cpp +0 -41
  70. package/src/duckdb/src/common/types/list_segment.cpp +658 -0
  71. package/src/duckdb/src/common/types/string_heap.cpp +1 -1
  72. package/src/duckdb/src/common/types/string_type.cpp +1 -1
  73. package/src/duckdb/src/common/types/time.cpp +13 -0
  74. package/src/duckdb/src/common/types/validity_mask.cpp +24 -7
  75. package/src/duckdb/src/common/types/value.cpp +320 -154
  76. package/src/duckdb/src/common/types/vector.cpp +158 -134
  77. package/src/duckdb/src/common/types.cpp +313 -153
  78. package/src/duckdb/src/common/value_operations/comparison_operations.cpp +14 -22
  79. package/src/duckdb/src/common/vector_operations/comparison_operators.cpp +10 -10
  80. package/src/duckdb/src/common/vector_operations/is_distinct_from.cpp +11 -10
  81. package/src/duckdb/src/common/vector_operations/vector_cast.cpp +2 -1
  82. package/src/duckdb/src/execution/aggregate_hashtable.cpp +98 -74
  83. package/src/duckdb/src/execution/column_binding_resolver.cpp +21 -5
  84. package/src/duckdb/src/execution/expression_executor/execute_cast.cpp +2 -1
  85. package/src/duckdb/src/execution/expression_executor/execute_comparison.cpp +2 -2
  86. package/src/duckdb/src/execution/index/art/art.cpp +19 -5
  87. package/src/duckdb/src/execution/join_hashtable.cpp +3 -1
  88. package/src/duckdb/src/execution/operator/aggregate/physical_hash_aggregate.cpp +1 -1
  89. package/src/duckdb/src/execution/operator/aggregate/physical_perfecthash_aggregate.cpp +4 -5
  90. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +117 -26
  91. package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +3 -0
  92. package/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp +5 -3
  93. package/src/duckdb/src/execution/operator/join/physical_blockwise_nl_join.cpp +64 -17
  94. package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +2 -0
  95. package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +2 -2
  96. package/src/duckdb/src/execution/operator/join/physical_index_join.cpp +13 -4
  97. package/src/duckdb/src/execution/operator/join/physical_join.cpp +0 -3
  98. package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +6 -11
  99. package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +3 -1
  100. package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +11 -4
  101. package/src/duckdb/src/execution/operator/persistent/buffered_csv_reader.cpp +24 -19
  102. package/src/duckdb/src/execution/operator/persistent/csv_reader_options.cpp +3 -0
  103. package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +2 -1
  104. package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +2 -2
  105. package/src/duckdb/src/execution/operator/persistent/physical_delete.cpp +1 -3
  106. package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +1 -0
  107. package/src/duckdb/src/execution/operator/projection/physical_projection.cpp +34 -0
  108. package/src/duckdb/src/execution/operator/scan/physical_positional_scan.cpp +20 -5
  109. package/src/duckdb/src/execution/operator/schema/physical_create_type.cpp +20 -40
  110. package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +2 -5
  111. package/src/duckdb/src/execution/partitionable_hashtable.cpp +20 -5
  112. package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +22 -16
  113. package/src/duckdb/src/execution/physical_plan/plan_asof_join.cpp +97 -0
  114. package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +95 -47
  115. package/src/duckdb/src/execution/physical_plan/plan_create_index.cpp +2 -1
  116. package/src/duckdb/src/execution/physical_plan/plan_distinct.cpp +5 -8
  117. package/src/duckdb/src/execution/physical_plan/plan_positional_join.cpp +14 -5
  118. package/src/duckdb/src/execution/physical_plan_generator.cpp +3 -0
  119. package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +23 -15
  120. package/src/duckdb/src/execution/window_segment_tree.cpp +173 -1
  121. package/src/duckdb/src/function/aggregate/algebraic/avg.cpp +0 -6
  122. package/src/duckdb/src/function/aggregate/distributive/bitagg.cpp +99 -95
  123. package/src/duckdb/src/function/aggregate/distributive/bitstring_agg.cpp +269 -0
  124. package/src/duckdb/src/function/aggregate/distributive/bool.cpp +2 -0
  125. package/src/duckdb/src/function/aggregate/distributive/count.cpp +3 -4
  126. package/src/duckdb/src/function/aggregate/distributive/first.cpp +1 -0
  127. package/src/duckdb/src/function/aggregate/distributive/minmax.cpp +2 -0
  128. package/src/duckdb/src/function/aggregate/distributive/sum.cpp +19 -16
  129. package/src/duckdb/src/function/aggregate/distributive_functions.cpp +1 -0
  130. package/src/duckdb/src/function/aggregate/holistic/approximate_quantile.cpp +5 -2
  131. package/src/duckdb/src/function/aggregate/holistic/mode.cpp +1 -1
  132. package/src/duckdb/src/function/aggregate/holistic/quantile.cpp +16 -1
  133. package/src/duckdb/src/function/aggregate/nested/list.cpp +6 -712
  134. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +138 -45
  135. package/src/duckdb/src/function/cast/bit_cast.cpp +0 -2
  136. package/src/duckdb/src/function/cast/blob_cast.cpp +0 -1
  137. package/src/duckdb/src/function/cast/cast_function_set.cpp +1 -1
  138. package/src/duckdb/src/function/cast/enum_casts.cpp +25 -3
  139. package/src/duckdb/src/function/cast/list_casts.cpp +17 -4
  140. package/src/duckdb/src/function/cast/map_cast.cpp +5 -2
  141. package/src/duckdb/src/function/cast/string_cast.cpp +36 -10
  142. package/src/duckdb/src/function/cast/struct_cast.cpp +24 -4
  143. package/src/duckdb/src/function/cast/time_casts.cpp +2 -2
  144. package/src/duckdb/src/function/cast/union_casts.cpp +33 -7
  145. package/src/duckdb/src/function/cast_rules.cpp +9 -4
  146. package/src/duckdb/src/function/function_binder.cpp +1 -8
  147. package/src/duckdb/src/function/pragma/pragma_queries.cpp +24 -1
  148. package/src/duckdb/src/function/scalar/bit/bitstring.cpp +100 -0
  149. package/src/duckdb/src/function/scalar/date/current.cpp +0 -2
  150. package/src/duckdb/src/function/scalar/date/date_diff.cpp +0 -1
  151. package/src/duckdb/src/function/scalar/date/date_part.cpp +18 -26
  152. package/src/duckdb/src/function/scalar/date/date_sub.cpp +0 -1
  153. package/src/duckdb/src/function/scalar/date/date_trunc.cpp +10 -14
  154. package/src/duckdb/src/function/scalar/generic/stats.cpp +2 -4
  155. package/src/duckdb/src/function/scalar/list/contains_or_position.cpp +4 -146
  156. package/src/duckdb/src/function/scalar/list/flatten.cpp +5 -12
  157. package/src/duckdb/src/function/scalar/list/list_aggregates.cpp +1 -1
  158. package/src/duckdb/src/function/scalar/list/list_concat.cpp +8 -12
  159. package/src/duckdb/src/function/scalar/list/list_extract.cpp +5 -12
  160. package/src/duckdb/src/function/scalar/list/list_lambdas.cpp +7 -3
  161. package/src/duckdb/src/function/scalar/list/list_sort.cpp +25 -18
  162. package/src/duckdb/src/function/scalar/list/list_value.cpp +6 -10
  163. package/src/duckdb/src/function/scalar/map/map.cpp +47 -1
  164. package/src/duckdb/src/function/scalar/map/map_entries.cpp +61 -0
  165. package/src/duckdb/src/function/scalar/map/map_extract.cpp +68 -26
  166. package/src/duckdb/src/function/scalar/map/map_keys_values.cpp +97 -0
  167. package/src/duckdb/src/function/scalar/math/numeric.cpp +101 -17
  168. package/src/duckdb/src/function/scalar/math_functions.cpp +3 -0
  169. package/src/duckdb/src/function/scalar/nested_functions.cpp +3 -0
  170. package/src/duckdb/src/function/scalar/operators/add.cpp +0 -9
  171. package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +29 -48
  172. package/src/duckdb/src/function/scalar/operators/bitwise.cpp +0 -63
  173. package/src/duckdb/src/function/scalar/operators/multiply.cpp +5 -6
  174. package/src/duckdb/src/function/scalar/operators/subtract.cpp +0 -6
  175. package/src/duckdb/src/function/scalar/string/caseconvert.cpp +2 -6
  176. package/src/duckdb/src/function/scalar/string/hex.cpp +201 -0
  177. package/src/duckdb/src/function/scalar/string/instr.cpp +2 -6
  178. package/src/duckdb/src/function/scalar/string/length.cpp +2 -6
  179. package/src/duckdb/src/function/scalar/string/like.cpp +2 -6
  180. package/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp +243 -0
  181. package/src/duckdb/src/function/scalar/string/regexp/regexp_util.cpp +79 -0
  182. package/src/duckdb/src/function/scalar/string/regexp.cpp +21 -80
  183. package/src/duckdb/src/function/scalar/string/substring.cpp +2 -6
  184. package/src/duckdb/src/function/scalar/string_functions.cpp +2 -0
  185. package/src/duckdb/src/function/scalar/struct/struct_extract.cpp +5 -10
  186. package/src/duckdb/src/function/scalar/struct/struct_insert.cpp +11 -14
  187. package/src/duckdb/src/function/scalar/struct/struct_pack.cpp +6 -7
  188. package/src/duckdb/src/function/table/arrow.cpp +5 -2
  189. package/src/duckdb/src/function/table/arrow_conversion.cpp +25 -1
  190. package/src/duckdb/src/function/table/checkpoint.cpp +5 -1
  191. package/src/duckdb/src/function/table/read_csv.cpp +60 -0
  192. package/src/duckdb/src/function/table/system/duckdb_constraints.cpp +2 -2
  193. package/src/duckdb/src/function/table/system/test_all_types.cpp +2 -2
  194. package/src/duckdb/src/function/table/table_scan.cpp +9 -12
  195. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  196. package/src/duckdb/src/function/table_function.cpp +30 -11
  197. package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +6 -0
  198. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_table_entry.hpp +1 -1
  199. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_function_catalog_entry.hpp +6 -8
  200. package/src/duckdb/src/include/duckdb/catalog/dependency_list.hpp +3 -0
  201. package/src/duckdb/src/include/duckdb/catalog/duck_catalog.hpp +2 -1
  202. package/src/duckdb/src/include/duckdb/common/box_renderer.hpp +8 -2
  203. package/src/duckdb/src/include/duckdb/common/constants.hpp +0 -19
  204. package/src/duckdb/src/include/duckdb/common/enums/aggregate_handling.hpp +2 -0
  205. package/src/duckdb/src/include/duckdb/common/enums/expression_type.hpp +2 -3
  206. package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +7 -4
  207. package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +1 -0
  208. package/src/duckdb/src/include/duckdb/common/enums/order_type.hpp +2 -0
  209. package/src/duckdb/src/include/duckdb/common/enums/set_operation_type.hpp +2 -1
  210. package/src/duckdb/src/include/duckdb/common/enums/statement_type.hpp +2 -1
  211. package/src/duckdb/src/include/duckdb/common/enums/tableref_type.hpp +2 -1
  212. package/src/duckdb/src/include/duckdb/common/exception.hpp +69 -2
  213. package/src/duckdb/src/include/duckdb/common/field_writer.hpp +12 -4
  214. package/src/duckdb/src/include/duckdb/common/helper.hpp +1 -1
  215. package/src/duckdb/src/include/duckdb/common/{http_stats.hpp → http_state.hpp} +18 -4
  216. package/src/duckdb/src/include/duckdb/common/operator/comparison_operators.hpp +45 -149
  217. package/src/duckdb/src/include/duckdb/common/operator/multiply.hpp +2 -0
  218. package/src/duckdb/src/include/duckdb/common/optional_ptr.hpp +45 -0
  219. package/src/duckdb/src/include/duckdb/common/preserved_error.hpp +6 -1
  220. package/src/duckdb/src/include/duckdb/common/progress_bar/progress_bar.hpp +2 -0
  221. package/src/duckdb/src/include/duckdb/common/serializer/buffered_deserializer.hpp +4 -2
  222. package/src/duckdb/src/include/duckdb/common/serializer/buffered_file_reader.hpp +8 -2
  223. package/src/duckdb/src/include/duckdb/common/serializer/enum_serializer.hpp +113 -0
  224. package/src/duckdb/src/include/duckdb/common/serializer/format_deserializer.hpp +336 -0
  225. package/src/duckdb/src/include/duckdb/common/serializer/format_serializer.hpp +268 -0
  226. package/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp +126 -0
  227. package/src/duckdb/src/include/duckdb/common/serializer.hpp +13 -0
  228. package/src/duckdb/src/include/duckdb/common/string_util.hpp +27 -0
  229. package/src/duckdb/src/include/duckdb/common/types/bit.hpp +12 -7
  230. package/src/duckdb/src/include/duckdb/common/types/interval.hpp +39 -3
  231. package/src/duckdb/src/include/duckdb/common/types/list_segment.hpp +70 -0
  232. package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +73 -3
  233. package/src/duckdb/src/include/duckdb/common/types/time.hpp +3 -0
  234. package/src/duckdb/src/include/duckdb/common/types/validity_mask.hpp +4 -1
  235. package/src/duckdb/src/include/duckdb/common/types/value.hpp +17 -48
  236. package/src/duckdb/src/include/duckdb/common/types/value_map.hpp +1 -1
  237. package/src/duckdb/src/include/duckdb/common/types/vector.hpp +3 -1
  238. package/src/duckdb/src/include/duckdb/common/types.hpp +45 -8
  239. package/src/duckdb/src/include/duckdb/common/vector_operations/unary_executor.hpp +2 -2
  240. package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +35 -20
  241. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +3 -14
  242. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_perfecthash_aggregate.hpp +1 -1
  243. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_cross_product.hpp +2 -0
  244. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_file_handle.hpp +1 -0
  245. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +10 -0
  246. package/src/duckdb/src/include/duckdb/execution/operator/projection/physical_projection.hpp +5 -0
  247. package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +5 -1
  248. package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +1 -3
  249. package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +54 -0
  250. package/src/duckdb/src/include/duckdb/function/aggregate/distributive_functions.hpp +5 -0
  251. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +18 -6
  252. package/src/duckdb/src/include/duckdb/function/cast/bound_cast_data.hpp +84 -0
  253. package/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp +2 -2
  254. package/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp +28 -64
  255. package/src/duckdb/src/include/duckdb/function/function_binder.hpp +3 -6
  256. package/src/duckdb/src/include/duckdb/function/scalar/bit_functions.hpp +4 -0
  257. package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +138 -0
  258. package/src/duckdb/src/include/duckdb/function/scalar/math_functions.hpp +8 -0
  259. package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +59 -0
  260. package/src/duckdb/src/include/duckdb/function/scalar/regexp.hpp +81 -1
  261. package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +4 -0
  262. package/src/duckdb/src/include/duckdb/function/scalar_function.hpp +2 -2
  263. package/src/duckdb/src/include/duckdb/function/table/arrow.hpp +12 -1
  264. package/src/duckdb/src/include/duckdb/function/table_function.hpp +10 -0
  265. package/src/duckdb/src/include/duckdb/main/capi/capi_internal.hpp +2 -0
  266. package/src/duckdb/src/include/duckdb/main/client_config.hpp +2 -0
  267. package/src/duckdb/src/include/duckdb/main/client_data.hpp +3 -3
  268. package/src/duckdb/src/include/duckdb/main/config.hpp +3 -0
  269. package/src/duckdb/src/include/duckdb/main/connection_manager.hpp +2 -0
  270. package/src/duckdb/src/include/duckdb/main/database.hpp +1 -0
  271. package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +2 -0
  272. package/src/duckdb/src/include/duckdb/main/prepared_statement.hpp +2 -0
  273. package/src/duckdb/src/include/duckdb/main/relation/explain_relation.hpp +2 -1
  274. package/src/duckdb/src/include/duckdb/main/relation.hpp +2 -1
  275. package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +2 -0
  276. package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +2 -2
  277. package/src/duckdb/src/include/duckdb/optimizer/rule/list.hpp +1 -0
  278. package/src/duckdb/src/include/duckdb/optimizer/rule/ordered_aggregate_optimizer.hpp +24 -0
  279. package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +4 -0
  280. package/src/duckdb/src/include/duckdb/parser/expression/between_expression.hpp +3 -0
  281. package/src/duckdb/src/include/duckdb/parser/expression/bound_expression.hpp +2 -0
  282. package/src/duckdb/src/include/duckdb/parser/expression/case_expression.hpp +5 -0
  283. package/src/duckdb/src/include/duckdb/parser/expression/cast_expression.hpp +2 -0
  284. package/src/duckdb/src/include/duckdb/parser/expression/collate_expression.hpp +2 -0
  285. package/src/duckdb/src/include/duckdb/parser/expression/columnref_expression.hpp +2 -0
  286. package/src/duckdb/src/include/duckdb/parser/expression/comparison_expression.hpp +2 -0
  287. package/src/duckdb/src/include/duckdb/parser/expression/conjunction_expression.hpp +2 -0
  288. package/src/duckdb/src/include/duckdb/parser/expression/constant_expression.hpp +3 -0
  289. package/src/duckdb/src/include/duckdb/parser/expression/default_expression.hpp +1 -0
  290. package/src/duckdb/src/include/duckdb/parser/expression/function_expression.hpp +4 -2
  291. package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +2 -0
  292. package/src/duckdb/src/include/duckdb/parser/expression/operator_expression.hpp +2 -0
  293. package/src/duckdb/src/include/duckdb/parser/expression/parameter_expression.hpp +2 -0
  294. package/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +2 -0
  295. package/src/duckdb/src/include/duckdb/parser/expression/star_expression.hpp +4 -2
  296. package/src/duckdb/src/include/duckdb/parser/expression/subquery_expression.hpp +2 -0
  297. package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +5 -0
  298. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_info.hpp +5 -1
  299. package/src/duckdb/src/include/duckdb/parser/parsed_data/{alter_function_info.hpp → alter_scalar_function_info.hpp} +13 -13
  300. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_function_info.hpp +47 -0
  301. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp +6 -0
  302. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_table_function_info.hpp +2 -1
  303. package/src/duckdb/src/include/duckdb/parser/parsed_data/sample_options.hpp +2 -0
  304. package/src/duckdb/src/include/duckdb/parser/parsed_expression.hpp +5 -0
  305. package/src/duckdb/src/include/duckdb/parser/query_node/recursive_cte_node.hpp +3 -0
  306. package/src/duckdb/src/include/duckdb/parser/query_node/select_node.hpp +5 -0
  307. package/src/duckdb/src/include/duckdb/parser/query_node/set_operation_node.hpp +3 -0
  308. package/src/duckdb/src/include/duckdb/parser/query_node.hpp +13 -2
  309. package/src/duckdb/src/include/duckdb/parser/result_modifier.hpp +24 -1
  310. package/src/duckdb/src/include/duckdb/parser/sql_statement.hpp +2 -1
  311. package/src/duckdb/src/include/duckdb/parser/statement/multi_statement.hpp +28 -0
  312. package/src/duckdb/src/include/duckdb/parser/statement/select_statement.hpp +6 -1
  313. package/src/duckdb/src/include/duckdb/parser/tableref/basetableref.hpp +4 -0
  314. package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +2 -0
  315. package/src/duckdb/src/include/duckdb/parser/tableref/expressionlistref.hpp +3 -0
  316. package/src/duckdb/src/include/duckdb/parser/tableref/joinref.hpp +3 -0
  317. package/src/duckdb/src/include/duckdb/parser/tableref/list.hpp +1 -0
  318. package/src/duckdb/src/include/duckdb/parser/tableref/pivotref.hpp +87 -0
  319. package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +3 -0
  320. package/src/duckdb/src/include/duckdb/parser/tableref/table_function_ref.hpp +3 -0
  321. package/src/duckdb/src/include/duckdb/parser/tableref.hpp +3 -1
  322. package/src/duckdb/src/include/duckdb/parser/tokens.hpp +2 -0
  323. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +33 -0
  324. package/src/duckdb/src/include/duckdb/planner/bind_context.hpp +2 -0
  325. package/src/duckdb/src/include/duckdb/planner/binder.hpp +15 -4
  326. package/src/duckdb/src/include/duckdb/planner/bound_result_modifier.hpp +3 -0
  327. package/src/duckdb/src/include/duckdb/planner/expression/bound_aggregate_expression.hpp +3 -0
  328. package/src/duckdb/src/include/duckdb/planner/expression_binder/base_select_binder.hpp +64 -0
  329. package/src/duckdb/src/include/duckdb/planner/expression_binder/having_binder.hpp +2 -2
  330. package/src/duckdb/src/include/duckdb/planner/expression_binder/order_binder.hpp +4 -1
  331. package/src/duckdb/src/include/duckdb/planner/expression_binder/qualify_binder.hpp +2 -2
  332. package/src/duckdb/src/include/duckdb/planner/expression_binder/select_binder.hpp +9 -38
  333. package/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +1 -1
  334. package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +1 -0
  335. package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +1 -0
  336. package/src/duckdb/src/include/duckdb/planner/operator/logical_asof_join.hpp +22 -0
  337. package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +5 -2
  338. package/src/duckdb/src/include/duckdb/planner/operator/logical_distinct.hpp +3 -0
  339. package/src/duckdb/src/include/duckdb/planner/query_node/bound_select_node.hpp +8 -2
  340. package/src/duckdb/src/include/duckdb/storage/buffer/block_handle.hpp +2 -0
  341. package/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp +76 -44
  342. package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp +3 -2
  343. package/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp +1 -1
  344. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_compress.hpp +2 -2
  345. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_fetch.hpp +1 -1
  346. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_scan.hpp +2 -1
  347. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_compress.hpp +2 -2
  348. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_fetch.hpp +1 -1
  349. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_scan.hpp +2 -1
  350. package/src/duckdb/src/include/duckdb/storage/data_pointer.hpp +4 -3
  351. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +4 -3
  352. package/src/duckdb/src/include/duckdb/storage/index.hpp +5 -4
  353. package/src/duckdb/src/include/duckdb/storage/meta_block_reader.hpp +7 -0
  354. package/src/duckdb/src/include/duckdb/storage/statistics/base_statistics.hpp +93 -29
  355. package/src/duckdb/src/include/duckdb/storage/statistics/column_statistics.hpp +22 -3
  356. package/src/duckdb/src/include/duckdb/storage/statistics/distinct_statistics.hpp +8 -6
  357. package/src/duckdb/src/include/duckdb/storage/statistics/list_stats.hpp +41 -0
  358. package/src/duckdb/src/include/duckdb/storage/statistics/node_statistics.hpp +26 -0
  359. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats.hpp +114 -0
  360. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats_union.hpp +62 -0
  361. package/src/duckdb/src/include/duckdb/storage/statistics/segment_statistics.hpp +2 -7
  362. package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +74 -0
  363. package/src/duckdb/src/include/duckdb/storage/statistics/struct_stats.hpp +42 -0
  364. package/src/duckdb/src/include/duckdb/storage/string_uncompressed.hpp +2 -3
  365. package/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp +2 -1
  366. package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +21 -7
  367. package/src/duckdb/src/include/duckdb/storage/table/column_data_checkpointer.hpp +3 -2
  368. package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +5 -6
  369. package/src/duckdb/src/include/duckdb/storage/table/column_segment_tree.hpp +18 -0
  370. package/src/duckdb/src/include/duckdb/storage/table/list_column_data.hpp +1 -1
  371. package/src/duckdb/src/include/duckdb/storage/table/persistent_table_data.hpp +6 -3
  372. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +41 -45
  373. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +23 -7
  374. package/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp +35 -0
  375. package/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp +21 -29
  376. package/src/duckdb/src/include/duckdb/storage/table/segment_base.hpp +6 -6
  377. package/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +281 -26
  378. package/src/duckdb/src/include/duckdb/storage/table/standard_column_data.hpp +0 -4
  379. package/src/duckdb/src/include/duckdb/storage/table/table_statistics.hpp +5 -0
  380. package/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +0 -1
  381. package/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +1 -1
  382. package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +6 -3
  383. package/src/duckdb/src/include/duckdb.h +71 -2
  384. package/src/duckdb/src/include/duckdb.hpp +0 -1
  385. package/src/duckdb/src/main/capi/pending-c.cpp +16 -3
  386. package/src/duckdb/src/main/capi/result-c.cpp +27 -1
  387. package/src/duckdb/src/main/capi/stream-c.cpp +25 -0
  388. package/src/duckdb/src/main/capi/table_function-c.cpp +23 -0
  389. package/src/duckdb/src/main/client_context.cpp +38 -34
  390. package/src/duckdb/src/main/client_data.cpp +7 -6
  391. package/src/duckdb/src/main/config.cpp +70 -1
  392. package/src/duckdb/src/main/database.cpp +19 -2
  393. package/src/duckdb/src/main/extension/extension_install.cpp +7 -2
  394. package/src/duckdb/src/main/prepared_statement.cpp +4 -0
  395. package/src/duckdb/src/main/query_profiler.cpp +17 -15
  396. package/src/duckdb/src/main/relation/explain_relation.cpp +3 -3
  397. package/src/duckdb/src/main/relation.cpp +3 -2
  398. package/src/duckdb/src/main/settings/settings.cpp +20 -8
  399. package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +1 -0
  400. package/src/duckdb/src/optimizer/deliminator.cpp +1 -1
  401. package/src/duckdb/src/optimizer/filter_combiner.cpp +3 -6
  402. package/src/duckdb/src/optimizer/filter_pullup.cpp +3 -1
  403. package/src/duckdb/src/optimizer/filter_pushdown.cpp +14 -8
  404. package/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp +107 -71
  405. package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +32 -12
  406. package/src/duckdb/src/optimizer/optimizer.cpp +1 -0
  407. package/src/duckdb/src/optimizer/pullup/pullup_from_left.cpp +2 -2
  408. package/src/duckdb/src/optimizer/pushdown/pushdown_aggregate.cpp +33 -5
  409. package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +1 -1
  410. package/src/duckdb/src/optimizer/pushdown/pushdown_inner_join.cpp +3 -0
  411. package/src/duckdb/src/optimizer/pushdown/pushdown_left_join.cpp +5 -12
  412. package/src/duckdb/src/optimizer/pushdown/pushdown_mark_join.cpp +2 -2
  413. package/src/duckdb/src/optimizer/pushdown/pushdown_single_join.cpp +1 -1
  414. package/src/duckdb/src/optimizer/remove_unused_columns.cpp +1 -0
  415. package/src/duckdb/src/optimizer/rule/move_constants.cpp +10 -4
  416. package/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp +30 -0
  417. package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +9 -2
  418. package/src/duckdb/src/optimizer/statistics/expression/propagate_aggregate.cpp +9 -3
  419. package/src/duckdb/src/optimizer/statistics/expression/propagate_and_compress.cpp +6 -7
  420. package/src/duckdb/src/optimizer/statistics/expression/propagate_cast.cpp +14 -11
  421. package/src/duckdb/src/optimizer/statistics/expression/propagate_columnref.cpp +1 -1
  422. package/src/duckdb/src/optimizer/statistics/expression/propagate_comparison.cpp +13 -15
  423. package/src/duckdb/src/optimizer/statistics/expression/propagate_conjunction.cpp +0 -1
  424. package/src/duckdb/src/optimizer/statistics/expression/propagate_constant.cpp +3 -75
  425. package/src/duckdb/src/optimizer/statistics/expression/propagate_function.cpp +7 -2
  426. package/src/duckdb/src/optimizer/statistics/expression/propagate_operator.cpp +10 -0
  427. package/src/duckdb/src/optimizer/statistics/operator/propagate_aggregate.cpp +2 -3
  428. package/src/duckdb/src/optimizer/statistics/operator/propagate_filter.cpp +29 -32
  429. package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +5 -5
  430. package/src/duckdb/src/optimizer/statistics/operator/propagate_set_operation.cpp +3 -3
  431. package/src/duckdb/src/optimizer/statistics_propagator.cpp +2 -1
  432. package/src/duckdb/src/optimizer/unnest_rewriter.cpp +2 -2
  433. package/src/duckdb/src/parallel/meta_pipeline.cpp +0 -7
  434. package/src/duckdb/src/parser/common_table_expression_info.cpp +19 -0
  435. package/src/duckdb/src/parser/expression/between_expression.cpp +17 -0
  436. package/src/duckdb/src/parser/expression/case_expression.cpp +28 -0
  437. package/src/duckdb/src/parser/expression/cast_expression.cpp +17 -0
  438. package/src/duckdb/src/parser/expression/collate_expression.cpp +16 -0
  439. package/src/duckdb/src/parser/expression/columnref_expression.cpp +15 -0
  440. package/src/duckdb/src/parser/expression/comparison_expression.cpp +16 -0
  441. package/src/duckdb/src/parser/expression/conjunction_expression.cpp +17 -0
  442. package/src/duckdb/src/parser/expression/constant_expression.cpp +14 -0
  443. package/src/duckdb/src/parser/expression/default_expression.cpp +7 -0
  444. package/src/duckdb/src/parser/expression/function_expression.cpp +35 -0
  445. package/src/duckdb/src/parser/expression/lambda_expression.cpp +16 -0
  446. package/src/duckdb/src/parser/expression/operator_expression.cpp +15 -0
  447. package/src/duckdb/src/parser/expression/parameter_expression.cpp +15 -0
  448. package/src/duckdb/src/parser/expression/positional_reference_expression.cpp +14 -0
  449. package/src/duckdb/src/parser/expression/star_expression.cpp +26 -6
  450. package/src/duckdb/src/parser/expression/subquery_expression.cpp +20 -0
  451. package/src/duckdb/src/parser/expression/window_expression.cpp +43 -0
  452. package/src/duckdb/src/parser/parsed_data/alter_info.cpp +7 -3
  453. package/src/duckdb/src/parser/parsed_data/alter_scalar_function_info.cpp +56 -0
  454. package/src/duckdb/src/parser/parsed_data/alter_table_function_info.cpp +51 -0
  455. package/src/duckdb/src/parser/parsed_data/create_scalar_function_info.cpp +3 -2
  456. package/src/duckdb/src/parser/parsed_data/create_table_function_info.cpp +6 -0
  457. package/src/duckdb/src/parser/parsed_data/sample_options.cpp +22 -10
  458. package/src/duckdb/src/parser/parsed_expression.cpp +72 -0
  459. package/src/duckdb/src/parser/parsed_expression_iterator.cpp +15 -1
  460. package/src/duckdb/src/parser/query_node/recursive_cte_node.cpp +21 -0
  461. package/src/duckdb/src/parser/query_node/select_node.cpp +31 -0
  462. package/src/duckdb/src/parser/query_node/set_operation_node.cpp +17 -0
  463. package/src/duckdb/src/parser/query_node.cpp +51 -1
  464. package/src/duckdb/src/parser/result_modifier.cpp +78 -0
  465. package/src/duckdb/src/parser/statement/multi_statement.cpp +18 -0
  466. package/src/duckdb/src/parser/statement/select_statement.cpp +12 -0
  467. package/src/duckdb/src/parser/tableref/basetableref.cpp +21 -0
  468. package/src/duckdb/src/parser/tableref/emptytableref.cpp +4 -0
  469. package/src/duckdb/src/parser/tableref/expressionlistref.cpp +17 -0
  470. package/src/duckdb/src/parser/tableref/joinref.cpp +29 -0
  471. package/src/duckdb/src/parser/tableref/pivotref.cpp +373 -0
  472. package/src/duckdb/src/parser/tableref/subqueryref.cpp +15 -0
  473. package/src/duckdb/src/parser/tableref/table_function.cpp +17 -0
  474. package/src/duckdb/src/parser/tableref.cpp +49 -0
  475. package/src/duckdb/src/parser/transform/expression/transform_array_access.cpp +11 -0
  476. package/src/duckdb/src/parser/transform/expression/transform_bool_expr.cpp +1 -1
  477. package/src/duckdb/src/parser/transform/expression/transform_columnref.cpp +17 -2
  478. package/src/duckdb/src/parser/transform/expression/transform_function.cpp +85 -42
  479. package/src/duckdb/src/parser/transform/expression/transform_operator.cpp +1 -1
  480. package/src/duckdb/src/parser/transform/expression/transform_subquery.cpp +1 -1
  481. package/src/duckdb/src/parser/transform/helpers/transform_alias.cpp +12 -6
  482. package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +24 -0
  483. package/src/duckdb/src/parser/transform/helpers/transform_groupby.cpp +7 -0
  484. package/src/duckdb/src/parser/transform/helpers/transform_orderby.cpp +0 -7
  485. package/src/duckdb/src/parser/transform/helpers/transform_typename.cpp +3 -2
  486. package/src/duckdb/src/parser/transform/statement/transform_create_function.cpp +4 -0
  487. package/src/duckdb/src/parser/transform/statement/transform_create_view.cpp +4 -0
  488. package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +179 -0
  489. package/src/duckdb/src/parser/transform/statement/transform_rename.cpp +3 -4
  490. package/src/duckdb/src/parser/transform/statement/transform_select.cpp +8 -0
  491. package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +2 -3
  492. package/src/duckdb/src/parser/transform/tableref/transform_join.cpp +12 -1
  493. package/src/duckdb/src/parser/transform/tableref/transform_pivot.cpp +121 -0
  494. package/src/duckdb/src/parser/transform/tableref/transform_tableref.cpp +2 -0
  495. package/src/duckdb/src/parser/transformer.cpp +15 -3
  496. package/src/duckdb/src/planner/bind_context.cpp +18 -25
  497. package/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp +9 -7
  498. package/src/duckdb/src/planner/binder/expression/bind_columnref_expression.cpp +4 -3
  499. package/src/duckdb/src/planner/binder/expression/bind_function_expression.cpp +23 -12
  500. package/src/duckdb/src/planner/binder/expression/bind_lambda.cpp +3 -2
  501. package/src/duckdb/src/planner/binder/expression/bind_star_expression.cpp +176 -0
  502. package/src/duckdb/src/planner/binder/expression/bind_subquery_expression.cpp +4 -0
  503. package/src/duckdb/src/planner/binder/expression/bind_unnest_expression.cpp +163 -24
  504. package/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp +2 -2
  505. package/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +109 -94
  506. package/src/duckdb/src/planner/binder/query_node/plan_query_node.cpp +11 -0
  507. package/src/duckdb/src/planner/binder/query_node/plan_select_node.cpp +9 -4
  508. package/src/duckdb/src/planner/binder/statement/bind_copy.cpp +5 -3
  509. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +3 -2
  510. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +10 -1
  511. package/src/duckdb/src/planner/binder/statement/bind_delete.cpp +1 -1
  512. package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +12 -8
  513. package/src/duckdb/src/planner/binder/statement/bind_logical_plan.cpp +17 -0
  514. package/src/duckdb/src/planner/binder/statement/bind_update.cpp +4 -2
  515. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +19 -3
  516. package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +366 -0
  517. package/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp +11 -1
  518. package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -0
  519. package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +61 -13
  520. package/src/duckdb/src/planner/binder.cpp +19 -24
  521. package/src/duckdb/src/planner/bound_result_modifier.cpp +27 -1
  522. package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +9 -2
  523. package/src/duckdb/src/planner/expression/bound_expression.cpp +4 -0
  524. package/src/duckdb/src/planner/expression/bound_window_expression.cpp +1 -1
  525. package/src/duckdb/src/planner/expression_binder/base_select_binder.cpp +146 -0
  526. package/src/duckdb/src/planner/expression_binder/having_binder.cpp +6 -3
  527. package/src/duckdb/src/planner/expression_binder/qualify_binder.cpp +3 -3
  528. package/src/duckdb/src/planner/expression_binder/select_binder.cpp +1 -132
  529. package/src/duckdb/src/planner/expression_binder.cpp +10 -3
  530. package/src/duckdb/src/planner/expression_iterator.cpp +17 -10
  531. package/src/duckdb/src/planner/filter/constant_filter.cpp +4 -6
  532. package/src/duckdb/src/planner/logical_operator.cpp +7 -2
  533. package/src/duckdb/src/planner/logical_operator_visitor.cpp +6 -0
  534. package/src/duckdb/src/planner/operator/logical_asof_join.cpp +8 -0
  535. package/src/duckdb/src/planner/operator/logical_distinct.cpp +3 -0
  536. package/src/duckdb/src/planner/planner.cpp +2 -1
  537. package/src/duckdb/src/planner/pragma_handler.cpp +10 -2
  538. package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +3 -1
  539. package/src/duckdb/src/storage/buffer_manager.cpp +44 -46
  540. package/src/duckdb/src/storage/checkpoint/row_group_writer.cpp +1 -1
  541. package/src/duckdb/src/storage/checkpoint/table_data_reader.cpp +4 -15
  542. package/src/duckdb/src/storage/checkpoint/table_data_writer.cpp +10 -4
  543. package/src/duckdb/src/storage/checkpoint_manager.cpp +9 -3
  544. package/src/duckdb/src/storage/compression/bitpacking.cpp +29 -25
  545. package/src/duckdb/src/storage/compression/fixed_size_uncompressed.cpp +45 -46
  546. package/src/duckdb/src/storage/compression/numeric_constant.cpp +10 -11
  547. package/src/duckdb/src/storage/compression/patas.cpp +1 -1
  548. package/src/duckdb/src/storage/compression/rle.cpp +20 -15
  549. package/src/duckdb/src/storage/compression/validity_uncompressed.cpp +6 -6
  550. package/src/duckdb/src/storage/data_table.cpp +23 -23
  551. package/src/duckdb/src/storage/index.cpp +12 -1
  552. package/src/duckdb/src/storage/local_storage.cpp +27 -23
  553. package/src/duckdb/src/storage/meta_block_reader.cpp +22 -0
  554. package/src/duckdb/src/storage/statistics/base_statistics.cpp +373 -128
  555. package/src/duckdb/src/storage/statistics/column_statistics.cpp +57 -3
  556. package/src/duckdb/src/storage/statistics/distinct_statistics.cpp +8 -9
  557. package/src/duckdb/src/storage/statistics/list_stats.cpp +121 -0
  558. package/src/duckdb/src/storage/statistics/numeric_stats.cpp +591 -0
  559. package/src/duckdb/src/storage/statistics/numeric_stats_union.cpp +65 -0
  560. package/src/duckdb/src/storage/statistics/segment_statistics.cpp +2 -11
  561. package/src/duckdb/src/storage/statistics/string_stats.cpp +273 -0
  562. package/src/duckdb/src/storage/statistics/struct_stats.cpp +133 -0
  563. package/src/duckdb/src/storage/storage_info.cpp +2 -2
  564. package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +4 -10
  565. package/src/duckdb/src/storage/table/column_data.cpp +118 -62
  566. package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +10 -9
  567. package/src/duckdb/src/storage/table/column_segment.cpp +30 -45
  568. package/src/duckdb/src/storage/table/list_column_data.cpp +50 -71
  569. package/src/duckdb/src/storage/table/persistent_table_data.cpp +2 -1
  570. package/src/duckdb/src/storage/table/row_group.cpp +213 -143
  571. package/src/duckdb/src/storage/table/row_group_collection.cpp +151 -105
  572. package/src/duckdb/src/storage/table/scan_state.cpp +45 -33
  573. package/src/duckdb/src/storage/table/standard_column_data.cpp +11 -12
  574. package/src/duckdb/src/storage/table/struct_column_data.cpp +27 -34
  575. package/src/duckdb/src/storage/table/table_statistics.cpp +27 -7
  576. package/src/duckdb/src/storage/table/update_segment.cpp +23 -18
  577. package/src/duckdb/src/storage/wal_replay.cpp +8 -5
  578. package/src/duckdb/src/storage/write_ahead_log.cpp +2 -2
  579. package/src/duckdb/src/transaction/commit_state.cpp +11 -7
  580. package/src/duckdb/src/verification/deserialized_statement_verifier.cpp +0 -1
  581. package/src/duckdb/third_party/libpg_query/include/nodes/nodes.hpp +35 -0
  582. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +36 -2
  583. package/src/duckdb/third_party/libpg_query/include/nodes/primnodes.hpp +3 -3
  584. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +1022 -530
  585. package/src/duckdb/third_party/libpg_query/include/parser/kwlist.hpp +8 -0
  586. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +24462 -22828
  587. package/src/duckdb/third_party/re2/re2/re2.cc +9 -0
  588. package/src/duckdb/third_party/re2/re2/re2.h +2 -0
  589. package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +4 -4
  590. package/src/duckdb/ub_extension_json_json_functions.cpp +2 -0
  591. package/src/duckdb/ub_src_common_serializer.cpp +2 -0
  592. package/src/duckdb/ub_src_common_types.cpp +2 -0
  593. package/src/duckdb/ub_src_execution_physical_plan.cpp +2 -0
  594. package/src/duckdb/ub_src_function_aggregate_distributive.cpp +2 -0
  595. package/src/duckdb/ub_src_function_scalar_bit.cpp +2 -0
  596. package/src/duckdb/ub_src_function_scalar_map.cpp +4 -0
  597. package/src/duckdb/ub_src_function_scalar_string.cpp +2 -0
  598. package/src/duckdb/ub_src_function_scalar_string_regexp.cpp +4 -0
  599. package/src/duckdb/ub_src_main_capi.cpp +2 -0
  600. package/src/duckdb/ub_src_optimizer_rule.cpp +2 -0
  601. package/src/duckdb/ub_src_parser.cpp +2 -0
  602. package/src/duckdb/ub_src_parser_parsed_data.cpp +4 -2
  603. package/src/duckdb/ub_src_parser_statement.cpp +2 -0
  604. package/src/duckdb/ub_src_parser_tableref.cpp +2 -0
  605. package/src/duckdb/ub_src_parser_transform_statement.cpp +2 -0
  606. package/src/duckdb/ub_src_parser_transform_tableref.cpp +2 -0
  607. package/src/duckdb/ub_src_planner_binder_expression.cpp +2 -0
  608. package/src/duckdb/ub_src_planner_binder_tableref.cpp +2 -0
  609. package/src/duckdb/ub_src_planner_expression_binder.cpp +2 -0
  610. package/src/duckdb/ub_src_planner_operator.cpp +2 -0
  611. package/src/duckdb/ub_src_storage_statistics.cpp +6 -6
  612. package/src/duckdb/ub_src_storage_table.cpp +0 -2
  613. package/src/duckdb_node.hpp +2 -1
  614. package/src/statement.cpp +5 -5
  615. package/src/utils.cpp +27 -2
  616. package/test/extension.test.ts +44 -26
  617. package/test/syntax_error.test.ts +3 -1
  618. package/filelist.cache +0 -0
  619. package/src/duckdb/src/include/duckdb/main/loadable_extension.hpp +0 -59
  620. package/src/duckdb/src/include/duckdb/storage/statistics/list_statistics.hpp +0 -36
  621. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_statistics.hpp +0 -75
  622. package/src/duckdb/src/include/duckdb/storage/statistics/string_statistics.hpp +0 -49
  623. package/src/duckdb/src/include/duckdb/storage/statistics/struct_statistics.hpp +0 -36
  624. package/src/duckdb/src/include/duckdb/storage/statistics/validity_statistics.hpp +0 -45
  625. package/src/duckdb/src/parser/parsed_data/alter_function_info.cpp +0 -55
  626. package/src/duckdb/src/storage/statistics/list_statistics.cpp +0 -94
  627. package/src/duckdb/src/storage/statistics/numeric_statistics.cpp +0 -307
  628. package/src/duckdb/src/storage/statistics/string_statistics.cpp +0 -220
  629. package/src/duckdb/src/storage/statistics/struct_statistics.cpp +0 -108
  630. package/src/duckdb/src/storage/statistics/validity_statistics.cpp +0 -91
  631. package/src/duckdb/src/storage/table/segment_tree.cpp +0 -179
@@ -10,32 +10,39 @@
10
10
  #include "duckdb/storage/table/column_data_checkpointer.hpp"
11
11
  #include "duckdb/storage/table/list_column_data.hpp"
12
12
  #include "duckdb/storage/table/standard_column_data.hpp"
13
- #include "duckdb/transaction/transaction.hpp"
14
13
 
15
14
  #include "duckdb/storage/table/struct_column_data.hpp"
16
15
  #include "duckdb/storage/table/update_segment.hpp"
17
16
  #include "duckdb/storage/table_storage_info.hpp"
17
+ #include "duckdb/storage/table/append_state.hpp"
18
+ #include "duckdb/storage/table/scan_state.hpp"
18
19
  #include "duckdb/main/attached_database.hpp"
19
20
 
20
21
  namespace duckdb {
21
22
 
22
23
  ColumnData::ColumnData(BlockManager &block_manager, DataTableInfo &info, idx_t column_index, idx_t start_row,
23
- LogicalType type, ColumnData *parent)
24
- : block_manager(block_manager), info(info), column_index(column_index), start(start_row), type(std::move(type)),
25
- parent(parent), version(0) {
24
+ LogicalType type_p, ColumnData *parent)
25
+ : start(start_row), count(0), block_manager(block_manager), info(info), column_index(column_index),
26
+ type(std::move(type_p)), parent(parent), version(0) {
27
+ if (!parent) {
28
+ stats = make_unique<SegmentStatistics>(type);
29
+ }
26
30
  }
27
31
 
28
32
  ColumnData::ColumnData(ColumnData &other, idx_t start, ColumnData *parent)
29
- : block_manager(other.block_manager), info(other.info), column_index(other.column_index), start(start),
30
- type(std::move(other.type)), parent(parent), version(parent ? parent->version + 1 : 0) {
33
+ : start(start), count(other.count), block_manager(other.block_manager), info(other.info),
34
+ column_index(other.column_index), type(std::move(other.type)), parent(parent),
35
+ version(parent ? parent->version + 1 : 0) {
31
36
  if (other.updates) {
32
37
  updates = make_unique<UpdateSegment>(*other.updates, *this);
33
38
  }
39
+ if (other.stats) {
40
+ stats = make_unique<SegmentStatistics>(other.stats->statistics.Copy());
41
+ }
34
42
  idx_t offset = 0;
35
- for (auto segment = other.data.GetRootSegment(); segment; segment = segment->Next()) {
36
- auto &other = (ColumnSegment &)*segment;
37
- this->data.AppendSegment(ColumnSegment::CreateSegment(other, start + offset));
38
- offset += segment->count;
43
+ for (auto &segment : other.data.Segments()) {
44
+ this->data.AppendSegment(ColumnSegment::CreateSegment(segment, start + offset));
45
+ offset += segment.count;
39
46
  }
40
47
  }
41
48
 
@@ -62,34 +69,29 @@ void ColumnData::IncrementVersion() {
62
69
  }
63
70
 
64
71
  idx_t ColumnData::GetMaxEntry() {
65
- auto l = data.Lock();
66
- auto first_segment = data.GetRootSegment(l);
67
- auto last_segment = data.GetLastSegment(l);
68
- if (!first_segment) {
69
- D_ASSERT(!last_segment);
70
- return 0;
71
- } else {
72
- D_ASSERT(last_segment->start >= first_segment->start);
73
- return last_segment->start + last_segment->count - first_segment->start;
74
- }
72
+ return count;
75
73
  }
76
74
 
77
75
  void ColumnData::InitializeScan(ColumnScanState &state) {
78
- state.current = (ColumnSegment *)data.GetRootSegment();
76
+ state.current = data.GetRootSegment();
77
+ state.segment_tree = &data;
79
78
  state.row_index = state.current ? state.current->start : 0;
80
79
  state.internal_index = state.row_index;
81
80
  state.initialized = false;
82
81
  state.version = version;
83
82
  state.scan_state.reset();
83
+ state.last_offset = 0;
84
84
  }
85
85
 
86
86
  void ColumnData::InitializeScanWithOffset(ColumnScanState &state, idx_t row_idx) {
87
- state.current = (ColumnSegment *)data.GetSegment(row_idx);
87
+ state.current = data.GetSegment(row_idx);
88
+ state.segment_tree = &data;
88
89
  state.row_index = row_idx;
89
90
  state.internal_index = state.current->start;
90
91
  state.initialized = false;
91
92
  state.version = version;
92
93
  state.scan_state.reset();
94
+ state.last_offset = 0;
93
95
  }
94
96
 
95
97
  idx_t ColumnData::ScanVector(ColumnScanState &state, Vector &result, idx_t remaining) {
@@ -125,11 +127,12 @@ idx_t ColumnData::ScanVector(ColumnScanState &state, Vector &result, idx_t remai
125
127
  }
126
128
 
127
129
  if (remaining > 0) {
128
- if (!state.current->next) {
130
+ auto next = data.GetNextSegment(state.current);
131
+ if (!next) {
129
132
  break;
130
133
  }
131
134
  state.previous_states.emplace_back(std::move(state.scan_state));
132
- state.current = (ColumnSegment *)state.current->Next();
135
+ state.current = next;
133
136
  state.current->InitializeScan(state);
134
137
  state.segment_checked = false;
135
138
  D_ASSERT(state.row_index >= state.current->start &&
@@ -228,20 +231,60 @@ void ColumnData::Append(BaseStatistics &stats, ColumnAppendState &state, Vector
228
231
  AppendData(stats, state, vdata, count);
229
232
  }
230
233
 
234
+ void ColumnData::Append(ColumnAppendState &state, Vector &vector, idx_t count) {
235
+ if (parent || !stats) {
236
+ throw InternalException("ColumnData::Append called on a column with a parent or without stats");
237
+ }
238
+ Append(stats->statistics, state, vector, count);
239
+ }
240
+
241
+ bool ColumnData::CheckZonemap(TableFilter &filter) {
242
+ if (!stats) {
243
+ throw InternalException("ColumnData::CheckZonemap called on a column without stats");
244
+ }
245
+ auto propagate_result = filter.CheckStatistics(stats->statistics);
246
+ if (propagate_result == FilterPropagateResult::FILTER_ALWAYS_FALSE ||
247
+ propagate_result == FilterPropagateResult::FILTER_FALSE_OR_NULL) {
248
+ return false;
249
+ }
250
+ return true;
251
+ }
252
+
253
+ unique_ptr<BaseStatistics> ColumnData::GetStatistics() {
254
+ if (!stats) {
255
+ throw InternalException("ColumnData::GetStatistics called on a column without stats");
256
+ }
257
+ return stats->statistics.ToUnique();
258
+ }
259
+
260
+ void ColumnData::MergeStatistics(const BaseStatistics &other) {
261
+ if (!stats) {
262
+ throw InternalException("ColumnData::MergeStatistics called on a column without stats");
263
+ }
264
+ return stats->statistics.Merge(other);
265
+ }
266
+
267
+ void ColumnData::MergeIntoStatistics(BaseStatistics &other) {
268
+ if (!stats) {
269
+ throw InternalException("ColumnData::MergeIntoStatistics called on a column without stats");
270
+ }
271
+ return other.Merge(stats->statistics);
272
+ }
273
+
231
274
  void ColumnData::InitializeAppend(ColumnAppendState &state) {
232
275
  auto l = data.Lock();
233
276
  if (data.IsEmpty(l)) {
234
277
  // no segments yet, append an empty segment
235
278
  AppendTransientSegment(l, start);
236
279
  }
237
- auto segment = (ColumnSegment *)data.GetLastSegment(l);
280
+ auto segment = data.GetLastSegment(l);
238
281
  if (segment->segment_type == ColumnSegmentType::PERSISTENT) {
239
282
  // no transient segments yet
240
283
  auto total_rows = segment->start + segment->count;
241
284
  AppendTransientSegment(l, total_rows);
242
- state.current = (ColumnSegment *)data.GetLastSegment(l);
285
+ state.current = data.GetLastSegment(l);
243
286
  } else {
244
- state.current = (ColumnSegment *)segment;
287
+ state.current = segment;
245
288
  }
246
289
 
247
290
  D_ASSERT(state.current->segment_type == ColumnSegmentType::TRANSIENT);
@@ -251,10 +294,11 @@ void ColumnData::InitializeAppend(ColumnAppendState &state) {
251
294
 
252
295
  void ColumnData::AppendData(BaseStatistics &stats, ColumnAppendState &state, UnifiedVectorFormat &vdata, idx_t count) {
253
296
  idx_t offset = 0;
297
+ this->count += count;
254
298
  while (true) {
255
299
  // append the data from the vector
256
300
  idx_t copied_elements = state.current->Append(state, vdata, offset, count);
257
- stats.Merge(*state.current->stats.statistics);
301
+ stats.Merge(state.current->stats.statistics);
258
302
  if (copied_elements == count) {
259
303
  // finished copying everything
260
304
  break;
@@ -264,7 +308,7 @@ void ColumnData::AppendData(BaseStatistics &stats, ColumnAppendState &state, Uni
264
308
  {
265
309
  auto l = data.Lock();
266
310
  AppendTransientSegment(l, state.current->start + state.current->count);
267
- state.current = (ColumnSegment *)data.GetLastSegment(l);
311
+ state.current = data.GetLastSegment(l);
268
312
  state.current->InitializeAppend(state);
269
313
  }
270
314
  offset += copied_elements;
@@ -284,12 +328,13 @@ void ColumnData::RevertAppend(row_t start_row) {
284
328
  // find the segment index that the current row belongs to
285
329
  idx_t segment_index = data.GetSegmentIndex(l, start_row);
286
330
  auto segment = data.GetSegmentByIndex(l, segment_index);
287
- auto &transient = (ColumnSegment &)*segment;
331
+ auto &transient = *segment;
288
332
  D_ASSERT(transient.segment_type == ColumnSegmentType::TRANSIENT);
289
333
 
290
334
  // remove any segments AFTER this segment: they should be deleted entirely
291
335
  data.EraseSegments(l, segment_index);
292
336
 
337
+ this->count = start_row - this->start;
293
338
  segment->next = nullptr;
294
339
  transient.RevertAppend(start_row);
295
340
  }
@@ -299,14 +344,14 @@ idx_t ColumnData::Fetch(ColumnScanState &state, row_t row_id, Vector &result) {
299
344
  D_ASSERT(idx_t(row_id) >= start);
300
345
  // perform the fetch within the segment
301
346
  state.row_index = start + ((row_id - start) / STANDARD_VECTOR_SIZE * STANDARD_VECTOR_SIZE);
302
- state.current = (ColumnSegment *)data.GetSegment(state.row_index);
347
+ state.current = data.GetSegment(state.row_index);
303
348
  state.internal_index = state.current->start;
304
349
  return ScanVector(state, result, STANDARD_VECTOR_SIZE);
305
350
  }
306
351
 
307
352
  void ColumnData::FetchRow(TransactionData transaction, ColumnFetchState &state, row_t row_id, Vector &result,
308
353
  idx_t result_idx) {
309
- auto segment = (ColumnSegment *)data.GetSegment(row_id);
354
+ auto segment = data.GetSegment(row_id);
310
355
 
311
356
  // now perform the fetch within the segment
312
357
  segment->FetchRow(state, row_id, result, result_idx);
@@ -357,15 +402,14 @@ void ColumnData::AppendTransientSegment(SegmentLock &l, idx_t start_row) {
357
402
  }
358
403
 
359
404
  void ColumnData::CommitDropColumn() {
360
- auto segment = (ColumnSegment *)data.GetRootSegment();
361
- while (segment) {
362
- if (segment->segment_type == ColumnSegmentType::PERSISTENT) {
363
- auto block_id = segment->GetBlockId();
405
+ for (auto &segment_p : data.Segments()) {
406
+ auto &segment = segment_p;
407
+ if (segment.segment_type == ColumnSegmentType::PERSISTENT) {
408
+ auto block_id = segment.GetBlockId();
364
409
  if (block_id != INVALID_BLOCK) {
365
410
  block_manager.MarkBlockAsModified(block_id);
366
411
  }
367
412
  }
368
- segment = (ColumnSegment *)segment->Next();
369
413
  }
370
414
  }
371
415
 
@@ -389,7 +433,7 @@ unique_ptr<ColumnCheckpointState> ColumnData::Checkpoint(RowGroup &row_group,
389
433
  // scan the segments of the column data
390
434
  // set up the checkpoint state
391
435
  auto checkpoint_state = CreateCheckpointState(row_group, partial_block_manager);
392
- checkpoint_state->global_stats = BaseStatistics::CreateEmpty(type, StatisticsType::LOCAL_STATS);
436
+ checkpoint_state->global_stats = BaseStatistics::CreateEmpty(type).ToUnique();
393
437
 
394
438
  auto l = data.Lock();
395
439
  auto nodes = data.MoveSegments(l);
@@ -411,16 +455,28 @@ unique_ptr<ColumnCheckpointState> ColumnData::Checkpoint(RowGroup &row_group,
411
455
 
412
456
  void ColumnData::DeserializeColumn(Deserializer &source) {
413
457
  // load the data pointers for the column
458
+ this->count = 0;
414
459
  idx_t data_pointer_count = source.Read<idx_t>();
415
460
  for (idx_t data_ptr = 0; data_ptr < data_pointer_count; data_ptr++) {
416
461
  // read the data pointer
417
- DataPointer data_pointer;
418
- data_pointer.row_start = source.Read<idx_t>();
419
- data_pointer.tuple_count = source.Read<idx_t>();
420
- data_pointer.block_pointer.block_id = source.Read<block_id_t>();
421
- data_pointer.block_pointer.offset = source.Read<uint32_t>();
422
- data_pointer.compression_type = source.Read<CompressionType>();
423
- data_pointer.statistics = BaseStatistics::Deserialize(source, type);
462
+ auto row_start = source.Read<idx_t>();
463
+ auto tuple_count = source.Read<idx_t>();
464
+ auto block_pointer_block_id = source.Read<block_id_t>();
465
+ auto block_pointer_offset = source.Read<uint32_t>();
466
+ auto compression_type = source.Read<CompressionType>();
467
+ auto segment_stats = BaseStatistics::Deserialize(source, type);
468
+ if (stats) {
469
+ stats->statistics.Merge(segment_stats);
470
+ }
471
+
472
+ DataPointer data_pointer(std::move(segment_stats));
473
+ data_pointer.row_start = row_start;
474
+ data_pointer.tuple_count = tuple_count;
475
+ data_pointer.block_pointer.block_id = block_pointer_block_id;
476
+ data_pointer.block_pointer.offset = block_pointer_offset;
477
+ data_pointer.compression_type = compression_type;
478
+
479
+ this->count += tuple_count;
424
480
 
425
481
  // create a persistent segment
426
482
  auto segment = ColumnSegment::CreatePersistentSegment(
@@ -458,7 +514,6 @@ void ColumnData::GetStorageInfo(idx_t row_group_index, vector<idx_t> col_path, T
458
514
  while (segment) {
459
515
  ColumnSegmentInfo column_info;
460
516
  column_info.row_group_index = row_group_index;
461
- ;
462
517
  column_info.column_id = col_path[0];
463
518
  column_info.column_path = col_path_str;
464
519
  column_info.segment_idx = segment_idx;
@@ -466,8 +521,7 @@ void ColumnData::GetStorageInfo(idx_t row_group_index, vector<idx_t> col_path, T
466
521
  column_info.segment_start = segment->start;
467
522
  column_info.segment_count = segment->count;
468
523
  column_info.compression_type = CompressionTypeToString(segment->function->type);
469
- column_info.segment_stats =
470
- segment->stats.statistics ? segment->stats.statistics->ToString() : string("No Stats");
524
+ column_info.segment_stats = segment->stats.statistics.ToString();
471
525
  column_info.has_updates = updates ? true : false;
472
526
  // persistent
473
527
  // block_id
@@ -482,7 +536,7 @@ void ColumnData::GetStorageInfo(idx_t row_group_index, vector<idx_t> col_path, T
482
536
  result.column_segments.push_back(std::move(column_info));
483
537
 
484
538
  segment_idx++;
485
- segment = (ColumnSegment *)segment->Next();
539
+ segment = (ColumnSegment *)data.GetNextSegment(segment);
486
540
  }
487
541
  }
488
542
 
@@ -490,20 +544,22 @@ void ColumnData::Verify(RowGroup &parent) {
490
544
  #ifdef DEBUG
491
545
  D_ASSERT(this->start == parent.start);
492
546
  data.Verify();
493
- auto root = data.GetRootSegment();
494
- if (root) {
495
- D_ASSERT(root != nullptr);
496
- D_ASSERT(root->start == this->start);
497
- idx_t prev_end = root->start;
498
- while (root) {
499
- D_ASSERT(prev_end == root->start);
500
- prev_end = root->start + root->count;
501
- if (!root->next) {
502
- D_ASSERT(prev_end == parent.start + parent.count);
503
- }
504
- root = root->Next();
505
- }
547
+ if (type.InternalType() == PhysicalType::STRUCT) {
548
+ // structs don't have segments
549
+ D_ASSERT(!data.GetRootSegment());
550
+ return;
551
+ }
552
+ idx_t current_index = 0;
553
+ idx_t current_start = this->start;
554
+ idx_t total_count = 0;
555
+ for (auto &segment : data.Segments()) {
556
+ D_ASSERT(segment.index == current_index);
557
+ D_ASSERT(segment.start == current_start);
558
+ current_start += segment.count;
559
+ total_count += segment.count;
560
+ current_index++;
506
561
  }
562
+ D_ASSERT(this->count == total_count);
507
563
  #endif
508
564
  }
509
565
 
@@ -3,6 +3,8 @@
3
3
  #include "duckdb/storage/table/update_segment.hpp"
4
4
  #include "duckdb/storage/data_table.hpp"
5
5
  #include "duckdb/parser/column_definition.hpp"
6
+ #include "duckdb/storage/table/scan_state.hpp"
7
+
6
8
  namespace duckdb {
7
9
 
8
10
  ColumnDataCheckpointer::ColumnDataCheckpointer(ColumnData &col_data_p, RowGroup &row_group_p,
@@ -38,7 +40,7 @@ ColumnCheckpointState &ColumnDataCheckpointer::GetCheckpointState() {
38
40
  void ColumnDataCheckpointer::ScanSegments(const std::function<void(Vector &, idx_t)> &callback) {
39
41
  Vector scan_vector(intermediate.GetType(), nullptr);
40
42
  for (idx_t segment_idx = 0; segment_idx < nodes.size(); segment_idx++) {
41
- auto segment = (ColumnSegment *)nodes[segment_idx].node.get();
43
+ auto segment = nodes[segment_idx].node.get();
42
44
  ColumnScanState scan_state;
43
45
  scan_state.current = segment;
44
46
  segment->InitializeScan(scan_state);
@@ -161,9 +163,9 @@ void ColumnDataCheckpointer::WriteToDisk() {
161
163
  // first we check the current segments
162
164
  // if there are any persistent segments, we will mark their old block ids as modified
163
165
  // since the segments will be rewritten their old on disk data is no longer required
164
- auto &block_manager = col_data.block_manager;
166
+ auto &block_manager = col_data.GetBlockManager();
165
167
  for (idx_t segment_idx = 0; segment_idx < nodes.size(); segment_idx++) {
166
- auto segment = (ColumnSegment *)nodes[segment_idx].node.get();
168
+ auto segment = nodes[segment_idx].node.get();
167
169
  if (segment->segment_type == ColumnSegmentType::PERSISTENT) {
168
170
  // persistent segment has updates: mark it as modified and rewrite the block with the merged updates
169
171
  auto block_id = segment->GetBlockId();
@@ -194,7 +196,7 @@ void ColumnDataCheckpointer::WriteToDisk() {
194
196
 
195
197
  bool ColumnDataCheckpointer::HasChanges() {
196
198
  for (idx_t segment_idx = 0; segment_idx < nodes.size(); segment_idx++) {
197
- auto segment = (ColumnSegment *)nodes[segment_idx].node.get();
199
+ auto segment = nodes[segment_idx].node.get();
198
200
  if (segment->segment_type == ColumnSegmentType::TRANSIENT) {
199
201
  // transient segment: always need to write to disk
200
202
  return true;
@@ -214,20 +216,19 @@ void ColumnDataCheckpointer::WritePersistentSegments() {
214
216
  // all segments are persistent and there are no updates
215
217
  // we only need to write the metadata
216
218
  for (idx_t segment_idx = 0; segment_idx < nodes.size(); segment_idx++) {
217
- auto segment = (ColumnSegment *)nodes[segment_idx].node.get();
219
+ auto segment = nodes[segment_idx].node.get();
218
220
  D_ASSERT(segment->segment_type == ColumnSegmentType::PERSISTENT);
219
221
 
220
222
  // set up the data pointer directly using the data from the persistent segment
221
- DataPointer pointer;
223
+ DataPointer pointer(segment->stats.statistics.Copy());
222
224
  pointer.block_pointer.block_id = segment->GetBlockId();
223
225
  pointer.block_pointer.offset = segment->GetBlockOffset();
224
226
  pointer.row_start = segment->start;
225
227
  pointer.tuple_count = segment->count;
226
228
  pointer.compression_type = segment->function->type;
227
- pointer.statistics = segment->stats.statistics->Copy();
228
229
 
229
230
  // merge the persistent stats into the global column stats
230
- state.global_stats->Merge(*segment->stats.statistics);
231
+ state.global_stats->Merge(segment->stats.statistics);
231
232
 
232
233
  // directly append the current segment to the new tree
233
234
  state.new_tree.AppendSegment(std::move(nodes[segment_idx].node));
@@ -236,7 +237,7 @@ void ColumnDataCheckpointer::WritePersistentSegments() {
236
237
  }
237
238
  }
238
239
 
239
- void ColumnDataCheckpointer::Checkpoint(vector<SegmentNode> nodes) {
240
+ void ColumnDataCheckpointer::Checkpoint(vector<SegmentNode<ColumnSegment>> nodes) {
240
241
  D_ASSERT(!nodes.empty());
241
242
  this->nodes = std::move(nodes);
242
243
  // first check if any of the segments have changes
@@ -3,13 +3,12 @@
3
3
  #include "duckdb/storage/table/update_segment.hpp"
4
4
  #include "duckdb/common/types/null_value.hpp"
5
5
  #include "duckdb/common/types/vector.hpp"
6
- #include "duckdb/common/vector_operations/vector_operations.hpp"
7
6
  #include "duckdb/storage/table/append_state.hpp"
8
7
  #include "duckdb/storage/storage_manager.hpp"
9
8
  #include "duckdb/planner/filter/conjunction_filter.hpp"
10
9
  #include "duckdb/planner/filter/constant_filter.hpp"
11
- #include "duckdb/planner/filter/null_filter.hpp"
12
10
  #include "duckdb/main/config.hpp"
11
+ #include "duckdb/storage/table/scan_state.hpp"
13
12
 
14
13
  #include <cstring>
15
14
 
@@ -19,7 +18,7 @@ unique_ptr<ColumnSegment> ColumnSegment::CreatePersistentSegment(DatabaseInstanc
19
18
  block_id_t block_id, idx_t offset,
20
19
  const LogicalType &type, idx_t start, idx_t count,
21
20
  CompressionType compression_type,
22
- unique_ptr<BaseStatistics> statistics) {
21
+ BaseStatistics statistics) {
23
22
  auto &config = DBConfig::GetConfig(db);
24
23
  CompressionFunction *function;
25
24
  shared_ptr<BlockHandle> block;
@@ -48,7 +47,7 @@ unique_ptr<ColumnSegment> ColumnSegment::CreateTransientSegment(DatabaseInstance
48
47
  buffer_manager.Allocate(segment_size, false, &block);
49
48
  }
50
49
  return make_unique<ColumnSegment>(db, std::move(block), type, ColumnSegmentType::TRANSIENT, start, 0, function,
51
- nullptr, INVALID_BLOCK, 0, segment_size);
50
+ BaseStatistics::CreateEmpty(type), INVALID_BLOCK, 0, segment_size);
52
51
  }
53
52
 
54
53
  unique_ptr<ColumnSegment> ColumnSegment::CreateSegment(ColumnSegment &other, idx_t start) {
@@ -57,11 +56,11 @@ unique_ptr<ColumnSegment> ColumnSegment::CreateSegment(ColumnSegment &other, idx
57
56
 
58
57
  ColumnSegment::ColumnSegment(DatabaseInstance &db, shared_ptr<BlockHandle> block, LogicalType type_p,
59
58
  ColumnSegmentType segment_type, idx_t start, idx_t count, CompressionFunction *function_p,
60
- unique_ptr<BaseStatistics> statistics, block_id_t block_id_p, idx_t offset_p,
61
- idx_t segment_size_p)
62
- : SegmentBase(start, count), db(db), type(std::move(type_p)), type_size(GetTypeIdSize(type.InternalType())),
63
- segment_type(segment_type), function(function_p), stats(type, std::move(statistics)), block(std::move(block)),
64
- block_id(block_id_p), offset(offset_p), segment_size(segment_size_p) {
59
+ BaseStatistics statistics, block_id_t block_id_p, idx_t offset_p, idx_t segment_size_p)
60
+ : SegmentBase<ColumnSegment>(start, count), db(db), type(std::move(type_p)),
61
+ type_size(GetTypeIdSize(type.InternalType())), segment_type(segment_type), function(function_p),
62
+ stats(std::move(statistics)), block(std::move(block)), block_id(block_id_p), offset(offset_p),
63
+ segment_size(segment_size_p) {
65
64
  D_ASSERT(function);
66
65
  if (function->init_segment) {
67
66
  segment_state = function->init_segment(*this, block_id);
@@ -69,10 +68,10 @@ ColumnSegment::ColumnSegment(DatabaseInstance &db, shared_ptr<BlockHandle> block
69
68
  }
70
69
 
71
70
  ColumnSegment::ColumnSegment(ColumnSegment &other, idx_t start)
72
- : SegmentBase(start, other.count), db(other.db), type(std::move(other.type)), type_size(other.type_size),
73
- segment_type(other.segment_type), function(other.function), stats(std::move(other.stats)),
74
- block(std::move(other.block)), block_id(other.block_id), offset(other.offset), segment_size(other.segment_size),
75
- segment_state(std::move(other.segment_state)) {
71
+ : SegmentBase<ColumnSegment>(start, other.count.load()), db(other.db), type(std::move(other.type)),
72
+ type_size(other.type_size), segment_type(other.segment_type), function(other.function),
73
+ stats(std::move(other.stats)), block(std::move(other.block)), block_id(other.block_id), offset(other.offset),
74
+ segment_size(other.segment_size), segment_state(std::move(other.segment_state)) {
76
75
  }
77
76
 
78
77
  ColumnSegment::~ColumnSegment() {
@@ -181,13 +180,12 @@ void ColumnSegment::ConvertToPersistent(BlockManager *block_manager, block_id_t
181
180
  block_id = block_id_p;
182
181
  offset = 0;
183
182
 
184
- D_ASSERT(stats.statistics);
185
183
  if (block_id == INVALID_BLOCK) {
186
184
  // constant block: reset the block buffer
187
- D_ASSERT(stats.statistics->IsConstant());
185
+ D_ASSERT(stats.statistics.IsConstant());
188
186
  block.reset();
189
187
  } else {
190
- D_ASSERT(!stats.statistics->IsConstant());
188
+ D_ASSERT(!stats.statistics.IsConstant());
191
189
  // non-constant block: write the block to disk
192
190
  // the data for the block already exists in-memory of our block
193
191
  // instead of copying the data we alter some metadata so the buffer points to an on-disk block
@@ -218,12 +216,12 @@ void ColumnSegment::MarkAsPersistent(shared_ptr<BlockHandle> block_p, uint32_t o
218
216
  // Filter Selection
219
217
  //===--------------------------------------------------------------------===//
220
218
  template <class T, class OP, bool HAS_NULL>
221
- static idx_t TemplatedFilterSelection(T *vec, T *predicate, SelectionVector &sel, idx_t approved_tuple_count,
219
+ static idx_t TemplatedFilterSelection(T *vec, T predicate, SelectionVector &sel, idx_t approved_tuple_count,
222
220
  ValidityMask &mask, SelectionVector &result_sel) {
223
221
  idx_t result_count = 0;
224
222
  for (idx_t i = 0; i < approved_tuple_count; i++) {
225
223
  auto idx = sel.get_index(i);
226
- if ((!HAS_NULL || mask.RowIsValid(idx)) && OP::Operation(vec[idx], *predicate)) {
224
+ if ((!HAS_NULL || mask.RowIsValid(idx)) && OP::Operation(vec[idx], predicate)) {
227
225
  result_sel.set_index(result_count++, idx);
228
226
  }
229
227
  }
@@ -231,7 +229,7 @@ static idx_t TemplatedFilterSelection(T *vec, T *predicate, SelectionVector &sel
231
229
  }
232
230
 
233
231
  template <class T>
234
- static void FilterSelectionSwitch(T *vec, T *predicate, SelectionVector &sel, idx_t &approved_tuple_count,
232
+ static void FilterSelectionSwitch(T *vec, T predicate, SelectionVector &sel, idx_t &approved_tuple_count,
235
233
  ExpressionType comparison_type, ValidityMask &mask) {
236
234
  SelectionVector new_sel(approved_tuple_count);
237
235
  // the inplace loops take the result as the last parameter
@@ -372,104 +370,91 @@ idx_t ColumnSegment::FilterSelection(SelectionVector &sel, Vector &result, const
372
370
  switch (result.GetType().InternalType()) {
373
371
  case PhysicalType::UINT8: {
374
372
  auto result_flat = FlatVector::GetData<uint8_t>(result);
375
- Vector predicate_vector(constant_filter.constant);
376
- auto predicate = FlatVector::GetData<uint8_t>(predicate_vector);
373
+ auto predicate = UTinyIntValue::Get(constant_filter.constant);
377
374
  FilterSelectionSwitch<uint8_t>(result_flat, predicate, sel, approved_tuple_count,
378
375
  constant_filter.comparison_type, mask);
379
376
  break;
380
377
  }
381
378
  case PhysicalType::UINT16: {
382
379
  auto result_flat = FlatVector::GetData<uint16_t>(result);
383
- Vector predicate_vector(constant_filter.constant);
384
- auto predicate = FlatVector::GetData<uint16_t>(predicate_vector);
380
+ auto predicate = USmallIntValue::Get(constant_filter.constant);
385
381
  FilterSelectionSwitch<uint16_t>(result_flat, predicate, sel, approved_tuple_count,
386
382
  constant_filter.comparison_type, mask);
387
383
  break;
388
384
  }
389
385
  case PhysicalType::UINT32: {
390
386
  auto result_flat = FlatVector::GetData<uint32_t>(result);
391
- Vector predicate_vector(constant_filter.constant);
392
- auto predicate = FlatVector::GetData<uint32_t>(predicate_vector);
387
+ auto predicate = UIntegerValue::Get(constant_filter.constant);
393
388
  FilterSelectionSwitch<uint32_t>(result_flat, predicate, sel, approved_tuple_count,
394
389
  constant_filter.comparison_type, mask);
395
390
  break;
396
391
  }
397
392
  case PhysicalType::UINT64: {
398
393
  auto result_flat = FlatVector::GetData<uint64_t>(result);
399
- Vector predicate_vector(constant_filter.constant);
400
- auto predicate = FlatVector::GetData<uint64_t>(predicate_vector);
394
+ auto predicate = UBigIntValue::Get(constant_filter.constant);
401
395
  FilterSelectionSwitch<uint64_t>(result_flat, predicate, sel, approved_tuple_count,
402
396
  constant_filter.comparison_type, mask);
403
397
  break;
404
398
  }
405
399
  case PhysicalType::INT8: {
406
400
  auto result_flat = FlatVector::GetData<int8_t>(result);
407
- Vector predicate_vector(constant_filter.constant);
408
- auto predicate = FlatVector::GetData<int8_t>(predicate_vector);
401
+ auto predicate = TinyIntValue::Get(constant_filter.constant);
409
402
  FilterSelectionSwitch<int8_t>(result_flat, predicate, sel, approved_tuple_count,
410
403
  constant_filter.comparison_type, mask);
411
404
  break;
412
405
  }
413
406
  case PhysicalType::INT16: {
414
407
  auto result_flat = FlatVector::GetData<int16_t>(result);
415
- Vector predicate_vector(constant_filter.constant);
416
- auto predicate = FlatVector::GetData<int16_t>(predicate_vector);
408
+ auto predicate = SmallIntValue::Get(constant_filter.constant);
417
409
  FilterSelectionSwitch<int16_t>(result_flat, predicate, sel, approved_tuple_count,
418
410
  constant_filter.comparison_type, mask);
419
411
  break;
420
412
  }
421
413
  case PhysicalType::INT32: {
422
414
  auto result_flat = FlatVector::GetData<int32_t>(result);
423
- Vector predicate_vector(constant_filter.constant);
424
- auto predicate = FlatVector::GetData<int32_t>(predicate_vector);
415
+ auto predicate = IntegerValue::Get(constant_filter.constant);
425
416
  FilterSelectionSwitch<int32_t>(result_flat, predicate, sel, approved_tuple_count,
426
417
  constant_filter.comparison_type, mask);
427
418
  break;
428
419
  }
429
420
  case PhysicalType::INT64: {
430
421
  auto result_flat = FlatVector::GetData<int64_t>(result);
431
- Vector predicate_vector(constant_filter.constant);
432
- auto predicate = FlatVector::GetData<int64_t>(predicate_vector);
422
+ auto predicate = BigIntValue::Get(constant_filter.constant);
433
423
  FilterSelectionSwitch<int64_t>(result_flat, predicate, sel, approved_tuple_count,
434
424
  constant_filter.comparison_type, mask);
435
425
  break;
436
426
  }
437
427
  case PhysicalType::INT128: {
438
428
  auto result_flat = FlatVector::GetData<hugeint_t>(result);
439
- Vector predicate_vector(constant_filter.constant);
440
- auto predicate = FlatVector::GetData<hugeint_t>(predicate_vector);
429
+ auto predicate = HugeIntValue::Get(constant_filter.constant);
441
430
  FilterSelectionSwitch<hugeint_t>(result_flat, predicate, sel, approved_tuple_count,
442
431
  constant_filter.comparison_type, mask);
443
432
  break;
444
433
  }
445
434
  case PhysicalType::FLOAT: {
446
435
  auto result_flat = FlatVector::GetData<float>(result);
447
- Vector predicate_vector(constant_filter.constant);
448
- auto predicate = FlatVector::GetData<float>(predicate_vector);
436
+ auto predicate = FloatValue::Get(constant_filter.constant);
449
437
  FilterSelectionSwitch<float>(result_flat, predicate, sel, approved_tuple_count,
450
438
  constant_filter.comparison_type, mask);
451
439
  break;
452
440
  }
453
441
  case PhysicalType::DOUBLE: {
454
442
  auto result_flat = FlatVector::GetData<double>(result);
455
- Vector predicate_vector(constant_filter.constant);
456
- auto predicate = FlatVector::GetData<double>(predicate_vector);
443
+ auto predicate = DoubleValue::Get(constant_filter.constant);
457
444
  FilterSelectionSwitch<double>(result_flat, predicate, sel, approved_tuple_count,
458
445
  constant_filter.comparison_type, mask);
459
446
  break;
460
447
  }
461
448
  case PhysicalType::VARCHAR: {
462
449
  auto result_flat = FlatVector::GetData<string_t>(result);
463
- Vector predicate_vector(constant_filter.constant);
464
- auto predicate = FlatVector::GetData<string_t>(predicate_vector);
450
+ auto predicate = string_t(StringValue::Get(constant_filter.constant));
465
451
  FilterSelectionSwitch<string_t>(result_flat, predicate, sel, approved_tuple_count,
466
452
  constant_filter.comparison_type, mask);
467
453
  break;
468
454
  }
469
455
  case PhysicalType::BOOL: {
470
456
  auto result_flat = FlatVector::GetData<bool>(result);
471
- Vector predicate_vector(constant_filter.constant);
472
- auto predicate = FlatVector::GetData<bool>(predicate_vector);
457
+ auto predicate = BooleanValue::Get(constant_filter.constant);
473
458
  FilterSelectionSwitch<bool>(result_flat, predicate, sel, approved_tuple_count,
474
459
  constant_filter.comparison_type, mask);
475
460
  break;