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
@@ -0,0 +1,591 @@
1
+ #include "duckdb/storage/statistics/numeric_stats.hpp"
2
+ #include "duckdb/storage/statistics/base_statistics.hpp"
3
+ #include "duckdb/common/field_writer.hpp"
4
+ #include "duckdb/common/types/vector.hpp"
5
+ #include "duckdb/common/operator/comparison_operators.hpp"
6
+
7
+ namespace duckdb {
8
+
9
+ template <>
10
+ void NumericStats::Update<interval_t>(BaseStatistics &stats, interval_t new_value) {
11
+ }
12
+
13
+ template <>
14
+ void NumericStats::Update<list_entry_t>(BaseStatistics &stats, list_entry_t new_value) {
15
+ }
16
+
17
+ //===--------------------------------------------------------------------===//
18
+ // NumericStats
19
+ //===--------------------------------------------------------------------===//
20
+ BaseStatistics NumericStats::CreateUnknown(LogicalType type) {
21
+ BaseStatistics result(std::move(type));
22
+ result.InitializeUnknown();
23
+ SetMin(result, Value(result.GetType()));
24
+ SetMax(result, Value(result.GetType()));
25
+ return result;
26
+ }
27
+
28
+ BaseStatistics NumericStats::CreateEmpty(LogicalType type) {
29
+ BaseStatistics result(std::move(type));
30
+ result.InitializeEmpty();
31
+ SetMin(result, Value::MaximumValue(result.GetType()));
32
+ SetMax(result, Value::MinimumValue(result.GetType()));
33
+ return result;
34
+ }
35
+
36
+ NumericStatsData &NumericStats::GetDataUnsafe(BaseStatistics &stats) {
37
+ D_ASSERT(stats.GetStatsType() == StatisticsType::NUMERIC_STATS);
38
+ return stats.stats_union.numeric_data;
39
+ }
40
+
41
+ const NumericStatsData &NumericStats::GetDataUnsafe(const BaseStatistics &stats) {
42
+ D_ASSERT(stats.GetStatsType() == StatisticsType::NUMERIC_STATS);
43
+ return stats.stats_union.numeric_data;
44
+ }
45
+
46
+ void NumericStats::Merge(BaseStatistics &stats, const BaseStatistics &other) {
47
+ if (other.GetType().id() == LogicalTypeId::VALIDITY) {
48
+ return;
49
+ }
50
+ D_ASSERT(stats.GetType() == other.GetType());
51
+ if (NumericStats::HasMin(other) && NumericStats::HasMin(stats)) {
52
+ auto other_min = NumericStats::Min(other);
53
+ if (other_min < NumericStats::Min(stats)) {
54
+ NumericStats::SetMin(stats, other_min);
55
+ }
56
+ } else {
57
+ NumericStats::SetMin(stats, Value());
58
+ }
59
+ if (NumericStats::HasMax(other) && NumericStats::HasMax(stats)) {
60
+ auto other_max = NumericStats::Max(other);
61
+ if (other_max > NumericStats::Max(stats)) {
62
+ NumericStats::SetMax(stats, other_max);
63
+ }
64
+ } else {
65
+ NumericStats::SetMax(stats, Value());
66
+ }
67
+ }
68
+
69
+ struct GetNumericValueUnion {
70
+ template <class T>
71
+ static T Operation(const NumericValueUnion &v);
72
+ };
73
+
74
+ template <>
75
+ int8_t GetNumericValueUnion::Operation(const NumericValueUnion &v) {
76
+ return v.value_.tinyint;
77
+ }
78
+
79
+ template <>
80
+ int16_t GetNumericValueUnion::Operation(const NumericValueUnion &v) {
81
+ return v.value_.smallint;
82
+ }
83
+
84
+ template <>
85
+ int32_t GetNumericValueUnion::Operation(const NumericValueUnion &v) {
86
+ return v.value_.integer;
87
+ }
88
+
89
+ template <>
90
+ int64_t GetNumericValueUnion::Operation(const NumericValueUnion &v) {
91
+ return v.value_.bigint;
92
+ }
93
+
94
+ template <>
95
+ hugeint_t GetNumericValueUnion::Operation(const NumericValueUnion &v) {
96
+ return v.value_.hugeint;
97
+ }
98
+
99
+ template <>
100
+ uint8_t GetNumericValueUnion::Operation(const NumericValueUnion &v) {
101
+ return v.value_.utinyint;
102
+ }
103
+
104
+ template <>
105
+ uint16_t GetNumericValueUnion::Operation(const NumericValueUnion &v) {
106
+ return v.value_.usmallint;
107
+ }
108
+
109
+ template <>
110
+ uint32_t GetNumericValueUnion::Operation(const NumericValueUnion &v) {
111
+ return v.value_.uinteger;
112
+ }
113
+
114
+ template <>
115
+ uint64_t GetNumericValueUnion::Operation(const NumericValueUnion &v) {
116
+ return v.value_.ubigint;
117
+ }
118
+
119
+ template <>
120
+ float GetNumericValueUnion::Operation(const NumericValueUnion &v) {
121
+ return v.value_.float_;
122
+ }
123
+
124
+ template <>
125
+ double GetNumericValueUnion::Operation(const NumericValueUnion &v) {
126
+ return v.value_.double_;
127
+ }
128
+
129
+ template <class T>
130
+ T NumericStats::GetMinUnsafe(const BaseStatistics &stats) {
131
+ return GetNumericValueUnion::Operation<T>(NumericStats::GetDataUnsafe(stats).min);
132
+ }
133
+
134
+ template <class T>
135
+ T NumericStats::GetMaxUnsafe(const BaseStatistics &stats) {
136
+ return GetNumericValueUnion::Operation<T>(NumericStats::GetDataUnsafe(stats).max);
137
+ }
138
+
139
+ template <class T>
140
+ bool ConstantExactRange(T min, T max, T constant) {
141
+ return Equals::Operation(constant, min) && Equals::Operation(constant, max);
142
+ }
143
+
144
+ template <class T>
145
+ bool ConstantValueInRange(T min, T max, T constant) {
146
+ return !(LessThan::Operation(constant, min) || GreaterThan::Operation(constant, max));
147
+ }
148
+
149
+ template <class T>
150
+ FilterPropagateResult CheckZonemapTemplated(const BaseStatistics &stats, ExpressionType comparison_type,
151
+ const Value &constant_value) {
152
+ T min_value = NumericStats::GetMinUnsafe<T>(stats);
153
+ T max_value = NumericStats::GetMaxUnsafe<T>(stats);
154
+ T constant = constant_value.GetValueUnsafe<T>();
155
+ switch (comparison_type) {
156
+ case ExpressionType::COMPARE_EQUAL:
157
+ if (ConstantExactRange(min_value, max_value, constant)) {
158
+ return FilterPropagateResult::FILTER_ALWAYS_TRUE;
159
+ }
160
+ if (ConstantValueInRange(min_value, max_value, constant)) {
161
+ return FilterPropagateResult::NO_PRUNING_POSSIBLE;
162
+ }
163
+ return FilterPropagateResult::FILTER_ALWAYS_FALSE;
164
+ case ExpressionType::COMPARE_NOTEQUAL:
165
+ if (!ConstantValueInRange(min_value, max_value, constant)) {
166
+ return FilterPropagateResult::FILTER_ALWAYS_TRUE;
167
+ } else if (ConstantExactRange(min_value, max_value, constant)) {
168
+ // corner case of a cluster with one numeric equal to the target constant
169
+ return FilterPropagateResult::FILTER_ALWAYS_FALSE;
170
+ }
171
+ return FilterPropagateResult::NO_PRUNING_POSSIBLE;
172
+ case ExpressionType::COMPARE_GREATERTHANOREQUALTO:
173
+ // GreaterThanEquals::Operation(X, C)
174
+ // this can be true only if max(X) >= C
175
+ // if min(X) >= C, then this is always true
176
+ if (GreaterThanEquals::Operation(min_value, constant)) {
177
+ return FilterPropagateResult::FILTER_ALWAYS_TRUE;
178
+ } else if (GreaterThanEquals::Operation(max_value, constant)) {
179
+ return FilterPropagateResult::NO_PRUNING_POSSIBLE;
180
+ } else {
181
+ return FilterPropagateResult::FILTER_ALWAYS_FALSE;
182
+ }
183
+ case ExpressionType::COMPARE_GREATERTHAN:
184
+ // GreaterThan::Operation(X, C)
185
+ // this can be true only if max(X) > C
186
+ // if min(X) > C, then this is always true
187
+ if (GreaterThan::Operation(min_value, constant)) {
188
+ return FilterPropagateResult::FILTER_ALWAYS_TRUE;
189
+ } else if (GreaterThan::Operation(max_value, constant)) {
190
+ return FilterPropagateResult::NO_PRUNING_POSSIBLE;
191
+ } else {
192
+ return FilterPropagateResult::FILTER_ALWAYS_FALSE;
193
+ }
194
+ case ExpressionType::COMPARE_LESSTHANOREQUALTO:
195
+ // LessThanEquals::Operation(X, C)
196
+ // this can be true only if min(X) <= C
197
+ // if max(X) <= C, then this is always true
198
+ if (LessThanEquals::Operation(max_value, constant)) {
199
+ return FilterPropagateResult::FILTER_ALWAYS_TRUE;
200
+ } else if (LessThanEquals::Operation(min_value, constant)) {
201
+ return FilterPropagateResult::NO_PRUNING_POSSIBLE;
202
+ } else {
203
+ return FilterPropagateResult::FILTER_ALWAYS_FALSE;
204
+ }
205
+ case ExpressionType::COMPARE_LESSTHAN:
206
+ // LessThan::Operation(X, C)
207
+ // this can be true only if min(X) < C
208
+ // if max(X) < C, then this is always true
209
+ if (LessThan::Operation(max_value, constant)) {
210
+ return FilterPropagateResult::FILTER_ALWAYS_TRUE;
211
+ } else if (LessThan::Operation(min_value, constant)) {
212
+ return FilterPropagateResult::NO_PRUNING_POSSIBLE;
213
+ } else {
214
+ return FilterPropagateResult::FILTER_ALWAYS_FALSE;
215
+ }
216
+ default:
217
+ throw InternalException("Expression type in zonemap check not implemented");
218
+ }
219
+ }
220
+
221
+ FilterPropagateResult NumericStats::CheckZonemap(const BaseStatistics &stats, ExpressionType comparison_type,
222
+ const Value &constant) {
223
+ D_ASSERT(constant.type() == stats.GetType());
224
+ if (constant.IsNull()) {
225
+ return FilterPropagateResult::FILTER_ALWAYS_FALSE;
226
+ }
227
+ if (!NumericStats::HasMinMax(stats)) {
228
+ return FilterPropagateResult::NO_PRUNING_POSSIBLE;
229
+ }
230
+ switch (stats.GetType().InternalType()) {
231
+ case PhysicalType::INT8:
232
+ return CheckZonemapTemplated<int8_t>(stats, comparison_type, constant);
233
+ case PhysicalType::INT16:
234
+ return CheckZonemapTemplated<int16_t>(stats, comparison_type, constant);
235
+ case PhysicalType::INT32:
236
+ return CheckZonemapTemplated<int32_t>(stats, comparison_type, constant);
237
+ case PhysicalType::INT64:
238
+ return CheckZonemapTemplated<int64_t>(stats, comparison_type, constant);
239
+ case PhysicalType::UINT8:
240
+ return CheckZonemapTemplated<uint8_t>(stats, comparison_type, constant);
241
+ case PhysicalType::UINT16:
242
+ return CheckZonemapTemplated<uint16_t>(stats, comparison_type, constant);
243
+ case PhysicalType::UINT32:
244
+ return CheckZonemapTemplated<uint32_t>(stats, comparison_type, constant);
245
+ case PhysicalType::UINT64:
246
+ return CheckZonemapTemplated<uint64_t>(stats, comparison_type, constant);
247
+ case PhysicalType::INT128:
248
+ return CheckZonemapTemplated<hugeint_t>(stats, comparison_type, constant);
249
+ case PhysicalType::FLOAT:
250
+ return CheckZonemapTemplated<float>(stats, comparison_type, constant);
251
+ case PhysicalType::DOUBLE:
252
+ return CheckZonemapTemplated<double>(stats, comparison_type, constant);
253
+ default:
254
+ throw InternalException("Unsupported type for NumericStats::CheckZonemap");
255
+ }
256
+ }
257
+
258
+ bool NumericStats::IsConstant(const BaseStatistics &stats) {
259
+ return NumericStats::Max(stats) <= NumericStats::Min(stats);
260
+ }
261
+
262
+ void SetNumericValueInternal(const Value &input, const LogicalType &type, NumericValueUnion &val, bool &has_val) {
263
+ if (input.IsNull()) {
264
+ has_val = false;
265
+ return;
266
+ }
267
+ if (input.type().InternalType() != type.InternalType()) {
268
+ throw InternalException("SetMin or SetMax called with Value that does not match statistics' column value");
269
+ }
270
+ has_val = true;
271
+ switch (type.InternalType()) {
272
+ case PhysicalType::BOOL:
273
+ val.value_.boolean = BooleanValue::Get(input);
274
+ break;
275
+ case PhysicalType::INT8:
276
+ val.value_.tinyint = TinyIntValue::Get(input);
277
+ break;
278
+ case PhysicalType::INT16:
279
+ val.value_.smallint = SmallIntValue::Get(input);
280
+ break;
281
+ case PhysicalType::INT32:
282
+ val.value_.integer = IntegerValue::Get(input);
283
+ break;
284
+ case PhysicalType::INT64:
285
+ val.value_.bigint = BigIntValue::Get(input);
286
+ break;
287
+ case PhysicalType::UINT8:
288
+ val.value_.utinyint = UTinyIntValue::Get(input);
289
+ break;
290
+ case PhysicalType::UINT16:
291
+ val.value_.usmallint = USmallIntValue::Get(input);
292
+ break;
293
+ case PhysicalType::UINT32:
294
+ val.value_.uinteger = UIntegerValue::Get(input);
295
+ break;
296
+ case PhysicalType::UINT64:
297
+ val.value_.ubigint = UBigIntValue::Get(input);
298
+ break;
299
+ case PhysicalType::INT128:
300
+ val.value_.hugeint = HugeIntValue::Get(input);
301
+ break;
302
+ case PhysicalType::FLOAT:
303
+ val.value_.float_ = FloatValue::Get(input);
304
+ break;
305
+ case PhysicalType::DOUBLE:
306
+ val.value_.double_ = DoubleValue::Get(input);
307
+ break;
308
+ default:
309
+ throw InternalException("Unsupported type for NumericStatistics::SetValueInternal");
310
+ }
311
+ }
312
+
313
+ void NumericStats::SetMin(BaseStatistics &stats, const Value &new_min) {
314
+ auto &data = NumericStats::GetDataUnsafe(stats);
315
+ SetNumericValueInternal(new_min, stats.GetType(), data.min, data.has_min);
316
+ }
317
+
318
+ void NumericStats::SetMax(BaseStatistics &stats, const Value &new_max) {
319
+ auto &data = NumericStats::GetDataUnsafe(stats);
320
+ SetNumericValueInternal(new_max, stats.GetType(), data.max, data.has_max);
321
+ }
322
+
323
+ Value NumericValueUnionToValueInternal(const LogicalType &type, const NumericValueUnion &val) {
324
+ switch (type.InternalType()) {
325
+ case PhysicalType::BOOL:
326
+ return Value::BOOLEAN(val.value_.boolean);
327
+ case PhysicalType::INT8:
328
+ return Value::TINYINT(val.value_.tinyint);
329
+ case PhysicalType::INT16:
330
+ return Value::SMALLINT(val.value_.smallint);
331
+ case PhysicalType::INT32:
332
+ return Value::INTEGER(val.value_.integer);
333
+ case PhysicalType::INT64:
334
+ return Value::BIGINT(val.value_.bigint);
335
+ case PhysicalType::UINT8:
336
+ return Value::UTINYINT(val.value_.utinyint);
337
+ case PhysicalType::UINT16:
338
+ return Value::USMALLINT(val.value_.usmallint);
339
+ case PhysicalType::UINT32:
340
+ return Value::UINTEGER(val.value_.uinteger);
341
+ case PhysicalType::UINT64:
342
+ return Value::UBIGINT(val.value_.ubigint);
343
+ case PhysicalType::INT128:
344
+ return Value::HUGEINT(val.value_.hugeint);
345
+ case PhysicalType::FLOAT:
346
+ return Value::FLOAT(val.value_.float_);
347
+ case PhysicalType::DOUBLE:
348
+ return Value::DOUBLE(val.value_.double_);
349
+ default:
350
+ throw InternalException("Unsupported type for NumericValueUnionToValue");
351
+ }
352
+ }
353
+
354
+ Value NumericValueUnionToValue(const LogicalType &type, const NumericValueUnion &val) {
355
+ Value result = NumericValueUnionToValueInternal(type, val);
356
+ result.GetTypeMutable() = type;
357
+ return result;
358
+ }
359
+
360
+ bool NumericStats::HasMinMax(const BaseStatistics &stats) {
361
+ return NumericStats::HasMin(stats) && NumericStats::HasMax(stats);
362
+ }
363
+
364
+ bool NumericStats::HasMin(const BaseStatistics &stats) {
365
+ if (stats.GetType().id() == LogicalTypeId::SQLNULL) {
366
+ return false;
367
+ }
368
+ return NumericStats::GetDataUnsafe(stats).has_min;
369
+ }
370
+
371
+ bool NumericStats::HasMax(const BaseStatistics &stats) {
372
+ if (stats.GetType().id() == LogicalTypeId::SQLNULL) {
373
+ return false;
374
+ }
375
+ return NumericStats::GetDataUnsafe(stats).has_max;
376
+ }
377
+
378
+ Value NumericStats::Min(const BaseStatistics &stats) {
379
+ if (!NumericStats::HasMin(stats)) {
380
+ throw InternalException("Min() called on statistics that does not have min");
381
+ }
382
+ return NumericValueUnionToValue(stats.GetType(), NumericStats::GetDataUnsafe(stats).min);
383
+ }
384
+
385
+ Value NumericStats::Max(const BaseStatistics &stats) {
386
+ if (!NumericStats::HasMax(stats)) {
387
+ throw InternalException("Max() called on statistics that does not have max");
388
+ }
389
+ return NumericValueUnionToValue(stats.GetType(), NumericStats::GetDataUnsafe(stats).max);
390
+ }
391
+
392
+ Value NumericStats::MinOrNull(const BaseStatistics &stats) {
393
+ if (!NumericStats::HasMin(stats)) {
394
+ return Value(stats.GetType());
395
+ }
396
+ return NumericStats::Min(stats);
397
+ }
398
+
399
+ Value NumericStats::MaxOrNull(const BaseStatistics &stats) {
400
+ if (!NumericStats::HasMax(stats)) {
401
+ return Value(stats.GetType());
402
+ }
403
+ return NumericStats::Max(stats);
404
+ }
405
+
406
+ void SerializeNumericStatsValue(const LogicalType &type, NumericValueUnion val, bool has_value, FieldWriter &writer) {
407
+ writer.WriteField<bool>(!has_value);
408
+ if (!has_value) {
409
+ return;
410
+ }
411
+ switch (type.InternalType()) {
412
+ case PhysicalType::BOOL:
413
+ writer.WriteField<bool>(val.value_.boolean);
414
+ break;
415
+ case PhysicalType::INT8:
416
+ writer.WriteField<int8_t>(val.value_.tinyint);
417
+ break;
418
+ case PhysicalType::INT16:
419
+ writer.WriteField<int16_t>(val.value_.smallint);
420
+ break;
421
+ case PhysicalType::INT32:
422
+ writer.WriteField<int32_t>(val.value_.integer);
423
+ break;
424
+ case PhysicalType::INT64:
425
+ writer.WriteField<int64_t>(val.value_.bigint);
426
+ break;
427
+ case PhysicalType::UINT8:
428
+ writer.WriteField<int8_t>(val.value_.utinyint);
429
+ break;
430
+ case PhysicalType::UINT16:
431
+ writer.WriteField<int16_t>(val.value_.usmallint);
432
+ break;
433
+ case PhysicalType::UINT32:
434
+ writer.WriteField<int32_t>(val.value_.uinteger);
435
+ break;
436
+ case PhysicalType::UINT64:
437
+ writer.WriteField<int64_t>(val.value_.ubigint);
438
+ break;
439
+ case PhysicalType::INT128:
440
+ writer.WriteField<hugeint_t>(val.value_.hugeint);
441
+ break;
442
+ case PhysicalType::FLOAT:
443
+ writer.WriteField<float>(val.value_.float_);
444
+ break;
445
+ case PhysicalType::DOUBLE:
446
+ writer.WriteField<double>(val.value_.double_);
447
+ break;
448
+ default:
449
+ throw InternalException("Unsupported type for serializing numeric statistics");
450
+ }
451
+ }
452
+
453
+ void NumericStats::Serialize(const BaseStatistics &stats, FieldWriter &writer) {
454
+ auto &numeric_stats = NumericStats::GetDataUnsafe(stats);
455
+ SerializeNumericStatsValue(stats.GetType(), numeric_stats.min, numeric_stats.has_min, writer);
456
+ SerializeNumericStatsValue(stats.GetType(), numeric_stats.max, numeric_stats.has_max, writer);
457
+ }
458
+
459
+ void DeserializeNumericStatsValue(const LogicalType &type, FieldReader &reader, NumericValueUnion &result,
460
+ bool &has_stats) {
461
+ auto is_null = reader.ReadRequired<bool>();
462
+ if (is_null) {
463
+ has_stats = false;
464
+ return;
465
+ }
466
+ has_stats = true;
467
+ switch (type.InternalType()) {
468
+ case PhysicalType::BOOL:
469
+ result.value_.boolean = reader.ReadRequired<bool>();
470
+ break;
471
+ case PhysicalType::INT8:
472
+ result.value_.tinyint = reader.ReadRequired<int8_t>();
473
+ break;
474
+ case PhysicalType::INT16:
475
+ result.value_.smallint = reader.ReadRequired<int16_t>();
476
+ break;
477
+ case PhysicalType::INT32:
478
+ result.value_.integer = reader.ReadRequired<int32_t>();
479
+ break;
480
+ case PhysicalType::INT64:
481
+ result.value_.bigint = reader.ReadRequired<int64_t>();
482
+ break;
483
+ case PhysicalType::UINT8:
484
+ result.value_.utinyint = reader.ReadRequired<uint8_t>();
485
+ break;
486
+ case PhysicalType::UINT16:
487
+ result.value_.usmallint = reader.ReadRequired<uint16_t>();
488
+ break;
489
+ case PhysicalType::UINT32:
490
+ result.value_.uinteger = reader.ReadRequired<uint32_t>();
491
+ break;
492
+ case PhysicalType::UINT64:
493
+ result.value_.ubigint = reader.ReadRequired<uint64_t>();
494
+ break;
495
+ case PhysicalType::INT128:
496
+ result.value_.hugeint = reader.ReadRequired<hugeint_t>();
497
+ break;
498
+ case PhysicalType::FLOAT:
499
+ result.value_.float_ = reader.ReadRequired<float>();
500
+ break;
501
+ case PhysicalType::DOUBLE:
502
+ result.value_.double_ = reader.ReadRequired<double>();
503
+ break;
504
+ default:
505
+ throw InternalException("Unsupported type for deserializing numeric statistics");
506
+ }
507
+ }
508
+
509
+ BaseStatistics NumericStats::Deserialize(FieldReader &reader, LogicalType type) {
510
+ BaseStatistics result(std::move(type));
511
+ auto &numeric_stats = NumericStats::GetDataUnsafe(result);
512
+ DeserializeNumericStatsValue(result.GetType(), reader, numeric_stats.min, numeric_stats.has_min);
513
+ DeserializeNumericStatsValue(result.GetType(), reader, numeric_stats.max, numeric_stats.has_max);
514
+ return result;
515
+ }
516
+
517
+ string NumericStats::ToString(const BaseStatistics &stats) {
518
+ return StringUtil::Format("[Min: %s, Max: %s]", NumericStats::MinOrNull(stats).ToString(),
519
+ NumericStats::MaxOrNull(stats).ToString());
520
+ }
521
+
522
+ template <class T>
523
+ void NumericStats::TemplatedVerify(const BaseStatistics &stats, Vector &vector, const SelectionVector &sel,
524
+ idx_t count) {
525
+ UnifiedVectorFormat vdata;
526
+ vector.ToUnifiedFormat(count, vdata);
527
+
528
+ auto data = (T *)vdata.data;
529
+ auto min_value = NumericStats::MinOrNull(stats);
530
+ auto max_value = NumericStats::MaxOrNull(stats);
531
+ for (idx_t i = 0; i < count; i++) {
532
+ auto idx = sel.get_index(i);
533
+ auto index = vdata.sel->get_index(idx);
534
+ if (!vdata.validity.RowIsValid(index)) {
535
+ continue;
536
+ }
537
+ if (!min_value.IsNull() && LessThan::Operation(data[index], min_value.GetValueUnsafe<T>())) { // LCOV_EXCL_START
538
+ throw InternalException("Statistics mismatch: value is smaller than min.\nStatistics: %s\nVector: %s",
539
+ stats.ToString(), vector.ToString(count));
540
+ } // LCOV_EXCL_STOP
541
+ if (!max_value.IsNull() && GreaterThan::Operation(data[index], max_value.GetValueUnsafe<T>())) {
542
+ throw InternalException("Statistics mismatch: value is bigger than max.\nStatistics: %s\nVector: %s",
543
+ stats.ToString(), vector.ToString(count));
544
+ }
545
+ }
546
+ }
547
+
548
+ void NumericStats::Verify(const BaseStatistics &stats, Vector &vector, const SelectionVector &sel, idx_t count) {
549
+ auto &type = stats.GetType();
550
+ switch (type.InternalType()) {
551
+ case PhysicalType::BOOL:
552
+ break;
553
+ case PhysicalType::INT8:
554
+ TemplatedVerify<int8_t>(stats, vector, sel, count);
555
+ break;
556
+ case PhysicalType::INT16:
557
+ TemplatedVerify<int16_t>(stats, vector, sel, count);
558
+ break;
559
+ case PhysicalType::INT32:
560
+ TemplatedVerify<int32_t>(stats, vector, sel, count);
561
+ break;
562
+ case PhysicalType::INT64:
563
+ TemplatedVerify<int64_t>(stats, vector, sel, count);
564
+ break;
565
+ case PhysicalType::UINT8:
566
+ TemplatedVerify<uint8_t>(stats, vector, sel, count);
567
+ break;
568
+ case PhysicalType::UINT16:
569
+ TemplatedVerify<uint16_t>(stats, vector, sel, count);
570
+ break;
571
+ case PhysicalType::UINT32:
572
+ TemplatedVerify<uint32_t>(stats, vector, sel, count);
573
+ break;
574
+ case PhysicalType::UINT64:
575
+ TemplatedVerify<uint64_t>(stats, vector, sel, count);
576
+ break;
577
+ case PhysicalType::INT128:
578
+ TemplatedVerify<hugeint_t>(stats, vector, sel, count);
579
+ break;
580
+ case PhysicalType::FLOAT:
581
+ TemplatedVerify<float>(stats, vector, sel, count);
582
+ break;
583
+ case PhysicalType::DOUBLE:
584
+ TemplatedVerify<double>(stats, vector, sel, count);
585
+ break;
586
+ default:
587
+ throw InternalException("Unsupported type %s for numeric statistics verify", type.ToString());
588
+ }
589
+ }
590
+
591
+ } // namespace duckdb
@@ -0,0 +1,65 @@
1
+ #include "duckdb/storage/statistics/numeric_stats_union.hpp"
2
+
3
+ namespace duckdb {
4
+
5
+ template <>
6
+ bool &NumericValueUnion::GetReferenceUnsafe() {
7
+ return value_.boolean;
8
+ }
9
+
10
+ template <>
11
+ int8_t &NumericValueUnion::GetReferenceUnsafe() {
12
+ return value_.tinyint;
13
+ }
14
+
15
+ template <>
16
+ int16_t &NumericValueUnion::GetReferenceUnsafe() {
17
+ return value_.smallint;
18
+ }
19
+
20
+ template <>
21
+ int32_t &NumericValueUnion::GetReferenceUnsafe() {
22
+ return value_.integer;
23
+ }
24
+
25
+ template <>
26
+ int64_t &NumericValueUnion::GetReferenceUnsafe() {
27
+ return value_.bigint;
28
+ }
29
+
30
+ template <>
31
+ hugeint_t &NumericValueUnion::GetReferenceUnsafe() {
32
+ return value_.hugeint;
33
+ }
34
+
35
+ template <>
36
+ uint8_t &NumericValueUnion::GetReferenceUnsafe() {
37
+ return value_.utinyint;
38
+ }
39
+
40
+ template <>
41
+ uint16_t &NumericValueUnion::GetReferenceUnsafe() {
42
+ return value_.usmallint;
43
+ }
44
+
45
+ template <>
46
+ uint32_t &NumericValueUnion::GetReferenceUnsafe() {
47
+ return value_.uinteger;
48
+ }
49
+
50
+ template <>
51
+ uint64_t &NumericValueUnion::GetReferenceUnsafe() {
52
+ return value_.ubigint;
53
+ }
54
+
55
+ template <>
56
+ float &NumericValueUnion::GetReferenceUnsafe() {
57
+ return value_.float_;
58
+ }
59
+
60
+ template <>
61
+ double &NumericValueUnion::GetReferenceUnsafe() {
62
+ return value_.double_;
63
+ }
64
+
65
+ } // namespace duckdb
@@ -4,19 +4,10 @@
4
4
 
5
5
  namespace duckdb {
6
6
 
7
- SegmentStatistics::SegmentStatistics(LogicalType type) : type(std::move(type)) {
8
- Reset();
7
+ SegmentStatistics::SegmentStatistics(LogicalType type) : statistics(BaseStatistics::CreateEmpty(std::move(type))) {
9
8
  }
10
9
 
11
- SegmentStatistics::SegmentStatistics(LogicalType type, unique_ptr<BaseStatistics> stats)
12
- : type(std::move(type)), statistics(std::move(stats)) {
13
- if (!statistics) {
14
- Reset();
15
- }
16
- }
17
-
18
- void SegmentStatistics::Reset() {
19
- statistics = BaseStatistics::CreateEmpty(type, StatisticsType::LOCAL_STATS);
10
+ SegmentStatistics::SegmentStatistics(BaseStatistics stats) : statistics(std::move(stats)) {
20
11
  }
21
12
 
22
13
  } // namespace duckdb