duckdb 0.10.1-dev22.0 → 0.10.1-dev26.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 (700) hide show
  1. package/binding.gyp +4 -1
  2. package/package.json +1 -1
  3. package/src/duckdb/extension/icu/icu-strptime.cpp +46 -4
  4. package/src/duckdb/extension/icu/icu-table-range.cpp +5 -0
  5. package/src/duckdb/extension/icu/icu-timezone.cpp +28 -4
  6. package/src/duckdb/extension/json/buffered_json_reader.cpp +6 -5
  7. package/src/duckdb/extension/json/include/buffered_json_reader.hpp +3 -3
  8. package/src/duckdb/extension/json/include/json_transform.hpp +2 -0
  9. package/src/duckdb/extension/json/json_functions/json_create.cpp +6 -0
  10. package/src/duckdb/extension/json/json_functions/json_transform.cpp +8 -9
  11. package/src/duckdb/extension/json/json_functions.cpp +1 -2
  12. package/src/duckdb/extension/json/json_scan.cpp +1 -0
  13. package/src/duckdb/extension/parquet/column_reader.cpp +17 -1
  14. package/src/duckdb/extension/parquet/column_writer.cpp +151 -20
  15. package/src/duckdb/extension/parquet/include/column_writer.hpp +3 -4
  16. package/src/duckdb/extension/parquet/parquet_extension.cpp +14 -9
  17. package/src/duckdb/extension/parquet/parquet_timestamp.cpp +10 -0
  18. package/src/duckdb/extension/parquet/parquet_writer.cpp +4 -0
  19. package/src/duckdb/src/catalog/catalog.cpp +94 -10
  20. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +9 -5
  21. package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +1 -0
  22. package/src/duckdb/src/catalog/catalog_entry/ub_duckdb_catalog_entries.cpp +16 -0
  23. package/src/duckdb/src/catalog/catalog_entry/view_catalog_entry.cpp +28 -0
  24. package/src/duckdb/src/catalog/default/default_functions.cpp +3 -0
  25. package/src/duckdb/src/catalog/default/default_views.cpp +3 -3
  26. package/src/duckdb/src/catalog/default/ub_duckdb_catalog_default_entries.cpp +5 -0
  27. package/src/duckdb/src/catalog/dependency_catalog_set.cpp +1 -3
  28. package/src/duckdb/src/catalog/dependency_manager.cpp +2 -5
  29. package/src/duckdb/src/catalog/ub_duckdb_catalog.cpp +10 -0
  30. package/src/duckdb/src/common/adbc/adbc.cpp +1 -1
  31. package/src/duckdb/src/common/adbc/driver_manager.cpp +2 -1
  32. package/src/duckdb/src/common/adbc/nanoarrow/ub_duckdb_adbc_nanoarrow.cpp +5 -0
  33. package/src/duckdb/src/common/adbc/ub_duckdb_adbc.cpp +3 -0
  34. package/src/duckdb/src/common/allocator.cpp +34 -8
  35. package/src/duckdb/src/common/arrow/appender/fixed_size_list_data.cpp +39 -0
  36. package/src/duckdb/src/common/arrow/appender/ub_duckdb_common_arrow_appender.cpp +6 -0
  37. package/src/duckdb/src/common/arrow/appender/union_data.cpp +2 -1
  38. package/src/duckdb/src/common/arrow/arrow_appender.cpp +5 -5
  39. package/src/duckdb/src/common/arrow/arrow_converter.cpp +17 -0
  40. package/src/duckdb/src/common/arrow/ub_duckdb_common_arrow.cpp +4 -0
  41. package/src/duckdb/src/common/compressed_file_system.cpp +1 -0
  42. package/src/duckdb/src/common/crypto/ub_duckdb_common_crypto.cpp +2 -0
  43. package/src/duckdb/src/common/enum_util.cpp +153 -13
  44. package/src/duckdb/src/common/enums/logical_operator_type.cpp +0 -2
  45. package/src/duckdb/src/common/enums/physical_operator_type.cpp +2 -2
  46. package/src/duckdb/src/common/enums/ub_duckdb_common_enums.cpp +12 -0
  47. package/src/duckdb/src/common/exception/conversion_exception.cpp +23 -0
  48. package/src/duckdb/src/common/exception.cpp +7 -14
  49. package/src/duckdb/src/common/extra_type_info.cpp +6 -5
  50. package/src/duckdb/src/common/gzip_file_system.cpp +5 -4
  51. package/src/duckdb/src/common/local_file_system.cpp +85 -10
  52. package/src/duckdb/src/common/operator/cast_operators.cpp +413 -305
  53. package/src/duckdb/src/common/operator/ub_duckdb_common_operators.cpp +4 -0
  54. package/src/duckdb/src/common/progress_bar/ub_duckdb_progress_bar.cpp +3 -0
  55. package/src/duckdb/src/common/re2_regex.cpp +2 -1
  56. package/src/duckdb/src/common/row_operations/row_heap_scatter.cpp +2 -2
  57. package/src/duckdb/src/common/row_operations/row_matcher.cpp +1 -0
  58. package/src/duckdb/src/common/row_operations/row_scatter.cpp +2 -2
  59. package/src/duckdb/src/common/row_operations/ub_duckdb_row_operations.cpp +9 -0
  60. package/src/duckdb/src/common/serializer/binary_serializer.cpp +3 -3
  61. package/src/duckdb/src/common/serializer/ub_duckdb_common_serializer.cpp +7 -0
  62. package/src/duckdb/src/common/sort/partition_state.cpp +2 -3
  63. package/src/duckdb/src/common/sort/ub_duckdb_sort.cpp +7 -0
  64. package/src/duckdb/src/common/string_util.cpp +3 -3
  65. package/src/duckdb/src/common/types/bit.cpp +7 -6
  66. package/src/duckdb/src/common/types/blob.cpp +20 -9
  67. package/src/duckdb/src/common/types/column/column_data_allocator.cpp +8 -6
  68. package/src/duckdb/src/common/types/column/column_data_collection.cpp +11 -1
  69. package/src/duckdb/src/common/types/column/column_data_collection_segment.cpp +5 -0
  70. package/src/duckdb/src/common/types/column/partitioned_column_data.cpp +1 -1
  71. package/src/duckdb/src/common/types/column/ub_duckdb_common_types_column.cpp +6 -0
  72. package/src/duckdb/src/common/types/data_chunk.cpp +1 -1
  73. package/src/duckdb/src/common/types/date.cpp +1 -1
  74. package/src/duckdb/src/common/types/hugeint.cpp +3 -2
  75. package/src/duckdb/src/common/types/interval.cpp +1 -1
  76. package/src/duckdb/src/common/types/list_segment.cpp +2 -1
  77. package/src/duckdb/src/common/types/row/partitioned_tuple_data.cpp +3 -9
  78. package/src/duckdb/src/common/types/row/tuple_data_allocator.cpp +7 -7
  79. package/src/duckdb/src/common/types/row/tuple_data_collection.cpp +10 -27
  80. package/src/duckdb/src/common/types/row/tuple_data_scatter_gather.cpp +168 -88
  81. package/src/duckdb/src/common/types/row/ub_duckdb_common_types_row.cpp +11 -0
  82. package/src/duckdb/src/common/types/selection_vector.cpp +1 -1
  83. package/src/duckdb/src/common/types/string_heap.cpp +5 -1
  84. package/src/duckdb/src/common/types/string_type.cpp +18 -4
  85. package/src/duckdb/src/common/types/time.cpp +4 -2
  86. package/src/duckdb/src/common/types/timestamp.cpp +32 -6
  87. package/src/duckdb/src/common/types/ub_duckdb_common_types.cpp +28 -0
  88. package/src/duckdb/src/common/types/uhugeint.cpp +3 -2
  89. package/src/duckdb/src/common/types/uuid.cpp +11 -0
  90. package/src/duckdb/src/common/types/validity_mask.cpp +4 -3
  91. package/src/duckdb/src/common/types/value.cpp +17 -6
  92. package/src/duckdb/src/common/types/vector.cpp +243 -68
  93. package/src/duckdb/src/common/types.cpp +7 -5
  94. package/src/duckdb/src/common/ub_duckdb_common.cpp +34 -0
  95. package/src/duckdb/src/common/value_operations/ub_duckdb_value_operations.cpp +2 -0
  96. package/src/duckdb/src/common/vector_operations/generators.cpp +2 -1
  97. package/src/duckdb/src/common/vector_operations/vector_cast.cpp +4 -4
  98. package/src/duckdb/src/common/vector_operations/vector_copy.cpp +2 -2
  99. package/src/duckdb/src/common/vector_operations/vector_hash.cpp +17 -6
  100. package/src/duckdb/src/core_functions/aggregate/algebraic/ub_duckdb_aggr_algebraic.cpp +5 -0
  101. package/src/duckdb/src/core_functions/aggregate/distributive/arg_min_max.cpp +30 -6
  102. package/src/duckdb/src/core_functions/aggregate/distributive/bitagg.cpp +1 -1
  103. package/src/duckdb/src/core_functions/aggregate/distributive/bitstring_agg.cpp +12 -5
  104. package/src/duckdb/src/core_functions/aggregate/distributive/minmax.cpp +2 -2
  105. package/src/duckdb/src/core_functions/aggregate/distributive/string_agg.cpp +2 -1
  106. package/src/duckdb/src/core_functions/aggregate/distributive/ub_duckdb_aggr_distributive.cpp +13 -0
  107. package/src/duckdb/src/core_functions/aggregate/holistic/mode.cpp +2 -1
  108. package/src/duckdb/src/core_functions/aggregate/holistic/quantile.cpp +2 -9
  109. package/src/duckdb/src/core_functions/aggregate/holistic/ub_duckdb_aggr_holistic.cpp +5 -0
  110. package/src/duckdb/src/core_functions/aggregate/nested/ub_duckdb_aggr_nested.cpp +3 -0
  111. package/src/duckdb/src/core_functions/aggregate/regression/ub_duckdb_aggr_regr.cpp +8 -0
  112. package/src/duckdb/src/core_functions/function_list.cpp +1 -0
  113. package/src/duckdb/src/core_functions/scalar/bit/bitstring.cpp +2 -2
  114. package/src/duckdb/src/core_functions/scalar/bit/ub_duckdb_func_bit.cpp +2 -0
  115. package/src/duckdb/src/core_functions/scalar/blob/ub_duckdb_func_blob.cpp +3 -0
  116. package/src/duckdb/src/core_functions/scalar/date/date_diff.cpp +8 -0
  117. package/src/duckdb/src/core_functions/scalar/date/date_part.cpp +22 -3
  118. package/src/duckdb/src/core_functions/scalar/date/make_date.cpp +29 -7
  119. package/src/duckdb/src/core_functions/scalar/date/to_interval.cpp +3 -1
  120. package/src/duckdb/src/core_functions/scalar/date/ub_duckdb_func_date.cpp +12 -0
  121. package/src/duckdb/src/core_functions/scalar/debug/ub_duckdb_func_debug.cpp +2 -0
  122. package/src/duckdb/src/core_functions/scalar/enum/ub_duckdb_func_enum.cpp +2 -0
  123. package/src/duckdb/src/core_functions/scalar/generic/ub_duckdb_func_generic.cpp +9 -0
  124. package/src/duckdb/src/core_functions/scalar/list/array_slice.cpp +12 -8
  125. package/src/duckdb/src/core_functions/scalar/list/list_aggregates.cpp +2 -1
  126. package/src/duckdb/src/core_functions/scalar/list/list_reduce.cpp +6 -5
  127. package/src/duckdb/src/core_functions/scalar/list/list_sort.cpp +5 -3
  128. package/src/duckdb/src/core_functions/scalar/list/list_value.cpp +28 -12
  129. package/src/duckdb/src/core_functions/scalar/list/ub_duckdb_func_list.cpp +11 -0
  130. package/src/duckdb/src/core_functions/scalar/map/map.cpp +129 -160
  131. package/src/duckdb/src/core_functions/scalar/map/ub_duckdb_func_map_nested.cpp +8 -0
  132. package/src/duckdb/src/core_functions/scalar/math/numeric.cpp +19 -16
  133. package/src/duckdb/src/core_functions/scalar/math/ub_duckdb_func_math.cpp +1 -0
  134. package/src/duckdb/src/core_functions/scalar/operators/bitwise.cpp +4 -4
  135. package/src/duckdb/src/core_functions/scalar/operators/ub_duckdb_func_ops.cpp +1 -0
  136. package/src/duckdb/src/core_functions/scalar/random/ub_duckdb_func_random.cpp +3 -0
  137. package/src/duckdb/src/core_functions/scalar/string/hex.cpp +2 -1
  138. package/src/duckdb/src/core_functions/scalar/string/pad.cpp +2 -2
  139. package/src/duckdb/src/core_functions/scalar/string/repeat.cpp +1 -1
  140. package/src/duckdb/src/core_functions/scalar/string/replace.cpp +1 -1
  141. package/src/duckdb/src/core_functions/scalar/string/string_split.cpp +2 -1
  142. package/src/duckdb/src/core_functions/scalar/string/translate.cpp +1 -1
  143. package/src/duckdb/src/core_functions/scalar/string/ub_duckdb_func_string.cpp +26 -0
  144. package/src/duckdb/src/core_functions/scalar/struct/ub_duckdb_func_struct.cpp +3 -0
  145. package/src/duckdb/src/core_functions/scalar/union/ub_duckdb_func_union.cpp +4 -0
  146. package/src/duckdb/src/core_functions/ub_duckdb_core_functions.cpp +3 -0
  147. package/src/duckdb/src/execution/adaptive_filter.cpp +1 -1
  148. package/src/duckdb/src/execution/aggregate_hashtable.cpp +1 -1
  149. package/src/duckdb/src/execution/column_binding_resolver.cpp +7 -1
  150. package/src/duckdb/src/execution/expression_executor/execute_case.cpp +2 -2
  151. package/src/duckdb/src/execution/expression_executor/execute_cast.cpp +2 -0
  152. package/src/duckdb/src/execution/expression_executor/execute_function.cpp +2 -2
  153. package/src/duckdb/src/execution/expression_executor/execute_operator.cpp +1 -1
  154. package/src/duckdb/src/execution/expression_executor/ub_duckdb_expression_executor.cpp +11 -0
  155. package/src/duckdb/src/execution/expression_executor.cpp +5 -2
  156. package/src/duckdb/src/execution/index/art/art.cpp +12 -6
  157. package/src/duckdb/src/execution/index/art/art_key.cpp +3 -3
  158. package/src/duckdb/src/execution/index/art/leaf.cpp +2 -2
  159. package/src/duckdb/src/execution/index/art/node16.cpp +2 -2
  160. package/src/duckdb/src/execution/index/art/node256.cpp +3 -3
  161. package/src/duckdb/src/execution/index/art/node48.cpp +5 -5
  162. package/src/duckdb/src/execution/index/art/prefix.cpp +1 -1
  163. package/src/duckdb/src/execution/index/art/ub_duckdb_art_index_execution.cpp +12 -0
  164. package/src/duckdb/src/execution/index/art/ub_duckdb_execution_index_art.cpp +11 -0
  165. package/src/duckdb/src/execution/index/fixed_size_buffer.cpp +6 -5
  166. package/src/duckdb/src/execution/index/ub_duckdb_execution_index.cpp +3 -0
  167. package/src/duckdb/src/execution/nested_loop_join/ub_duckdb_nested_loop_join.cpp +3 -0
  168. package/src/duckdb/src/execution/operator/aggregate/aggregate_object.cpp +1 -1
  169. package/src/duckdb/src/execution/operator/aggregate/physical_hash_aggregate.cpp +3 -4
  170. package/src/duckdb/src/execution/operator/aggregate/physical_streaming_window.cpp +0 -1
  171. package/src/duckdb/src/execution/operator/aggregate/physical_ungrouped_aggregate.cpp +3 -4
  172. package/src/duckdb/src/execution/operator/aggregate/ub_duckdb_operator_aggregate.cpp +9 -0
  173. package/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_buffer.cpp +1 -1
  174. package/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_buffer_manager.cpp +8 -3
  175. package/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_file_handle.cpp +1 -1
  176. package/src/duckdb/src/execution/operator/csv_scanner/scanner/base_scanner.cpp +5 -5
  177. package/src/duckdb/src/execution/operator/csv_scanner/scanner/column_count_scanner.cpp +2 -3
  178. package/src/duckdb/src/execution/operator/csv_scanner/scanner/scanner_boundary.cpp +5 -1
  179. package/src/duckdb/src/execution/operator/csv_scanner/scanner/skip_scanner.cpp +2 -2
  180. package/src/duckdb/src/execution/operator/csv_scanner/scanner/string_value_scanner.cpp +151 -79
  181. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/csv_sniffer.cpp +11 -6
  182. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/dialect_detection.cpp +27 -6
  183. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/header_detection.cpp +71 -18
  184. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/type_detection.cpp +22 -11
  185. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/type_refinement.cpp +6 -4
  186. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/type_replacement.cpp +5 -3
  187. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/ub_duckdb_operator_csv_sniffer.cpp +7 -0
  188. package/src/duckdb/src/execution/operator/csv_scanner/state_machine/csv_state_machine.cpp +3 -3
  189. package/src/duckdb/src/execution/operator/csv_scanner/state_machine/csv_state_machine_cache.cpp +30 -5
  190. package/src/duckdb/src/execution/operator/csv_scanner/table_function/csv_file_scanner.cpp +6 -2
  191. package/src/duckdb/src/execution/operator/csv_scanner/table_function/global_csv_state.cpp +47 -46
  192. package/src/duckdb/src/execution/operator/csv_scanner/ub_duckdb_operator_csv_scanner.cpp +10 -0
  193. package/src/duckdb/src/execution/operator/csv_scanner/util/csv_error.cpp +102 -54
  194. package/src/duckdb/src/execution/operator/csv_scanner/util/csv_reader_options.cpp +8 -1
  195. package/src/duckdb/src/execution/operator/filter/ub_duckdb_operator_filter.cpp +2 -0
  196. package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +54 -36
  197. package/src/duckdb/src/execution/operator/helper/physical_limit_percent.cpp +56 -32
  198. package/src/duckdb/src/execution/operator/helper/physical_streaming_limit.cpp +9 -13
  199. package/src/duckdb/src/execution/operator/helper/physical_transaction.cpp +12 -0
  200. package/src/duckdb/src/execution/operator/helper/physical_verify_vector.cpp +221 -0
  201. package/src/duckdb/src/execution/operator/helper/ub_duckdb_operator_helper.cpp +18 -0
  202. package/src/duckdb/src/execution/operator/join/physical_asof_join.cpp +1 -0
  203. package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +23 -8
  204. package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +8 -3
  205. package/src/duckdb/src/execution/operator/join/ub_duckdb_operator_join.cpp +16 -0
  206. package/src/duckdb/src/execution/operator/order/physical_order.cpp +2 -3
  207. package/src/duckdb/src/execution/operator/order/physical_top_n.cpp +2 -7
  208. package/src/duckdb/src/execution/operator/order/ub_duckdb_operator_order.cpp +3 -0
  209. package/src/duckdb/src/execution/operator/persistent/physical_batch_copy_to_file.cpp +451 -55
  210. package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +312 -150
  211. package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +200 -75
  212. package/src/duckdb/src/execution/operator/persistent/physical_delete.cpp +1 -0
  213. package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +6 -5
  214. package/src/duckdb/src/execution/operator/persistent/ub_duckdb_operator_persistent.cpp +10 -0
  215. package/src/duckdb/src/execution/operator/projection/physical_pivot.cpp +3 -2
  216. package/src/duckdb/src/execution/operator/projection/ub_duckdb_operator_projection.cpp +5 -0
  217. package/src/duckdb/src/execution/operator/scan/ub_duckdb_operator_scan.cpp +7 -0
  218. package/src/duckdb/src/execution/operator/schema/ub_duckdb_operator_schema.cpp +12 -0
  219. package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +25 -0
  220. package/src/duckdb/src/execution/operator/set/ub_duckdb_operator_set.cpp +4 -0
  221. package/src/duckdb/src/execution/perfect_aggregate_hashtable.cpp +4 -4
  222. package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +2 -2
  223. package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +2 -2
  224. package/src/duckdb/src/execution/physical_plan/plan_copy_to_file.cpp +7 -17
  225. package/src/duckdb/src/execution/physical_plan/plan_distinct.cpp +10 -0
  226. package/src/duckdb/src/execution/physical_plan/plan_insert.cpp +7 -0
  227. package/src/duckdb/src/execution/physical_plan/plan_limit.cpp +45 -13
  228. package/src/duckdb/src/execution/physical_plan/ub_duckdb_physical_plan.cpp +44 -0
  229. package/src/duckdb/src/execution/physical_plan_generator.cpp +5 -3
  230. package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +13 -12
  231. package/src/duckdb/src/execution/ub_duckdb_execution.cpp +15 -0
  232. package/src/duckdb/src/execution/window_executor.cpp +71 -61
  233. package/src/duckdb/src/execution/window_segment_tree.cpp +6 -6
  234. package/src/duckdb/src/extension_forward_decl/icu.cpp +59 -0
  235. package/src/duckdb/src/function/aggregate/algebraic/ub_duckdb_aggr_algebraic.cpp +5 -0
  236. package/src/duckdb/src/function/aggregate/distributive/first.cpp +2 -2
  237. package/src/duckdb/src/function/aggregate/distributive/ub_duckdb_aggr_distr.cpp +3 -0
  238. package/src/duckdb/src/function/aggregate/holistic/ub_duckdb_aggr_holistic.cpp +5 -0
  239. package/src/duckdb/src/function/aggregate/nested/ub_duckdb_aggr_nested.cpp +3 -0
  240. package/src/duckdb/src/function/aggregate/regression/ub_duckdb_aggr_regr.cpp +8 -0
  241. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +3 -2
  242. package/src/duckdb/src/function/aggregate/ub_duckdb_func_aggr.cpp +3 -0
  243. package/src/duckdb/src/function/cast/array_casts.cpp +2 -4
  244. package/src/duckdb/src/function/cast/bit_cast.cpp +13 -13
  245. package/src/duckdb/src/function/cast/cast_function_set.cpp +2 -0
  246. package/src/duckdb/src/function/cast/decimal_cast.cpp +38 -44
  247. package/src/duckdb/src/function/cast/default_casts.cpp +5 -2
  248. package/src/duckdb/src/function/cast/enum_casts.cpp +5 -5
  249. package/src/duckdb/src/function/cast/list_casts.cpp +24 -14
  250. package/src/duckdb/src/function/cast/string_cast.cpp +48 -30
  251. package/src/duckdb/src/function/cast/struct_cast.cpp +2 -2
  252. package/src/duckdb/src/function/cast/time_casts.cpp +12 -0
  253. package/src/duckdb/src/function/cast/ub_duckdb_func_cast.cpp +17 -0
  254. package/src/duckdb/src/function/cast/union/ub_duckdb_union_cast.cpp +2 -0
  255. package/src/duckdb/src/function/cast/union_casts.cpp +13 -15
  256. package/src/duckdb/src/function/cast/vector_cast_helpers.cpp +1 -1
  257. package/src/duckdb/src/function/cast_rules.cpp +2 -1
  258. package/src/duckdb/src/function/pragma/ub_duckdb_func_pragma.cpp +3 -0
  259. package/src/duckdb/src/function/scalar/bit/ub_duckdb_func_bit.cpp +2 -0
  260. package/src/duckdb/src/function/scalar/blob/ub_duckdb_func_blob.cpp +3 -0
  261. package/src/duckdb/src/function/scalar/compressed_materialization/compress_integral.cpp +7 -6
  262. package/src/duckdb/src/function/scalar/compressed_materialization/compress_string.cpp +3 -3
  263. package/src/duckdb/src/function/scalar/compressed_materialization/ub_duckdb_func_compressed_materialization.cpp +3 -0
  264. package/src/duckdb/src/function/scalar/date/ub_duckdb_func_date.cpp +12 -0
  265. package/src/duckdb/src/function/scalar/enum/ub_duckdb_func_enum.cpp +2 -0
  266. package/src/duckdb/src/function/scalar/generic/ub_duckdb_func_generic.cpp +8 -0
  267. package/src/duckdb/src/function/scalar/generic/ub_duckdb_func_generic_main.cpp +2 -0
  268. package/src/duckdb/src/function/scalar/list/list_resize.cpp +3 -1
  269. package/src/duckdb/src/function/scalar/list/list_zip.cpp +3 -4
  270. package/src/duckdb/src/function/scalar/list/ub_duckdb_func_list.cpp +11 -0
  271. package/src/duckdb/src/function/scalar/list/ub_duckdb_func_list_nested.cpp +5 -0
  272. package/src/duckdb/src/function/scalar/map/ub_duckdb_func_map_nested.cpp +7 -0
  273. package/src/duckdb/src/function/scalar/math/ub_duckdb_func_math.cpp +4 -0
  274. package/src/duckdb/src/function/scalar/nested_functions.cpp +7 -3
  275. package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +1 -1
  276. package/src/duckdb/src/function/scalar/operators/multiply.cpp +4 -2
  277. package/src/duckdb/src/function/scalar/operators/subtract.cpp +9 -3
  278. package/src/duckdb/src/function/scalar/operators/ub_duckdb_func_ops.cpp +6 -0
  279. package/src/duckdb/src/function/scalar/operators/ub_duckdb_func_ops_main.cpp +5 -0
  280. package/src/duckdb/src/function/scalar/sequence/ub_duckdb_func_seq.cpp +2 -0
  281. package/src/duckdb/src/function/scalar/strftime_format.cpp +21 -20
  282. package/src/duckdb/src/function/scalar/string/like.cpp +14 -3
  283. package/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp +4 -2
  284. package/src/duckdb/src/function/scalar/string/regexp/ub_duckdb_func_string_regexp.cpp +3 -0
  285. package/src/duckdb/src/function/scalar/string/regexp.cpp +6 -4
  286. package/src/duckdb/src/function/scalar/string/suffix.cpp +1 -1
  287. package/src/duckdb/src/function/scalar/string/ub_duckdb_func_string.cpp +31 -0
  288. package/src/duckdb/src/function/scalar/string/ub_duckdb_func_string_main.cpp +12 -0
  289. package/src/duckdb/src/function/scalar/struct/ub_duckdb_func_struct.cpp +4 -0
  290. package/src/duckdb/src/function/scalar/struct/ub_duckdb_func_struct_main.cpp +2 -0
  291. package/src/duckdb/src/function/scalar/system/ub_duckdb_func_system.cpp +2 -0
  292. package/src/duckdb/src/function/scalar/ub_duckdb_func_scalar.cpp +9 -0
  293. package/src/duckdb/src/function/scalar/union/ub_duckdb_func_union.cpp +4 -0
  294. package/src/duckdb/src/function/table/arrow/arrow_array_scan_state.cpp +28 -2
  295. package/src/duckdb/src/function/table/arrow/ub_duckdb_arrow_conversion.cpp +2 -0
  296. package/src/duckdb/src/function/table/arrow.cpp +23 -6
  297. package/src/duckdb/src/function/table/arrow_conversion.cpp +75 -33
  298. package/src/duckdb/src/function/table/copy_csv.cpp +8 -3
  299. package/src/duckdb/src/function/table/range.cpp +5 -0
  300. package/src/duckdb/src/function/table/read_csv.cpp +9 -8
  301. package/src/duckdb/src/function/table/read_file.cpp +1 -1
  302. package/src/duckdb/src/function/table/sniff_csv.cpp +5 -5
  303. package/src/duckdb/src/function/table/system/duckdb_columns.cpp +6 -2
  304. package/src/duckdb/src/function/table/system/duckdb_secrets.cpp +5 -1
  305. package/src/duckdb/src/function/table/system/duckdb_sequences.cpp +3 -1
  306. package/src/duckdb/src/function/table/system/duckdb_settings.cpp +13 -1
  307. package/src/duckdb/src/function/table/system/test_all_types.cpp +64 -0
  308. package/src/duckdb/src/function/table/system/ub_duckdb_table_func_system.cpp +23 -0
  309. package/src/duckdb/src/function/table/ub_duckdb_func_table.cpp +16 -0
  310. package/src/duckdb/src/function/table/version/pragma_version.cpp +11 -2
  311. package/src/duckdb/src/function/table/version/ub_duckdb_func_table_version.cpp +2 -0
  312. package/src/duckdb/src/function/ub_duckdb_function.cpp +14 -0
  313. package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +11 -1
  314. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/view_catalog_entry.hpp +2 -0
  315. package/src/duckdb/src/include/duckdb/catalog/catalog_entry.hpp +1 -1
  316. package/src/duckdb/src/include/duckdb/common/allocator.hpp +8 -11
  317. package/src/duckdb/src/include/duckdb/common/arrow/appender/enum_data.hpp +2 -2
  318. package/src/duckdb/src/include/duckdb/common/arrow/appender/fixed_size_list_data.hpp +14 -0
  319. package/src/duckdb/src/include/duckdb/common/arrow/appender/list.hpp +1 -0
  320. package/src/duckdb/src/include/duckdb/common/arrow/appender/list_data.hpp +1 -1
  321. package/src/duckdb/src/include/duckdb/common/arrow/appender/varchar_data.hpp +2 -2
  322. package/src/duckdb/src/include/duckdb/common/bitpacking.hpp +2 -2
  323. package/src/duckdb/src/include/duckdb/common/bswap.hpp +6 -2
  324. package/src/duckdb/src/include/duckdb/common/enum_util.hpp +32 -0
  325. package/src/duckdb/src/include/duckdb/common/enums/catalog_lookup_behavior.hpp +21 -0
  326. package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +0 -1
  327. package/src/duckdb/src/include/duckdb/common/enums/physical_operator_type.hpp +1 -1
  328. package/src/duckdb/src/include/duckdb/common/enums/prepared_statement_mode.hpp +20 -0
  329. package/src/duckdb/src/include/duckdb/common/enums/statement_type.hpp +2 -0
  330. package/src/duckdb/src/include/duckdb/common/exception/conversion_exception.hpp +6 -0
  331. package/src/duckdb/src/include/duckdb/common/exception/parser_exception.hpp +4 -0
  332. package/src/duckdb/src/include/duckdb/common/exception.hpp +2 -0
  333. package/src/duckdb/src/include/duckdb/common/extra_type_info.hpp +3 -3
  334. package/src/duckdb/src/include/duckdb/common/file_opener.hpp +6 -5
  335. package/src/duckdb/src/include/duckdb/common/file_system.hpp +4 -2
  336. package/src/duckdb/src/include/duckdb/common/helper.hpp +7 -0
  337. package/src/duckdb/src/include/duckdb/common/limits.hpp +2 -2
  338. package/src/duckdb/src/include/duckdb/common/local_file_system.hpp +3 -0
  339. package/src/duckdb/src/include/duckdb/common/numeric_utils.hpp +64 -0
  340. package/src/duckdb/src/include/duckdb/common/operator/cast_operators.hpp +34 -33
  341. package/src/duckdb/src/include/duckdb/common/operator/decimal_cast_operators.hpp +150 -124
  342. package/src/duckdb/src/include/duckdb/common/operator/integer_cast_operator.hpp +5 -5
  343. package/src/duckdb/src/include/duckdb/common/radix.hpp +1 -1
  344. package/src/duckdb/src/include/duckdb/common/serializer/deserializer.hpp +1 -1
  345. package/src/duckdb/src/include/duckdb/common/sort/duckdb_pdqsort.hpp +4 -4
  346. package/src/duckdb/src/include/duckdb/common/types/bit.hpp +1 -1
  347. package/src/duckdb/src/include/duckdb/common/types/blob.hpp +4 -1
  348. package/src/duckdb/src/include/duckdb/common/types/cast_helpers.hpp +15 -13
  349. package/src/duckdb/src/include/duckdb/common/types/column/column_data_allocator.hpp +5 -0
  350. package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection.hpp +2 -0
  351. package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection_segment.hpp +3 -0
  352. package/src/duckdb/src/include/duckdb/common/types/column/partitioned_column_data.hpp +1 -1
  353. package/src/duckdb/src/include/duckdb/common/types/row/partitioned_tuple_data.hpp +1 -1
  354. package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_states.hpp +4 -1
  355. package/src/duckdb/src/include/duckdb/common/types/selection_vector.hpp +2 -1
  356. package/src/duckdb/src/include/duckdb/common/types/string_heap.hpp +2 -0
  357. package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +11 -4
  358. package/src/duckdb/src/include/duckdb/common/types/time.hpp +1 -1
  359. package/src/duckdb/src/include/duckdb/common/types/timestamp.hpp +7 -2
  360. package/src/duckdb/src/include/duckdb/common/types/uuid.hpp +3 -0
  361. package/src/duckdb/src/include/duckdb/common/types/value.hpp +7 -0
  362. package/src/duckdb/src/include/duckdb/common/types/vector.hpp +40 -7
  363. package/src/duckdb/src/include/duckdb/common/types/vector_buffer.hpp +1 -1
  364. package/src/duckdb/src/include/duckdb/common/types.hpp +1 -1
  365. package/src/duckdb/src/include/duckdb/common/vector_operations/general_cast.hpp +12 -4
  366. package/src/duckdb/src/include/duckdb/common/vector_operations/generic_executor.hpp +6 -6
  367. package/src/duckdb/src/include/duckdb/common/vector_operations/vector_operations.hpp +3 -2
  368. package/src/duckdb/src/include/duckdb/common/windows_undefs.hpp +4 -0
  369. package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_count.hpp +1 -1
  370. package/src/duckdb/src/include/duckdb/core_functions/scalar/list_functions.hpp +9 -0
  371. package/src/duckdb/src/include/duckdb/execution/column_binding_resolver.hpp +2 -1
  372. package/src/duckdb/src/include/duckdb/execution/executor.hpp +10 -0
  373. package/src/duckdb/src/include/duckdb/execution/expression_executor_state.hpp +1 -1
  374. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/base_scanner.hpp +262 -0
  375. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/column_count_scanner.hpp +70 -0
  376. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_buffer.hpp +103 -0
  377. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_buffer_manager.hpp +74 -0
  378. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_casting.hpp +154 -0
  379. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_error.hpp +130 -0
  380. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_file_handle.hpp +60 -0
  381. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_file_scanner.hpp +70 -0
  382. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_option.hpp +155 -0
  383. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_reader_options.hpp +166 -0
  384. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_sniffer.hpp +191 -0
  385. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_state.hpp +30 -0
  386. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_state_machine.hpp +99 -0
  387. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_state_machine_cache.hpp +91 -0
  388. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/global_csv_state.hpp +80 -0
  389. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/quote_rules.hpp +21 -0
  390. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/scanner_boundary.hpp +93 -0
  391. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/skip_scanner.hpp +60 -0
  392. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/state_machine_options.hpp +35 -0
  393. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/string_value_scanner.hpp +200 -0
  394. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_limit.hpp +13 -10
  395. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_limit_percent.hpp +5 -11
  396. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_streaming_limit.hpp +4 -6
  397. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_verify_vector.hpp +51 -0
  398. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_hash_join.hpp +3 -0
  399. package/src/duckdb/src/include/duckdb/execution/operator/persistent/batch_memory_manager.hpp +165 -0
  400. package/src/duckdb/src/include/duckdb/execution/operator/persistent/batch_task_manager.hpp +48 -0
  401. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_batch_copy_to_file.hpp +10 -17
  402. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_batch_insert.hpp +4 -0
  403. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_copy_to_file.hpp +2 -0
  404. package/src/duckdb/src/include/duckdb/execution/physical_operator_states.hpp +10 -6
  405. package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +0 -2
  406. package/src/duckdb/src/include/duckdb/execution/window_executor.hpp +2 -1
  407. package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +1 -1
  408. package/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp +1 -0
  409. package/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp +14 -5
  410. package/src/duckdb/src/include/duckdb/function/cast/vector_cast_helpers.hpp +27 -43
  411. package/src/duckdb/src/include/duckdb/function/compression_function.hpp +4 -4
  412. package/src/duckdb/src/include/duckdb/function/copy_function.hpp +3 -3
  413. package/src/duckdb/src/include/duckdb/function/function.hpp +1 -1
  414. package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +1 -0
  415. package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +1 -1
  416. package/src/duckdb/src/include/duckdb/function/scalar_function.hpp +1 -1
  417. package/src/duckdb/src/include/duckdb/function/table/arrow.hpp +10 -4
  418. package/src/duckdb/src/include/duckdb/function/table/read_csv.hpp +8 -6
  419. package/src/duckdb/src/include/duckdb/function/table_function.hpp +3 -3
  420. package/src/duckdb/src/include/duckdb/main/attached_database.hpp +3 -0
  421. package/src/duckdb/src/include/duckdb/main/capi/cast/from_decimal.hpp +6 -4
  422. package/src/duckdb/src/include/duckdb/main/capi/cast/to_decimal.hpp +17 -10
  423. package/src/duckdb/src/include/duckdb/main/client_config.hpp +2 -0
  424. package/src/duckdb/src/include/duckdb/main/client_context.hpp +17 -3
  425. package/src/duckdb/src/include/duckdb/main/client_context_file_opener.hpp +2 -2
  426. package/src/duckdb/src/include/duckdb/main/client_context_state.hpp +20 -0
  427. package/src/duckdb/src/include/duckdb/main/client_data.hpp +1 -1
  428. package/src/duckdb/src/include/duckdb/main/database.hpp +3 -2
  429. package/src/duckdb/src/include/duckdb/main/database_manager.hpp +2 -1
  430. package/src/duckdb/src/include/duckdb/main/extension/generated_extension_loader.hpp +1 -1
  431. package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +230 -199
  432. package/src/duckdb/src/include/duckdb/main/extension_helper.hpp +18 -0
  433. package/src/duckdb/src/include/duckdb/main/relation/read_csv_relation.hpp +1 -1
  434. package/src/duckdb/src/include/duckdb/main/relation/table_function_relation.hpp +2 -0
  435. package/src/duckdb/src/include/duckdb/main/relation.hpp +1 -1
  436. package/src/duckdb/src/include/duckdb/main/secret/secret_manager.hpp +4 -0
  437. package/src/duckdb/src/include/duckdb/main/settings.hpp +54 -10
  438. package/src/duckdb/src/include/duckdb/optimizer/join_order/relation_manager.hpp +2 -1
  439. package/src/duckdb/src/include/duckdb/optimizer/rule/ordered_aggregate_optimizer.hpp +2 -0
  440. package/src/duckdb/src/include/duckdb/parallel/concurrentqueue.hpp +21 -5
  441. package/src/duckdb/src/include/duckdb/parallel/event.hpp +1 -1
  442. package/src/duckdb/src/include/duckdb/parallel/executor_task.hpp +37 -0
  443. package/src/duckdb/src/include/duckdb/parallel/interrupt.hpp +1 -1
  444. package/src/duckdb/src/include/duckdb/parallel/pipeline.hpp +1 -1
  445. package/src/duckdb/src/include/duckdb/parallel/task.hpp +0 -20
  446. package/src/duckdb/src/include/duckdb/parallel/task_scheduler.hpp +4 -2
  447. package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +10 -0
  448. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_info.hpp +2 -1
  449. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp +0 -24
  450. package/src/duckdb/src/include/duckdb/parser/parsed_data/comment_on_column_info.hpp +46 -0
  451. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_view_info.hpp +2 -0
  452. package/src/duckdb/src/include/duckdb/parser/parsed_data/extra_drop_info.hpp +1 -1
  453. package/src/duckdb/src/include/duckdb/parser/parsed_data/parse_info.hpp +3 -2
  454. package/src/duckdb/src/include/duckdb/parser/tableref/pivotref.hpp +3 -3
  455. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +3 -3
  456. package/src/duckdb/src/include/duckdb/planner/binder.hpp +11 -4
  457. package/src/duckdb/src/include/duckdb/planner/bound_result_modifier.hpp +59 -23
  458. package/src/duckdb/src/include/duckdb/planner/expression.hpp +1 -0
  459. package/src/duckdb/src/include/duckdb/planner/expression_binder/column_alias_binder.hpp +2 -2
  460. package/src/duckdb/src/include/duckdb/planner/expression_iterator.hpp +11 -3
  461. package/src/duckdb/src/include/duckdb/planner/extension_callback.hpp +6 -0
  462. package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +0 -1
  463. package/src/duckdb/src/include/duckdb/planner/operator/logical_insert.hpp +1 -1
  464. package/src/duckdb/src/include/duckdb/planner/operator/logical_limit.hpp +5 -9
  465. package/src/duckdb/src/include/duckdb/planner/subquery/rewrite_correlated_expressions.hpp +0 -15
  466. package/src/duckdb/src/include/duckdb/storage/arena_allocator.hpp +5 -0
  467. package/src/duckdb/src/include/duckdb/storage/buffer/buffer_pool.hpp +40 -5
  468. package/src/duckdb/src/include/duckdb/storage/compression/alp/algorithm/alp.hpp +1 -1
  469. package/src/duckdb/src/include/duckdb/storage/compression/alp/alp_analyze.hpp +5 -1
  470. package/src/duckdb/src/include/duckdb/storage/compression/alp/alp_compress.hpp +4 -4
  471. package/src/duckdb/src/include/duckdb/storage/compression/alp/alp_utils.hpp +2 -1
  472. package/src/duckdb/src/include/duckdb/storage/compression/alprd/algorithm/alprd.hpp +10 -8
  473. package/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_analyze.hpp +5 -1
  474. package/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_compress.hpp +3 -3
  475. package/src/duckdb/src/include/duckdb/storage/compression/chimp/algorithm/bit_reader.hpp +11 -10
  476. package/src/duckdb/src/include/duckdb/storage/compression/chimp/algorithm/bit_utils.hpp +3 -1
  477. package/src/duckdb/src/include/duckdb/storage/compression/chimp/algorithm/chimp128.hpp +1 -1
  478. package/src/duckdb/src/include/duckdb/storage/compression/chimp/algorithm/leading_zero_buffer.hpp +5 -3
  479. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_scan.hpp +2 -1
  480. package/src/duckdb/src/include/duckdb/storage/data_pointer.hpp +1 -1
  481. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +3 -1
  482. package/src/duckdb/src/include/duckdb/storage/index.hpp +1 -1
  483. package/src/duckdb/src/include/duckdb/storage/partial_block_manager.hpp +1 -1
  484. package/src/duckdb/src/include/duckdb/storage/standard_buffer_manager.hpp +3 -0
  485. package/src/duckdb/src/include/duckdb/storage/storage_manager.hpp +1 -1
  486. package/src/duckdb/src/include/duckdb/storage/table/append_state.hpp +0 -2
  487. package/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp +1 -1
  488. package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +5 -3
  489. package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +2 -2
  490. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +5 -0
  491. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +9 -2
  492. package/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp +2 -6
  493. package/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +3 -3
  494. package/src/duckdb/src/include/duckdb/storage/temporary_file_manager.hpp +169 -0
  495. package/src/duckdb/src/include/duckdb/transaction/duck_transaction_manager.hpp +11 -1
  496. package/src/duckdb/src/include/duckdb/transaction/meta_transaction.hpp +6 -1
  497. package/src/duckdb/src/include/duckdb/transaction/transaction.hpp +1 -1
  498. package/src/duckdb/src/include/duckdb.h +119 -67
  499. package/src/duckdb/src/main/appender.cpp +2 -1
  500. package/src/duckdb/src/main/attached_database.cpp +49 -27
  501. package/src/duckdb/src/main/capi/appender-c.cpp +1 -1
  502. package/src/duckdb/src/main/capi/cast/ub_duckdb_main_capi_cast.cpp +3 -0
  503. package/src/duckdb/src/main/capi/cast/utils-c.cpp +1 -1
  504. package/src/duckdb/src/main/capi/data_chunk-c.cpp +9 -1
  505. package/src/duckdb/src/main/capi/datetime-c.cpp +14 -8
  506. package/src/duckdb/src/main/capi/duckdb_value-c.cpp +29 -2
  507. package/src/duckdb/src/main/capi/helper-c.cpp +2 -0
  508. package/src/duckdb/src/main/capi/hugeint-c.cpp +2 -1
  509. package/src/duckdb/src/main/capi/logical_types-c.cpp +35 -1
  510. package/src/duckdb/src/main/capi/result-c.cpp +9 -0
  511. package/src/duckdb/src/main/capi/ub_duckdb_main_capi.cpp +19 -0
  512. package/src/duckdb/src/main/chunk_scan_state/ub_duckdb_main_chunk_scan_state.cpp +2 -0
  513. package/src/duckdb/src/main/client_context.cpp +133 -33
  514. package/src/duckdb/src/main/client_context_file_opener.cpp +8 -7
  515. package/src/duckdb/src/main/config.cpp +2 -0
  516. package/src/duckdb/src/main/connection_manager.cpp +8 -0
  517. package/src/duckdb/src/main/database.cpp +13 -4
  518. package/src/duckdb/src/main/database_manager.cpp +10 -1
  519. package/src/duckdb/src/main/extension/extension_helper.cpp +8 -5
  520. package/src/duckdb/src/main/extension/extension_install.cpp +1 -1
  521. package/src/duckdb/src/main/extension/ub_duckdb_main_extension.cpp +6 -0
  522. package/src/duckdb/src/main/prepared_statement_data.cpp +23 -6
  523. package/src/duckdb/src/main/query_profiler.cpp +9 -7
  524. package/src/duckdb/src/main/relation/read_csv_relation.cpp +17 -12
  525. package/src/duckdb/src/main/relation/ub_duckdb_main_relation.cpp +26 -0
  526. package/src/duckdb/src/main/relation/value_relation.cpp +2 -0
  527. package/src/duckdb/src/main/secret/secret.cpp +1 -1
  528. package/src/duckdb/src/main/secret/secret_manager.cpp +41 -8
  529. package/src/duckdb/src/main/secret/secret_storage.cpp +8 -2
  530. package/src/duckdb/src/main/settings/settings.cpp +42 -2
  531. package/src/duckdb/src/main/settings/ub_duckdb_main_settings.cpp +2 -0
  532. package/src/duckdb/src/main/ub_duckdb_main.cpp +25 -0
  533. package/src/duckdb/src/optimizer/compressed_materialization/ub_duckdb_optimizer_compressed_materialization.cpp +4 -0
  534. package/src/duckdb/src/optimizer/filter_combiner.cpp +20 -14
  535. package/src/duckdb/src/optimizer/in_clause_rewriter.cpp +5 -1
  536. package/src/duckdb/src/optimizer/join_order/relation_manager.cpp +23 -11
  537. package/src/duckdb/src/optimizer/join_order/ub_duckdb_optimizer_join_order.cpp +12 -0
  538. package/src/duckdb/src/optimizer/matcher/ub_duckdb_optimizer_matcher.cpp +2 -0
  539. package/src/duckdb/src/optimizer/pullup/ub_duckdb_optimizer_pullup.cpp +6 -0
  540. package/src/duckdb/src/optimizer/pushdown/pushdown_limit.cpp +1 -1
  541. package/src/duckdb/src/optimizer/pushdown/ub_duckdb_optimizer_pushdown.cpp +12 -0
  542. package/src/duckdb/src/optimizer/remove_unused_columns.cpp +7 -6
  543. package/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp +8 -6
  544. package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +1 -1
  545. package/src/duckdb/src/optimizer/rule/ub_duckdb_optimizer_rules.cpp +16 -0
  546. package/src/duckdb/src/optimizer/statistics/expression/propagate_cast.cpp +71 -1
  547. package/src/duckdb/src/optimizer/statistics/expression/ub_duckdb_optimizer_statistics_expr.cpp +11 -0
  548. package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +1 -1
  549. package/src/duckdb/src/optimizer/statistics/operator/propagate_limit.cpp +5 -1
  550. package/src/duckdb/src/optimizer/statistics/operator/ub_duckdb_optimizer_statistics_op.cpp +11 -0
  551. package/src/duckdb/src/optimizer/topn_optimizer.cpp +12 -11
  552. package/src/duckdb/src/optimizer/ub_duckdb_optimizer.cpp +20 -0
  553. package/src/duckdb/src/parallel/executor.cpp +8 -19
  554. package/src/duckdb/src/parallel/executor_task.cpp +6 -2
  555. package/src/duckdb/src/parallel/pipeline.cpp +12 -6
  556. package/src/duckdb/src/parallel/pipeline_executor.cpp +1 -1
  557. package/src/duckdb/src/parallel/pipeline_finish_event.cpp +2 -2
  558. package/src/duckdb/src/parallel/pipeline_initialize_event.cpp +1 -2
  559. package/src/duckdb/src/parallel/task_scheduler.cpp +15 -8
  560. package/src/duckdb/src/parallel/ub_duckdb_parallel.cpp +15 -0
  561. package/src/duckdb/src/parser/constraints/ub_duckdb_constraints.cpp +5 -0
  562. package/src/duckdb/src/parser/expression/ub_duckdb_expression.cpp +18 -0
  563. package/src/duckdb/src/parser/parsed_data/alter_table_info.cpp +0 -18
  564. package/src/duckdb/src/parser/parsed_data/comment_on_column_info.cpp +44 -0
  565. package/src/duckdb/src/parser/parsed_data/create_view_info.cpp +1 -0
  566. package/src/duckdb/src/parser/parsed_data/extra_drop_info.cpp +2 -0
  567. package/src/duckdb/src/parser/parsed_data/ub_duckdb_parsed_data.cpp +24 -0
  568. package/src/duckdb/src/parser/parser.cpp +1 -1
  569. package/src/duckdb/src/parser/query_error_context.cpp +15 -1
  570. package/src/duckdb/src/parser/query_node/ub_duckdb_query_node.cpp +5 -0
  571. package/src/duckdb/src/parser/statement/export_statement.cpp +2 -1
  572. package/src/duckdb/src/parser/statement/relation_statement.cpp +2 -2
  573. package/src/duckdb/src/parser/statement/ub_duckdb_statement.cpp +25 -0
  574. package/src/duckdb/src/parser/tableref/pivotref.cpp +3 -3
  575. package/src/duckdb/src/parser/tableref/showref.cpp +2 -0
  576. package/src/duckdb/src/parser/tableref/ub_duckdb_parser_tableref.cpp +8 -0
  577. package/src/duckdb/src/parser/transform/constraint/ub_duckdb_transformer_constraint.cpp +2 -0
  578. package/src/duckdb/src/parser/transform/expression/transform_boolean_test.cpp +1 -1
  579. package/src/duckdb/src/parser/transform/expression/transform_cast.cpp +10 -2
  580. package/src/duckdb/src/parser/transform/expression/transform_constant.cpp +7 -7
  581. package/src/duckdb/src/parser/transform/expression/transform_interval.cpp +2 -1
  582. package/src/duckdb/src/parser/transform/expression/ub_duckdb_transformer_expression.cpp +20 -0
  583. package/src/duckdb/src/parser/transform/helpers/transform_typename.cpp +2 -2
  584. package/src/duckdb/src/parser/transform/helpers/ub_duckdb_transformer_helpers.cpp +8 -0
  585. package/src/duckdb/src/parser/transform/statement/transform_comment_on.cpp +3 -8
  586. package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +3 -1
  587. package/src/duckdb/src/parser/transform/statement/transform_show_select.cpp +2 -3
  588. package/src/duckdb/src/parser/transform/statement/ub_duckdb_transformer_statement.cpp +37 -0
  589. package/src/duckdb/src/parser/transform/tableref/transform_join.cpp +16 -0
  590. package/src/duckdb/src/parser/transform/tableref/transform_pivot.cpp +49 -32
  591. package/src/duckdb/src/parser/transform/tableref/ub_duckdb_transformer_tableref.cpp +8 -0
  592. package/src/duckdb/src/parser/ub_duckdb_parser.cpp +15 -0
  593. package/src/duckdb/src/planner/binder/expression/bind_lambda.cpp +11 -4
  594. package/src/duckdb/src/planner/binder/expression/bind_operator_expression.cpp +4 -1
  595. package/src/duckdb/src/planner/binder/expression/bind_star_expression.cpp +71 -5
  596. package/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp +35 -1
  597. package/src/duckdb/src/planner/binder/expression/ub_duckdb_bind_expression.cpp +20 -0
  598. package/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +55 -51
  599. package/src/duckdb/src/planner/binder/query_node/plan_query_node.cpp +1 -11
  600. package/src/duckdb/src/planner/binder/query_node/plan_subquery.cpp +2 -2
  601. package/src/duckdb/src/planner/binder/query_node/ub_duckdb_bind_query_node.cpp +12 -0
  602. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +12 -6
  603. package/src/duckdb/src/planner/binder/statement/bind_drop.cpp +1 -1
  604. package/src/duckdb/src/planner/binder/statement/bind_export.cpp +8 -2
  605. package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +6 -3
  606. package/src/duckdb/src/planner/binder/statement/bind_simple.cpp +13 -2
  607. package/src/duckdb/src/planner/binder/statement/ub_duckdb_bind_statement.cpp +26 -0
  608. package/src/duckdb/src/planner/binder/tableref/bind_basetableref.cpp +15 -4
  609. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +9 -2
  610. package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +93 -45
  611. package/src/duckdb/src/planner/binder/tableref/bind_subqueryref.cpp +6 -1
  612. package/src/duckdb/src/planner/binder/tableref/ub_duckdb_bind_tableref.cpp +17 -0
  613. package/src/duckdb/src/planner/binder.cpp +22 -23
  614. package/src/duckdb/src/planner/bound_result_modifier.cpp +67 -4
  615. package/src/duckdb/src/planner/expression/bound_cast_expression.cpp +5 -1
  616. package/src/duckdb/src/planner/expression/bound_window_expression.cpp +3 -0
  617. package/src/duckdb/src/planner/expression/ub_duckdb_planner_expression.cpp +19 -0
  618. package/src/duckdb/src/planner/expression_binder/column_alias_binder.cpp +14 -9
  619. package/src/duckdb/src/planner/expression_binder/having_binder.cpp +17 -9
  620. package/src/duckdb/src/planner/expression_binder/lateral_binder.cpp +61 -37
  621. package/src/duckdb/src/planner/expression_binder/qualify_binder.cpp +8 -4
  622. package/src/duckdb/src/planner/expression_binder/ub_duckdb_expression_binders.cpp +20 -0
  623. package/src/duckdb/src/planner/expression_binder/where_binder.cpp +3 -2
  624. package/src/duckdb/src/planner/expression_iterator.cpp +73 -52
  625. package/src/duckdb/src/planner/filter/ub_duckdb_planner_filter.cpp +4 -0
  626. package/src/duckdb/src/planner/logical_operator_visitor.cpp +4 -14
  627. package/src/duckdb/src/planner/operator/logical_limit.cpp +14 -6
  628. package/src/duckdb/src/planner/operator/ub_duckdb_planner_operator.cpp +43 -0
  629. package/src/duckdb/src/planner/parsed_data/ub_duckdb_planner_parsed_data.cpp +2 -0
  630. package/src/duckdb/src/planner/planner.cpp +3 -0
  631. package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +46 -18
  632. package/src/duckdb/src/planner/subquery/rewrite_correlated_expressions.cpp +39 -33
  633. package/src/duckdb/src/planner/subquery/ub_duckdb_planner_subquery.cpp +4 -0
  634. package/src/duckdb/src/planner/ub_duckdb_planner.cpp +15 -0
  635. package/src/duckdb/src/storage/arena_allocator.cpp +9 -0
  636. package/src/duckdb/src/storage/buffer/block_handle.cpp +7 -2
  637. package/src/duckdb/src/storage/buffer/block_manager.cpp +7 -3
  638. package/src/duckdb/src/storage/buffer/buffer_pool.cpp +121 -24
  639. package/src/duckdb/src/storage/buffer/ub_duckdb_storage_buffer.cpp +6 -0
  640. package/src/duckdb/src/storage/checkpoint/ub_duckdb_storage_checkpoint.cpp +5 -0
  641. package/src/duckdb/src/storage/checkpoint/write_overflow_strings_to_disk.cpp +4 -4
  642. package/src/duckdb/src/storage/compression/chimp/ub_duckdb_storage_compression_chimp.cpp +6 -0
  643. package/src/duckdb/src/storage/compression/dictionary_compression.cpp +6 -5
  644. package/src/duckdb/src/storage/compression/fsst.cpp +3 -2
  645. package/src/duckdb/src/storage/compression/rle.cpp +1 -1
  646. package/src/duckdb/src/storage/compression/string_uncompressed.cpp +4 -4
  647. package/src/duckdb/src/storage/compression/ub_duckdb_storage_compression.cpp +12 -0
  648. package/src/duckdb/src/storage/data_table.cpp +6 -3
  649. package/src/duckdb/src/storage/local_storage.cpp +5 -2
  650. package/src/duckdb/src/storage/metadata/metadata_manager.cpp +4 -4
  651. package/src/duckdb/src/storage/metadata/metadata_reader.cpp +1 -1
  652. package/src/duckdb/src/storage/metadata/metadata_writer.cpp +1 -1
  653. package/src/duckdb/src/storage/metadata/ub_duckdb_storage_metadata.cpp +4 -0
  654. package/src/duckdb/src/storage/partial_block_manager.cpp +1 -1
  655. package/src/duckdb/src/storage/serialization/serialize_create_info.cpp +2 -0
  656. package/src/duckdb/src/storage/serialization/serialize_expression.cpp +3 -0
  657. package/src/duckdb/src/storage/serialization/serialize_logical_operator.cpp +5 -29
  658. package/src/duckdb/src/storage/serialization/serialize_nodes.cpp +22 -4
  659. package/src/duckdb/src/storage/serialization/serialize_parse_info.cpp +12 -32
  660. package/src/duckdb/src/storage/serialization/ub_duckdb_storage_serialization.cpp +16 -0
  661. package/src/duckdb/src/storage/standard_buffer_manager.cpp +29 -397
  662. package/src/duckdb/src/storage/statistics/string_stats.cpp +1 -1
  663. package/src/duckdb/src/storage/statistics/ub_duckdb_storage_statistics.cpp +10 -0
  664. package/src/duckdb/src/storage/storage_info.cpp +1 -1
  665. package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +3 -3
  666. package/src/duckdb/src/storage/table/column_data.cpp +7 -16
  667. package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +4 -1
  668. package/src/duckdb/src/storage/table/column_segment.cpp +68 -78
  669. package/src/duckdb/src/storage/table/list_column_data.cpp +1 -0
  670. package/src/duckdb/src/storage/table/row_group.cpp +17 -7
  671. package/src/duckdb/src/storage/table/row_group_collection.cpp +28 -27
  672. package/src/duckdb/src/storage/table/ub_duckdb_storage_table.cpp +17 -0
  673. package/src/duckdb/src/storage/table/update_segment.cpp +7 -7
  674. package/src/duckdb/src/storage/temporary_file_manager.cpp +334 -0
  675. package/src/duckdb/src/storage/ub_duckdb_storage.cpp +20 -0
  676. package/src/duckdb/src/storage/write_ahead_log.cpp +3 -2
  677. package/src/duckdb/src/transaction/commit_state.cpp +4 -2
  678. package/src/duckdb/src/transaction/duck_transaction_manager.cpp +32 -17
  679. package/src/duckdb/src/transaction/meta_transaction.cpp +24 -0
  680. package/src/duckdb/src/transaction/transaction_context.cpp +0 -9
  681. package/src/duckdb/src/transaction/ub_duckdb_transaction.cpp +11 -0
  682. package/src/duckdb/src/transaction/undo_buffer.cpp +1 -1
  683. package/src/duckdb/third_party/jaro_winkler/details/common.hpp +1 -1
  684. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +2 -0
  685. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +1032 -551
  686. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +24122 -24304
  687. package/src/duckdb/third_party/mbedtls/include/mbedtls/mbedtls_config.h +0 -3
  688. package/src/duckdb/third_party/mbedtls/library/entropy_poll.cpp +32 -4
  689. package/src/duckdb/third_party/miniz/miniz_wrapper.hpp +4 -4
  690. package/src/duckdb/third_party/tdigest/t_digest.hpp +3 -3
  691. package/src/duckdb/ub_src_common_arrow_appender.cpp +2 -0
  692. package/src/duckdb/ub_src_common_exception.cpp +2 -0
  693. package/src/duckdb/ub_src_execution_operator_helper.cpp +2 -0
  694. package/src/duckdb/ub_src_execution_operator_persistent.cpp +0 -2
  695. package/src/duckdb/ub_src_execution_physical_plan.cpp +0 -2
  696. package/src/duckdb/ub_src_parser_parsed_data.cpp +1 -1
  697. package/src/duckdb/ub_src_planner_operator.cpp +0 -2
  698. package/src/duckdb/ub_src_storage.cpp +2 -0
  699. package/test/columns.test.ts +1 -1
  700. package/test/test_all_types.test.ts +1 -1
package/binding.gyp CHANGED
@@ -389,6 +389,9 @@
389
389
  {
390
390
  "defines": [
391
391
  "DUCKDB_BUILD_LIBRARY"
392
+ ],
393
+ "libraries": [
394
+ "rstrtmgr.lib", "bcrypt.lib"
392
395
  ]
393
396
  }
394
397
  ]
@@ -411,4 +414,4 @@
411
414
  ]
412
415
  }
413
416
  ]
414
- }
417
+ }
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "duckdb",
3
3
  "main": "./lib/duckdb.js",
4
4
  "types": "./lib/duckdb.d.ts",
5
- "version": "0.10.1-dev22.0",
5
+ "version": "0.10.1-dev26.0",
6
6
  "description": "DuckDB node.js API",
7
7
  "gypfile": true,
8
8
  "dependencies": {
@@ -246,7 +246,7 @@ struct ICUStrptime : public ICUDateFunc {
246
246
  TailPatch(name, db, types);
247
247
  }
248
248
 
249
- static bool CastFromVarchar(Vector &source, Vector &result, idx_t count, CastParameters &parameters) {
249
+ static bool VarcharToTimestampTZ(Vector &source, Vector &result, idx_t count, CastParameters &parameters) {
250
250
  auto &cast_data = parameters.cast_data->Cast<CastData>();
251
251
  auto &info = cast_data.info->Cast<BindData>();
252
252
  CalendarPtr cal(info.calendar->clone());
@@ -260,7 +260,7 @@ struct ICUStrptime : public ICUDateFunc {
260
260
  bool has_offset = false;
261
261
  if (!Timestamp::TryConvertTimestampTZ(str, len, result, has_offset, tz)) {
262
262
  auto msg = Timestamp::ConversionError(string(str, len));
263
- HandleCastError::AssignError(msg, parameters.error_message);
263
+ HandleCastError::AssignError(msg, parameters);
264
264
  mask.SetInvalid(idx);
265
265
  } else if (!has_offset) {
266
266
  // Convert parts to a TZ (default or parsed) if no offset was provided
@@ -280,15 +280,56 @@ struct ICUStrptime : public ICUDateFunc {
280
280
  return true;
281
281
  }
282
282
 
283
+ static bool VarcharToTimeTZ(Vector &source, Vector &result, idx_t count, CastParameters &parameters) {
284
+ auto &cast_data = parameters.cast_data->Cast<CastData>();
285
+ auto &info = cast_data.info->Cast<BindData>();
286
+ CalendarPtr cal(info.calendar->clone());
287
+
288
+ UnaryExecutor::ExecuteWithNulls<string_t, dtime_tz_t>(
289
+ source, result, count, [&](string_t input, ValidityMask &mask, idx_t idx) {
290
+ dtime_tz_t result;
291
+ const auto str = input.GetData();
292
+ const auto len = input.GetSize();
293
+ bool has_offset = false;
294
+ idx_t pos = 0;
295
+ if (!Time::TryConvertTimeTZ(str, len, pos, result, has_offset, false)) {
296
+ auto msg = Time::ConversionError(string(str, len));
297
+ HandleCastError::AssignError(msg, parameters);
298
+ mask.SetInvalid(idx);
299
+ } else if (!has_offset) {
300
+ // Convert parts to a TZ (default or parsed) if no offset was provided
301
+ auto calendar = cal.get();
302
+
303
+ // Extract the offset from the calendar
304
+ auto offset = ExtractField(calendar, UCAL_ZONE_OFFSET);
305
+ offset += ExtractField(calendar, UCAL_DST_OFFSET);
306
+ offset /= Interval::MSECS_PER_SEC;
307
+
308
+ // Apply it to the offset +00 time we parsed.
309
+ result = dtime_tz_t(result.time(), offset);
310
+ }
311
+
312
+ return result;
313
+ });
314
+ return true;
315
+ }
316
+
283
317
  static BoundCastInfo BindCastFromVarchar(BindCastInput &input, const LogicalType &source,
284
318
  const LogicalType &target) {
285
319
  if (!input.context) {
286
- throw InternalException("Missing context for VARCHAR to TIMESTAMPTZ cast.");
320
+ throw InternalException("Missing context for VARCHAR to TIME/TIMESTAMPTZ cast.");
287
321
  }
288
322
 
289
323
  auto cast_data = make_uniq<CastData>(make_uniq<BindData>(*input.context));
290
324
 
291
- return BoundCastInfo(CastFromVarchar, std::move(cast_data));
325
+ switch (target.id()) {
326
+ case LogicalTypeId::TIMESTAMP_TZ:
327
+ return BoundCastInfo(VarcharToTimestampTZ, std::move(cast_data));
328
+ case LogicalTypeId::TIME_TZ:
329
+ return BoundCastInfo(VarcharToTimeTZ, std::move(cast_data));
330
+ default:
331
+ throw InternalException("Unsupported type for VARCHAR to TIME/TIMESTAMPTZ cast.");
332
+ }
292
333
  }
293
334
 
294
335
  static void AddCasts(DatabaseInstance &db) {
@@ -296,6 +337,7 @@ struct ICUStrptime : public ICUDateFunc {
296
337
  auto &casts = config.GetCastFunctions();
297
338
 
298
339
  casts.RegisterCastFunction(LogicalType::VARCHAR, LogicalType::TIMESTAMP_TZ, BindCastFromVarchar);
340
+ casts.RegisterCastFunction(LogicalType::VARCHAR, LogicalType::TIME_TZ, BindCastFromVarchar);
299
341
  }
300
342
  };
301
343
 
@@ -90,6 +90,11 @@ struct ICUTableRange {
90
90
 
91
91
  auto &inputs = input.inputs;
92
92
  D_ASSERT(inputs.size() == 3);
93
+ for (const auto &value : inputs) {
94
+ if (value.IsNull()) {
95
+ throw BinderException("RANGE with NULL bounds is not supported");
96
+ }
97
+ }
93
98
  result->start = inputs[0].GetValue<timestamp_t>();
94
99
  result->end = inputs[1].GetValue<timestamp_t>();
95
100
  result->increment = inputs[2].GetValue<interval_t>();
@@ -8,6 +8,7 @@
8
8
  #include "duckdb/parser/parsed_data/create_table_function_info.hpp"
9
9
  #include "include/icu-datefunc.hpp"
10
10
  #include "duckdb/transaction/meta_transaction.hpp"
11
+ #include "duckdb/common/operator/cast_operators.hpp"
11
12
 
12
13
  namespace duckdb {
13
14
 
@@ -138,13 +139,23 @@ struct ICUFromNaiveTimestamp : public ICUDateFunc {
138
139
  return GetTime(calendar, micros);
139
140
  }
140
141
 
142
+ struct CastTimestampUsToUs {
143
+ template <class SRC, class DST>
144
+ static inline DST Operation(SRC input) {
145
+ // no-op
146
+ return input;
147
+ }
148
+ };
149
+
150
+ template <class OP>
141
151
  static bool CastFromNaive(Vector &source, Vector &result, idx_t count, CastParameters &parameters) {
142
152
  auto &cast_data = parameters.cast_data->Cast<CastData>();
143
153
  auto &info = cast_data.info->Cast<BindData>();
144
154
  CalendarPtr calendar(info.calendar->clone());
145
155
 
146
- UnaryExecutor::Execute<timestamp_t, timestamp_t>(
147
- source, result, count, [&](timestamp_t input) { return Operation(calendar.get(), input); });
156
+ UnaryExecutor::Execute<timestamp_t, timestamp_t>(source, result, count, [&](timestamp_t input) {
157
+ return Operation(calendar.get(), OP::template Operation<timestamp_t, timestamp_t>(input));
158
+ });
148
159
  return true;
149
160
  }
150
161
 
@@ -154,8 +165,18 @@ struct ICUFromNaiveTimestamp : public ICUDateFunc {
154
165
  }
155
166
 
156
167
  auto cast_data = make_uniq<CastData>(make_uniq<BindData>(*input.context));
157
-
158
- return BoundCastInfo(CastFromNaive, std::move(cast_data));
168
+ switch (source.id()) {
169
+ case LogicalTypeId::TIMESTAMP:
170
+ return BoundCastInfo(CastFromNaive<CastTimestampUsToUs>, std::move(cast_data));
171
+ case LogicalTypeId::TIMESTAMP_MS:
172
+ return BoundCastInfo(CastFromNaive<CastTimestampMsToUs>, std::move(cast_data));
173
+ case LogicalTypeId::TIMESTAMP_NS:
174
+ return BoundCastInfo(CastFromNaive<CastTimestampNsToUs>, std::move(cast_data));
175
+ case LogicalTypeId::TIMESTAMP_SEC:
176
+ return BoundCastInfo(CastFromNaive<CastTimestampSecToUs>, std::move(cast_data));
177
+ default:
178
+ throw InternalException("Type %s not handled in BindCastFromNaive", LogicalTypeIdToString(source.id()));
179
+ }
159
180
  }
160
181
 
161
182
  static void AddCasts(DatabaseInstance &db) {
@@ -163,6 +184,9 @@ struct ICUFromNaiveTimestamp : public ICUDateFunc {
163
184
  auto &casts = config.GetCastFunctions();
164
185
 
165
186
  casts.RegisterCastFunction(LogicalType::TIMESTAMP, LogicalType::TIMESTAMP_TZ, BindCastFromNaive);
187
+ casts.RegisterCastFunction(LogicalType::TIMESTAMP_MS, LogicalType::TIMESTAMP_TZ, BindCastFromNaive);
188
+ casts.RegisterCastFunction(LogicalType::TIMESTAMP_NS, LogicalType::TIMESTAMP_TZ, BindCastFromNaive);
189
+ casts.RegisterCastFunction(LogicalType::TIMESTAMP_S, LogicalType::TIMESTAMP_TZ, BindCastFromNaive);
166
190
  }
167
191
  };
168
192
 
@@ -304,11 +304,11 @@ idx_t BufferedJSONReader::GetLineNumber(idx_t buf_index, idx_t line_or_object_in
304
304
  line += buffer_line_or_object_counts[b_idx];
305
305
  }
306
306
  }
307
- }
308
- if (can_throw) {
309
- thrown = true;
310
- // SQL uses 1-based indexing so I guess we will do that in our exception here as well
311
- return line + 1;
307
+ if (can_throw) {
308
+ thrown = true;
309
+ // SQL uses 1-based indexing so I guess we will do that in our exception here as well
310
+ return line + 1;
311
+ }
312
312
  }
313
313
  TaskScheduler::YieldThread();
314
314
  }
@@ -331,6 +331,7 @@ void BufferedJSONReader::ThrowTransformError(idx_t buf_index, idx_t line_or_obje
331
331
  }
332
332
 
333
333
  double BufferedJSONReader::GetProgress() const {
334
+ lock_guard<mutex> guard(lock);
334
335
  if (HasFileHandle()) {
335
336
  return 100.0 - 100.0 * double(file_handle->Remaining()) / double(file_handle->FileSize());
336
337
  } else {
@@ -90,9 +90,9 @@ private:
90
90
 
91
91
  //! Read properties
92
92
  idx_t read_position;
93
- idx_t requested_reads;
93
+ atomic<idx_t> requested_reads;
94
94
  atomic<idx_t> actual_reads;
95
- bool last_read_requested;
95
+ atomic<bool> last_read_requested;
96
96
 
97
97
  //! Cached buffers for resetting when reading stream
98
98
  vector<AllocatedData> cached_buffers;
@@ -161,7 +161,7 @@ private:
161
161
  bool thrown;
162
162
 
163
163
  public:
164
- mutex lock;
164
+ mutable mutex lock;
165
165
  MultiFileReaderData reader_data;
166
166
  };
167
167
 
@@ -40,6 +40,8 @@ public:
40
40
  string error_message;
41
41
  //! Index of the object where the error occurred
42
42
  idx_t object_index = DConstants::INVALID_INDEX;
43
+ //! Cast parameters
44
+ CastParameters parameters;
43
45
 
44
46
  public:
45
47
  void Serialize(Serializer &serializer) const;
@@ -61,6 +61,9 @@ static LogicalType GetJSONType(StructNames &const_struct_names, const LogicalTyp
61
61
  // The nested types need to conform as well
62
62
  case LogicalTypeId::LIST:
63
63
  return LogicalType::LIST(GetJSONType(const_struct_names, ListType::GetChildType(type)));
64
+ case LogicalTypeId::ARRAY:
65
+ return LogicalType::ARRAY(GetJSONType(const_struct_names, ArrayType::GetChildType(type)),
66
+ ArrayType::GetSize(type));
64
67
  // Struct and MAP are treated as JSON values
65
68
  case LogicalTypeId::STRUCT: {
66
69
  child_list_t<LogicalType> child_types;
@@ -435,6 +438,9 @@ static void CreateValuesList(const StructNames &names, yyjson_mut_doc *doc, yyjs
435
438
 
436
439
  static void CreateValuesArray(const StructNames &names, yyjson_mut_doc *doc, yyjson_mut_val *vals[], Vector &value_v,
437
440
  idx_t count) {
441
+
442
+ value_v.Flatten(count);
443
+
438
444
  // Initialize array for the nested values
439
445
  auto &child_v = ArrayVector::GetEntry(value_v);
440
446
  auto array_size = ArrayType::GetSize(value_v.GetType());
@@ -13,13 +13,13 @@
13
13
 
14
14
  namespace duckdb {
15
15
 
16
- JSONTransformOptions::JSONTransformOptions() {
16
+ JSONTransformOptions::JSONTransformOptions() : parameters(false, &error_message) {
17
17
  }
18
18
 
19
19
  JSONTransformOptions::JSONTransformOptions(bool strict_cast_p, bool error_duplicate_key_p, bool error_missing_key_p,
20
20
  bool error_unkown_key_p)
21
21
  : strict_cast(strict_cast_p), error_duplicate_key(error_duplicate_key_p), error_missing_key(error_missing_key_p),
22
- error_unknown_key(error_unkown_key_p) {
22
+ error_unknown_key(error_unkown_key_p), parameters(false, &error_message) {
23
23
  }
24
24
 
25
25
  //! Forward declaration for recursion
@@ -135,7 +135,7 @@ static inline bool GetValueDecimal(yyjson_val *val, T &result, uint8_t w, uint8_
135
135
  bool success;
136
136
  switch (unsafe_yyjson_get_tag(val)) {
137
137
  case YYJSON_TYPE_STR | YYJSON_SUBTYPE_NONE:
138
- success = OP::template Operation<string_t, T>(GetString(val), result, &options.error_message, w, s);
138
+ success = OP::template Operation<string_t, T>(GetString(val), result, options.parameters, w, s);
139
139
  break;
140
140
  case YYJSON_TYPE_ARR | YYJSON_SUBTYPE_NONE:
141
141
  case YYJSON_TYPE_OBJ | YYJSON_SUBTYPE_NONE:
@@ -143,17 +143,16 @@ static inline bool GetValueDecimal(yyjson_val *val, T &result, uint8_t w, uint8_
143
143
  break;
144
144
  case YYJSON_TYPE_BOOL | YYJSON_SUBTYPE_TRUE:
145
145
  case YYJSON_TYPE_BOOL | YYJSON_SUBTYPE_FALSE:
146
- success = OP::template Operation<bool, T>(unsafe_yyjson_get_bool(val), result, &options.error_message, w, s);
146
+ success = OP::template Operation<bool, T>(unsafe_yyjson_get_bool(val), result, options.parameters, w, s);
147
147
  break;
148
148
  case YYJSON_TYPE_NUM | YYJSON_SUBTYPE_UINT:
149
- success =
150
- OP::template Operation<uint64_t, T>(unsafe_yyjson_get_uint(val), result, &options.error_message, w, s);
149
+ success = OP::template Operation<uint64_t, T>(unsafe_yyjson_get_uint(val), result, options.parameters, w, s);
151
150
  break;
152
151
  case YYJSON_TYPE_NUM | YYJSON_SUBTYPE_SINT:
153
- success = OP::template Operation<int64_t, T>(unsafe_yyjson_get_sint(val), result, &options.error_message, w, s);
152
+ success = OP::template Operation<int64_t, T>(unsafe_yyjson_get_sint(val), result, options.parameters, w, s);
154
153
  break;
155
154
  case YYJSON_TYPE_NUM | YYJSON_SUBTYPE_REAL:
156
- success = OP::template Operation<double, T>(unsafe_yyjson_get_real(val), result, &options.error_message, w, s);
155
+ success = OP::template Operation<double, T>(unsafe_yyjson_get_real(val), result, options.parameters, w, s);
157
156
  break;
158
157
  default:
159
158
  throw InternalException("Unknown yyjson tag in GetValueString");
@@ -982,7 +981,7 @@ static bool JSONToAnyCast(Vector &source, Vector &result, idx_t count, CastParam
982
981
 
983
982
  auto success = TransformFunctionInternal(source, count, result, alc, options);
984
983
  if (!success) {
985
- HandleCastError::AssignError(options.error_message, parameters.error_message);
984
+ HandleCastError::AssignError(options.error_message, parameters);
986
985
  }
987
986
  return success;
988
987
  }
@@ -224,8 +224,7 @@ static bool CastVarcharToJSON(Vector &source, Vector &result, idx_t count, CastP
224
224
  if (!doc) {
225
225
  mask.SetInvalid(idx);
226
226
  if (success) {
227
- HandleCastError::AssignError(JSONCommon::FormatParseError(data, length, error),
228
- parameters.error_message);
227
+ HandleCastError::AssignError(JSONCommon::FormatParseError(data, length, error), parameters);
229
228
  success = false;
230
229
  }
231
230
  }
@@ -569,6 +569,7 @@ bool JSONScanLocalState::ReadNextBuffer(JSONScanGlobalState &gstate) {
569
569
  if (file_done) {
570
570
  lock_guard<mutex> guard(gstate.lock);
571
571
  TryIncrementFileIndex(gstate);
572
+ lock_guard<mutex> reader_guard(current_reader->lock);
572
573
  current_reader->GetFileHandle().Close();
573
574
  }
574
575
 
@@ -1004,7 +1004,23 @@ idx_t CastColumnReader::Read(uint64_t num_values, parquet_filter_t &filter, data
1004
1004
  }
1005
1005
  }
1006
1006
  }
1007
- VectorOperations::DefaultCast(intermediate_vector, result, amount);
1007
+ string error_message;
1008
+ bool all_succeeded = VectorOperations::DefaultTryCast(intermediate_vector, result, amount, &error_message);
1009
+ if (!all_succeeded) {
1010
+ string extended_error;
1011
+ extended_error =
1012
+ StringUtil::Format("In file \"%s\" the column \"%s\" has type %s, but we are trying to read it as type %s.",
1013
+ reader.file_name, schema.name, intermediate_vector.GetType(), result.GetType());
1014
+ extended_error += "\nThis can happen when reading multiple Parquet files. The schema information is taken from "
1015
+ "the first Parquet file by default. Possible solutions:\n";
1016
+ extended_error += "* Enable the union_by_name=True option to combine the schema of all Parquet files "
1017
+ "(duckdb.org/docs/data/multiple_files/combining_schemas)\n";
1018
+ extended_error += "* Use a COPY statement to automatically derive types from an existing table.";
1019
+ throw ConversionException(
1020
+ "In Parquet reader of file \"%s\": failed to cast column \"%s\" from type %s to %s: %s\n\n%s",
1021
+ reader.file_name, schema.name, intermediate_vector.GetType(), result.GetType(), error_message,
1022
+ extended_error);
1023
+ }
1008
1024
  return amount;
1009
1025
  }
1010
1026
 
@@ -176,7 +176,7 @@ void RleBpEncoder::FinishWrite(WriteStream &writer) {
176
176
  ColumnWriter::ColumnWriter(ParquetWriter &writer, idx_t schema_idx, vector<string> schema_path_p, idx_t max_repeat,
177
177
  idx_t max_define, bool can_have_nulls)
178
178
  : writer(writer), schema_idx(schema_idx), schema_path(std::move(schema_path_p)), max_repeat(max_repeat),
179
- max_define(max_define), can_have_nulls(can_have_nulls), null_count(0) {
179
+ max_define(max_define), can_have_nulls(can_have_nulls) {
180
180
  }
181
181
  ColumnWriter::~ColumnWriter() {
182
182
  }
@@ -254,7 +254,7 @@ void ColumnWriter::HandleDefineLevels(ColumnWriterState &state, ColumnWriterStat
254
254
  if (!can_have_nulls) {
255
255
  throw IOException("Parquet writer: map key column is not allowed to contain NULL values");
256
256
  }
257
- null_count++;
257
+ state.null_count++;
258
258
  state.definition_levels.push_back(null_value);
259
259
  }
260
260
  if (parent->is_empty.empty() || !parent->is_empty[current_index]) {
@@ -270,7 +270,7 @@ void ColumnWriter::HandleDefineLevels(ColumnWriterState &state, ColumnWriterStat
270
270
  if (!can_have_nulls) {
271
271
  throw IOException("Parquet writer: map key column is not allowed to contain NULL values");
272
272
  }
273
- null_count++;
273
+ state.null_count++;
274
274
  state.definition_levels.push_back(null_value);
275
275
  }
276
276
  }
@@ -285,7 +285,7 @@ public:
285
285
  public:
286
286
  template <class TARGET>
287
287
  TARGET &Cast() {
288
- D_ASSERT(dynamic_cast<TARGET *>(this));
288
+ DynamicCastCheck<TARGET>(this);
289
289
  return reinterpret_cast<TARGET &>(*this);
290
290
  }
291
291
  template <class TARGET>
@@ -614,7 +614,7 @@ void BasicColumnWriter::Write(ColumnWriterState &state_p, Vector &vector, idx_t
614
614
  void BasicColumnWriter::SetParquetStatistics(BasicColumnWriterState &state,
615
615
  duckdb_parquet::format::ColumnChunk &column_chunk) {
616
616
  if (max_repeat == 0) {
617
- column_chunk.meta_data.statistics.null_count = null_count;
617
+ column_chunk.meta_data.statistics.null_count = NumericCast<int64_t>(state.null_count);
618
618
  column_chunk.meta_data.statistics.__isset.null_count = true;
619
619
  column_chunk.meta_data.__isset.statistics = true;
620
620
  }
@@ -663,19 +663,17 @@ void BasicColumnWriter::FinalizeWrite(ColumnWriterState &state_p) {
663
663
 
664
664
  auto &column_writer = writer.GetWriter();
665
665
  auto start_offset = column_writer.GetTotalWritten();
666
- auto page_offset = start_offset;
667
666
  // flush the dictionary
668
667
  if (HasDictionary(state)) {
669
668
  column_chunk.meta_data.statistics.distinct_count = DictionarySize(state);
670
669
  column_chunk.meta_data.statistics.__isset.distinct_count = true;
671
- column_chunk.meta_data.dictionary_page_offset = page_offset;
670
+ column_chunk.meta_data.dictionary_page_offset = start_offset;
672
671
  column_chunk.meta_data.__isset.dictionary_page_offset = true;
673
672
  FlushDictionary(state, state.stats_state.get());
674
- page_offset += state.write_info[0].compressed_size;
675
673
  }
676
674
 
677
675
  // record the start position of the pages for this column
678
- column_chunk.meta_data.data_page_offset = page_offset;
676
+ column_chunk.meta_data.data_page_offset = column_writer.GetTotalWritten();
679
677
  SetParquetStatistics(state, column_chunk);
680
678
 
681
679
  // write the individual pages to disk
@@ -790,14 +788,14 @@ struct ParquetCastOperator : public BaseParquetOperator {
790
788
  struct ParquetTimestampNSOperator : public BaseParquetOperator {
791
789
  template <class SRC, class TGT>
792
790
  static TGT Operation(SRC input) {
793
- return Timestamp::FromEpochNanoSeconds(input).value;
791
+ return Timestamp::FromEpochNanoSecondsPossiblyInfinite(input).value;
794
792
  }
795
793
  };
796
794
 
797
795
  struct ParquetTimestampSOperator : public BaseParquetOperator {
798
796
  template <class SRC, class TGT>
799
797
  static TGT Operation(SRC input) {
800
- return Timestamp::FromEpochSeconds(input).value;
798
+ return Timestamp::FromEpochSecondsPossiblyInfinite(input).value;
801
799
  }
802
800
  };
803
801
 
@@ -1687,7 +1685,7 @@ void StructColumnWriter::FinalizeWrite(ColumnWriterState &state_p) {
1687
1685
  auto &state = state_p.Cast<StructColumnWriterState>();
1688
1686
  for (idx_t child_idx = 0; child_idx < child_writers.size(); child_idx++) {
1689
1687
  // we add the null count of the struct to the null count of the children
1690
- child_writers[child_idx]->null_count += null_count;
1688
+ state.child_states[child_idx]->null_count += state_p.null_count;
1691
1689
  child_writers[child_idx]->FinalizeWrite(*state.child_states[child_idx]);
1692
1690
  }
1693
1691
  }
@@ -1752,6 +1750,40 @@ void ListColumnWriter::FinalizeAnalyze(ColumnWriterState &state_p) {
1752
1750
  child_writer->FinalizeAnalyze(*state.child_state);
1753
1751
  }
1754
1752
 
1753
+ idx_t GetConsecutiveChildList(Vector &list, Vector &result, idx_t offset, idx_t count) {
1754
+ // returns a consecutive child list that fully flattens and repeats all required elements
1755
+ auto &validity = FlatVector::Validity(list);
1756
+ auto list_entries = FlatVector::GetData<list_entry_t>(list);
1757
+ bool is_consecutive = true;
1758
+ idx_t total_length = 0;
1759
+ for (idx_t c = offset; c < offset + count; c++) {
1760
+ if (!validity.RowIsValid(c)) {
1761
+ continue;
1762
+ }
1763
+ if (list_entries[c].offset != total_length) {
1764
+ is_consecutive = false;
1765
+ }
1766
+ total_length += list_entries[c].length;
1767
+ }
1768
+ if (is_consecutive) {
1769
+ // already consecutive - leave it as-is
1770
+ return total_length;
1771
+ }
1772
+ SelectionVector sel(total_length);
1773
+ idx_t index = 0;
1774
+ for (idx_t c = offset; c < offset + count; c++) {
1775
+ if (!validity.RowIsValid(c)) {
1776
+ continue;
1777
+ }
1778
+ for (idx_t k = 0; k < list_entries[c].length; k++) {
1779
+ sel.set_index(index++, list_entries[c].offset + k);
1780
+ }
1781
+ }
1782
+ result.Slice(sel, total_length);
1783
+ result.Flatten(total_length);
1784
+ return total_length;
1785
+ }
1786
+
1755
1787
  void ListColumnWriter::Prepare(ColumnWriterState &state_p, ColumnWriterState *parent, Vector &vector, idx_t count) {
1756
1788
  auto &state = state_p.Cast<ListColumnWriterState>();
1757
1789
 
@@ -1805,7 +1837,7 @@ void ListColumnWriter::Prepare(ColumnWriterState &state_p, ColumnWriterState *pa
1805
1837
 
1806
1838
  auto &list_child = ListVector::GetEntry(vector);
1807
1839
  Vector child_list(list_child);
1808
- auto child_length = ListVector::GetConsecutiveChildList(vector, child_list, 0, count);
1840
+ auto child_length = GetConsecutiveChildList(vector, child_list, 0, count);
1809
1841
  child_writer->Prepare(*state.child_state, &state_p, child_list, child_length);
1810
1842
  }
1811
1843
 
@@ -1819,7 +1851,7 @@ void ListColumnWriter::Write(ColumnWriterState &state_p, Vector &vector, idx_t c
1819
1851
 
1820
1852
  auto &list_child = ListVector::GetEntry(vector);
1821
1853
  Vector child_list(list_child);
1822
- auto child_length = ListVector::GetConsecutiveChildList(vector, child_list, 0, count);
1854
+ auto child_length = GetConsecutiveChildList(vector, child_list, 0, count);
1823
1855
  child_writer->Write(*state.child_state, child_list, child_length);
1824
1856
  }
1825
1857
 
@@ -1828,9 +1860,102 @@ void ListColumnWriter::FinalizeWrite(ColumnWriterState &state_p) {
1828
1860
  child_writer->FinalizeWrite(*state.child_state);
1829
1861
  }
1830
1862
 
1863
+ //===--------------------------------------------------------------------===//
1864
+ // Array Column Writer
1865
+ //===--------------------------------------------------------------------===//
1866
+ class ArrayColumnWriter : public ListColumnWriter {
1867
+ public:
1868
+ ArrayColumnWriter(ParquetWriter &writer, idx_t schema_idx, vector<string> schema_path_p, idx_t max_repeat,
1869
+ idx_t max_define, unique_ptr<ColumnWriter> child_writer_p, bool can_have_nulls)
1870
+ : ListColumnWriter(writer, schema_idx, std::move(schema_path_p), max_repeat, max_define,
1871
+ std::move(child_writer_p), can_have_nulls) {
1872
+ }
1873
+ ~ArrayColumnWriter() override = default;
1874
+
1875
+ public:
1876
+ void Analyze(ColumnWriterState &state, ColumnWriterState *parent, Vector &vector, idx_t count) override;
1877
+ void Prepare(ColumnWriterState &state, ColumnWriterState *parent, Vector &vector, idx_t count) override;
1878
+ void Write(ColumnWriterState &state, Vector &vector, idx_t count) override;
1879
+ };
1880
+
1881
+ void ArrayColumnWriter::Analyze(ColumnWriterState &state_p, ColumnWriterState *parent, Vector &vector, idx_t count) {
1882
+ auto &state = state_p.Cast<ListColumnWriterState>();
1883
+ auto &array_child = ArrayVector::GetEntry(vector);
1884
+ auto array_size = ArrayType::GetSize(vector.GetType());
1885
+ child_writer->Analyze(*state.child_state, &state_p, array_child, array_size * count);
1886
+ }
1887
+
1888
+ void ArrayColumnWriter::Prepare(ColumnWriterState &state_p, ColumnWriterState *parent, Vector &vector, idx_t count) {
1889
+ auto &state = state_p.Cast<ListColumnWriterState>();
1890
+
1891
+ auto array_size = ArrayType::GetSize(vector.GetType());
1892
+ auto &validity = FlatVector::Validity(vector);
1893
+
1894
+ // write definition levels and repeats
1895
+ // the main difference between this and ListColumnWriter::Prepare is that we need to make sure to write out
1896
+ // repetition levels and definitions for the child elements of the array even if the array itself is NULL.
1897
+ idx_t start = 0;
1898
+ idx_t vcount = parent ? parent->definition_levels.size() - state.parent_index : count;
1899
+ idx_t vector_index = 0;
1900
+ for (idx_t i = start; i < vcount; i++) {
1901
+ idx_t parent_index = state.parent_index + i;
1902
+ if (parent && !parent->is_empty.empty() && parent->is_empty[parent_index]) {
1903
+ state.definition_levels.push_back(parent->definition_levels[parent_index]);
1904
+ state.repetition_levels.push_back(parent->repetition_levels[parent_index]);
1905
+ state.is_empty.push_back(true);
1906
+ continue;
1907
+ }
1908
+ auto first_repeat_level =
1909
+ parent && !parent->repetition_levels.empty() ? parent->repetition_levels[parent_index] : max_repeat;
1910
+ if (parent && parent->definition_levels[parent_index] != PARQUET_DEFINE_VALID) {
1911
+ state.definition_levels.push_back(parent->definition_levels[parent_index]);
1912
+ state.repetition_levels.push_back(first_repeat_level);
1913
+ state.is_empty.push_back(false);
1914
+ for (idx_t k = 1; k < array_size; k++) {
1915
+ state.repetition_levels.push_back(max_repeat + 1);
1916
+ state.definition_levels.push_back(parent->definition_levels[parent_index]);
1917
+ state.is_empty.push_back(false);
1918
+ }
1919
+ } else if (validity.RowIsValid(vector_index)) {
1920
+ // push the repetition levels
1921
+ state.definition_levels.push_back(PARQUET_DEFINE_VALID);
1922
+ state.is_empty.push_back(false);
1923
+
1924
+ state.repetition_levels.push_back(first_repeat_level);
1925
+ for (idx_t k = 1; k < array_size; k++) {
1926
+ state.repetition_levels.push_back(max_repeat + 1);
1927
+ state.definition_levels.push_back(PARQUET_DEFINE_VALID);
1928
+ state.is_empty.push_back(false);
1929
+ }
1930
+ } else {
1931
+ state.definition_levels.push_back(max_define - 1);
1932
+ state.repetition_levels.push_back(first_repeat_level);
1933
+ state.is_empty.push_back(false);
1934
+ for (idx_t k = 1; k < array_size; k++) {
1935
+ state.repetition_levels.push_back(max_repeat + 1);
1936
+ state.definition_levels.push_back(max_define - 1);
1937
+ state.is_empty.push_back(false);
1938
+ }
1939
+ }
1940
+ vector_index++;
1941
+ }
1942
+ state.parent_index += vcount;
1943
+
1944
+ auto &array_child = ArrayVector::GetEntry(vector);
1945
+ child_writer->Prepare(*state.child_state, &state_p, array_child, count * array_size);
1946
+ }
1947
+
1948
+ void ArrayColumnWriter::Write(ColumnWriterState &state_p, Vector &vector, idx_t count) {
1949
+ auto &state = state_p.Cast<ListColumnWriterState>();
1950
+ auto array_size = ArrayType::GetSize(vector.GetType());
1951
+ auto &array_child = ArrayVector::GetEntry(vector);
1952
+ child_writer->Write(*state.child_state, array_child, count * array_size);
1953
+ }
1954
+
1831
1955
  //===--------------------------------------------------------------------===//
1832
1956
  // Create Column Writer
1833
1957
  //===--------------------------------------------------------------------===//
1958
+
1834
1959
  unique_ptr<ColumnWriter> ColumnWriter::CreateWriterRecursive(vector<duckdb_parquet::format::SchemaElement> &schemas,
1835
1960
  ParquetWriter &writer, const LogicalType &type,
1836
1961
  const string &name, vector<string> schema_path,
@@ -1879,8 +2004,9 @@ unique_ptr<ColumnWriter> ColumnWriter::CreateWriterRecursive(vector<duckdb_parqu
1879
2004
  return make_uniq<StructColumnWriter>(writer, schema_idx, std::move(schema_path), max_repeat, max_define,
1880
2005
  std::move(child_writers), can_have_nulls);
1881
2006
  }
1882
- if (type.id() == LogicalTypeId::LIST) {
1883
- auto &child_type = ListType::GetChildType(type);
2007
+ if (type.id() == LogicalTypeId::LIST || type.id() == LogicalTypeId::ARRAY) {
2008
+ auto is_list = type.id() == LogicalTypeId::LIST;
2009
+ auto &child_type = is_list ? ListType::GetChildType(type) : ArrayType::GetChildType(type);
1884
2010
  // set up the two schema elements for the list
1885
2011
  // for some reason we only set the converted type in the OPTIONAL element
1886
2012
  // first an OPTIONAL element
@@ -1907,14 +2033,19 @@ unique_ptr<ColumnWriter> ColumnWriter::CreateWriterRecursive(vector<duckdb_parqu
1907
2033
  repeated_element.__isset.num_children = true;
1908
2034
  repeated_element.__isset.type = false;
1909
2035
  repeated_element.__isset.repetition_type = true;
1910
- repeated_element.name = "list";
2036
+ repeated_element.name = is_list ? "list" : "array";
1911
2037
  schemas.push_back(std::move(repeated_element));
1912
- schema_path.emplace_back("list");
2038
+ schema_path.emplace_back(is_list ? "list" : "array");
1913
2039
 
1914
2040
  auto child_writer = CreateWriterRecursive(schemas, writer, child_type, "element", schema_path, child_field_ids,
1915
2041
  max_repeat + 1, max_define + 2);
1916
- return make_uniq<ListColumnWriter>(writer, schema_idx, std::move(schema_path), max_repeat, max_define,
1917
- std::move(child_writer), can_have_nulls);
2042
+ if (is_list) {
2043
+ return make_uniq<ListColumnWriter>(writer, schema_idx, std::move(schema_path), max_repeat, max_define,
2044
+ std::move(child_writer), can_have_nulls);
2045
+ } else {
2046
+ return make_uniq<ArrayColumnWriter>(writer, schema_idx, std::move(schema_path), max_repeat, max_define,
2047
+ std::move(child_writer), can_have_nulls);
2048
+ }
1918
2049
  }
1919
2050
  if (type.id() == LogicalTypeId::MAP) {
1920
2051
  // map type