duckdb 0.10.1-dev9.0 → 0.10.2-dev0.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 (702) hide show
  1. package/.github/workflows/NodeJS.yml +9 -16
  2. package/binding.gyp +4 -1
  3. package/package.json +1 -1
  4. package/src/database.cpp +1 -0
  5. package/src/duckdb/extension/icu/icu-strptime.cpp +46 -4
  6. package/src/duckdb/extension/icu/icu-table-range.cpp +5 -0
  7. package/src/duckdb/extension/icu/icu-timezone.cpp +28 -4
  8. package/src/duckdb/extension/json/buffered_json_reader.cpp +6 -5
  9. package/src/duckdb/extension/json/include/buffered_json_reader.hpp +3 -3
  10. package/src/duckdb/extension/json/include/json_transform.hpp +2 -0
  11. package/src/duckdb/extension/json/json_functions/json_create.cpp +6 -0
  12. package/src/duckdb/extension/json/json_functions/json_transform.cpp +8 -9
  13. package/src/duckdb/extension/json/json_functions.cpp +1 -2
  14. package/src/duckdb/extension/json/json_scan.cpp +1 -0
  15. package/src/duckdb/extension/parquet/column_reader.cpp +17 -1
  16. package/src/duckdb/extension/parquet/column_writer.cpp +151 -20
  17. package/src/duckdb/extension/parquet/include/column_writer.hpp +3 -4
  18. package/src/duckdb/extension/parquet/parquet_extension.cpp +14 -9
  19. package/src/duckdb/extension/parquet/parquet_timestamp.cpp +10 -0
  20. package/src/duckdb/extension/parquet/parquet_writer.cpp +4 -0
  21. package/src/duckdb/src/catalog/catalog.cpp +94 -10
  22. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +9 -5
  23. package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +1 -0
  24. package/src/duckdb/src/catalog/catalog_entry/ub_duckdb_catalog_entries.cpp +16 -0
  25. package/src/duckdb/src/catalog/catalog_entry/view_catalog_entry.cpp +28 -0
  26. package/src/duckdb/src/catalog/default/default_functions.cpp +3 -0
  27. package/src/duckdb/src/catalog/default/default_views.cpp +3 -3
  28. package/src/duckdb/src/catalog/default/ub_duckdb_catalog_default_entries.cpp +5 -0
  29. package/src/duckdb/src/catalog/dependency_catalog_set.cpp +1 -3
  30. package/src/duckdb/src/catalog/dependency_manager.cpp +2 -5
  31. package/src/duckdb/src/catalog/ub_duckdb_catalog.cpp +10 -0
  32. package/src/duckdb/src/common/adbc/adbc.cpp +1 -1
  33. package/src/duckdb/src/common/adbc/driver_manager.cpp +2 -1
  34. package/src/duckdb/src/common/adbc/nanoarrow/ub_duckdb_adbc_nanoarrow.cpp +5 -0
  35. package/src/duckdb/src/common/adbc/ub_duckdb_adbc.cpp +3 -0
  36. package/src/duckdb/src/common/allocator.cpp +34 -8
  37. package/src/duckdb/src/common/arrow/appender/fixed_size_list_data.cpp +39 -0
  38. package/src/duckdb/src/common/arrow/appender/ub_duckdb_common_arrow_appender.cpp +6 -0
  39. package/src/duckdb/src/common/arrow/appender/union_data.cpp +2 -1
  40. package/src/duckdb/src/common/arrow/arrow_appender.cpp +5 -5
  41. package/src/duckdb/src/common/arrow/arrow_converter.cpp +17 -0
  42. package/src/duckdb/src/common/arrow/ub_duckdb_common_arrow.cpp +4 -0
  43. package/src/duckdb/src/common/compressed_file_system.cpp +1 -0
  44. package/src/duckdb/src/common/crypto/ub_duckdb_common_crypto.cpp +2 -0
  45. package/src/duckdb/src/common/enum_util.cpp +153 -13
  46. package/src/duckdb/src/common/enums/logical_operator_type.cpp +0 -2
  47. package/src/duckdb/src/common/enums/physical_operator_type.cpp +2 -2
  48. package/src/duckdb/src/common/enums/ub_duckdb_common_enums.cpp +12 -0
  49. package/src/duckdb/src/common/exception/conversion_exception.cpp +23 -0
  50. package/src/duckdb/src/common/exception.cpp +7 -14
  51. package/src/duckdb/src/common/extra_type_info.cpp +6 -5
  52. package/src/duckdb/src/common/gzip_file_system.cpp +5 -4
  53. package/src/duckdb/src/common/local_file_system.cpp +85 -10
  54. package/src/duckdb/src/common/operator/cast_operators.cpp +413 -305
  55. package/src/duckdb/src/common/operator/ub_duckdb_common_operators.cpp +4 -0
  56. package/src/duckdb/src/common/progress_bar/ub_duckdb_progress_bar.cpp +3 -0
  57. package/src/duckdb/src/common/re2_regex.cpp +2 -1
  58. package/src/duckdb/src/common/row_operations/row_heap_scatter.cpp +2 -2
  59. package/src/duckdb/src/common/row_operations/row_matcher.cpp +1 -0
  60. package/src/duckdb/src/common/row_operations/row_scatter.cpp +2 -2
  61. package/src/duckdb/src/common/row_operations/ub_duckdb_row_operations.cpp +9 -0
  62. package/src/duckdb/src/common/serializer/binary_serializer.cpp +3 -3
  63. package/src/duckdb/src/common/serializer/ub_duckdb_common_serializer.cpp +7 -0
  64. package/src/duckdb/src/common/sort/partition_state.cpp +2 -3
  65. package/src/duckdb/src/common/sort/ub_duckdb_sort.cpp +7 -0
  66. package/src/duckdb/src/common/string_util.cpp +3 -3
  67. package/src/duckdb/src/common/types/bit.cpp +7 -6
  68. package/src/duckdb/src/common/types/blob.cpp +20 -9
  69. package/src/duckdb/src/common/types/column/column_data_allocator.cpp +8 -6
  70. package/src/duckdb/src/common/types/column/column_data_collection.cpp +11 -1
  71. package/src/duckdb/src/common/types/column/column_data_collection_segment.cpp +5 -0
  72. package/src/duckdb/src/common/types/column/partitioned_column_data.cpp +1 -1
  73. package/src/duckdb/src/common/types/column/ub_duckdb_common_types_column.cpp +6 -0
  74. package/src/duckdb/src/common/types/data_chunk.cpp +1 -1
  75. package/src/duckdb/src/common/types/date.cpp +1 -1
  76. package/src/duckdb/src/common/types/hugeint.cpp +3 -2
  77. package/src/duckdb/src/common/types/interval.cpp +1 -1
  78. package/src/duckdb/src/common/types/list_segment.cpp +2 -1
  79. package/src/duckdb/src/common/types/row/partitioned_tuple_data.cpp +3 -9
  80. package/src/duckdb/src/common/types/row/tuple_data_allocator.cpp +7 -7
  81. package/src/duckdb/src/common/types/row/tuple_data_collection.cpp +10 -27
  82. package/src/duckdb/src/common/types/row/tuple_data_scatter_gather.cpp +168 -88
  83. package/src/duckdb/src/common/types/row/ub_duckdb_common_types_row.cpp +11 -0
  84. package/src/duckdb/src/common/types/selection_vector.cpp +1 -1
  85. package/src/duckdb/src/common/types/string_heap.cpp +5 -1
  86. package/src/duckdb/src/common/types/string_type.cpp +18 -4
  87. package/src/duckdb/src/common/types/time.cpp +4 -2
  88. package/src/duckdb/src/common/types/timestamp.cpp +32 -6
  89. package/src/duckdb/src/common/types/ub_duckdb_common_types.cpp +28 -0
  90. package/src/duckdb/src/common/types/uhugeint.cpp +3 -2
  91. package/src/duckdb/src/common/types/uuid.cpp +11 -0
  92. package/src/duckdb/src/common/types/validity_mask.cpp +4 -3
  93. package/src/duckdb/src/common/types/value.cpp +17 -6
  94. package/src/duckdb/src/common/types/vector.cpp +243 -68
  95. package/src/duckdb/src/common/types.cpp +7 -5
  96. package/src/duckdb/src/common/ub_duckdb_common.cpp +34 -0
  97. package/src/duckdb/src/common/value_operations/ub_duckdb_value_operations.cpp +2 -0
  98. package/src/duckdb/src/common/vector_operations/generators.cpp +2 -1
  99. package/src/duckdb/src/common/vector_operations/vector_cast.cpp +4 -4
  100. package/src/duckdb/src/common/vector_operations/vector_copy.cpp +2 -2
  101. package/src/duckdb/src/common/vector_operations/vector_hash.cpp +17 -6
  102. package/src/duckdb/src/core_functions/aggregate/algebraic/ub_duckdb_aggr_algebraic.cpp +5 -0
  103. package/src/duckdb/src/core_functions/aggregate/distributive/arg_min_max.cpp +30 -6
  104. package/src/duckdb/src/core_functions/aggregate/distributive/bitagg.cpp +1 -1
  105. package/src/duckdb/src/core_functions/aggregate/distributive/bitstring_agg.cpp +12 -5
  106. package/src/duckdb/src/core_functions/aggregate/distributive/minmax.cpp +2 -2
  107. package/src/duckdb/src/core_functions/aggregate/distributive/string_agg.cpp +2 -1
  108. package/src/duckdb/src/core_functions/aggregate/distributive/ub_duckdb_aggr_distributive.cpp +13 -0
  109. package/src/duckdb/src/core_functions/aggregate/holistic/mode.cpp +2 -1
  110. package/src/duckdb/src/core_functions/aggregate/holistic/quantile.cpp +2 -9
  111. package/src/duckdb/src/core_functions/aggregate/holistic/ub_duckdb_aggr_holistic.cpp +5 -0
  112. package/src/duckdb/src/core_functions/aggregate/nested/ub_duckdb_aggr_nested.cpp +3 -0
  113. package/src/duckdb/src/core_functions/aggregate/regression/ub_duckdb_aggr_regr.cpp +8 -0
  114. package/src/duckdb/src/core_functions/function_list.cpp +1 -0
  115. package/src/duckdb/src/core_functions/scalar/bit/bitstring.cpp +2 -2
  116. package/src/duckdb/src/core_functions/scalar/bit/ub_duckdb_func_bit.cpp +2 -0
  117. package/src/duckdb/src/core_functions/scalar/blob/ub_duckdb_func_blob.cpp +3 -0
  118. package/src/duckdb/src/core_functions/scalar/date/date_diff.cpp +8 -0
  119. package/src/duckdb/src/core_functions/scalar/date/date_part.cpp +22 -3
  120. package/src/duckdb/src/core_functions/scalar/date/make_date.cpp +29 -7
  121. package/src/duckdb/src/core_functions/scalar/date/to_interval.cpp +3 -1
  122. package/src/duckdb/src/core_functions/scalar/date/ub_duckdb_func_date.cpp +12 -0
  123. package/src/duckdb/src/core_functions/scalar/debug/ub_duckdb_func_debug.cpp +2 -0
  124. package/src/duckdb/src/core_functions/scalar/enum/ub_duckdb_func_enum.cpp +2 -0
  125. package/src/duckdb/src/core_functions/scalar/generic/ub_duckdb_func_generic.cpp +9 -0
  126. package/src/duckdb/src/core_functions/scalar/list/array_slice.cpp +12 -8
  127. package/src/duckdb/src/core_functions/scalar/list/list_aggregates.cpp +2 -1
  128. package/src/duckdb/src/core_functions/scalar/list/list_reduce.cpp +6 -5
  129. package/src/duckdb/src/core_functions/scalar/list/list_sort.cpp +5 -3
  130. package/src/duckdb/src/core_functions/scalar/list/list_value.cpp +28 -12
  131. package/src/duckdb/src/core_functions/scalar/list/ub_duckdb_func_list.cpp +11 -0
  132. package/src/duckdb/src/core_functions/scalar/map/map.cpp +129 -160
  133. package/src/duckdb/src/core_functions/scalar/map/ub_duckdb_func_map_nested.cpp +8 -0
  134. package/src/duckdb/src/core_functions/scalar/math/numeric.cpp +19 -16
  135. package/src/duckdb/src/core_functions/scalar/math/ub_duckdb_func_math.cpp +1 -0
  136. package/src/duckdb/src/core_functions/scalar/operators/bitwise.cpp +4 -4
  137. package/src/duckdb/src/core_functions/scalar/operators/ub_duckdb_func_ops.cpp +1 -0
  138. package/src/duckdb/src/core_functions/scalar/random/ub_duckdb_func_random.cpp +3 -0
  139. package/src/duckdb/src/core_functions/scalar/string/hex.cpp +2 -1
  140. package/src/duckdb/src/core_functions/scalar/string/pad.cpp +2 -2
  141. package/src/duckdb/src/core_functions/scalar/string/repeat.cpp +1 -1
  142. package/src/duckdb/src/core_functions/scalar/string/replace.cpp +1 -1
  143. package/src/duckdb/src/core_functions/scalar/string/string_split.cpp +2 -1
  144. package/src/duckdb/src/core_functions/scalar/string/translate.cpp +1 -1
  145. package/src/duckdb/src/core_functions/scalar/string/ub_duckdb_func_string.cpp +26 -0
  146. package/src/duckdb/src/core_functions/scalar/struct/ub_duckdb_func_struct.cpp +3 -0
  147. package/src/duckdb/src/core_functions/scalar/union/ub_duckdb_func_union.cpp +4 -0
  148. package/src/duckdb/src/core_functions/ub_duckdb_core_functions.cpp +3 -0
  149. package/src/duckdb/src/execution/adaptive_filter.cpp +1 -1
  150. package/src/duckdb/src/execution/aggregate_hashtable.cpp +1 -1
  151. package/src/duckdb/src/execution/column_binding_resolver.cpp +7 -1
  152. package/src/duckdb/src/execution/expression_executor/execute_case.cpp +2 -2
  153. package/src/duckdb/src/execution/expression_executor/execute_cast.cpp +2 -0
  154. package/src/duckdb/src/execution/expression_executor/execute_function.cpp +2 -2
  155. package/src/duckdb/src/execution/expression_executor/execute_operator.cpp +1 -1
  156. package/src/duckdb/src/execution/expression_executor/ub_duckdb_expression_executor.cpp +11 -0
  157. package/src/duckdb/src/execution/expression_executor.cpp +5 -2
  158. package/src/duckdb/src/execution/index/art/art.cpp +12 -6
  159. package/src/duckdb/src/execution/index/art/art_key.cpp +3 -3
  160. package/src/duckdb/src/execution/index/art/leaf.cpp +2 -2
  161. package/src/duckdb/src/execution/index/art/node16.cpp +2 -2
  162. package/src/duckdb/src/execution/index/art/node256.cpp +3 -3
  163. package/src/duckdb/src/execution/index/art/node48.cpp +5 -5
  164. package/src/duckdb/src/execution/index/art/prefix.cpp +1 -1
  165. package/src/duckdb/src/execution/index/art/ub_duckdb_art_index_execution.cpp +12 -0
  166. package/src/duckdb/src/execution/index/art/ub_duckdb_execution_index_art.cpp +11 -0
  167. package/src/duckdb/src/execution/index/fixed_size_buffer.cpp +6 -5
  168. package/src/duckdb/src/execution/index/ub_duckdb_execution_index.cpp +3 -0
  169. package/src/duckdb/src/execution/nested_loop_join/ub_duckdb_nested_loop_join.cpp +3 -0
  170. package/src/duckdb/src/execution/operator/aggregate/aggregate_object.cpp +1 -1
  171. package/src/duckdb/src/execution/operator/aggregate/physical_hash_aggregate.cpp +3 -4
  172. package/src/duckdb/src/execution/operator/aggregate/physical_streaming_window.cpp +0 -1
  173. package/src/duckdb/src/execution/operator/aggregate/physical_ungrouped_aggregate.cpp +3 -4
  174. package/src/duckdb/src/execution/operator/aggregate/ub_duckdb_operator_aggregate.cpp +9 -0
  175. package/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_buffer.cpp +1 -1
  176. package/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_buffer_manager.cpp +8 -3
  177. package/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_file_handle.cpp +1 -1
  178. package/src/duckdb/src/execution/operator/csv_scanner/scanner/base_scanner.cpp +5 -5
  179. package/src/duckdb/src/execution/operator/csv_scanner/scanner/column_count_scanner.cpp +2 -3
  180. package/src/duckdb/src/execution/operator/csv_scanner/scanner/scanner_boundary.cpp +5 -1
  181. package/src/duckdb/src/execution/operator/csv_scanner/scanner/skip_scanner.cpp +2 -2
  182. package/src/duckdb/src/execution/operator/csv_scanner/scanner/string_value_scanner.cpp +151 -79
  183. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/csv_sniffer.cpp +11 -6
  184. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/dialect_detection.cpp +27 -6
  185. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/header_detection.cpp +71 -18
  186. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/type_detection.cpp +22 -11
  187. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/type_refinement.cpp +6 -4
  188. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/type_replacement.cpp +5 -3
  189. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/ub_duckdb_operator_csv_sniffer.cpp +7 -0
  190. package/src/duckdb/src/execution/operator/csv_scanner/state_machine/csv_state_machine.cpp +3 -3
  191. package/src/duckdb/src/execution/operator/csv_scanner/state_machine/csv_state_machine_cache.cpp +30 -5
  192. package/src/duckdb/src/execution/operator/csv_scanner/table_function/csv_file_scanner.cpp +6 -2
  193. package/src/duckdb/src/execution/operator/csv_scanner/table_function/global_csv_state.cpp +47 -46
  194. package/src/duckdb/src/execution/operator/csv_scanner/ub_duckdb_operator_csv_scanner.cpp +10 -0
  195. package/src/duckdb/src/execution/operator/csv_scanner/util/csv_error.cpp +102 -54
  196. package/src/duckdb/src/execution/operator/csv_scanner/util/csv_reader_options.cpp +8 -1
  197. package/src/duckdb/src/execution/operator/filter/ub_duckdb_operator_filter.cpp +2 -0
  198. package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +54 -36
  199. package/src/duckdb/src/execution/operator/helper/physical_limit_percent.cpp +56 -32
  200. package/src/duckdb/src/execution/operator/helper/physical_streaming_limit.cpp +9 -13
  201. package/src/duckdb/src/execution/operator/helper/physical_transaction.cpp +12 -0
  202. package/src/duckdb/src/execution/operator/helper/physical_verify_vector.cpp +221 -0
  203. package/src/duckdb/src/execution/operator/helper/ub_duckdb_operator_helper.cpp +18 -0
  204. package/src/duckdb/src/execution/operator/join/physical_asof_join.cpp +1 -0
  205. package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +23 -8
  206. package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +8 -3
  207. package/src/duckdb/src/execution/operator/join/ub_duckdb_operator_join.cpp +16 -0
  208. package/src/duckdb/src/execution/operator/order/physical_order.cpp +2 -3
  209. package/src/duckdb/src/execution/operator/order/physical_top_n.cpp +2 -7
  210. package/src/duckdb/src/execution/operator/order/ub_duckdb_operator_order.cpp +3 -0
  211. package/src/duckdb/src/execution/operator/persistent/physical_batch_copy_to_file.cpp +451 -55
  212. package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +312 -150
  213. package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +200 -75
  214. package/src/duckdb/src/execution/operator/persistent/physical_delete.cpp +1 -0
  215. package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +6 -5
  216. package/src/duckdb/src/execution/operator/persistent/ub_duckdb_operator_persistent.cpp +10 -0
  217. package/src/duckdb/src/execution/operator/projection/physical_pivot.cpp +3 -2
  218. package/src/duckdb/src/execution/operator/projection/ub_duckdb_operator_projection.cpp +5 -0
  219. package/src/duckdb/src/execution/operator/scan/ub_duckdb_operator_scan.cpp +7 -0
  220. package/src/duckdb/src/execution/operator/schema/ub_duckdb_operator_schema.cpp +12 -0
  221. package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +25 -0
  222. package/src/duckdb/src/execution/operator/set/ub_duckdb_operator_set.cpp +4 -0
  223. package/src/duckdb/src/execution/perfect_aggregate_hashtable.cpp +4 -4
  224. package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +2 -2
  225. package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +2 -2
  226. package/src/duckdb/src/execution/physical_plan/plan_copy_to_file.cpp +7 -17
  227. package/src/duckdb/src/execution/physical_plan/plan_distinct.cpp +10 -0
  228. package/src/duckdb/src/execution/physical_plan/plan_insert.cpp +7 -0
  229. package/src/duckdb/src/execution/physical_plan/plan_limit.cpp +45 -13
  230. package/src/duckdb/src/execution/physical_plan/ub_duckdb_physical_plan.cpp +44 -0
  231. package/src/duckdb/src/execution/physical_plan_generator.cpp +5 -3
  232. package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +13 -12
  233. package/src/duckdb/src/execution/ub_duckdb_execution.cpp +15 -0
  234. package/src/duckdb/src/execution/window_executor.cpp +71 -61
  235. package/src/duckdb/src/execution/window_segment_tree.cpp +6 -6
  236. package/src/duckdb/src/extension_forward_decl/icu.cpp +59 -0
  237. package/src/duckdb/src/function/aggregate/algebraic/ub_duckdb_aggr_algebraic.cpp +5 -0
  238. package/src/duckdb/src/function/aggregate/distributive/first.cpp +2 -2
  239. package/src/duckdb/src/function/aggregate/distributive/ub_duckdb_aggr_distr.cpp +3 -0
  240. package/src/duckdb/src/function/aggregate/holistic/ub_duckdb_aggr_holistic.cpp +5 -0
  241. package/src/duckdb/src/function/aggregate/nested/ub_duckdb_aggr_nested.cpp +3 -0
  242. package/src/duckdb/src/function/aggregate/regression/ub_duckdb_aggr_regr.cpp +8 -0
  243. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +3 -2
  244. package/src/duckdb/src/function/aggregate/ub_duckdb_func_aggr.cpp +3 -0
  245. package/src/duckdb/src/function/cast/array_casts.cpp +2 -4
  246. package/src/duckdb/src/function/cast/bit_cast.cpp +13 -13
  247. package/src/duckdb/src/function/cast/cast_function_set.cpp +2 -0
  248. package/src/duckdb/src/function/cast/decimal_cast.cpp +38 -44
  249. package/src/duckdb/src/function/cast/default_casts.cpp +5 -2
  250. package/src/duckdb/src/function/cast/enum_casts.cpp +5 -5
  251. package/src/duckdb/src/function/cast/list_casts.cpp +24 -14
  252. package/src/duckdb/src/function/cast/string_cast.cpp +48 -30
  253. package/src/duckdb/src/function/cast/struct_cast.cpp +2 -2
  254. package/src/duckdb/src/function/cast/time_casts.cpp +12 -0
  255. package/src/duckdb/src/function/cast/ub_duckdb_func_cast.cpp +17 -0
  256. package/src/duckdb/src/function/cast/union/ub_duckdb_union_cast.cpp +2 -0
  257. package/src/duckdb/src/function/cast/union_casts.cpp +13 -15
  258. package/src/duckdb/src/function/cast/vector_cast_helpers.cpp +1 -1
  259. package/src/duckdb/src/function/cast_rules.cpp +2 -1
  260. package/src/duckdb/src/function/pragma/ub_duckdb_func_pragma.cpp +3 -0
  261. package/src/duckdb/src/function/scalar/bit/ub_duckdb_func_bit.cpp +2 -0
  262. package/src/duckdb/src/function/scalar/blob/ub_duckdb_func_blob.cpp +3 -0
  263. package/src/duckdb/src/function/scalar/compressed_materialization/compress_integral.cpp +7 -6
  264. package/src/duckdb/src/function/scalar/compressed_materialization/compress_string.cpp +3 -3
  265. package/src/duckdb/src/function/scalar/compressed_materialization/ub_duckdb_func_compressed_materialization.cpp +3 -0
  266. package/src/duckdb/src/function/scalar/date/ub_duckdb_func_date.cpp +12 -0
  267. package/src/duckdb/src/function/scalar/enum/ub_duckdb_func_enum.cpp +2 -0
  268. package/src/duckdb/src/function/scalar/generic/ub_duckdb_func_generic.cpp +8 -0
  269. package/src/duckdb/src/function/scalar/generic/ub_duckdb_func_generic_main.cpp +2 -0
  270. package/src/duckdb/src/function/scalar/list/list_resize.cpp +3 -1
  271. package/src/duckdb/src/function/scalar/list/list_zip.cpp +3 -4
  272. package/src/duckdb/src/function/scalar/list/ub_duckdb_func_list.cpp +11 -0
  273. package/src/duckdb/src/function/scalar/list/ub_duckdb_func_list_nested.cpp +5 -0
  274. package/src/duckdb/src/function/scalar/map/ub_duckdb_func_map_nested.cpp +7 -0
  275. package/src/duckdb/src/function/scalar/math/ub_duckdb_func_math.cpp +4 -0
  276. package/src/duckdb/src/function/scalar/nested_functions.cpp +7 -3
  277. package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +1 -1
  278. package/src/duckdb/src/function/scalar/operators/multiply.cpp +4 -2
  279. package/src/duckdb/src/function/scalar/operators/subtract.cpp +9 -3
  280. package/src/duckdb/src/function/scalar/operators/ub_duckdb_func_ops.cpp +6 -0
  281. package/src/duckdb/src/function/scalar/operators/ub_duckdb_func_ops_main.cpp +5 -0
  282. package/src/duckdb/src/function/scalar/sequence/ub_duckdb_func_seq.cpp +2 -0
  283. package/src/duckdb/src/function/scalar/strftime_format.cpp +21 -20
  284. package/src/duckdb/src/function/scalar/string/like.cpp +14 -3
  285. package/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp +4 -2
  286. package/src/duckdb/src/function/scalar/string/regexp/ub_duckdb_func_string_regexp.cpp +3 -0
  287. package/src/duckdb/src/function/scalar/string/regexp.cpp +6 -4
  288. package/src/duckdb/src/function/scalar/string/suffix.cpp +1 -1
  289. package/src/duckdb/src/function/scalar/string/ub_duckdb_func_string.cpp +31 -0
  290. package/src/duckdb/src/function/scalar/string/ub_duckdb_func_string_main.cpp +12 -0
  291. package/src/duckdb/src/function/scalar/struct/ub_duckdb_func_struct.cpp +4 -0
  292. package/src/duckdb/src/function/scalar/struct/ub_duckdb_func_struct_main.cpp +2 -0
  293. package/src/duckdb/src/function/scalar/system/ub_duckdb_func_system.cpp +2 -0
  294. package/src/duckdb/src/function/scalar/ub_duckdb_func_scalar.cpp +9 -0
  295. package/src/duckdb/src/function/scalar/union/ub_duckdb_func_union.cpp +4 -0
  296. package/src/duckdb/src/function/table/arrow/arrow_array_scan_state.cpp +28 -2
  297. package/src/duckdb/src/function/table/arrow/ub_duckdb_arrow_conversion.cpp +2 -0
  298. package/src/duckdb/src/function/table/arrow.cpp +23 -6
  299. package/src/duckdb/src/function/table/arrow_conversion.cpp +75 -33
  300. package/src/duckdb/src/function/table/copy_csv.cpp +8 -3
  301. package/src/duckdb/src/function/table/range.cpp +5 -0
  302. package/src/duckdb/src/function/table/read_csv.cpp +9 -8
  303. package/src/duckdb/src/function/table/read_file.cpp +1 -1
  304. package/src/duckdb/src/function/table/sniff_csv.cpp +5 -5
  305. package/src/duckdb/src/function/table/system/duckdb_columns.cpp +6 -2
  306. package/src/duckdb/src/function/table/system/duckdb_secrets.cpp +5 -1
  307. package/src/duckdb/src/function/table/system/duckdb_sequences.cpp +3 -1
  308. package/src/duckdb/src/function/table/system/duckdb_settings.cpp +13 -1
  309. package/src/duckdb/src/function/table/system/test_all_types.cpp +64 -0
  310. package/src/duckdb/src/function/table/system/ub_duckdb_table_func_system.cpp +23 -0
  311. package/src/duckdb/src/function/table/ub_duckdb_func_table.cpp +16 -0
  312. package/src/duckdb/src/function/table/version/pragma_version.cpp +11 -2
  313. package/src/duckdb/src/function/table/version/ub_duckdb_func_table_version.cpp +2 -0
  314. package/src/duckdb/src/function/ub_duckdb_function.cpp +14 -0
  315. package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +11 -1
  316. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/view_catalog_entry.hpp +2 -0
  317. package/src/duckdb/src/include/duckdb/catalog/catalog_entry.hpp +1 -1
  318. package/src/duckdb/src/include/duckdb/common/allocator.hpp +8 -11
  319. package/src/duckdb/src/include/duckdb/common/arrow/appender/enum_data.hpp +2 -2
  320. package/src/duckdb/src/include/duckdb/common/arrow/appender/fixed_size_list_data.hpp +14 -0
  321. package/src/duckdb/src/include/duckdb/common/arrow/appender/list.hpp +1 -0
  322. package/src/duckdb/src/include/duckdb/common/arrow/appender/list_data.hpp +1 -1
  323. package/src/duckdb/src/include/duckdb/common/arrow/appender/varchar_data.hpp +2 -2
  324. package/src/duckdb/src/include/duckdb/common/bitpacking.hpp +2 -2
  325. package/src/duckdb/src/include/duckdb/common/bswap.hpp +6 -2
  326. package/src/duckdb/src/include/duckdb/common/enum_util.hpp +32 -0
  327. package/src/duckdb/src/include/duckdb/common/enums/catalog_lookup_behavior.hpp +21 -0
  328. package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +0 -1
  329. package/src/duckdb/src/include/duckdb/common/enums/physical_operator_type.hpp +1 -1
  330. package/src/duckdb/src/include/duckdb/common/enums/prepared_statement_mode.hpp +20 -0
  331. package/src/duckdb/src/include/duckdb/common/enums/statement_type.hpp +2 -0
  332. package/src/duckdb/src/include/duckdb/common/exception/conversion_exception.hpp +6 -0
  333. package/src/duckdb/src/include/duckdb/common/exception/parser_exception.hpp +4 -0
  334. package/src/duckdb/src/include/duckdb/common/exception.hpp +2 -0
  335. package/src/duckdb/src/include/duckdb/common/extra_type_info.hpp +3 -3
  336. package/src/duckdb/src/include/duckdb/common/file_opener.hpp +6 -5
  337. package/src/duckdb/src/include/duckdb/common/file_system.hpp +4 -2
  338. package/src/duckdb/src/include/duckdb/common/helper.hpp +7 -0
  339. package/src/duckdb/src/include/duckdb/common/limits.hpp +2 -2
  340. package/src/duckdb/src/include/duckdb/common/local_file_system.hpp +3 -0
  341. package/src/duckdb/src/include/duckdb/common/numeric_utils.hpp +64 -0
  342. package/src/duckdb/src/include/duckdb/common/operator/cast_operators.hpp +34 -33
  343. package/src/duckdb/src/include/duckdb/common/operator/decimal_cast_operators.hpp +150 -124
  344. package/src/duckdb/src/include/duckdb/common/operator/integer_cast_operator.hpp +5 -5
  345. package/src/duckdb/src/include/duckdb/common/radix.hpp +1 -1
  346. package/src/duckdb/src/include/duckdb/common/serializer/deserializer.hpp +1 -1
  347. package/src/duckdb/src/include/duckdb/common/sort/duckdb_pdqsort.hpp +4 -4
  348. package/src/duckdb/src/include/duckdb/common/types/bit.hpp +1 -1
  349. package/src/duckdb/src/include/duckdb/common/types/blob.hpp +4 -1
  350. package/src/duckdb/src/include/duckdb/common/types/cast_helpers.hpp +15 -13
  351. package/src/duckdb/src/include/duckdb/common/types/column/column_data_allocator.hpp +5 -0
  352. package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection.hpp +2 -0
  353. package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection_segment.hpp +3 -0
  354. package/src/duckdb/src/include/duckdb/common/types/column/partitioned_column_data.hpp +1 -1
  355. package/src/duckdb/src/include/duckdb/common/types/row/partitioned_tuple_data.hpp +1 -1
  356. package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_states.hpp +4 -1
  357. package/src/duckdb/src/include/duckdb/common/types/selection_vector.hpp +2 -1
  358. package/src/duckdb/src/include/duckdb/common/types/string_heap.hpp +2 -0
  359. package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +11 -4
  360. package/src/duckdb/src/include/duckdb/common/types/time.hpp +1 -1
  361. package/src/duckdb/src/include/duckdb/common/types/timestamp.hpp +7 -2
  362. package/src/duckdb/src/include/duckdb/common/types/uuid.hpp +3 -0
  363. package/src/duckdb/src/include/duckdb/common/types/value.hpp +7 -0
  364. package/src/duckdb/src/include/duckdb/common/types/vector.hpp +40 -7
  365. package/src/duckdb/src/include/duckdb/common/types/vector_buffer.hpp +1 -1
  366. package/src/duckdb/src/include/duckdb/common/types.hpp +1 -1
  367. package/src/duckdb/src/include/duckdb/common/vector_operations/general_cast.hpp +12 -4
  368. package/src/duckdb/src/include/duckdb/common/vector_operations/generic_executor.hpp +6 -6
  369. package/src/duckdb/src/include/duckdb/common/vector_operations/vector_operations.hpp +3 -2
  370. package/src/duckdb/src/include/duckdb/common/windows_undefs.hpp +4 -0
  371. package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_count.hpp +1 -1
  372. package/src/duckdb/src/include/duckdb/core_functions/scalar/list_functions.hpp +9 -0
  373. package/src/duckdb/src/include/duckdb/execution/column_binding_resolver.hpp +2 -1
  374. package/src/duckdb/src/include/duckdb/execution/executor.hpp +10 -0
  375. package/src/duckdb/src/include/duckdb/execution/expression_executor_state.hpp +1 -1
  376. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/base_scanner.hpp +262 -0
  377. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/column_count_scanner.hpp +70 -0
  378. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_buffer.hpp +103 -0
  379. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_buffer_manager.hpp +74 -0
  380. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_casting.hpp +154 -0
  381. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_error.hpp +130 -0
  382. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_file_handle.hpp +60 -0
  383. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_file_scanner.hpp +70 -0
  384. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_option.hpp +155 -0
  385. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_reader_options.hpp +166 -0
  386. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_sniffer.hpp +191 -0
  387. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_state.hpp +30 -0
  388. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_state_machine.hpp +99 -0
  389. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_state_machine_cache.hpp +91 -0
  390. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/global_csv_state.hpp +80 -0
  391. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/quote_rules.hpp +21 -0
  392. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/scanner_boundary.hpp +93 -0
  393. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/skip_scanner.hpp +60 -0
  394. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/state_machine_options.hpp +35 -0
  395. package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/string_value_scanner.hpp +200 -0
  396. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_limit.hpp +13 -10
  397. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_limit_percent.hpp +5 -11
  398. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_streaming_limit.hpp +4 -6
  399. package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_verify_vector.hpp +51 -0
  400. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_hash_join.hpp +3 -0
  401. package/src/duckdb/src/include/duckdb/execution/operator/persistent/batch_memory_manager.hpp +165 -0
  402. package/src/duckdb/src/include/duckdb/execution/operator/persistent/batch_task_manager.hpp +48 -0
  403. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_batch_copy_to_file.hpp +10 -17
  404. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_batch_insert.hpp +4 -0
  405. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_copy_to_file.hpp +2 -0
  406. package/src/duckdb/src/include/duckdb/execution/physical_operator_states.hpp +10 -6
  407. package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +0 -2
  408. package/src/duckdb/src/include/duckdb/execution/window_executor.hpp +2 -1
  409. package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +1 -1
  410. package/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp +1 -0
  411. package/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp +14 -5
  412. package/src/duckdb/src/include/duckdb/function/cast/vector_cast_helpers.hpp +27 -43
  413. package/src/duckdb/src/include/duckdb/function/compression_function.hpp +4 -4
  414. package/src/duckdb/src/include/duckdb/function/copy_function.hpp +3 -3
  415. package/src/duckdb/src/include/duckdb/function/function.hpp +1 -1
  416. package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +1 -0
  417. package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +1 -1
  418. package/src/duckdb/src/include/duckdb/function/scalar_function.hpp +1 -1
  419. package/src/duckdb/src/include/duckdb/function/table/arrow.hpp +10 -4
  420. package/src/duckdb/src/include/duckdb/function/table/read_csv.hpp +8 -6
  421. package/src/duckdb/src/include/duckdb/function/table_function.hpp +3 -3
  422. package/src/duckdb/src/include/duckdb/main/attached_database.hpp +3 -0
  423. package/src/duckdb/src/include/duckdb/main/capi/cast/from_decimal.hpp +6 -4
  424. package/src/duckdb/src/include/duckdb/main/capi/cast/to_decimal.hpp +17 -10
  425. package/src/duckdb/src/include/duckdb/main/client_config.hpp +2 -0
  426. package/src/duckdb/src/include/duckdb/main/client_context.hpp +17 -3
  427. package/src/duckdb/src/include/duckdb/main/client_context_file_opener.hpp +2 -2
  428. package/src/duckdb/src/include/duckdb/main/client_context_state.hpp +20 -0
  429. package/src/duckdb/src/include/duckdb/main/client_data.hpp +1 -1
  430. package/src/duckdb/src/include/duckdb/main/database.hpp +3 -2
  431. package/src/duckdb/src/include/duckdb/main/database_manager.hpp +2 -1
  432. package/src/duckdb/src/include/duckdb/main/extension/generated_extension_loader.hpp +1 -1
  433. package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +230 -199
  434. package/src/duckdb/src/include/duckdb/main/extension_helper.hpp +18 -0
  435. package/src/duckdb/src/include/duckdb/main/relation/read_csv_relation.hpp +1 -1
  436. package/src/duckdb/src/include/duckdb/main/relation/table_function_relation.hpp +2 -0
  437. package/src/duckdb/src/include/duckdb/main/relation.hpp +1 -1
  438. package/src/duckdb/src/include/duckdb/main/secret/secret_manager.hpp +4 -0
  439. package/src/duckdb/src/include/duckdb/main/settings.hpp +54 -10
  440. package/src/duckdb/src/include/duckdb/optimizer/join_order/relation_manager.hpp +2 -1
  441. package/src/duckdb/src/include/duckdb/optimizer/rule/ordered_aggregate_optimizer.hpp +2 -0
  442. package/src/duckdb/src/include/duckdb/parallel/concurrentqueue.hpp +21 -5
  443. package/src/duckdb/src/include/duckdb/parallel/event.hpp +1 -1
  444. package/src/duckdb/src/include/duckdb/parallel/executor_task.hpp +37 -0
  445. package/src/duckdb/src/include/duckdb/parallel/interrupt.hpp +1 -1
  446. package/src/duckdb/src/include/duckdb/parallel/pipeline.hpp +1 -1
  447. package/src/duckdb/src/include/duckdb/parallel/task.hpp +0 -20
  448. package/src/duckdb/src/include/duckdb/parallel/task_scheduler.hpp +4 -2
  449. package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +10 -0
  450. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_info.hpp +2 -1
  451. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp +0 -24
  452. package/src/duckdb/src/include/duckdb/parser/parsed_data/comment_on_column_info.hpp +46 -0
  453. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_view_info.hpp +2 -0
  454. package/src/duckdb/src/include/duckdb/parser/parsed_data/extra_drop_info.hpp +1 -1
  455. package/src/duckdb/src/include/duckdb/parser/parsed_data/parse_info.hpp +3 -2
  456. package/src/duckdb/src/include/duckdb/parser/tableref/pivotref.hpp +3 -3
  457. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +3 -3
  458. package/src/duckdb/src/include/duckdb/planner/binder.hpp +11 -4
  459. package/src/duckdb/src/include/duckdb/planner/bound_result_modifier.hpp +59 -23
  460. package/src/duckdb/src/include/duckdb/planner/expression.hpp +1 -0
  461. package/src/duckdb/src/include/duckdb/planner/expression_binder/column_alias_binder.hpp +2 -2
  462. package/src/duckdb/src/include/duckdb/planner/expression_iterator.hpp +11 -3
  463. package/src/duckdb/src/include/duckdb/planner/extension_callback.hpp +6 -0
  464. package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +0 -1
  465. package/src/duckdb/src/include/duckdb/planner/operator/logical_insert.hpp +1 -1
  466. package/src/duckdb/src/include/duckdb/planner/operator/logical_limit.hpp +5 -9
  467. package/src/duckdb/src/include/duckdb/planner/subquery/rewrite_correlated_expressions.hpp +0 -15
  468. package/src/duckdb/src/include/duckdb/storage/arena_allocator.hpp +5 -0
  469. package/src/duckdb/src/include/duckdb/storage/buffer/buffer_pool.hpp +40 -5
  470. package/src/duckdb/src/include/duckdb/storage/compression/alp/algorithm/alp.hpp +1 -1
  471. package/src/duckdb/src/include/duckdb/storage/compression/alp/alp_analyze.hpp +5 -1
  472. package/src/duckdb/src/include/duckdb/storage/compression/alp/alp_compress.hpp +4 -4
  473. package/src/duckdb/src/include/duckdb/storage/compression/alp/alp_utils.hpp +2 -1
  474. package/src/duckdb/src/include/duckdb/storage/compression/alprd/algorithm/alprd.hpp +10 -8
  475. package/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_analyze.hpp +5 -1
  476. package/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_compress.hpp +3 -3
  477. package/src/duckdb/src/include/duckdb/storage/compression/chimp/algorithm/bit_reader.hpp +11 -10
  478. package/src/duckdb/src/include/duckdb/storage/compression/chimp/algorithm/bit_utils.hpp +3 -1
  479. package/src/duckdb/src/include/duckdb/storage/compression/chimp/algorithm/chimp128.hpp +1 -1
  480. package/src/duckdb/src/include/duckdb/storage/compression/chimp/algorithm/leading_zero_buffer.hpp +5 -3
  481. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_scan.hpp +2 -1
  482. package/src/duckdb/src/include/duckdb/storage/data_pointer.hpp +1 -1
  483. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +3 -1
  484. package/src/duckdb/src/include/duckdb/storage/index.hpp +1 -1
  485. package/src/duckdb/src/include/duckdb/storage/partial_block_manager.hpp +1 -1
  486. package/src/duckdb/src/include/duckdb/storage/standard_buffer_manager.hpp +3 -0
  487. package/src/duckdb/src/include/duckdb/storage/storage_manager.hpp +1 -1
  488. package/src/duckdb/src/include/duckdb/storage/table/append_state.hpp +0 -2
  489. package/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp +1 -1
  490. package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +5 -3
  491. package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +2 -2
  492. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +5 -0
  493. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +9 -2
  494. package/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp +2 -6
  495. package/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +3 -3
  496. package/src/duckdb/src/include/duckdb/storage/temporary_file_manager.hpp +169 -0
  497. package/src/duckdb/src/include/duckdb/transaction/duck_transaction_manager.hpp +11 -1
  498. package/src/duckdb/src/include/duckdb/transaction/meta_transaction.hpp +6 -1
  499. package/src/duckdb/src/include/duckdb/transaction/transaction.hpp +1 -1
  500. package/src/duckdb/src/include/duckdb.h +119 -67
  501. package/src/duckdb/src/main/appender.cpp +2 -1
  502. package/src/duckdb/src/main/attached_database.cpp +49 -27
  503. package/src/duckdb/src/main/capi/appender-c.cpp +1 -1
  504. package/src/duckdb/src/main/capi/cast/ub_duckdb_main_capi_cast.cpp +3 -0
  505. package/src/duckdb/src/main/capi/cast/utils-c.cpp +1 -1
  506. package/src/duckdb/src/main/capi/data_chunk-c.cpp +9 -1
  507. package/src/duckdb/src/main/capi/datetime-c.cpp +14 -8
  508. package/src/duckdb/src/main/capi/duckdb_value-c.cpp +29 -2
  509. package/src/duckdb/src/main/capi/helper-c.cpp +2 -0
  510. package/src/duckdb/src/main/capi/hugeint-c.cpp +2 -1
  511. package/src/duckdb/src/main/capi/logical_types-c.cpp +35 -1
  512. package/src/duckdb/src/main/capi/result-c.cpp +9 -0
  513. package/src/duckdb/src/main/capi/ub_duckdb_main_capi.cpp +19 -0
  514. package/src/duckdb/src/main/chunk_scan_state/ub_duckdb_main_chunk_scan_state.cpp +2 -0
  515. package/src/duckdb/src/main/client_context.cpp +133 -33
  516. package/src/duckdb/src/main/client_context_file_opener.cpp +8 -7
  517. package/src/duckdb/src/main/config.cpp +2 -0
  518. package/src/duckdb/src/main/connection_manager.cpp +8 -0
  519. package/src/duckdb/src/main/database.cpp +13 -4
  520. package/src/duckdb/src/main/database_manager.cpp +10 -1
  521. package/src/duckdb/src/main/extension/extension_helper.cpp +8 -5
  522. package/src/duckdb/src/main/extension/extension_install.cpp +1 -1
  523. package/src/duckdb/src/main/extension/ub_duckdb_main_extension.cpp +6 -0
  524. package/src/duckdb/src/main/prepared_statement_data.cpp +23 -6
  525. package/src/duckdb/src/main/query_profiler.cpp +9 -7
  526. package/src/duckdb/src/main/relation/read_csv_relation.cpp +17 -12
  527. package/src/duckdb/src/main/relation/ub_duckdb_main_relation.cpp +26 -0
  528. package/src/duckdb/src/main/relation/value_relation.cpp +2 -0
  529. package/src/duckdb/src/main/secret/secret.cpp +1 -1
  530. package/src/duckdb/src/main/secret/secret_manager.cpp +41 -8
  531. package/src/duckdb/src/main/secret/secret_storage.cpp +8 -2
  532. package/src/duckdb/src/main/settings/settings.cpp +42 -2
  533. package/src/duckdb/src/main/settings/ub_duckdb_main_settings.cpp +2 -0
  534. package/src/duckdb/src/main/ub_duckdb_main.cpp +25 -0
  535. package/src/duckdb/src/optimizer/compressed_materialization/ub_duckdb_optimizer_compressed_materialization.cpp +4 -0
  536. package/src/duckdb/src/optimizer/filter_combiner.cpp +20 -14
  537. package/src/duckdb/src/optimizer/in_clause_rewriter.cpp +5 -1
  538. package/src/duckdb/src/optimizer/join_order/relation_manager.cpp +23 -11
  539. package/src/duckdb/src/optimizer/join_order/ub_duckdb_optimizer_join_order.cpp +12 -0
  540. package/src/duckdb/src/optimizer/matcher/ub_duckdb_optimizer_matcher.cpp +2 -0
  541. package/src/duckdb/src/optimizer/pullup/ub_duckdb_optimizer_pullup.cpp +6 -0
  542. package/src/duckdb/src/optimizer/pushdown/pushdown_limit.cpp +1 -1
  543. package/src/duckdb/src/optimizer/pushdown/ub_duckdb_optimizer_pushdown.cpp +12 -0
  544. package/src/duckdb/src/optimizer/remove_unused_columns.cpp +7 -6
  545. package/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp +8 -6
  546. package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +1 -1
  547. package/src/duckdb/src/optimizer/rule/ub_duckdb_optimizer_rules.cpp +16 -0
  548. package/src/duckdb/src/optimizer/statistics/expression/propagate_cast.cpp +71 -1
  549. package/src/duckdb/src/optimizer/statistics/expression/ub_duckdb_optimizer_statistics_expr.cpp +11 -0
  550. package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +1 -1
  551. package/src/duckdb/src/optimizer/statistics/operator/propagate_limit.cpp +5 -1
  552. package/src/duckdb/src/optimizer/statistics/operator/ub_duckdb_optimizer_statistics_op.cpp +11 -0
  553. package/src/duckdb/src/optimizer/topn_optimizer.cpp +12 -11
  554. package/src/duckdb/src/optimizer/ub_duckdb_optimizer.cpp +20 -0
  555. package/src/duckdb/src/parallel/executor.cpp +8 -19
  556. package/src/duckdb/src/parallel/executor_task.cpp +6 -2
  557. package/src/duckdb/src/parallel/pipeline.cpp +12 -6
  558. package/src/duckdb/src/parallel/pipeline_executor.cpp +1 -1
  559. package/src/duckdb/src/parallel/pipeline_finish_event.cpp +2 -2
  560. package/src/duckdb/src/parallel/pipeline_initialize_event.cpp +1 -2
  561. package/src/duckdb/src/parallel/task_scheduler.cpp +15 -8
  562. package/src/duckdb/src/parallel/ub_duckdb_parallel.cpp +15 -0
  563. package/src/duckdb/src/parser/constraints/ub_duckdb_constraints.cpp +5 -0
  564. package/src/duckdb/src/parser/expression/ub_duckdb_expression.cpp +18 -0
  565. package/src/duckdb/src/parser/parsed_data/alter_table_info.cpp +0 -18
  566. package/src/duckdb/src/parser/parsed_data/comment_on_column_info.cpp +44 -0
  567. package/src/duckdb/src/parser/parsed_data/create_view_info.cpp +1 -0
  568. package/src/duckdb/src/parser/parsed_data/extra_drop_info.cpp +2 -0
  569. package/src/duckdb/src/parser/parsed_data/ub_duckdb_parsed_data.cpp +24 -0
  570. package/src/duckdb/src/parser/parser.cpp +1 -1
  571. package/src/duckdb/src/parser/query_error_context.cpp +15 -1
  572. package/src/duckdb/src/parser/query_node/ub_duckdb_query_node.cpp +5 -0
  573. package/src/duckdb/src/parser/statement/export_statement.cpp +2 -1
  574. package/src/duckdb/src/parser/statement/relation_statement.cpp +2 -2
  575. package/src/duckdb/src/parser/statement/ub_duckdb_statement.cpp +25 -0
  576. package/src/duckdb/src/parser/tableref/pivotref.cpp +3 -3
  577. package/src/duckdb/src/parser/tableref/showref.cpp +2 -0
  578. package/src/duckdb/src/parser/tableref/ub_duckdb_parser_tableref.cpp +8 -0
  579. package/src/duckdb/src/parser/transform/constraint/ub_duckdb_transformer_constraint.cpp +2 -0
  580. package/src/duckdb/src/parser/transform/expression/transform_boolean_test.cpp +1 -1
  581. package/src/duckdb/src/parser/transform/expression/transform_cast.cpp +10 -2
  582. package/src/duckdb/src/parser/transform/expression/transform_constant.cpp +7 -7
  583. package/src/duckdb/src/parser/transform/expression/transform_interval.cpp +2 -1
  584. package/src/duckdb/src/parser/transform/expression/ub_duckdb_transformer_expression.cpp +20 -0
  585. package/src/duckdb/src/parser/transform/helpers/transform_typename.cpp +2 -2
  586. package/src/duckdb/src/parser/transform/helpers/ub_duckdb_transformer_helpers.cpp +8 -0
  587. package/src/duckdb/src/parser/transform/statement/transform_comment_on.cpp +3 -8
  588. package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +3 -1
  589. package/src/duckdb/src/parser/transform/statement/transform_show_select.cpp +2 -3
  590. package/src/duckdb/src/parser/transform/statement/ub_duckdb_transformer_statement.cpp +37 -0
  591. package/src/duckdb/src/parser/transform/tableref/transform_join.cpp +16 -0
  592. package/src/duckdb/src/parser/transform/tableref/transform_pivot.cpp +49 -32
  593. package/src/duckdb/src/parser/transform/tableref/ub_duckdb_transformer_tableref.cpp +8 -0
  594. package/src/duckdb/src/parser/ub_duckdb_parser.cpp +15 -0
  595. package/src/duckdb/src/planner/binder/expression/bind_lambda.cpp +11 -4
  596. package/src/duckdb/src/planner/binder/expression/bind_operator_expression.cpp +4 -1
  597. package/src/duckdb/src/planner/binder/expression/bind_star_expression.cpp +71 -5
  598. package/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp +35 -1
  599. package/src/duckdb/src/planner/binder/expression/ub_duckdb_bind_expression.cpp +20 -0
  600. package/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +55 -51
  601. package/src/duckdb/src/planner/binder/query_node/plan_query_node.cpp +1 -11
  602. package/src/duckdb/src/planner/binder/query_node/plan_subquery.cpp +2 -2
  603. package/src/duckdb/src/planner/binder/query_node/ub_duckdb_bind_query_node.cpp +12 -0
  604. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +12 -6
  605. package/src/duckdb/src/planner/binder/statement/bind_drop.cpp +1 -1
  606. package/src/duckdb/src/planner/binder/statement/bind_export.cpp +8 -2
  607. package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +6 -3
  608. package/src/duckdb/src/planner/binder/statement/bind_simple.cpp +13 -2
  609. package/src/duckdb/src/planner/binder/statement/ub_duckdb_bind_statement.cpp +26 -0
  610. package/src/duckdb/src/planner/binder/tableref/bind_basetableref.cpp +15 -4
  611. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +9 -2
  612. package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +93 -45
  613. package/src/duckdb/src/planner/binder/tableref/bind_subqueryref.cpp +6 -1
  614. package/src/duckdb/src/planner/binder/tableref/ub_duckdb_bind_tableref.cpp +17 -0
  615. package/src/duckdb/src/planner/binder.cpp +22 -23
  616. package/src/duckdb/src/planner/bound_result_modifier.cpp +67 -4
  617. package/src/duckdb/src/planner/expression/bound_cast_expression.cpp +5 -1
  618. package/src/duckdb/src/planner/expression/bound_window_expression.cpp +3 -0
  619. package/src/duckdb/src/planner/expression/ub_duckdb_planner_expression.cpp +19 -0
  620. package/src/duckdb/src/planner/expression_binder/column_alias_binder.cpp +14 -9
  621. package/src/duckdb/src/planner/expression_binder/having_binder.cpp +17 -9
  622. package/src/duckdb/src/planner/expression_binder/lateral_binder.cpp +61 -37
  623. package/src/duckdb/src/planner/expression_binder/qualify_binder.cpp +8 -4
  624. package/src/duckdb/src/planner/expression_binder/ub_duckdb_expression_binders.cpp +20 -0
  625. package/src/duckdb/src/planner/expression_binder/where_binder.cpp +3 -2
  626. package/src/duckdb/src/planner/expression_iterator.cpp +73 -52
  627. package/src/duckdb/src/planner/filter/ub_duckdb_planner_filter.cpp +4 -0
  628. package/src/duckdb/src/planner/logical_operator_visitor.cpp +4 -14
  629. package/src/duckdb/src/planner/operator/logical_limit.cpp +14 -6
  630. package/src/duckdb/src/planner/operator/ub_duckdb_planner_operator.cpp +43 -0
  631. package/src/duckdb/src/planner/parsed_data/ub_duckdb_planner_parsed_data.cpp +2 -0
  632. package/src/duckdb/src/planner/planner.cpp +3 -0
  633. package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +46 -18
  634. package/src/duckdb/src/planner/subquery/rewrite_correlated_expressions.cpp +39 -33
  635. package/src/duckdb/src/planner/subquery/ub_duckdb_planner_subquery.cpp +4 -0
  636. package/src/duckdb/src/planner/ub_duckdb_planner.cpp +15 -0
  637. package/src/duckdb/src/storage/arena_allocator.cpp +9 -0
  638. package/src/duckdb/src/storage/buffer/block_handle.cpp +7 -2
  639. package/src/duckdb/src/storage/buffer/block_manager.cpp +7 -3
  640. package/src/duckdb/src/storage/buffer/buffer_pool.cpp +121 -24
  641. package/src/duckdb/src/storage/buffer/ub_duckdb_storage_buffer.cpp +6 -0
  642. package/src/duckdb/src/storage/checkpoint/ub_duckdb_storage_checkpoint.cpp +5 -0
  643. package/src/duckdb/src/storage/checkpoint/write_overflow_strings_to_disk.cpp +4 -4
  644. package/src/duckdb/src/storage/compression/chimp/ub_duckdb_storage_compression_chimp.cpp +6 -0
  645. package/src/duckdb/src/storage/compression/dictionary_compression.cpp +6 -5
  646. package/src/duckdb/src/storage/compression/fsst.cpp +3 -2
  647. package/src/duckdb/src/storage/compression/rle.cpp +1 -1
  648. package/src/duckdb/src/storage/compression/string_uncompressed.cpp +4 -4
  649. package/src/duckdb/src/storage/compression/ub_duckdb_storage_compression.cpp +12 -0
  650. package/src/duckdb/src/storage/data_table.cpp +6 -3
  651. package/src/duckdb/src/storage/local_storage.cpp +5 -2
  652. package/src/duckdb/src/storage/metadata/metadata_manager.cpp +4 -4
  653. package/src/duckdb/src/storage/metadata/metadata_reader.cpp +1 -1
  654. package/src/duckdb/src/storage/metadata/metadata_writer.cpp +1 -1
  655. package/src/duckdb/src/storage/metadata/ub_duckdb_storage_metadata.cpp +4 -0
  656. package/src/duckdb/src/storage/partial_block_manager.cpp +1 -1
  657. package/src/duckdb/src/storage/serialization/serialize_create_info.cpp +2 -0
  658. package/src/duckdb/src/storage/serialization/serialize_expression.cpp +3 -0
  659. package/src/duckdb/src/storage/serialization/serialize_logical_operator.cpp +5 -29
  660. package/src/duckdb/src/storage/serialization/serialize_nodes.cpp +22 -4
  661. package/src/duckdb/src/storage/serialization/serialize_parse_info.cpp +12 -32
  662. package/src/duckdb/src/storage/serialization/ub_duckdb_storage_serialization.cpp +16 -0
  663. package/src/duckdb/src/storage/standard_buffer_manager.cpp +29 -397
  664. package/src/duckdb/src/storage/statistics/string_stats.cpp +1 -1
  665. package/src/duckdb/src/storage/statistics/ub_duckdb_storage_statistics.cpp +10 -0
  666. package/src/duckdb/src/storage/storage_info.cpp +1 -1
  667. package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +3 -3
  668. package/src/duckdb/src/storage/table/column_data.cpp +7 -16
  669. package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +4 -1
  670. package/src/duckdb/src/storage/table/column_segment.cpp +68 -78
  671. package/src/duckdb/src/storage/table/list_column_data.cpp +1 -0
  672. package/src/duckdb/src/storage/table/row_group.cpp +17 -7
  673. package/src/duckdb/src/storage/table/row_group_collection.cpp +28 -27
  674. package/src/duckdb/src/storage/table/ub_duckdb_storage_table.cpp +17 -0
  675. package/src/duckdb/src/storage/table/update_segment.cpp +7 -7
  676. package/src/duckdb/src/storage/temporary_file_manager.cpp +334 -0
  677. package/src/duckdb/src/storage/ub_duckdb_storage.cpp +20 -0
  678. package/src/duckdb/src/storage/write_ahead_log.cpp +3 -2
  679. package/src/duckdb/src/transaction/commit_state.cpp +4 -2
  680. package/src/duckdb/src/transaction/duck_transaction_manager.cpp +32 -17
  681. package/src/duckdb/src/transaction/meta_transaction.cpp +24 -0
  682. package/src/duckdb/src/transaction/transaction_context.cpp +0 -9
  683. package/src/duckdb/src/transaction/ub_duckdb_transaction.cpp +11 -0
  684. package/src/duckdb/src/transaction/undo_buffer.cpp +1 -1
  685. package/src/duckdb/third_party/jaro_winkler/details/common.hpp +1 -1
  686. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +2 -0
  687. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +1032 -551
  688. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +24122 -24304
  689. package/src/duckdb/third_party/mbedtls/include/mbedtls/mbedtls_config.h +0 -3
  690. package/src/duckdb/third_party/mbedtls/library/entropy_poll.cpp +32 -4
  691. package/src/duckdb/third_party/miniz/miniz_wrapper.hpp +4 -4
  692. package/src/duckdb/third_party/tdigest/t_digest.hpp +3 -3
  693. package/src/duckdb/ub_src_common_arrow_appender.cpp +2 -0
  694. package/src/duckdb/ub_src_common_exception.cpp +2 -0
  695. package/src/duckdb/ub_src_execution_operator_helper.cpp +2 -0
  696. package/src/duckdb/ub_src_execution_operator_persistent.cpp +0 -2
  697. package/src/duckdb/ub_src_execution_physical_plan.cpp +0 -2
  698. package/src/duckdb/ub_src_parser_parsed_data.cpp +1 -1
  699. package/src/duckdb/ub_src_planner_operator.cpp +0 -2
  700. package/src/duckdb/ub_src_storage.cpp +2 -0
  701. package/test/columns.test.ts +1 -1
  702. package/test/test_all_types.test.ts +1 -1
@@ -927,7 +927,7 @@ bool TryCast::Operation(string_t input, bool &result, bool strict) {
927
927
 
928
928
  switch (input_size) {
929
929
  case 1: {
930
- char c = std::tolower(*input_data);
930
+ char c = UnsafeNumericCast<char>(std::tolower(*input_data));
931
931
  if (c == 't' || (!strict && c == '1')) {
932
932
  result = true;
933
933
  return true;
@@ -938,10 +938,10 @@ bool TryCast::Operation(string_t input, bool &result, bool strict) {
938
938
  return false;
939
939
  }
940
940
  case 4: {
941
- char t = std::tolower(input_data[0]);
942
- char r = std::tolower(input_data[1]);
943
- char u = std::tolower(input_data[2]);
944
- char e = std::tolower(input_data[3]);
941
+ char t = UnsafeNumericCast<char>(std::tolower(input_data[0]));
942
+ char r = UnsafeNumericCast<char>(std::tolower(input_data[1]));
943
+ char u = UnsafeNumericCast<char>(std::tolower(input_data[2]));
944
+ char e = UnsafeNumericCast<char>(std::tolower(input_data[3]));
945
945
  if (t == 't' && r == 'r' && u == 'u' && e == 'e') {
946
946
  result = true;
947
947
  return true;
@@ -949,11 +949,11 @@ bool TryCast::Operation(string_t input, bool &result, bool strict) {
949
949
  return false;
950
950
  }
951
951
  case 5: {
952
- char f = std::tolower(input_data[0]);
953
- char a = std::tolower(input_data[1]);
954
- char l = std::tolower(input_data[2]);
955
- char s = std::tolower(input_data[3]);
956
- char e = std::tolower(input_data[4]);
952
+ char f = UnsafeNumericCast<char>(std::tolower(input_data[0]));
953
+ char a = UnsafeNumericCast<char>(std::tolower(input_data[1]));
954
+ char l = UnsafeNumericCast<char>(std::tolower(input_data[2]));
955
+ char s = UnsafeNumericCast<char>(std::tolower(input_data[3]));
956
+ char e = UnsafeNumericCast<char>(std::tolower(input_data[4]));
957
957
  if (f == 'f' && a == 'a' && l == 'l' && s == 's' && e == 'e') {
958
958
  result = false;
959
959
  return true;
@@ -1009,20 +1009,20 @@ bool TryCast::Operation(string_t input, double &result, bool strict) {
1009
1009
  }
1010
1010
 
1011
1011
  template <>
1012
- bool TryCastErrorMessageCommaSeparated::Operation(string_t input, float &result, string *error_message, bool strict) {
1013
- if (!TryDoubleCast<float>(input.GetData(), input.GetSize(), result, strict, ',')) {
1012
+ bool TryCastErrorMessageCommaSeparated::Operation(string_t input, float &result, CastParameters &parameters) {
1013
+ if (!TryDoubleCast<float>(input.GetData(), input.GetSize(), result, parameters.strict, ',')) {
1014
1014
  HandleCastError::AssignError(StringUtil::Format("Could not cast string to float: \"%s\"", input.GetString()),
1015
- error_message);
1015
+ parameters);
1016
1016
  return false;
1017
1017
  }
1018
1018
  return true;
1019
1019
  }
1020
1020
 
1021
1021
  template <>
1022
- bool TryCastErrorMessageCommaSeparated::Operation(string_t input, double &result, string *error_message, bool strict) {
1023
- if (!TryDoubleCast<double>(input.GetData(), input.GetSize(), result, strict, ',')) {
1022
+ bool TryCastErrorMessageCommaSeparated::Operation(string_t input, double &result, CastParameters &parameters) {
1023
+ if (!TryDoubleCast<double>(input.GetData(), input.GetSize(), result, parameters.strict, ',')) {
1024
1024
  HandleCastError::AssignError(StringUtil::Format("Could not cast string to double: \"%s\"", input.GetString()),
1025
- error_message);
1025
+ parameters);
1026
1026
  return false;
1027
1027
  }
1028
1028
  return true;
@@ -1126,37 +1126,49 @@ bool TryCast::Operation(interval_t input, interval_t &result, bool strict) {
1126
1126
  //===--------------------------------------------------------------------===//
1127
1127
  template <>
1128
1128
  duckdb::string_t CastFromTimestampNS::Operation(duckdb::timestamp_t input, Vector &result) {
1129
- return StringCast::Operation<timestamp_t>(Timestamp::FromEpochNanoSeconds(input.value), result);
1129
+ return StringCast::Operation<timestamp_t>(CastTimestampNsToUs::Operation<timestamp_t, timestamp_t>(input), result);
1130
1130
  }
1131
1131
  template <>
1132
1132
  duckdb::string_t CastFromTimestampMS::Operation(duckdb::timestamp_t input, Vector &result) {
1133
- return StringCast::Operation<timestamp_t>(Timestamp::FromEpochMs(input.value), result);
1133
+ return StringCast::Operation<timestamp_t>(CastTimestampMsToUs::Operation<timestamp_t, timestamp_t>(input), result);
1134
1134
  }
1135
1135
  template <>
1136
1136
  duckdb::string_t CastFromTimestampSec::Operation(duckdb::timestamp_t input, Vector &result) {
1137
- return StringCast::Operation<timestamp_t>(Timestamp::FromEpochSeconds(input.value), result);
1137
+ return StringCast::Operation<timestamp_t>(CastTimestampSecToUs::Operation<timestamp_t, timestamp_t>(input), result);
1138
1138
  }
1139
1139
 
1140
1140
  template <>
1141
1141
  timestamp_t CastTimestampUsToMs::Operation(timestamp_t input) {
1142
+ if (!Timestamp::IsFinite(input)) {
1143
+ return input;
1144
+ }
1142
1145
  timestamp_t cast_timestamp(Timestamp::GetEpochMs(input));
1143
1146
  return cast_timestamp;
1144
1147
  }
1145
1148
 
1146
1149
  template <>
1147
1150
  timestamp_t CastTimestampUsToNs::Operation(timestamp_t input) {
1151
+ if (!Timestamp::IsFinite(input)) {
1152
+ return input;
1153
+ }
1148
1154
  timestamp_t cast_timestamp(Timestamp::GetEpochNanoSeconds(input));
1149
1155
  return cast_timestamp;
1150
1156
  }
1151
1157
 
1152
1158
  template <>
1153
1159
  timestamp_t CastTimestampUsToSec::Operation(timestamp_t input) {
1160
+ if (!Timestamp::IsFinite(input)) {
1161
+ return input;
1162
+ }
1154
1163
  timestamp_t cast_timestamp(Timestamp::GetEpochSeconds(input));
1155
1164
  return cast_timestamp;
1156
1165
  }
1157
1166
 
1158
1167
  template <>
1159
1168
  timestamp_t CastTimestampMsToUs::Operation(timestamp_t input) {
1169
+ if (!Timestamp::IsFinite(input)) {
1170
+ return input;
1171
+ }
1160
1172
  return Timestamp::FromEpochMs(input.value);
1161
1173
  }
1162
1174
 
@@ -1172,17 +1184,36 @@ dtime_t CastTimestampMsToTime::Operation(timestamp_t input) {
1172
1184
 
1173
1185
  template <>
1174
1186
  timestamp_t CastTimestampMsToNs::Operation(timestamp_t input) {
1187
+ if (!Timestamp::IsFinite(input)) {
1188
+ return input;
1189
+ }
1175
1190
  auto us = CastTimestampMsToUs::Operation<timestamp_t, timestamp_t>(input);
1176
1191
  return CastTimestampUsToNs::Operation<timestamp_t, timestamp_t>(us);
1177
1192
  }
1178
1193
 
1179
1194
  template <>
1180
1195
  timestamp_t CastTimestampNsToUs::Operation(timestamp_t input) {
1196
+ if (!Timestamp::IsFinite(input)) {
1197
+ return input;
1198
+ }
1181
1199
  return Timestamp::FromEpochNanoSeconds(input.value);
1182
1200
  }
1183
1201
 
1202
+ template <>
1203
+ timestamp_t CastTimestampSecToUs::Operation(timestamp_t input) {
1204
+ if (!Timestamp::IsFinite(input)) {
1205
+ return input;
1206
+ }
1207
+ return Timestamp::FromEpochSeconds(input.value);
1208
+ }
1209
+
1184
1210
  template <>
1185
1211
  date_t CastTimestampNsToDate::Operation(timestamp_t input) {
1212
+ if (input == timestamp_t::infinity()) {
1213
+ return date_t::infinity();
1214
+ } else if (input == timestamp_t::ninfinity()) {
1215
+ return date_t::ninfinity();
1216
+ }
1186
1217
  const auto us = CastTimestampNsToUs::Operation<timestamp_t, timestamp_t>(input);
1187
1218
  return Timestamp::GetDate(us);
1188
1219
  }
@@ -1195,17 +1226,18 @@ dtime_t CastTimestampNsToTime::Operation(timestamp_t input) {
1195
1226
 
1196
1227
  template <>
1197
1228
  timestamp_t CastTimestampSecToMs::Operation(timestamp_t input) {
1229
+ if (!Timestamp::IsFinite(input)) {
1230
+ return input;
1231
+ }
1198
1232
  auto us = CastTimestampSecToUs::Operation<timestamp_t, timestamp_t>(input);
1199
1233
  return CastTimestampUsToMs::Operation<timestamp_t, timestamp_t>(us);
1200
1234
  }
1201
1235
 
1202
- template <>
1203
- timestamp_t CastTimestampSecToUs::Operation(timestamp_t input) {
1204
- return Timestamp::FromEpochSeconds(input.value);
1205
- }
1206
-
1207
1236
  template <>
1208
1237
  timestamp_t CastTimestampSecToNs::Operation(timestamp_t input) {
1238
+ if (!Timestamp::IsFinite(input)) {
1239
+ return input;
1240
+ }
1209
1241
  auto us = CastTimestampSecToUs::Operation<timestamp_t, timestamp_t>(input);
1210
1242
  return CastTimestampUsToNs::Operation<timestamp_t, timestamp_t>(us);
1211
1243
  }
@@ -1230,7 +1262,15 @@ bool TryCastToTimestampNS::Operation(string_t input, timestamp_t &result, bool s
1230
1262
  if (!TryCast::Operation<string_t, timestamp_t>(input, result, strict)) {
1231
1263
  return false;
1232
1264
  }
1233
- result = Timestamp::GetEpochNanoSeconds(result);
1265
+ if (!Timestamp::IsFinite(result)) {
1266
+ return true;
1267
+ }
1268
+
1269
+ int64_t nanoseconds;
1270
+ if (!Timestamp::TryGetEpochNanoSeconds(result, nanoseconds)) {
1271
+ throw ConversionException("Could not convert VARCHAR value '%s' to Timestamp(NS)", input.GetString());
1272
+ }
1273
+ result = nanoseconds;
1234
1274
  return true;
1235
1275
  }
1236
1276
 
@@ -1239,6 +1279,9 @@ bool TryCastToTimestampMS::Operation(string_t input, timestamp_t &result, bool s
1239
1279
  if (!TryCast::Operation<string_t, timestamp_t>(input, result, strict)) {
1240
1280
  return false;
1241
1281
  }
1282
+ if (!Timestamp::IsFinite(result)) {
1283
+ return true;
1284
+ }
1242
1285
  result = Timestamp::GetEpochMs(result);
1243
1286
  return true;
1244
1287
  }
@@ -1248,6 +1291,9 @@ bool TryCastToTimestampSec::Operation(string_t input, timestamp_t &result, bool
1248
1291
  if (!TryCast::Operation<string_t, timestamp_t>(input, result, strict)) {
1249
1292
  return false;
1250
1293
  }
1294
+ if (!Timestamp::IsFinite(result)) {
1295
+ return true;
1296
+ }
1251
1297
  result = Timestamp::GetEpochSeconds(result);
1252
1298
  return true;
1253
1299
  }
@@ -1257,6 +1303,9 @@ bool TryCastToTimestampNS::Operation(date_t input, timestamp_t &result, bool str
1257
1303
  if (!TryCast::Operation<date_t, timestamp_t>(input, result, strict)) {
1258
1304
  return false;
1259
1305
  }
1306
+ if (!Timestamp::IsFinite(result)) {
1307
+ return true;
1308
+ }
1260
1309
  if (!TryMultiplyOperator::Operation(result.value, Interval::NANOS_PER_MICRO, result.value)) {
1261
1310
  return false;
1262
1311
  }
@@ -1268,6 +1317,9 @@ bool TryCastToTimestampMS::Operation(date_t input, timestamp_t &result, bool str
1268
1317
  if (!TryCast::Operation<date_t, timestamp_t>(input, result, strict)) {
1269
1318
  return false;
1270
1319
  }
1320
+ if (!Timestamp::IsFinite(result)) {
1321
+ return true;
1322
+ }
1271
1323
  result.value /= Interval::MICROS_PER_MSEC;
1272
1324
  return true;
1273
1325
  }
@@ -1277,6 +1329,9 @@ bool TryCastToTimestampSec::Operation(date_t input, timestamp_t &result, bool st
1277
1329
  if (!TryCast::Operation<date_t, timestamp_t>(input, result, strict)) {
1278
1330
  return false;
1279
1331
  }
1332
+ if (!Timestamp::IsFinite(result)) {
1333
+ return true;
1334
+ }
1280
1335
  result.value /= Interval::MICROS_PER_MSEC * Interval::MSECS_PER_SEC;
1281
1336
  return true;
1282
1337
  }
@@ -1331,10 +1386,9 @@ string_t CastFromPointer::Operation(uintptr_t input, Vector &vector) {
1331
1386
  // Cast To Blob
1332
1387
  //===--------------------------------------------------------------------===//
1333
1388
  template <>
1334
- bool TryCastToBlob::Operation(string_t input, string_t &result, Vector &result_vector, string *error_message,
1335
- bool strict) {
1389
+ bool TryCastToBlob::Operation(string_t input, string_t &result, Vector &result_vector, CastParameters &parameters) {
1336
1390
  idx_t result_size;
1337
- if (!Blob::TryGetBlobSize(input, result_size, error_message)) {
1391
+ if (!Blob::TryGetBlobSize(input, result_size, parameters)) {
1338
1392
  return false;
1339
1393
  }
1340
1394
 
@@ -1348,10 +1402,9 @@ bool TryCastToBlob::Operation(string_t input, string_t &result, Vector &result_v
1348
1402
  // Cast To Bit
1349
1403
  //===--------------------------------------------------------------------===//
1350
1404
  template <>
1351
- bool TryCastToBit::Operation(string_t input, string_t &result, Vector &result_vector, string *error_message,
1352
- bool strict) {
1405
+ bool TryCastToBit::Operation(string_t input, string_t &result, Vector &result_vector, CastParameters &parameters) {
1353
1406
  idx_t result_size;
1354
- if (!Bit::TryGetBitStringSize(input, result_size, error_message)) {
1407
+ if (!Bit::TryGetBitStringSize(input, result_size, parameters.error_message)) {
1355
1408
  return false;
1356
1409
  }
1357
1410
 
@@ -1362,32 +1415,34 @@ bool TryCastToBit::Operation(string_t input, string_t &result, Vector &result_ve
1362
1415
  }
1363
1416
 
1364
1417
  template <>
1365
- bool CastFromBitToNumeric::Operation(string_t input, bool &result, bool strict) {
1418
+ bool CastFromBitToNumeric::Operation(string_t input, bool &result, CastParameters &parameters) {
1366
1419
  D_ASSERT(input.GetSize() > 1);
1367
1420
 
1368
1421
  uint8_t value;
1369
- bool success = CastFromBitToNumeric::Operation(input, value, strict);
1422
+ bool success = CastFromBitToNumeric::Operation(input, value, parameters);
1370
1423
  result = (value > 0);
1371
1424
  return (success);
1372
1425
  }
1373
1426
 
1374
1427
  template <>
1375
- bool CastFromBitToNumeric::Operation(string_t input, hugeint_t &result, bool strict) {
1428
+ bool CastFromBitToNumeric::Operation(string_t input, hugeint_t &result, CastParameters &parameters) {
1376
1429
  D_ASSERT(input.GetSize() > 1);
1377
1430
 
1378
1431
  if (input.GetSize() - 1 > sizeof(hugeint_t)) {
1379
- throw ConversionException("Bitstring doesn't fit inside of %s", GetTypeId<hugeint_t>());
1432
+ throw ConversionException(parameters.query_location, "Bitstring doesn't fit inside of %s",
1433
+ GetTypeId<hugeint_t>());
1380
1434
  }
1381
1435
  Bit::BitToNumeric(input, result);
1382
1436
  return (true);
1383
1437
  }
1384
1438
 
1385
1439
  template <>
1386
- bool CastFromBitToNumeric::Operation(string_t input, uhugeint_t &result, bool strict) {
1440
+ bool CastFromBitToNumeric::Operation(string_t input, uhugeint_t &result, CastParameters &parameters) {
1387
1441
  D_ASSERT(input.GetSize() > 1);
1388
1442
 
1389
1443
  if (input.GetSize() - 1 > sizeof(uhugeint_t)) {
1390
- throw ConversionException("Bitstring doesn't fit inside of %s", GetTypeId<uhugeint_t>());
1444
+ throw ConversionException(parameters.query_location, "Bitstring doesn't fit inside of %s",
1445
+ GetTypeId<uhugeint_t>());
1391
1446
  }
1392
1447
  Bit::BitToNumeric(input, result);
1393
1448
  return (true);
@@ -1408,8 +1463,7 @@ string_t CastFromUUID::Operation(hugeint_t input, Vector &vector) {
1408
1463
  // Cast To UUID
1409
1464
  //===--------------------------------------------------------------------===//
1410
1465
  template <>
1411
- bool TryCastToUUID::Operation(string_t input, hugeint_t &result, Vector &result_vector, string *error_message,
1412
- bool strict) {
1466
+ bool TryCastToUUID::Operation(string_t input, hugeint_t &result, Vector &result_vector, CastParameters &parameters) {
1413
1467
  return UUID::FromString(input.GetString(), result);
1414
1468
  }
1415
1469
 
@@ -1417,9 +1471,9 @@ bool TryCastToUUID::Operation(string_t input, hugeint_t &result, Vector &result_
1417
1471
  // Cast To Date
1418
1472
  //===--------------------------------------------------------------------===//
1419
1473
  template <>
1420
- bool TryCastErrorMessage::Operation(string_t input, date_t &result, string *error_message, bool strict) {
1421
- if (!TryCast::Operation<string_t, date_t>(input, result, strict)) {
1422
- HandleCastError::AssignError(Date::ConversionError(input), error_message);
1474
+ bool TryCastErrorMessage::Operation(string_t input, date_t &result, CastParameters &parameters) {
1475
+ if (!TryCast::Operation<string_t, date_t>(input, result, parameters.strict)) {
1476
+ HandleCastError::AssignError(Date::ConversionError(input), parameters);
1423
1477
  return false;
1424
1478
  }
1425
1479
  return true;
@@ -1441,9 +1495,9 @@ date_t Cast::Operation(string_t input) {
1441
1495
  // Cast To Time
1442
1496
  //===--------------------------------------------------------------------===//
1443
1497
  template <>
1444
- bool TryCastErrorMessage::Operation(string_t input, dtime_t &result, string *error_message, bool strict) {
1445
- if (!TryCast::Operation<string_t, dtime_t>(input, result, strict)) {
1446
- HandleCastError::AssignError(Time::ConversionError(input), error_message);
1498
+ bool TryCastErrorMessage::Operation(string_t input, dtime_t &result, CastParameters &parameters) {
1499
+ if (!TryCast::Operation<string_t, dtime_t>(input, result, parameters.strict)) {
1500
+ HandleCastError::AssignError(Time::ConversionError(input), parameters);
1447
1501
  return false;
1448
1502
  }
1449
1503
  return true;
@@ -1464,9 +1518,9 @@ dtime_t Cast::Operation(string_t input) {
1464
1518
  // Cast To TimeTZ
1465
1519
  //===--------------------------------------------------------------------===//
1466
1520
  template <>
1467
- bool TryCastErrorMessage::Operation(string_t input, dtime_tz_t &result, string *error_message, bool strict) {
1468
- if (!TryCast::Operation<string_t, dtime_tz_t>(input, result, strict)) {
1469
- HandleCastError::AssignError(Time::ConversionError(input), error_message);
1521
+ bool TryCastErrorMessage::Operation(string_t input, dtime_tz_t &result, CastParameters &parameters) {
1522
+ if (!TryCast::Operation<string_t, dtime_tz_t>(input, result, parameters.strict)) {
1523
+ HandleCastError::AssignError(Time::ConversionError(input), parameters);
1470
1524
  return false;
1471
1525
  }
1472
1526
  return true;
@@ -1475,7 +1529,8 @@ bool TryCastErrorMessage::Operation(string_t input, dtime_tz_t &result, string *
1475
1529
  template <>
1476
1530
  bool TryCast::Operation(string_t input, dtime_tz_t &result, bool strict) {
1477
1531
  idx_t pos;
1478
- return Time::TryConvertTimeTZ(input.GetData(), input.GetSize(), pos, result, strict);
1532
+ bool has_offset;
1533
+ return Time::TryConvertTimeTZ(input.GetData(), input.GetSize(), pos, result, has_offset, strict);
1479
1534
  }
1480
1535
 
1481
1536
  template <>
@@ -1491,15 +1546,15 @@ dtime_tz_t Cast::Operation(string_t input) {
1491
1546
  // Cast To Timestamp
1492
1547
  //===--------------------------------------------------------------------===//
1493
1548
  template <>
1494
- bool TryCastErrorMessage::Operation(string_t input, timestamp_t &result, string *error_message, bool strict) {
1549
+ bool TryCastErrorMessage::Operation(string_t input, timestamp_t &result, CastParameters &parameters) {
1495
1550
  auto cast_result = Timestamp::TryConvertTimestamp(input.GetData(), input.GetSize(), result);
1496
1551
  if (cast_result == TimestampCastResult::SUCCESS) {
1497
1552
  return true;
1498
1553
  }
1499
1554
  if (cast_result == TimestampCastResult::ERROR_INCORRECT_FORMAT) {
1500
- HandleCastError::AssignError(Timestamp::ConversionError(input), error_message);
1555
+ HandleCastError::AssignError(Timestamp::ConversionError(input), parameters);
1501
1556
  } else {
1502
- HandleCastError::AssignError(Timestamp::UnsupportedTimezoneError(input), error_message);
1557
+ HandleCastError::AssignError(Timestamp::UnsupportedTimezoneError(input), parameters);
1503
1558
  }
1504
1559
  return false;
1505
1560
  }
@@ -1518,8 +1573,8 @@ timestamp_t Cast::Operation(string_t input) {
1518
1573
  // Cast From Interval
1519
1574
  //===--------------------------------------------------------------------===//
1520
1575
  template <>
1521
- bool TryCastErrorMessage::Operation(string_t input, interval_t &result, string *error_message, bool strict) {
1522
- return Interval::FromCString(input.GetData(), input.GetSize(), result, error_message, strict);
1576
+ bool TryCastErrorMessage::Operation(string_t input, interval_t &result, CastParameters &parameters) {
1577
+ return Interval::FromCString(input.GetData(), input.GetSize(), result, parameters.error_message, parameters.strict);
1523
1578
  }
1524
1579
 
1525
1580
  //===--------------------------------------------------------------------===//
@@ -1642,7 +1697,7 @@ struct HugeIntegerCastOperation {
1642
1697
  remainder *= -1;
1643
1698
  }
1644
1699
  state.decimal = remainder;
1645
- state.decimal_total_digits = -e;
1700
+ state.decimal_total_digits = UnsafeNumericCast<uint16_t>(-e);
1646
1701
  state.decimal_intermediate = 0;
1647
1702
  state.decimal_intermediate_digits = 0;
1648
1703
  return Finalize<T, NEGATIVE>(state);
@@ -1826,7 +1881,7 @@ struct DecimalCastOperation {
1826
1881
  // Everything beyond that amount needs to be truncated
1827
1882
  if (decimal_excess > exponent) {
1828
1883
  // We've allowed too many decimals
1829
- state.excessive_decimals = decimal_excess - exponent;
1884
+ state.excessive_decimals = UnsafeNumericCast<uint8_t>(decimal_excess - exponent);
1830
1885
  exponent = 0;
1831
1886
  } else {
1832
1887
  exponent -= decimal_excess;
@@ -1931,7 +1986,7 @@ struct DecimalCastOperation {
1931
1986
  };
1932
1987
 
1933
1988
  template <class T, char decimal_separator = '.'>
1934
- bool TryDecimalStringCast(string_t input, T &result, string *error_message, uint8_t width, uint8_t scale) {
1989
+ bool TryDecimalStringCast(string_t input, T &result, CastParameters &parameters, uint8_t width, uint8_t scale) {
1935
1990
  DecimalCastData<T> state;
1936
1991
  state.result = 0;
1937
1992
  state.width = width;
@@ -1946,7 +2001,7 @@ bool TryDecimalStringCast(string_t input, T &result, string *error_message, uint
1946
2001
  input.GetData(), input.GetSize(), state, false)) {
1947
2002
  string error = StringUtil::Format("Could not convert string \"%s\" to DECIMAL(%d,%d)", input.GetString(),
1948
2003
  (int)width, (int)scale);
1949
- HandleCastError::AssignError(error, error_message);
2004
+ HandleCastError::AssignError(error, parameters);
1950
2005
  return false;
1951
2006
  }
1952
2007
  result = state.result;
@@ -1954,48 +2009,51 @@ bool TryDecimalStringCast(string_t input, T &result, string *error_message, uint
1954
2009
  }
1955
2010
 
1956
2011
  template <>
1957
- bool TryCastToDecimal::Operation(string_t input, int16_t &result, string *error_message, uint8_t width, uint8_t scale) {
1958
- return TryDecimalStringCast<int16_t>(input, result, error_message, width, scale);
2012
+ bool TryCastToDecimal::Operation(string_t input, int16_t &result, CastParameters &parameters, uint8_t width,
2013
+ uint8_t scale) {
2014
+ return TryDecimalStringCast<int16_t>(input, result, parameters, width, scale);
1959
2015
  }
1960
2016
 
1961
2017
  template <>
1962
- bool TryCastToDecimal::Operation(string_t input, int32_t &result, string *error_message, uint8_t width, uint8_t scale) {
1963
- return TryDecimalStringCast<int32_t>(input, result, error_message, width, scale);
2018
+ bool TryCastToDecimal::Operation(string_t input, int32_t &result, CastParameters &parameters, uint8_t width,
2019
+ uint8_t scale) {
2020
+ return TryDecimalStringCast<int32_t>(input, result, parameters, width, scale);
1964
2021
  }
1965
2022
 
1966
2023
  template <>
1967
- bool TryCastToDecimal::Operation(string_t input, int64_t &result, string *error_message, uint8_t width, uint8_t scale) {
1968
- return TryDecimalStringCast<int64_t>(input, result, error_message, width, scale);
2024
+ bool TryCastToDecimal::Operation(string_t input, int64_t &result, CastParameters &parameters, uint8_t width,
2025
+ uint8_t scale) {
2026
+ return TryDecimalStringCast<int64_t>(input, result, parameters, width, scale);
1969
2027
  }
1970
2028
 
1971
2029
  template <>
1972
- bool TryCastToDecimal::Operation(string_t input, hugeint_t &result, string *error_message, uint8_t width,
2030
+ bool TryCastToDecimal::Operation(string_t input, hugeint_t &result, CastParameters &parameters, uint8_t width,
1973
2031
  uint8_t scale) {
1974
- return TryDecimalStringCast<hugeint_t>(input, result, error_message, width, scale);
2032
+ return TryDecimalStringCast<hugeint_t>(input, result, parameters, width, scale);
1975
2033
  }
1976
2034
 
1977
2035
  template <>
1978
- bool TryCastToDecimalCommaSeparated::Operation(string_t input, int16_t &result, string *error_message, uint8_t width,
1979
- uint8_t scale) {
1980
- return TryDecimalStringCast<int16_t, ','>(input, result, error_message, width, scale);
2036
+ bool TryCastToDecimalCommaSeparated::Operation(string_t input, int16_t &result, CastParameters &parameters,
2037
+ uint8_t width, uint8_t scale) {
2038
+ return TryDecimalStringCast<int16_t, ','>(input, result, parameters, width, scale);
1981
2039
  }
1982
2040
 
1983
2041
  template <>
1984
- bool TryCastToDecimalCommaSeparated::Operation(string_t input, int32_t &result, string *error_message, uint8_t width,
1985
- uint8_t scale) {
1986
- return TryDecimalStringCast<int32_t, ','>(input, result, error_message, width, scale);
2042
+ bool TryCastToDecimalCommaSeparated::Operation(string_t input, int32_t &result, CastParameters &parameters,
2043
+ uint8_t width, uint8_t scale) {
2044
+ return TryDecimalStringCast<int32_t, ','>(input, result, parameters, width, scale);
1987
2045
  }
1988
2046
 
1989
2047
  template <>
1990
- bool TryCastToDecimalCommaSeparated::Operation(string_t input, int64_t &result, string *error_message, uint8_t width,
1991
- uint8_t scale) {
1992
- return TryDecimalStringCast<int64_t, ','>(input, result, error_message, width, scale);
2048
+ bool TryCastToDecimalCommaSeparated::Operation(string_t input, int64_t &result, CastParameters &parameters,
2049
+ uint8_t width, uint8_t scale) {
2050
+ return TryDecimalStringCast<int64_t, ','>(input, result, parameters, width, scale);
1993
2051
  }
1994
2052
 
1995
2053
  template <>
1996
- bool TryCastToDecimalCommaSeparated::Operation(string_t input, hugeint_t &result, string *error_message, uint8_t width,
1997
- uint8_t scale) {
1998
- return TryDecimalStringCast<hugeint_t, ','>(input, result, error_message, width, scale);
2054
+ bool TryCastToDecimalCommaSeparated::Operation(string_t input, hugeint_t &result, CastParameters &parameters,
2055
+ uint8_t width, uint8_t scale) {
2056
+ return TryDecimalStringCast<hugeint_t, ','>(input, result, parameters, width, scale);
1999
2057
  }
2000
2058
 
2001
2059
  template <>
@@ -2024,9 +2082,9 @@ string_t StringCastFromDecimal::Operation(hugeint_t input, uint8_t width, uint8_
2024
2082
  // Decimal <-> Bool
2025
2083
  //===--------------------------------------------------------------------===//
2026
2084
  template <class T, class OP = NumericHelper>
2027
- bool TryCastBoolToDecimal(bool input, T &result, string *error_message, uint8_t width, uint8_t scale) {
2085
+ bool TryCastBoolToDecimal(bool input, T &result, CastParameters &parameters, uint8_t width, uint8_t scale) {
2028
2086
  if (width > scale) {
2029
- result = input ? OP::POWERS_OF_TEN[scale] : 0;
2087
+ result = UnsafeNumericCast<T>(input ? OP::POWERS_OF_TEN[scale] : 0);
2030
2088
  return true;
2031
2089
  } else {
2032
2090
  return TryCast::Operation<bool, T>(input, result);
@@ -2034,42 +2092,50 @@ bool TryCastBoolToDecimal(bool input, T &result, string *error_message, uint8_t
2034
2092
  }
2035
2093
 
2036
2094
  template <>
2037
- bool TryCastToDecimal::Operation(bool input, int16_t &result, string *error_message, uint8_t width, uint8_t scale) {
2038
- return TryCastBoolToDecimal<int16_t>(input, result, error_message, width, scale);
2095
+ bool TryCastToDecimal::Operation(bool input, int16_t &result, CastParameters &parameters, uint8_t width,
2096
+ uint8_t scale) {
2097
+ return TryCastBoolToDecimal<int16_t>(input, result, parameters, width, scale);
2039
2098
  }
2040
2099
 
2041
2100
  template <>
2042
- bool TryCastToDecimal::Operation(bool input, int32_t &result, string *error_message, uint8_t width, uint8_t scale) {
2043
- return TryCastBoolToDecimal<int32_t>(input, result, error_message, width, scale);
2101
+ bool TryCastToDecimal::Operation(bool input, int32_t &result, CastParameters &parameters, uint8_t width,
2102
+ uint8_t scale) {
2103
+ return TryCastBoolToDecimal<int32_t>(input, result, parameters, width, scale);
2044
2104
  }
2045
2105
 
2046
2106
  template <>
2047
- bool TryCastToDecimal::Operation(bool input, int64_t &result, string *error_message, uint8_t width, uint8_t scale) {
2048
- return TryCastBoolToDecimal<int64_t>(input, result, error_message, width, scale);
2107
+ bool TryCastToDecimal::Operation(bool input, int64_t &result, CastParameters &parameters, uint8_t width,
2108
+ uint8_t scale) {
2109
+ return TryCastBoolToDecimal<int64_t>(input, result, parameters, width, scale);
2049
2110
  }
2050
2111
 
2051
2112
  template <>
2052
- bool TryCastToDecimal::Operation(bool input, hugeint_t &result, string *error_message, uint8_t width, uint8_t scale) {
2053
- return TryCastBoolToDecimal<hugeint_t, Hugeint>(input, result, error_message, width, scale);
2113
+ bool TryCastToDecimal::Operation(bool input, hugeint_t &result, CastParameters &parameters, uint8_t width,
2114
+ uint8_t scale) {
2115
+ return TryCastBoolToDecimal<hugeint_t, Hugeint>(input, result, parameters, width, scale);
2054
2116
  }
2055
2117
 
2056
2118
  template <>
2057
- bool TryCastFromDecimal::Operation(int16_t input, bool &result, string *error_message, uint8_t width, uint8_t scale) {
2119
+ bool TryCastFromDecimal::Operation(int16_t input, bool &result, CastParameters &parameters, uint8_t width,
2120
+ uint8_t scale) {
2058
2121
  return TryCast::Operation<int16_t, bool>(input, result);
2059
2122
  }
2060
2123
 
2061
2124
  template <>
2062
- bool TryCastFromDecimal::Operation(int32_t input, bool &result, string *error_message, uint8_t width, uint8_t scale) {
2125
+ bool TryCastFromDecimal::Operation(int32_t input, bool &result, CastParameters &parameters, uint8_t width,
2126
+ uint8_t scale) {
2063
2127
  return TryCast::Operation<int32_t, bool>(input, result);
2064
2128
  }
2065
2129
 
2066
2130
  template <>
2067
- bool TryCastFromDecimal::Operation(int64_t input, bool &result, string *error_message, uint8_t width, uint8_t scale) {
2131
+ bool TryCastFromDecimal::Operation(int64_t input, bool &result, CastParameters &parameters, uint8_t width,
2132
+ uint8_t scale) {
2068
2133
  return TryCast::Operation<int64_t, bool>(input, result);
2069
2134
  }
2070
2135
 
2071
2136
  template <>
2072
- bool TryCastFromDecimal::Operation(hugeint_t input, bool &result, string *error_message, uint8_t width, uint8_t scale) {
2137
+ bool TryCastFromDecimal::Operation(hugeint_t input, bool &result, CastParameters &parameters, uint8_t width,
2138
+ uint8_t scale) {
2073
2139
  return TryCast::Operation<hugeint_t, bool>(input, result);
2074
2140
  }
2075
2141
 
@@ -2091,26 +2157,26 @@ struct UnsignedToDecimalOperator {
2091
2157
  };
2092
2158
 
2093
2159
  template <class SRC, class DST, class OP = SignedToDecimalOperator>
2094
- bool StandardNumericToDecimalCast(SRC input, DST &result, string *error_message, uint8_t width, uint8_t scale) {
2160
+ bool StandardNumericToDecimalCast(SRC input, DST &result, CastParameters &parameters, uint8_t width, uint8_t scale) {
2095
2161
  // check for overflow
2096
- DST max_width = NumericHelper::POWERS_OF_TEN[width - scale];
2162
+ DST max_width = UnsafeNumericCast<DST>(NumericHelper::POWERS_OF_TEN[width - scale]);
2097
2163
  if (OP::template Operation<SRC, DST>(input, max_width)) {
2098
2164
  string error = StringUtil::Format("Could not cast value %d to DECIMAL(%d,%d)", input, width, scale);
2099
- HandleCastError::AssignError(error, error_message);
2165
+ HandleCastError::AssignError(error, parameters);
2100
2166
  return false;
2101
2167
  }
2102
- result = DST(input) * NumericHelper::POWERS_OF_TEN[scale];
2168
+ result = UnsafeNumericCast<DST>(DST(input) * NumericHelper::POWERS_OF_TEN[scale]);
2103
2169
  return true;
2104
2170
  }
2105
2171
 
2106
2172
  template <class SRC>
2107
- bool NumericToHugeDecimalCast(SRC input, hugeint_t &result, string *error_message, uint8_t width, uint8_t scale) {
2173
+ bool NumericToHugeDecimalCast(SRC input, hugeint_t &result, CastParameters &parameters, uint8_t width, uint8_t scale) {
2108
2174
  // check for overflow
2109
2175
  hugeint_t max_width = Hugeint::POWERS_OF_TEN[width - scale];
2110
2176
  hugeint_t hinput = Hugeint::Convert(input);
2111
2177
  if (hinput >= max_width || hinput <= -max_width) {
2112
2178
  string error = StringUtil::Format("Could not cast value %s to DECIMAL(%d,%d)", hinput.ToString(), width, scale);
2113
- HandleCastError::AssignError(error, error_message);
2179
+ HandleCastError::AssignError(error, parameters);
2114
2180
  return false;
2115
2181
  }
2116
2182
  result = hinput * Hugeint::POWERS_OF_TEN[scale];
@@ -2121,191 +2187,216 @@ bool NumericToHugeDecimalCast(SRC input, hugeint_t &result, string *error_messag
2121
2187
  // Cast int8_t -> Decimal
2122
2188
  //===--------------------------------------------------------------------===//
2123
2189
  template <>
2124
- bool TryCastToDecimal::Operation(int8_t input, int16_t &result, string *error_message, uint8_t width, uint8_t scale) {
2125
- return StandardNumericToDecimalCast<int8_t, int16_t>(input, result, error_message, width, scale);
2190
+ bool TryCastToDecimal::Operation(int8_t input, int16_t &result, CastParameters &parameters, uint8_t width,
2191
+ uint8_t scale) {
2192
+ return StandardNumericToDecimalCast<int8_t, int16_t>(input, result, parameters, width, scale);
2126
2193
  }
2127
2194
  template <>
2128
- bool TryCastToDecimal::Operation(int8_t input, int32_t &result, string *error_message, uint8_t width, uint8_t scale) {
2129
- return StandardNumericToDecimalCast<int8_t, int32_t>(input, result, error_message, width, scale);
2195
+ bool TryCastToDecimal::Operation(int8_t input, int32_t &result, CastParameters &parameters, uint8_t width,
2196
+ uint8_t scale) {
2197
+ return StandardNumericToDecimalCast<int8_t, int32_t>(input, result, parameters, width, scale);
2130
2198
  }
2131
2199
  template <>
2132
- bool TryCastToDecimal::Operation(int8_t input, int64_t &result, string *error_message, uint8_t width, uint8_t scale) {
2133
- return StandardNumericToDecimalCast<int8_t, int64_t>(input, result, error_message, width, scale);
2200
+ bool TryCastToDecimal::Operation(int8_t input, int64_t &result, CastParameters &parameters, uint8_t width,
2201
+ uint8_t scale) {
2202
+ return StandardNumericToDecimalCast<int8_t, int64_t>(input, result, parameters, width, scale);
2134
2203
  }
2135
2204
  template <>
2136
- bool TryCastToDecimal::Operation(int8_t input, hugeint_t &result, string *error_message, uint8_t width, uint8_t scale) {
2137
- return NumericToHugeDecimalCast<int8_t>(input, result, error_message, width, scale);
2205
+ bool TryCastToDecimal::Operation(int8_t input, hugeint_t &result, CastParameters &parameters, uint8_t width,
2206
+ uint8_t scale) {
2207
+ return NumericToHugeDecimalCast<int8_t>(input, result, parameters, width, scale);
2138
2208
  }
2139
2209
 
2140
2210
  //===--------------------------------------------------------------------===//
2141
2211
  // Cast int16_t -> Decimal
2142
2212
  //===--------------------------------------------------------------------===//
2143
2213
  template <>
2144
- bool TryCastToDecimal::Operation(int16_t input, int16_t &result, string *error_message, uint8_t width, uint8_t scale) {
2145
- return StandardNumericToDecimalCast<int16_t, int16_t>(input, result, error_message, width, scale);
2214
+ bool TryCastToDecimal::Operation(int16_t input, int16_t &result, CastParameters &parameters, uint8_t width,
2215
+ uint8_t scale) {
2216
+ return StandardNumericToDecimalCast<int16_t, int16_t>(input, result, parameters, width, scale);
2146
2217
  }
2147
2218
  template <>
2148
- bool TryCastToDecimal::Operation(int16_t input, int32_t &result, string *error_message, uint8_t width, uint8_t scale) {
2149
- return StandardNumericToDecimalCast<int16_t, int32_t>(input, result, error_message, width, scale);
2219
+ bool TryCastToDecimal::Operation(int16_t input, int32_t &result, CastParameters &parameters, uint8_t width,
2220
+ uint8_t scale) {
2221
+ return StandardNumericToDecimalCast<int16_t, int32_t>(input, result, parameters, width, scale);
2150
2222
  }
2151
2223
  template <>
2152
- bool TryCastToDecimal::Operation(int16_t input, int64_t &result, string *error_message, uint8_t width, uint8_t scale) {
2153
- return StandardNumericToDecimalCast<int16_t, int64_t>(input, result, error_message, width, scale);
2224
+ bool TryCastToDecimal::Operation(int16_t input, int64_t &result, CastParameters &parameters, uint8_t width,
2225
+ uint8_t scale) {
2226
+ return StandardNumericToDecimalCast<int16_t, int64_t>(input, result, parameters, width, scale);
2154
2227
  }
2155
2228
  template <>
2156
- bool TryCastToDecimal::Operation(int16_t input, hugeint_t &result, string *error_message, uint8_t width,
2229
+ bool TryCastToDecimal::Operation(int16_t input, hugeint_t &result, CastParameters &parameters, uint8_t width,
2157
2230
  uint8_t scale) {
2158
- return NumericToHugeDecimalCast<int16_t>(input, result, error_message, width, scale);
2231
+ return NumericToHugeDecimalCast<int16_t>(input, result, parameters, width, scale);
2159
2232
  }
2160
2233
 
2161
2234
  //===--------------------------------------------------------------------===//
2162
2235
  // Cast int32_t -> Decimal
2163
2236
  //===--------------------------------------------------------------------===//
2164
2237
  template <>
2165
- bool TryCastToDecimal::Operation(int32_t input, int16_t &result, string *error_message, uint8_t width, uint8_t scale) {
2166
- return StandardNumericToDecimalCast<int32_t, int16_t>(input, result, error_message, width, scale);
2238
+ bool TryCastToDecimal::Operation(int32_t input, int16_t &result, CastParameters &parameters, uint8_t width,
2239
+ uint8_t scale) {
2240
+ return StandardNumericToDecimalCast<int32_t, int16_t>(input, result, parameters, width, scale);
2167
2241
  }
2168
2242
  template <>
2169
- bool TryCastToDecimal::Operation(int32_t input, int32_t &result, string *error_message, uint8_t width, uint8_t scale) {
2170
- return StandardNumericToDecimalCast<int32_t, int32_t>(input, result, error_message, width, scale);
2243
+ bool TryCastToDecimal::Operation(int32_t input, int32_t &result, CastParameters &parameters, uint8_t width,
2244
+ uint8_t scale) {
2245
+ return StandardNumericToDecimalCast<int32_t, int32_t>(input, result, parameters, width, scale);
2171
2246
  }
2172
2247
  template <>
2173
- bool TryCastToDecimal::Operation(int32_t input, int64_t &result, string *error_message, uint8_t width, uint8_t scale) {
2174
- return StandardNumericToDecimalCast<int32_t, int64_t>(input, result, error_message, width, scale);
2248
+ bool TryCastToDecimal::Operation(int32_t input, int64_t &result, CastParameters &parameters, uint8_t width,
2249
+ uint8_t scale) {
2250
+ return StandardNumericToDecimalCast<int32_t, int64_t>(input, result, parameters, width, scale);
2175
2251
  }
2176
2252
  template <>
2177
- bool TryCastToDecimal::Operation(int32_t input, hugeint_t &result, string *error_message, uint8_t width,
2253
+ bool TryCastToDecimal::Operation(int32_t input, hugeint_t &result, CastParameters &parameters, uint8_t width,
2178
2254
  uint8_t scale) {
2179
- return NumericToHugeDecimalCast<int32_t>(input, result, error_message, width, scale);
2255
+ return NumericToHugeDecimalCast<int32_t>(input, result, parameters, width, scale);
2180
2256
  }
2181
2257
 
2182
2258
  //===--------------------------------------------------------------------===//
2183
2259
  // Cast int64_t -> Decimal
2184
2260
  //===--------------------------------------------------------------------===//
2185
2261
  template <>
2186
- bool TryCastToDecimal::Operation(int64_t input, int16_t &result, string *error_message, uint8_t width, uint8_t scale) {
2187
- return StandardNumericToDecimalCast<int64_t, int16_t>(input, result, error_message, width, scale);
2262
+ bool TryCastToDecimal::Operation(int64_t input, int16_t &result, CastParameters &parameters, uint8_t width,
2263
+ uint8_t scale) {
2264
+ return StandardNumericToDecimalCast<int64_t, int16_t>(input, result, parameters, width, scale);
2188
2265
  }
2189
2266
  template <>
2190
- bool TryCastToDecimal::Operation(int64_t input, int32_t &result, string *error_message, uint8_t width, uint8_t scale) {
2191
- return StandardNumericToDecimalCast<int64_t, int32_t>(input, result, error_message, width, scale);
2267
+ bool TryCastToDecimal::Operation(int64_t input, int32_t &result, CastParameters &parameters, uint8_t width,
2268
+ uint8_t scale) {
2269
+ return StandardNumericToDecimalCast<int64_t, int32_t>(input, result, parameters, width, scale);
2192
2270
  }
2193
2271
  template <>
2194
- bool TryCastToDecimal::Operation(int64_t input, int64_t &result, string *error_message, uint8_t width, uint8_t scale) {
2195
- return StandardNumericToDecimalCast<int64_t, int64_t>(input, result, error_message, width, scale);
2272
+ bool TryCastToDecimal::Operation(int64_t input, int64_t &result, CastParameters &parameters, uint8_t width,
2273
+ uint8_t scale) {
2274
+ return StandardNumericToDecimalCast<int64_t, int64_t>(input, result, parameters, width, scale);
2196
2275
  }
2197
2276
  template <>
2198
- bool TryCastToDecimal::Operation(int64_t input, hugeint_t &result, string *error_message, uint8_t width,
2277
+ bool TryCastToDecimal::Operation(int64_t input, hugeint_t &result, CastParameters &parameters, uint8_t width,
2199
2278
  uint8_t scale) {
2200
- return NumericToHugeDecimalCast<int64_t>(input, result, error_message, width, scale);
2279
+ return NumericToHugeDecimalCast<int64_t>(input, result, parameters, width, scale);
2201
2280
  }
2202
2281
 
2203
2282
  //===--------------------------------------------------------------------===//
2204
2283
  // Cast uint8_t -> Decimal
2205
2284
  //===--------------------------------------------------------------------===//
2206
2285
  template <>
2207
- bool TryCastToDecimal::Operation(uint8_t input, int16_t &result, string *error_message, uint8_t width, uint8_t scale) {
2208
- return StandardNumericToDecimalCast<uint8_t, int16_t, UnsignedToDecimalOperator>(input, result, error_message,
2209
- width, scale);
2286
+ bool TryCastToDecimal::Operation(uint8_t input, int16_t &result, CastParameters &parameters, uint8_t width,
2287
+ uint8_t scale) {
2288
+ return StandardNumericToDecimalCast<uint8_t, int16_t, UnsignedToDecimalOperator>(input, result, parameters, width,
2289
+ scale);
2210
2290
  }
2211
2291
  template <>
2212
- bool TryCastToDecimal::Operation(uint8_t input, int32_t &result, string *error_message, uint8_t width, uint8_t scale) {
2213
- return StandardNumericToDecimalCast<uint8_t, int32_t, UnsignedToDecimalOperator>(input, result, error_message,
2214
- width, scale);
2292
+ bool TryCastToDecimal::Operation(uint8_t input, int32_t &result, CastParameters &parameters, uint8_t width,
2293
+ uint8_t scale) {
2294
+ return StandardNumericToDecimalCast<uint8_t, int32_t, UnsignedToDecimalOperator>(input, result, parameters, width,
2295
+ scale);
2215
2296
  }
2216
2297
  template <>
2217
- bool TryCastToDecimal::Operation(uint8_t input, int64_t &result, string *error_message, uint8_t width, uint8_t scale) {
2218
- return StandardNumericToDecimalCast<uint8_t, int64_t, UnsignedToDecimalOperator>(input, result, error_message,
2219
- width, scale);
2298
+ bool TryCastToDecimal::Operation(uint8_t input, int64_t &result, CastParameters &parameters, uint8_t width,
2299
+ uint8_t scale) {
2300
+ return StandardNumericToDecimalCast<uint8_t, int64_t, UnsignedToDecimalOperator>(input, result, parameters, width,
2301
+ scale);
2220
2302
  }
2221
2303
  template <>
2222
- bool TryCastToDecimal::Operation(uint8_t input, hugeint_t &result, string *error_message, uint8_t width,
2304
+ bool TryCastToDecimal::Operation(uint8_t input, hugeint_t &result, CastParameters &parameters, uint8_t width,
2223
2305
  uint8_t scale) {
2224
- return NumericToHugeDecimalCast<uint8_t>(input, result, error_message, width, scale);
2306
+ return NumericToHugeDecimalCast<uint8_t>(input, result, parameters, width, scale);
2225
2307
  }
2226
2308
 
2227
2309
  //===--------------------------------------------------------------------===//
2228
2310
  // Cast uint16_t -> Decimal
2229
2311
  //===--------------------------------------------------------------------===//
2230
2312
  template <>
2231
- bool TryCastToDecimal::Operation(uint16_t input, int16_t &result, string *error_message, uint8_t width, uint8_t scale) {
2232
- return StandardNumericToDecimalCast<uint16_t, int16_t, UnsignedToDecimalOperator>(input, result, error_message,
2233
- width, scale);
2313
+ bool TryCastToDecimal::Operation(uint16_t input, int16_t &result, CastParameters &parameters, uint8_t width,
2314
+ uint8_t scale) {
2315
+ return StandardNumericToDecimalCast<uint16_t, int16_t, UnsignedToDecimalOperator>(input, result, parameters, width,
2316
+ scale);
2234
2317
  }
2235
2318
  template <>
2236
- bool TryCastToDecimal::Operation(uint16_t input, int32_t &result, string *error_message, uint8_t width, uint8_t scale) {
2237
- return StandardNumericToDecimalCast<uint16_t, int32_t, UnsignedToDecimalOperator>(input, result, error_message,
2238
- width, scale);
2319
+ bool TryCastToDecimal::Operation(uint16_t input, int32_t &result, CastParameters &parameters, uint8_t width,
2320
+ uint8_t scale) {
2321
+ return StandardNumericToDecimalCast<uint16_t, int32_t, UnsignedToDecimalOperator>(input, result, parameters, width,
2322
+ scale);
2239
2323
  }
2240
2324
  template <>
2241
- bool TryCastToDecimal::Operation(uint16_t input, int64_t &result, string *error_message, uint8_t width, uint8_t scale) {
2242
- return StandardNumericToDecimalCast<uint16_t, int64_t, UnsignedToDecimalOperator>(input, result, error_message,
2243
- width, scale);
2325
+ bool TryCastToDecimal::Operation(uint16_t input, int64_t &result, CastParameters &parameters, uint8_t width,
2326
+ uint8_t scale) {
2327
+ return StandardNumericToDecimalCast<uint16_t, int64_t, UnsignedToDecimalOperator>(input, result, parameters, width,
2328
+ scale);
2244
2329
  }
2245
2330
  template <>
2246
- bool TryCastToDecimal::Operation(uint16_t input, hugeint_t &result, string *error_message, uint8_t width,
2331
+ bool TryCastToDecimal::Operation(uint16_t input, hugeint_t &result, CastParameters &parameters, uint8_t width,
2247
2332
  uint8_t scale) {
2248
- return NumericToHugeDecimalCast<uint16_t>(input, result, error_message, width, scale);
2333
+ return NumericToHugeDecimalCast<uint16_t>(input, result, parameters, width, scale);
2249
2334
  }
2250
2335
 
2251
2336
  //===--------------------------------------------------------------------===//
2252
2337
  // Cast uint32_t -> Decimal
2253
2338
  //===--------------------------------------------------------------------===//
2254
2339
  template <>
2255
- bool TryCastToDecimal::Operation(uint32_t input, int16_t &result, string *error_message, uint8_t width, uint8_t scale) {
2256
- return StandardNumericToDecimalCast<uint32_t, int16_t, UnsignedToDecimalOperator>(input, result, error_message,
2257
- width, scale);
2340
+ bool TryCastToDecimal::Operation(uint32_t input, int16_t &result, CastParameters &parameters, uint8_t width,
2341
+ uint8_t scale) {
2342
+ return StandardNumericToDecimalCast<uint32_t, int16_t, UnsignedToDecimalOperator>(input, result, parameters, width,
2343
+ scale);
2258
2344
  }
2259
2345
  template <>
2260
- bool TryCastToDecimal::Operation(uint32_t input, int32_t &result, string *error_message, uint8_t width, uint8_t scale) {
2261
- return StandardNumericToDecimalCast<uint32_t, int32_t, UnsignedToDecimalOperator>(input, result, error_message,
2262
- width, scale);
2346
+ bool TryCastToDecimal::Operation(uint32_t input, int32_t &result, CastParameters &parameters, uint8_t width,
2347
+ uint8_t scale) {
2348
+ return StandardNumericToDecimalCast<uint32_t, int32_t, UnsignedToDecimalOperator>(input, result, parameters, width,
2349
+ scale);
2263
2350
  }
2264
2351
  template <>
2265
- bool TryCastToDecimal::Operation(uint32_t input, int64_t &result, string *error_message, uint8_t width, uint8_t scale) {
2266
- return StandardNumericToDecimalCast<uint32_t, int64_t, UnsignedToDecimalOperator>(input, result, error_message,
2267
- width, scale);
2352
+ bool TryCastToDecimal::Operation(uint32_t input, int64_t &result, CastParameters &parameters, uint8_t width,
2353
+ uint8_t scale) {
2354
+ return StandardNumericToDecimalCast<uint32_t, int64_t, UnsignedToDecimalOperator>(input, result, parameters, width,
2355
+ scale);
2268
2356
  }
2269
2357
  template <>
2270
- bool TryCastToDecimal::Operation(uint32_t input, hugeint_t &result, string *error_message, uint8_t width,
2358
+ bool TryCastToDecimal::Operation(uint32_t input, hugeint_t &result, CastParameters &parameters, uint8_t width,
2271
2359
  uint8_t scale) {
2272
- return NumericToHugeDecimalCast<uint32_t>(input, result, error_message, width, scale);
2360
+ return NumericToHugeDecimalCast<uint32_t>(input, result, parameters, width, scale);
2273
2361
  }
2274
2362
 
2275
2363
  //===--------------------------------------------------------------------===//
2276
2364
  // Cast uint64_t -> Decimal
2277
2365
  //===--------------------------------------------------------------------===//
2278
2366
  template <>
2279
- bool TryCastToDecimal::Operation(uint64_t input, int16_t &result, string *error_message, uint8_t width, uint8_t scale) {
2280
- return StandardNumericToDecimalCast<uint64_t, int16_t, UnsignedToDecimalOperator>(input, result, error_message,
2281
- width, scale);
2367
+ bool TryCastToDecimal::Operation(uint64_t input, int16_t &result, CastParameters &parameters, uint8_t width,
2368
+ uint8_t scale) {
2369
+ return StandardNumericToDecimalCast<uint64_t, int16_t, UnsignedToDecimalOperator>(input, result, parameters, width,
2370
+ scale);
2282
2371
  }
2283
2372
  template <>
2284
- bool TryCastToDecimal::Operation(uint64_t input, int32_t &result, string *error_message, uint8_t width, uint8_t scale) {
2285
- return StandardNumericToDecimalCast<uint64_t, int32_t, UnsignedToDecimalOperator>(input, result, error_message,
2286
- width, scale);
2373
+ bool TryCastToDecimal::Operation(uint64_t input, int32_t &result, CastParameters &parameters, uint8_t width,
2374
+ uint8_t scale) {
2375
+ return StandardNumericToDecimalCast<uint64_t, int32_t, UnsignedToDecimalOperator>(input, result, parameters, width,
2376
+ scale);
2287
2377
  }
2288
2378
  template <>
2289
- bool TryCastToDecimal::Operation(uint64_t input, int64_t &result, string *error_message, uint8_t width, uint8_t scale) {
2290
- return StandardNumericToDecimalCast<uint64_t, int64_t, UnsignedToDecimalOperator>(input, result, error_message,
2291
- width, scale);
2379
+ bool TryCastToDecimal::Operation(uint64_t input, int64_t &result, CastParameters &parameters, uint8_t width,
2380
+ uint8_t scale) {
2381
+ return StandardNumericToDecimalCast<uint64_t, int64_t, UnsignedToDecimalOperator>(input, result, parameters, width,
2382
+ scale);
2292
2383
  }
2293
2384
  template <>
2294
- bool TryCastToDecimal::Operation(uint64_t input, hugeint_t &result, string *error_message, uint8_t width,
2385
+ bool TryCastToDecimal::Operation(uint64_t input, hugeint_t &result, CastParameters &parameters, uint8_t width,
2295
2386
  uint8_t scale) {
2296
- return NumericToHugeDecimalCast<uint64_t>(input, result, error_message, width, scale);
2387
+ return NumericToHugeDecimalCast<uint64_t>(input, result, parameters, width, scale);
2297
2388
  }
2298
2389
 
2299
2390
  //===--------------------------------------------------------------------===//
2300
2391
  // Hugeint -> Decimal Cast
2301
2392
  //===--------------------------------------------------------------------===//
2302
2393
  template <class DST>
2303
- bool HugeintToDecimalCast(hugeint_t input, DST &result, string *error_message, uint8_t width, uint8_t scale) {
2394
+ bool HugeintToDecimalCast(hugeint_t input, DST &result, CastParameters &parameters, uint8_t width, uint8_t scale) {
2304
2395
  // check for overflow
2305
2396
  hugeint_t max_width = Hugeint::POWERS_OF_TEN[width - scale];
2306
2397
  if (input >= max_width || input <= -max_width) {
2307
2398
  string error = StringUtil::Format("Could not cast value %s to DECIMAL(%d,%d)", input.ToString(), width, scale);
2308
- HandleCastError::AssignError(error, error_message);
2399
+ HandleCastError::AssignError(error, parameters);
2309
2400
  return false;
2310
2401
  }
2311
2402
  result = Hugeint::Cast<DST>(input * Hugeint::POWERS_OF_TEN[scale]);
@@ -2313,39 +2404,39 @@ bool HugeintToDecimalCast(hugeint_t input, DST &result, string *error_message, u
2313
2404
  }
2314
2405
 
2315
2406
  template <>
2316
- bool TryCastToDecimal::Operation(hugeint_t input, int16_t &result, string *error_message, uint8_t width,
2407
+ bool TryCastToDecimal::Operation(hugeint_t input, int16_t &result, CastParameters &parameters, uint8_t width,
2317
2408
  uint8_t scale) {
2318
- return HugeintToDecimalCast<int16_t>(input, result, error_message, width, scale);
2409
+ return HugeintToDecimalCast<int16_t>(input, result, parameters, width, scale);
2319
2410
  }
2320
2411
 
2321
2412
  template <>
2322
- bool TryCastToDecimal::Operation(hugeint_t input, int32_t &result, string *error_message, uint8_t width,
2413
+ bool TryCastToDecimal::Operation(hugeint_t input, int32_t &result, CastParameters &parameters, uint8_t width,
2323
2414
  uint8_t scale) {
2324
- return HugeintToDecimalCast<int32_t>(input, result, error_message, width, scale);
2415
+ return HugeintToDecimalCast<int32_t>(input, result, parameters, width, scale);
2325
2416
  }
2326
2417
 
2327
2418
  template <>
2328
- bool TryCastToDecimal::Operation(hugeint_t input, int64_t &result, string *error_message, uint8_t width,
2419
+ bool TryCastToDecimal::Operation(hugeint_t input, int64_t &result, CastParameters &parameters, uint8_t width,
2329
2420
  uint8_t scale) {
2330
- return HugeintToDecimalCast<int64_t>(input, result, error_message, width, scale);
2421
+ return HugeintToDecimalCast<int64_t>(input, result, parameters, width, scale);
2331
2422
  }
2332
2423
 
2333
2424
  template <>
2334
- bool TryCastToDecimal::Operation(hugeint_t input, hugeint_t &result, string *error_message, uint8_t width,
2425
+ bool TryCastToDecimal::Operation(hugeint_t input, hugeint_t &result, CastParameters &parameters, uint8_t width,
2335
2426
  uint8_t scale) {
2336
- return HugeintToDecimalCast<hugeint_t>(input, result, error_message, width, scale);
2427
+ return HugeintToDecimalCast<hugeint_t>(input, result, parameters, width, scale);
2337
2428
  }
2338
2429
 
2339
2430
  //===--------------------------------------------------------------------===//
2340
2431
  // Uhugeint -> Decimal Cast
2341
2432
  //===--------------------------------------------------------------------===//
2342
2433
  template <class DST>
2343
- bool UhugeintToDecimalCast(uhugeint_t input, DST &result, string *error_message, uint8_t width, uint8_t scale) {
2434
+ bool UhugeintToDecimalCast(uhugeint_t input, DST &result, CastParameters &parameters, uint8_t width, uint8_t scale) {
2344
2435
  // check for overflow
2345
2436
  uhugeint_t max_width = Uhugeint::POWERS_OF_TEN[width - scale];
2346
2437
  if (input >= max_width) {
2347
2438
  string error = StringUtil::Format("Could not cast value %s to DECIMAL(%d,%d)", input.ToString(), width, scale);
2348
- HandleCastError::AssignError(error, error_message);
2439
+ HandleCastError::AssignError(error, parameters);
2349
2440
  return false;
2350
2441
  }
2351
2442
  result = Uhugeint::Cast<DST>(input * Uhugeint::POWERS_OF_TEN[scale]);
@@ -2353,41 +2444,41 @@ bool UhugeintToDecimalCast(uhugeint_t input, DST &result, string *error_message,
2353
2444
  }
2354
2445
 
2355
2446
  template <>
2356
- bool TryCastToDecimal::Operation(uhugeint_t input, int16_t &result, string *error_message, uint8_t width,
2447
+ bool TryCastToDecimal::Operation(uhugeint_t input, int16_t &result, CastParameters &parameters, uint8_t width,
2357
2448
  uint8_t scale) {
2358
- return UhugeintToDecimalCast<int16_t>(input, result, error_message, width, scale);
2449
+ return UhugeintToDecimalCast<int16_t>(input, result, parameters, width, scale);
2359
2450
  }
2360
2451
 
2361
2452
  template <>
2362
- bool TryCastToDecimal::Operation(uhugeint_t input, int32_t &result, string *error_message, uint8_t width,
2453
+ bool TryCastToDecimal::Operation(uhugeint_t input, int32_t &result, CastParameters &parameters, uint8_t width,
2363
2454
  uint8_t scale) {
2364
- return UhugeintToDecimalCast<int32_t>(input, result, error_message, width, scale);
2455
+ return UhugeintToDecimalCast<int32_t>(input, result, parameters, width, scale);
2365
2456
  }
2366
2457
 
2367
2458
  template <>
2368
- bool TryCastToDecimal::Operation(uhugeint_t input, int64_t &result, string *error_message, uint8_t width,
2459
+ bool TryCastToDecimal::Operation(uhugeint_t input, int64_t &result, CastParameters &parameters, uint8_t width,
2369
2460
  uint8_t scale) {
2370
- return UhugeintToDecimalCast<int64_t>(input, result, error_message, width, scale);
2461
+ return UhugeintToDecimalCast<int64_t>(input, result, parameters, width, scale);
2371
2462
  }
2372
2463
 
2373
2464
  template <>
2374
- bool TryCastToDecimal::Operation(uhugeint_t input, hugeint_t &result, string *error_message, uint8_t width,
2465
+ bool TryCastToDecimal::Operation(uhugeint_t input, hugeint_t &result, CastParameters &parameters, uint8_t width,
2375
2466
  uint8_t scale) {
2376
- return UhugeintToDecimalCast<hugeint_t>(input, result, error_message, width, scale);
2467
+ return UhugeintToDecimalCast<hugeint_t>(input, result, parameters, width, scale);
2377
2468
  }
2378
2469
 
2379
2470
  //===--------------------------------------------------------------------===//
2380
2471
  // Float/Double -> Decimal Cast
2381
2472
  //===--------------------------------------------------------------------===//
2382
2473
  template <class SRC, class DST>
2383
- bool DoubleToDecimalCast(SRC input, DST &result, string *error_message, uint8_t width, uint8_t scale) {
2474
+ bool DoubleToDecimalCast(SRC input, DST &result, CastParameters &parameters, uint8_t width, uint8_t scale) {
2384
2475
  double value = input * NumericHelper::DOUBLE_POWERS_OF_TEN[scale];
2385
2476
  // Add the sign (-1, 0, 1) times a tiny value to fix floating point issues (issue 3091)
2386
2477
  double sign = (double(0) < value) - (value < double(0));
2387
2478
  value += 1e-9 * sign;
2388
2479
  if (value <= -NumericHelper::DOUBLE_POWERS_OF_TEN[width] || value >= NumericHelper::DOUBLE_POWERS_OF_TEN[width]) {
2389
2480
  string error = StringUtil::Format("Could not cast value %f to DECIMAL(%d,%d)", value, width, scale);
2390
- HandleCastError::AssignError(error, error_message);
2481
+ HandleCastError::AssignError(error, parameters);
2391
2482
  return false;
2392
2483
  }
2393
2484
  result = Cast::Operation<SRC, DST>(value);
@@ -2395,73 +2486,81 @@ bool DoubleToDecimalCast(SRC input, DST &result, string *error_message, uint8_t
2395
2486
  }
2396
2487
 
2397
2488
  template <>
2398
- bool TryCastToDecimal::Operation(float input, int16_t &result, string *error_message, uint8_t width, uint8_t scale) {
2399
- return DoubleToDecimalCast<float, int16_t>(input, result, error_message, width, scale);
2489
+ bool TryCastToDecimal::Operation(float input, int16_t &result, CastParameters &parameters, uint8_t width,
2490
+ uint8_t scale) {
2491
+ return DoubleToDecimalCast<float, int16_t>(input, result, parameters, width, scale);
2400
2492
  }
2401
2493
 
2402
2494
  template <>
2403
- bool TryCastToDecimal::Operation(float input, int32_t &result, string *error_message, uint8_t width, uint8_t scale) {
2404
- return DoubleToDecimalCast<float, int32_t>(input, result, error_message, width, scale);
2495
+ bool TryCastToDecimal::Operation(float input, int32_t &result, CastParameters &parameters, uint8_t width,
2496
+ uint8_t scale) {
2497
+ return DoubleToDecimalCast<float, int32_t>(input, result, parameters, width, scale);
2405
2498
  }
2406
2499
 
2407
2500
  template <>
2408
- bool TryCastToDecimal::Operation(float input, int64_t &result, string *error_message, uint8_t width, uint8_t scale) {
2409
- return DoubleToDecimalCast<float, int64_t>(input, result, error_message, width, scale);
2501
+ bool TryCastToDecimal::Operation(float input, int64_t &result, CastParameters &parameters, uint8_t width,
2502
+ uint8_t scale) {
2503
+ return DoubleToDecimalCast<float, int64_t>(input, result, parameters, width, scale);
2410
2504
  }
2411
2505
 
2412
2506
  template <>
2413
- bool TryCastToDecimal::Operation(float input, hugeint_t &result, string *error_message, uint8_t width, uint8_t scale) {
2414
- return DoubleToDecimalCast<float, hugeint_t>(input, result, error_message, width, scale);
2507
+ bool TryCastToDecimal::Operation(float input, hugeint_t &result, CastParameters &parameters, uint8_t width,
2508
+ uint8_t scale) {
2509
+ return DoubleToDecimalCast<float, hugeint_t>(input, result, parameters, width, scale);
2415
2510
  }
2416
2511
 
2417
2512
  template <>
2418
- bool TryCastToDecimal::Operation(double input, int16_t &result, string *error_message, uint8_t width, uint8_t scale) {
2419
- return DoubleToDecimalCast<double, int16_t>(input, result, error_message, width, scale);
2513
+ bool TryCastToDecimal::Operation(double input, int16_t &result, CastParameters &parameters, uint8_t width,
2514
+ uint8_t scale) {
2515
+ return DoubleToDecimalCast<double, int16_t>(input, result, parameters, width, scale);
2420
2516
  }
2421
2517
 
2422
2518
  template <>
2423
- bool TryCastToDecimal::Operation(double input, int32_t &result, string *error_message, uint8_t width, uint8_t scale) {
2424
- return DoubleToDecimalCast<double, int32_t>(input, result, error_message, width, scale);
2519
+ bool TryCastToDecimal::Operation(double input, int32_t &result, CastParameters &parameters, uint8_t width,
2520
+ uint8_t scale) {
2521
+ return DoubleToDecimalCast<double, int32_t>(input, result, parameters, width, scale);
2425
2522
  }
2426
2523
 
2427
2524
  template <>
2428
- bool TryCastToDecimal::Operation(double input, int64_t &result, string *error_message, uint8_t width, uint8_t scale) {
2429
- return DoubleToDecimalCast<double, int64_t>(input, result, error_message, width, scale);
2525
+ bool TryCastToDecimal::Operation(double input, int64_t &result, CastParameters &parameters, uint8_t width,
2526
+ uint8_t scale) {
2527
+ return DoubleToDecimalCast<double, int64_t>(input, result, parameters, width, scale);
2430
2528
  }
2431
2529
 
2432
2530
  template <>
2433
- bool TryCastToDecimal::Operation(double input, hugeint_t &result, string *error_message, uint8_t width, uint8_t scale) {
2434
- return DoubleToDecimalCast<double, hugeint_t>(input, result, error_message, width, scale);
2531
+ bool TryCastToDecimal::Operation(double input, hugeint_t &result, CastParameters &parameters, uint8_t width,
2532
+ uint8_t scale) {
2533
+ return DoubleToDecimalCast<double, hugeint_t>(input, result, parameters, width, scale);
2435
2534
  }
2436
2535
 
2437
2536
  //===--------------------------------------------------------------------===//
2438
2537
  // Decimal -> Numeric Cast
2439
2538
  //===--------------------------------------------------------------------===//
2440
2539
  template <class SRC, class DST>
2441
- bool TryCastDecimalToNumeric(SRC input, DST &result, string *error_message, uint8_t scale) {
2540
+ bool TryCastDecimalToNumeric(SRC input, DST &result, CastParameters &parameters, uint8_t scale) {
2442
2541
  // Round away from 0.
2443
2542
  const auto power = NumericHelper::POWERS_OF_TEN[scale];
2444
2543
  // https://graphics.stanford.edu/~seander/bithacks.html#ConditionalNegate
2445
2544
  const auto fNegate = int64_t(input < 0);
2446
2545
  const auto rounding = ((power ^ -fNegate) + fNegate) / 2;
2447
2546
  const auto scaled_value = (input + rounding) / power;
2448
- if (!TryCast::Operation<SRC, DST>(scaled_value, result)) {
2547
+ if (!TryCast::Operation<SRC, DST>(UnsafeNumericCast<SRC>(scaled_value), result)) {
2449
2548
  string error = StringUtil::Format("Failed to cast decimal value %d to type %s", scaled_value, GetTypeId<DST>());
2450
- HandleCastError::AssignError(error, error_message);
2549
+ HandleCastError::AssignError(error, parameters);
2451
2550
  return false;
2452
2551
  }
2453
2552
  return true;
2454
2553
  }
2455
2554
 
2456
2555
  template <class DST>
2457
- bool TryCastHugeDecimalToNumeric(hugeint_t input, DST &result, string *error_message, uint8_t scale) {
2556
+ bool TryCastHugeDecimalToNumeric(hugeint_t input, DST &result, CastParameters &parameters, uint8_t scale) {
2458
2557
  const auto power = Hugeint::POWERS_OF_TEN[scale];
2459
2558
  const auto rounding = ((input < 0) ? -power : power) / 2;
2460
2559
  auto scaled_value = (input + rounding) / power;
2461
2560
  if (!TryCast::Operation<hugeint_t, DST>(scaled_value, result)) {
2462
2561
  string error = StringUtil::Format("Failed to cast decimal value %s to type %s",
2463
2562
  ConvertToString::Operation(scaled_value), GetTypeId<DST>());
2464
- HandleCastError::AssignError(error, error_message);
2563
+ HandleCastError::AssignError(error, parameters);
2465
2564
  return false;
2466
2565
  }
2467
2566
  return true;
@@ -2471,237 +2570,240 @@ bool TryCastHugeDecimalToNumeric(hugeint_t input, DST &result, string *error_mes
2471
2570
  // Cast Decimal -> int8_t
2472
2571
  //===--------------------------------------------------------------------===//
2473
2572
  template <>
2474
- bool TryCastFromDecimal::Operation(int16_t input, int8_t &result, string *error_message, uint8_t width, uint8_t scale) {
2475
- return TryCastDecimalToNumeric<int16_t, int8_t>(input, result, error_message, scale);
2573
+ bool TryCastFromDecimal::Operation(int16_t input, int8_t &result, CastParameters &parameters, uint8_t width,
2574
+ uint8_t scale) {
2575
+ return TryCastDecimalToNumeric<int16_t, int8_t>(input, result, parameters, scale);
2476
2576
  }
2477
2577
  template <>
2478
- bool TryCastFromDecimal::Operation(int32_t input, int8_t &result, string *error_message, uint8_t width, uint8_t scale) {
2479
- return TryCastDecimalToNumeric<int32_t, int8_t>(input, result, error_message, scale);
2578
+ bool TryCastFromDecimal::Operation(int32_t input, int8_t &result, CastParameters &parameters, uint8_t width,
2579
+ uint8_t scale) {
2580
+ return TryCastDecimalToNumeric<int32_t, int8_t>(input, result, parameters, scale);
2480
2581
  }
2481
2582
  template <>
2482
- bool TryCastFromDecimal::Operation(int64_t input, int8_t &result, string *error_message, uint8_t width, uint8_t scale) {
2483
- return TryCastDecimalToNumeric<int64_t, int8_t>(input, result, error_message, scale);
2583
+ bool TryCastFromDecimal::Operation(int64_t input, int8_t &result, CastParameters &parameters, uint8_t width,
2584
+ uint8_t scale) {
2585
+ return TryCastDecimalToNumeric<int64_t, int8_t>(input, result, parameters, scale);
2484
2586
  }
2485
2587
  template <>
2486
- bool TryCastFromDecimal::Operation(hugeint_t input, int8_t &result, string *error_message, uint8_t width,
2588
+ bool TryCastFromDecimal::Operation(hugeint_t input, int8_t &result, CastParameters &parameters, uint8_t width,
2487
2589
  uint8_t scale) {
2488
- return TryCastHugeDecimalToNumeric<int8_t>(input, result, error_message, scale);
2590
+ return TryCastHugeDecimalToNumeric<int8_t>(input, result, parameters, scale);
2489
2591
  }
2490
2592
 
2491
2593
  //===--------------------------------------------------------------------===//
2492
2594
  // Cast Decimal -> int16_t
2493
2595
  //===--------------------------------------------------------------------===//
2494
2596
  template <>
2495
- bool TryCastFromDecimal::Operation(int16_t input, int16_t &result, string *error_message, uint8_t width,
2597
+ bool TryCastFromDecimal::Operation(int16_t input, int16_t &result, CastParameters &parameters, uint8_t width,
2496
2598
  uint8_t scale) {
2497
- return TryCastDecimalToNumeric<int16_t, int16_t>(input, result, error_message, scale);
2599
+ return TryCastDecimalToNumeric<int16_t, int16_t>(input, result, parameters, scale);
2498
2600
  }
2499
2601
  template <>
2500
- bool TryCastFromDecimal::Operation(int32_t input, int16_t &result, string *error_message, uint8_t width,
2602
+ bool TryCastFromDecimal::Operation(int32_t input, int16_t &result, CastParameters &parameters, uint8_t width,
2501
2603
  uint8_t scale) {
2502
- return TryCastDecimalToNumeric<int32_t, int16_t>(input, result, error_message, scale);
2604
+ return TryCastDecimalToNumeric<int32_t, int16_t>(input, result, parameters, scale);
2503
2605
  }
2504
2606
  template <>
2505
- bool TryCastFromDecimal::Operation(int64_t input, int16_t &result, string *error_message, uint8_t width,
2607
+ bool TryCastFromDecimal::Operation(int64_t input, int16_t &result, CastParameters &parameters, uint8_t width,
2506
2608
  uint8_t scale) {
2507
- return TryCastDecimalToNumeric<int64_t, int16_t>(input, result, error_message, scale);
2609
+ return TryCastDecimalToNumeric<int64_t, int16_t>(input, result, parameters, scale);
2508
2610
  }
2509
2611
  template <>
2510
- bool TryCastFromDecimal::Operation(hugeint_t input, int16_t &result, string *error_message, uint8_t width,
2612
+ bool TryCastFromDecimal::Operation(hugeint_t input, int16_t &result, CastParameters &parameters, uint8_t width,
2511
2613
  uint8_t scale) {
2512
- return TryCastHugeDecimalToNumeric<int16_t>(input, result, error_message, scale);
2614
+ return TryCastHugeDecimalToNumeric<int16_t>(input, result, parameters, scale);
2513
2615
  }
2514
2616
 
2515
2617
  //===--------------------------------------------------------------------===//
2516
2618
  // Cast Decimal -> int32_t
2517
2619
  //===--------------------------------------------------------------------===//
2518
2620
  template <>
2519
- bool TryCastFromDecimal::Operation(int16_t input, int32_t &result, string *error_message, uint8_t width,
2621
+ bool TryCastFromDecimal::Operation(int16_t input, int32_t &result, CastParameters &parameters, uint8_t width,
2520
2622
  uint8_t scale) {
2521
- return TryCastDecimalToNumeric<int16_t, int32_t>(input, result, error_message, scale);
2623
+ return TryCastDecimalToNumeric<int16_t, int32_t>(input, result, parameters, scale);
2522
2624
  }
2523
2625
  template <>
2524
- bool TryCastFromDecimal::Operation(int32_t input, int32_t &result, string *error_message, uint8_t width,
2626
+ bool TryCastFromDecimal::Operation(int32_t input, int32_t &result, CastParameters &parameters, uint8_t width,
2525
2627
  uint8_t scale) {
2526
- return TryCastDecimalToNumeric<int32_t, int32_t>(input, result, error_message, scale);
2628
+ return TryCastDecimalToNumeric<int32_t, int32_t>(input, result, parameters, scale);
2527
2629
  }
2528
2630
  template <>
2529
- bool TryCastFromDecimal::Operation(int64_t input, int32_t &result, string *error_message, uint8_t width,
2631
+ bool TryCastFromDecimal::Operation(int64_t input, int32_t &result, CastParameters &parameters, uint8_t width,
2530
2632
  uint8_t scale) {
2531
- return TryCastDecimalToNumeric<int64_t, int32_t>(input, result, error_message, scale);
2633
+ return TryCastDecimalToNumeric<int64_t, int32_t>(input, result, parameters, scale);
2532
2634
  }
2533
2635
  template <>
2534
- bool TryCastFromDecimal::Operation(hugeint_t input, int32_t &result, string *error_message, uint8_t width,
2636
+ bool TryCastFromDecimal::Operation(hugeint_t input, int32_t &result, CastParameters &parameters, uint8_t width,
2535
2637
  uint8_t scale) {
2536
- return TryCastHugeDecimalToNumeric<int32_t>(input, result, error_message, scale);
2638
+ return TryCastHugeDecimalToNumeric<int32_t>(input, result, parameters, scale);
2537
2639
  }
2538
2640
 
2539
2641
  //===--------------------------------------------------------------------===//
2540
2642
  // Cast Decimal -> int64_t
2541
2643
  //===--------------------------------------------------------------------===//
2542
2644
  template <>
2543
- bool TryCastFromDecimal::Operation(int16_t input, int64_t &result, string *error_message, uint8_t width,
2645
+ bool TryCastFromDecimal::Operation(int16_t input, int64_t &result, CastParameters &parameters, uint8_t width,
2544
2646
  uint8_t scale) {
2545
- return TryCastDecimalToNumeric<int16_t, int64_t>(input, result, error_message, scale);
2647
+ return TryCastDecimalToNumeric<int16_t, int64_t>(input, result, parameters, scale);
2546
2648
  }
2547
2649
  template <>
2548
- bool TryCastFromDecimal::Operation(int32_t input, int64_t &result, string *error_message, uint8_t width,
2650
+ bool TryCastFromDecimal::Operation(int32_t input, int64_t &result, CastParameters &parameters, uint8_t width,
2549
2651
  uint8_t scale) {
2550
- return TryCastDecimalToNumeric<int32_t, int64_t>(input, result, error_message, scale);
2652
+ return TryCastDecimalToNumeric<int32_t, int64_t>(input, result, parameters, scale);
2551
2653
  }
2552
2654
  template <>
2553
- bool TryCastFromDecimal::Operation(int64_t input, int64_t &result, string *error_message, uint8_t width,
2655
+ bool TryCastFromDecimal::Operation(int64_t input, int64_t &result, CastParameters &parameters, uint8_t width,
2554
2656
  uint8_t scale) {
2555
- return TryCastDecimalToNumeric<int64_t, int64_t>(input, result, error_message, scale);
2657
+ return TryCastDecimalToNumeric<int64_t, int64_t>(input, result, parameters, scale);
2556
2658
  }
2557
2659
  template <>
2558
- bool TryCastFromDecimal::Operation(hugeint_t input, int64_t &result, string *error_message, uint8_t width,
2660
+ bool TryCastFromDecimal::Operation(hugeint_t input, int64_t &result, CastParameters &parameters, uint8_t width,
2559
2661
  uint8_t scale) {
2560
- return TryCastHugeDecimalToNumeric<int64_t>(input, result, error_message, scale);
2662
+ return TryCastHugeDecimalToNumeric<int64_t>(input, result, parameters, scale);
2561
2663
  }
2562
2664
 
2563
2665
  //===--------------------------------------------------------------------===//
2564
2666
  // Cast Decimal -> uint8_t
2565
2667
  //===--------------------------------------------------------------------===//
2566
2668
  template <>
2567
- bool TryCastFromDecimal::Operation(int16_t input, uint8_t &result, string *error_message, uint8_t width,
2669
+ bool TryCastFromDecimal::Operation(int16_t input, uint8_t &result, CastParameters &parameters, uint8_t width,
2568
2670
  uint8_t scale) {
2569
- return TryCastDecimalToNumeric<int16_t, uint8_t>(input, result, error_message, scale);
2671
+ return TryCastDecimalToNumeric<int16_t, uint8_t>(input, result, parameters, scale);
2570
2672
  }
2571
2673
  template <>
2572
- bool TryCastFromDecimal::Operation(int32_t input, uint8_t &result, string *error_message, uint8_t width,
2674
+ bool TryCastFromDecimal::Operation(int32_t input, uint8_t &result, CastParameters &parameters, uint8_t width,
2573
2675
  uint8_t scale) {
2574
- return TryCastDecimalToNumeric<int32_t, uint8_t>(input, result, error_message, scale);
2676
+ return TryCastDecimalToNumeric<int32_t, uint8_t>(input, result, parameters, scale);
2575
2677
  }
2576
2678
  template <>
2577
- bool TryCastFromDecimal::Operation(int64_t input, uint8_t &result, string *error_message, uint8_t width,
2679
+ bool TryCastFromDecimal::Operation(int64_t input, uint8_t &result, CastParameters &parameters, uint8_t width,
2578
2680
  uint8_t scale) {
2579
- return TryCastDecimalToNumeric<int64_t, uint8_t>(input, result, error_message, scale);
2681
+ return TryCastDecimalToNumeric<int64_t, uint8_t>(input, result, parameters, scale);
2580
2682
  }
2581
2683
  template <>
2582
- bool TryCastFromDecimal::Operation(hugeint_t input, uint8_t &result, string *error_message, uint8_t width,
2684
+ bool TryCastFromDecimal::Operation(hugeint_t input, uint8_t &result, CastParameters &parameters, uint8_t width,
2583
2685
  uint8_t scale) {
2584
- return TryCastHugeDecimalToNumeric<uint8_t>(input, result, error_message, scale);
2686
+ return TryCastHugeDecimalToNumeric<uint8_t>(input, result, parameters, scale);
2585
2687
  }
2586
2688
 
2587
2689
  //===--------------------------------------------------------------------===//
2588
2690
  // Cast Decimal -> uint16_t
2589
2691
  //===--------------------------------------------------------------------===//
2590
2692
  template <>
2591
- bool TryCastFromDecimal::Operation(int16_t input, uint16_t &result, string *error_message, uint8_t width,
2693
+ bool TryCastFromDecimal::Operation(int16_t input, uint16_t &result, CastParameters &parameters, uint8_t width,
2592
2694
  uint8_t scale) {
2593
- return TryCastDecimalToNumeric<int16_t, uint16_t>(input, result, error_message, scale);
2695
+ return TryCastDecimalToNumeric<int16_t, uint16_t>(input, result, parameters, scale);
2594
2696
  }
2595
2697
  template <>
2596
- bool TryCastFromDecimal::Operation(int32_t input, uint16_t &result, string *error_message, uint8_t width,
2698
+ bool TryCastFromDecimal::Operation(int32_t input, uint16_t &result, CastParameters &parameters, uint8_t width,
2597
2699
  uint8_t scale) {
2598
- return TryCastDecimalToNumeric<int32_t, uint16_t>(input, result, error_message, scale);
2700
+ return TryCastDecimalToNumeric<int32_t, uint16_t>(input, result, parameters, scale);
2599
2701
  }
2600
2702
  template <>
2601
- bool TryCastFromDecimal::Operation(int64_t input, uint16_t &result, string *error_message, uint8_t width,
2703
+ bool TryCastFromDecimal::Operation(int64_t input, uint16_t &result, CastParameters &parameters, uint8_t width,
2602
2704
  uint8_t scale) {
2603
- return TryCastDecimalToNumeric<int64_t, uint16_t>(input, result, error_message, scale);
2705
+ return TryCastDecimalToNumeric<int64_t, uint16_t>(input, result, parameters, scale);
2604
2706
  }
2605
2707
  template <>
2606
- bool TryCastFromDecimal::Operation(hugeint_t input, uint16_t &result, string *error_message, uint8_t width,
2708
+ bool TryCastFromDecimal::Operation(hugeint_t input, uint16_t &result, CastParameters &parameters, uint8_t width,
2607
2709
  uint8_t scale) {
2608
- return TryCastHugeDecimalToNumeric<uint16_t>(input, result, error_message, scale);
2710
+ return TryCastHugeDecimalToNumeric<uint16_t>(input, result, parameters, scale);
2609
2711
  }
2610
2712
 
2611
2713
  //===--------------------------------------------------------------------===//
2612
2714
  // Cast Decimal -> uint32_t
2613
2715
  //===--------------------------------------------------------------------===//
2614
2716
  template <>
2615
- bool TryCastFromDecimal::Operation(int16_t input, uint32_t &result, string *error_message, uint8_t width,
2717
+ bool TryCastFromDecimal::Operation(int16_t input, uint32_t &result, CastParameters &parameters, uint8_t width,
2616
2718
  uint8_t scale) {
2617
- return TryCastDecimalToNumeric<int16_t, uint32_t>(input, result, error_message, scale);
2719
+ return TryCastDecimalToNumeric<int16_t, uint32_t>(input, result, parameters, scale);
2618
2720
  }
2619
2721
  template <>
2620
- bool TryCastFromDecimal::Operation(int32_t input, uint32_t &result, string *error_message, uint8_t width,
2722
+ bool TryCastFromDecimal::Operation(int32_t input, uint32_t &result, CastParameters &parameters, uint8_t width,
2621
2723
  uint8_t scale) {
2622
- return TryCastDecimalToNumeric<int32_t, uint32_t>(input, result, error_message, scale);
2724
+ return TryCastDecimalToNumeric<int32_t, uint32_t>(input, result, parameters, scale);
2623
2725
  }
2624
2726
  template <>
2625
- bool TryCastFromDecimal::Operation(int64_t input, uint32_t &result, string *error_message, uint8_t width,
2727
+ bool TryCastFromDecimal::Operation(int64_t input, uint32_t &result, CastParameters &parameters, uint8_t width,
2626
2728
  uint8_t scale) {
2627
- return TryCastDecimalToNumeric<int64_t, uint32_t>(input, result, error_message, scale);
2729
+ return TryCastDecimalToNumeric<int64_t, uint32_t>(input, result, parameters, scale);
2628
2730
  }
2629
2731
  template <>
2630
- bool TryCastFromDecimal::Operation(hugeint_t input, uint32_t &result, string *error_message, uint8_t width,
2732
+ bool TryCastFromDecimal::Operation(hugeint_t input, uint32_t &result, CastParameters &parameters, uint8_t width,
2631
2733
  uint8_t scale) {
2632
- return TryCastHugeDecimalToNumeric<uint32_t>(input, result, error_message, scale);
2734
+ return TryCastHugeDecimalToNumeric<uint32_t>(input, result, parameters, scale);
2633
2735
  }
2634
2736
 
2635
2737
  //===--------------------------------------------------------------------===//
2636
2738
  // Cast Decimal -> uint64_t
2637
2739
  //===--------------------------------------------------------------------===//
2638
2740
  template <>
2639
- bool TryCastFromDecimal::Operation(int16_t input, uint64_t &result, string *error_message, uint8_t width,
2741
+ bool TryCastFromDecimal::Operation(int16_t input, uint64_t &result, CastParameters &parameters, uint8_t width,
2640
2742
  uint8_t scale) {
2641
- return TryCastDecimalToNumeric<int16_t, uint64_t>(input, result, error_message, scale);
2743
+ return TryCastDecimalToNumeric<int16_t, uint64_t>(input, result, parameters, scale);
2642
2744
  }
2643
2745
  template <>
2644
- bool TryCastFromDecimal::Operation(int32_t input, uint64_t &result, string *error_message, uint8_t width,
2746
+ bool TryCastFromDecimal::Operation(int32_t input, uint64_t &result, CastParameters &parameters, uint8_t width,
2645
2747
  uint8_t scale) {
2646
- return TryCastDecimalToNumeric<int32_t, uint64_t>(input, result, error_message, scale);
2748
+ return TryCastDecimalToNumeric<int32_t, uint64_t>(input, result, parameters, scale);
2647
2749
  }
2648
2750
  template <>
2649
- bool TryCastFromDecimal::Operation(int64_t input, uint64_t &result, string *error_message, uint8_t width,
2751
+ bool TryCastFromDecimal::Operation(int64_t input, uint64_t &result, CastParameters &parameters, uint8_t width,
2650
2752
  uint8_t scale) {
2651
- return TryCastDecimalToNumeric<int64_t, uint64_t>(input, result, error_message, scale);
2753
+ return TryCastDecimalToNumeric<int64_t, uint64_t>(input, result, parameters, scale);
2652
2754
  }
2653
2755
  template <>
2654
- bool TryCastFromDecimal::Operation(hugeint_t input, uint64_t &result, string *error_message, uint8_t width,
2756
+ bool TryCastFromDecimal::Operation(hugeint_t input, uint64_t &result, CastParameters &parameters, uint8_t width,
2655
2757
  uint8_t scale) {
2656
- return TryCastHugeDecimalToNumeric<uint64_t>(input, result, error_message, scale);
2758
+ return TryCastHugeDecimalToNumeric<uint64_t>(input, result, parameters, scale);
2657
2759
  }
2658
2760
 
2659
2761
  //===--------------------------------------------------------------------===//
2660
2762
  // Cast Decimal -> hugeint_t
2661
2763
  //===--------------------------------------------------------------------===//
2662
2764
  template <>
2663
- bool TryCastFromDecimal::Operation(int16_t input, hugeint_t &result, string *error_message, uint8_t width,
2765
+ bool TryCastFromDecimal::Operation(int16_t input, hugeint_t &result, CastParameters &parameters, uint8_t width,
2664
2766
  uint8_t scale) {
2665
- return TryCastDecimalToNumeric<int16_t, hugeint_t>(input, result, error_message, scale);
2767
+ return TryCastDecimalToNumeric<int16_t, hugeint_t>(input, result, parameters, scale);
2666
2768
  }
2667
2769
  template <>
2668
- bool TryCastFromDecimal::Operation(int32_t input, hugeint_t &result, string *error_message, uint8_t width,
2770
+ bool TryCastFromDecimal::Operation(int32_t input, hugeint_t &result, CastParameters &parameters, uint8_t width,
2669
2771
  uint8_t scale) {
2670
- return TryCastDecimalToNumeric<int32_t, hugeint_t>(input, result, error_message, scale);
2772
+ return TryCastDecimalToNumeric<int32_t, hugeint_t>(input, result, parameters, scale);
2671
2773
  }
2672
2774
  template <>
2673
- bool TryCastFromDecimal::Operation(int64_t input, hugeint_t &result, string *error_message, uint8_t width,
2775
+ bool TryCastFromDecimal::Operation(int64_t input, hugeint_t &result, CastParameters &parameters, uint8_t width,
2674
2776
  uint8_t scale) {
2675
- return TryCastDecimalToNumeric<int64_t, hugeint_t>(input, result, error_message, scale);
2777
+ return TryCastDecimalToNumeric<int64_t, hugeint_t>(input, result, parameters, scale);
2676
2778
  }
2677
2779
  template <>
2678
- bool TryCastFromDecimal::Operation(hugeint_t input, hugeint_t &result, string *error_message, uint8_t width,
2780
+ bool TryCastFromDecimal::Operation(hugeint_t input, hugeint_t &result, CastParameters &parameters, uint8_t width,
2679
2781
  uint8_t scale) {
2680
- return TryCastHugeDecimalToNumeric<hugeint_t>(input, result, error_message, scale);
2782
+ return TryCastHugeDecimalToNumeric<hugeint_t>(input, result, parameters, scale);
2681
2783
  }
2682
2784
 
2683
2785
  //===--------------------------------------------------------------------===//
2684
2786
  // Cast Decimal -> uhugeint_t
2685
2787
  //===--------------------------------------------------------------------===//
2686
2788
  template <>
2687
- bool TryCastFromDecimal::Operation(int16_t input, uhugeint_t &result, string *error_message, uint8_t width,
2789
+ bool TryCastFromDecimal::Operation(int16_t input, uhugeint_t &result, CastParameters &parameters, uint8_t width,
2688
2790
  uint8_t scale) {
2689
- return TryCastDecimalToNumeric<int16_t, uhugeint_t>(input, result, error_message, scale);
2791
+ return TryCastDecimalToNumeric<int16_t, uhugeint_t>(input, result, parameters, scale);
2690
2792
  }
2691
2793
  template <>
2692
- bool TryCastFromDecimal::Operation(int32_t input, uhugeint_t &result, string *error_message, uint8_t width,
2794
+ bool TryCastFromDecimal::Operation(int32_t input, uhugeint_t &result, CastParameters &parameters, uint8_t width,
2693
2795
  uint8_t scale) {
2694
- return TryCastDecimalToNumeric<int32_t, uhugeint_t>(input, result, error_message, scale);
2796
+ return TryCastDecimalToNumeric<int32_t, uhugeint_t>(input, result, parameters, scale);
2695
2797
  }
2696
2798
  template <>
2697
- bool TryCastFromDecimal::Operation(int64_t input, uhugeint_t &result, string *error_message, uint8_t width,
2799
+ bool TryCastFromDecimal::Operation(int64_t input, uhugeint_t &result, CastParameters &parameters, uint8_t width,
2698
2800
  uint8_t scale) {
2699
- return TryCastDecimalToNumeric<int64_t, uhugeint_t>(input, result, error_message, scale);
2801
+ return TryCastDecimalToNumeric<int64_t, uhugeint_t>(input, result, parameters, scale);
2700
2802
  }
2701
2803
  template <>
2702
- bool TryCastFromDecimal::Operation(hugeint_t input, uhugeint_t &result, string *error_message, uint8_t width,
2804
+ bool TryCastFromDecimal::Operation(hugeint_t input, uhugeint_t &result, CastParameters &parameters, uint8_t width,
2703
2805
  uint8_t scale) {
2704
- return TryCastHugeDecimalToNumeric<uhugeint_t>(input, result, error_message, scale);
2806
+ return TryCastHugeDecimalToNumeric<uhugeint_t>(input, result, parameters, scale);
2705
2807
  }
2706
2808
 
2707
2809
  //===--------------------------------------------------------------------===//
@@ -2715,44 +2817,50 @@ bool TryCastDecimalToFloatingPoint(SRC input, DST &result, uint8_t scale) {
2715
2817
 
2716
2818
  // DECIMAL -> FLOAT
2717
2819
  template <>
2718
- bool TryCastFromDecimal::Operation(int16_t input, float &result, string *error_message, uint8_t width, uint8_t scale) {
2820
+ bool TryCastFromDecimal::Operation(int16_t input, float &result, CastParameters &parameters, uint8_t width,
2821
+ uint8_t scale) {
2719
2822
  return TryCastDecimalToFloatingPoint<int16_t, float>(input, result, scale);
2720
2823
  }
2721
2824
 
2722
2825
  template <>
2723
- bool TryCastFromDecimal::Operation(int32_t input, float &result, string *error_message, uint8_t width, uint8_t scale) {
2826
+ bool TryCastFromDecimal::Operation(int32_t input, float &result, CastParameters &parameters, uint8_t width,
2827
+ uint8_t scale) {
2724
2828
  return TryCastDecimalToFloatingPoint<int32_t, float>(input, result, scale);
2725
2829
  }
2726
2830
 
2727
2831
  template <>
2728
- bool TryCastFromDecimal::Operation(int64_t input, float &result, string *error_message, uint8_t width, uint8_t scale) {
2832
+ bool TryCastFromDecimal::Operation(int64_t input, float &result, CastParameters &parameters, uint8_t width,
2833
+ uint8_t scale) {
2729
2834
  return TryCastDecimalToFloatingPoint<int64_t, float>(input, result, scale);
2730
2835
  }
2731
2836
 
2732
2837
  template <>
2733
- bool TryCastFromDecimal::Operation(hugeint_t input, float &result, string *error_message, uint8_t width,
2838
+ bool TryCastFromDecimal::Operation(hugeint_t input, float &result, CastParameters &parameters, uint8_t width,
2734
2839
  uint8_t scale) {
2735
2840
  return TryCastDecimalToFloatingPoint<hugeint_t, float>(input, result, scale);
2736
2841
  }
2737
2842
 
2738
2843
  // DECIMAL -> DOUBLE
2739
2844
  template <>
2740
- bool TryCastFromDecimal::Operation(int16_t input, double &result, string *error_message, uint8_t width, uint8_t scale) {
2845
+ bool TryCastFromDecimal::Operation(int16_t input, double &result, CastParameters &parameters, uint8_t width,
2846
+ uint8_t scale) {
2741
2847
  return TryCastDecimalToFloatingPoint<int16_t, double>(input, result, scale);
2742
2848
  }
2743
2849
 
2744
2850
  template <>
2745
- bool TryCastFromDecimal::Operation(int32_t input, double &result, string *error_message, uint8_t width, uint8_t scale) {
2851
+ bool TryCastFromDecimal::Operation(int32_t input, double &result, CastParameters &parameters, uint8_t width,
2852
+ uint8_t scale) {
2746
2853
  return TryCastDecimalToFloatingPoint<int32_t, double>(input, result, scale);
2747
2854
  }
2748
2855
 
2749
2856
  template <>
2750
- bool TryCastFromDecimal::Operation(int64_t input, double &result, string *error_message, uint8_t width, uint8_t scale) {
2857
+ bool TryCastFromDecimal::Operation(int64_t input, double &result, CastParameters &parameters, uint8_t width,
2858
+ uint8_t scale) {
2751
2859
  return TryCastDecimalToFloatingPoint<int64_t, double>(input, result, scale);
2752
2860
  }
2753
2861
 
2754
2862
  template <>
2755
- bool TryCastFromDecimal::Operation(hugeint_t input, double &result, string *error_message, uint8_t width,
2863
+ bool TryCastFromDecimal::Operation(hugeint_t input, double &result, CastParameters &parameters, uint8_t width,
2756
2864
  uint8_t scale) {
2757
2865
  return TryCastDecimalToFloatingPoint<hugeint_t, double>(input, result, scale);
2758
2866
  }