duckdb 0.8.1-dev96.0 → 0.8.1

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 (243) hide show
  1. package/binding.gyp +8 -8
  2. package/package.json +3 -1
  3. package/src/duckdb/extension/icu/icu-datepart.cpp +1 -1
  4. package/src/duckdb/extension/icu/icu-extension.cpp +1 -1
  5. package/src/duckdb/extension/icu/icu-makedate.cpp +5 -4
  6. package/src/duckdb/extension/icu/icu-strptime.cpp +1 -1
  7. package/src/duckdb/extension/icu/third_party/icu/i18n/nfsubs.cpp +0 -2
  8. package/src/duckdb/extension/json/buffered_json_reader.cpp +23 -14
  9. package/src/duckdb/extension/json/include/buffered_json_reader.hpp +6 -6
  10. package/src/duckdb/extension/json/include/json_common.hpp +12 -2
  11. package/src/duckdb/extension/json/include/json_scan.hpp +5 -2
  12. package/src/duckdb/extension/json/json_functions/json_contains.cpp +5 -0
  13. package/src/duckdb/extension/json/json_functions/json_create.cpp +10 -10
  14. package/src/duckdb/extension/json/json_functions/json_merge_patch.cpp +2 -2
  15. package/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp +2 -2
  16. package/src/duckdb/extension/json/json_functions/json_structure.cpp +5 -3
  17. package/src/duckdb/extension/json/json_functions/json_transform.cpp +11 -11
  18. package/src/duckdb/extension/json/json_functions/read_json.cpp +2 -1
  19. package/src/duckdb/extension/json/json_functions.cpp +6 -3
  20. package/src/duckdb/extension/json/json_scan.cpp +43 -27
  21. package/src/duckdb/extension/parquet/column_reader.cpp +5 -1
  22. package/src/duckdb/extension/parquet/include/decode_utils.hpp +6 -0
  23. package/src/duckdb/extension/parquet/parquet-extension.cpp +26 -1
  24. package/src/duckdb/src/catalog/catalog.cpp +5 -17
  25. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +7 -1
  26. package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +121 -0
  27. package/src/duckdb/src/catalog/catalog_search_path.cpp +49 -12
  28. package/src/duckdb/src/catalog/default/default_types.cpp +9 -84
  29. package/src/duckdb/src/common/adbc/adbc.cpp +118 -12
  30. package/src/duckdb/src/common/adbc/driver_manager.cpp +0 -20
  31. package/src/duckdb/src/common/arrow/arrow_converter.cpp +11 -12
  32. package/src/duckdb/src/common/arrow/arrow_wrapper.cpp +4 -3
  33. package/src/duckdb/src/common/exception.cpp +4 -1
  34. package/src/duckdb/src/common/exception_format_value.cpp +24 -15
  35. package/src/duckdb/src/common/multi_file_reader.cpp +3 -0
  36. package/src/duckdb/src/common/random_engine.cpp +1 -1
  37. package/src/duckdb/src/common/types/row/row_data_collection_scanner.cpp +5 -4
  38. package/src/duckdb/src/common/types/row/tuple_data_scatter_gather.cpp +44 -7
  39. package/src/duckdb/src/common/types/time.cpp +2 -8
  40. package/src/duckdb/src/common/types/timestamp.cpp +37 -1
  41. package/src/duckdb/src/common/types/value.cpp +1 -0
  42. package/src/duckdb/src/common/types.cpp +4 -0
  43. package/src/duckdb/src/core_functions/aggregate/algebraic/avg.cpp +30 -33
  44. package/src/duckdb/src/core_functions/aggregate/algebraic/covar.cpp +0 -4
  45. package/src/duckdb/src/core_functions/aggregate/distributive/approx_count.cpp +30 -33
  46. package/src/duckdb/src/core_functions/aggregate/distributive/arg_min_max.cpp +52 -65
  47. package/src/duckdb/src/core_functions/aggregate/distributive/bitagg.cpp +48 -48
  48. package/src/duckdb/src/core_functions/aggregate/distributive/bitstring_agg.cpp +39 -40
  49. package/src/duckdb/src/core_functions/aggregate/distributive/bool.cpp +32 -32
  50. package/src/duckdb/src/core_functions/aggregate/distributive/entropy.cpp +34 -34
  51. package/src/duckdb/src/core_functions/aggregate/distributive/kurtosis.cpp +30 -31
  52. package/src/duckdb/src/core_functions/aggregate/distributive/minmax.cpp +88 -100
  53. package/src/duckdb/src/core_functions/aggregate/distributive/product.cpp +17 -17
  54. package/src/duckdb/src/core_functions/aggregate/distributive/skew.cpp +25 -27
  55. package/src/duckdb/src/core_functions/aggregate/distributive/string_agg.cpp +37 -38
  56. package/src/duckdb/src/core_functions/aggregate/distributive/sum.cpp +22 -22
  57. package/src/duckdb/src/core_functions/aggregate/holistic/approximate_quantile.cpp +44 -80
  58. package/src/duckdb/src/core_functions/aggregate/holistic/mode.cpp +49 -51
  59. package/src/duckdb/src/core_functions/aggregate/holistic/quantile.cpp +104 -122
  60. package/src/duckdb/src/core_functions/aggregate/holistic/reservoir_quantile.cpp +57 -93
  61. package/src/duckdb/src/core_functions/aggregate/nested/histogram.cpp +22 -23
  62. package/src/duckdb/src/core_functions/aggregate/nested/list.cpp +18 -19
  63. package/src/duckdb/src/core_functions/aggregate/regression/regr_avg.cpp +16 -18
  64. package/src/duckdb/src/core_functions/aggregate/regression/regr_intercept.cpp +22 -25
  65. package/src/duckdb/src/core_functions/aggregate/regression/regr_r2.cpp +19 -24
  66. package/src/duckdb/src/core_functions/aggregate/regression/regr_sxx_syy.cpp +18 -23
  67. package/src/duckdb/src/core_functions/aggregate/regression/regr_sxy.cpp +14 -18
  68. package/src/duckdb/src/core_functions/function_list.cpp +1 -0
  69. package/src/duckdb/src/core_functions/scalar/date/date_part.cpp +1 -1
  70. package/src/duckdb/src/core_functions/scalar/date/make_date.cpp +3 -0
  71. package/src/duckdb/src/core_functions/scalar/generic/system_functions.cpp +14 -0
  72. package/src/duckdb/src/core_functions/scalar/list/array_slice.cpp +1 -1
  73. package/src/duckdb/src/core_functions/scalar/list/list_aggregates.cpp +23 -6
  74. package/src/duckdb/src/core_functions/scalar/list/list_lambdas.cpp +1 -2
  75. package/src/duckdb/src/core_functions/scalar/map/map_concat.cpp +3 -0
  76. package/src/duckdb/src/core_functions/scalar/math/numeric.cpp +3 -3
  77. package/src/duckdb/src/execution/index/art/art.cpp +80 -7
  78. package/src/duckdb/src/execution/index/art/fixed_size_allocator.cpp +20 -1
  79. package/src/duckdb/src/execution/index/art/leaf.cpp +11 -11
  80. package/src/duckdb/src/execution/index/art/leaf_segment.cpp +10 -0
  81. package/src/duckdb/src/execution/index/art/node.cpp +48 -35
  82. package/src/duckdb/src/execution/index/art/node16.cpp +3 -0
  83. package/src/duckdb/src/execution/index/art/node256.cpp +1 -0
  84. package/src/duckdb/src/execution/index/art/node4.cpp +3 -0
  85. package/src/duckdb/src/execution/index/art/node48.cpp +2 -0
  86. package/src/duckdb/src/execution/index/art/prefix.cpp +2 -0
  87. package/src/duckdb/src/execution/join_hashtable.cpp +2 -0
  88. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +26 -9
  89. package/src/duckdb/src/execution/operator/helper/physical_reset.cpp +5 -2
  90. package/src/duckdb/src/execution/operator/helper/physical_set.cpp +5 -1
  91. package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +3 -6
  92. package/src/duckdb/src/execution/operator/projection/physical_tableinout_function.cpp +1 -0
  93. package/src/duckdb/src/execution/operator/projection/physical_unnest.cpp +8 -3
  94. package/src/duckdb/src/execution/operator/schema/physical_attach.cpp +0 -1
  95. package/src/duckdb/src/execution/operator/schema/physical_create_index.cpp +29 -3
  96. package/src/duckdb/src/execution/reservoir_sample.cpp +18 -4
  97. package/src/duckdb/src/function/aggregate/distributive/count.cpp +159 -21
  98. package/src/duckdb/src/function/aggregate/distributive/first.cpp +67 -74
  99. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +7 -7
  100. package/src/duckdb/src/function/cast/list_casts.cpp +2 -4
  101. package/src/duckdb/src/function/pragma/pragma_queries.cpp +33 -23
  102. package/src/duckdb/src/function/scalar/list/list_extract.cpp +1 -1
  103. package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +1 -1
  104. package/src/duckdb/src/function/scalar/string/regexp/regexp_util.cpp +6 -2
  105. package/src/duckdb/src/function/scalar/system/aggregate_export.cpp +2 -2
  106. package/src/duckdb/src/function/table/arrow.cpp +2 -2
  107. package/src/duckdb/src/function/table/checkpoint.cpp +3 -0
  108. package/src/duckdb/src/function/table/read_csv.cpp +15 -17
  109. package/src/duckdb/src/function/table/repeat.cpp +3 -0
  110. package/src/duckdb/src/function/table/repeat_row.cpp +8 -1
  111. package/src/duckdb/src/function/table/system/pragma_storage_info.cpp +4 -4
  112. package/src/duckdb/src/function/table/system/test_vector_types.cpp +81 -25
  113. package/src/duckdb/src/function/table/table_scan.cpp +2 -2
  114. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  115. package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +0 -3
  116. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_table_entry.hpp +2 -0
  117. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_catalog_entry.hpp +11 -1
  118. package/src/duckdb/src/include/duckdb/catalog/catalog_search_path.hpp +8 -2
  119. package/src/duckdb/src/include/duckdb/catalog/default/builtin_types/types.hpp +97 -0
  120. package/src/duckdb/src/include/duckdb/common/arrow/arrow_appender.hpp +1 -1
  121. package/src/duckdb/src/include/duckdb/common/arrow/arrow_converter.hpp +2 -3
  122. package/src/duckdb/src/include/duckdb/common/arrow/arrow_options.hpp +8 -1
  123. package/src/duckdb/src/include/duckdb/common/arrow/result_arrow_wrapper.hpp +0 -1
  124. package/src/duckdb/src/include/duckdb/common/bit_utils.hpp +16 -22
  125. package/src/duckdb/src/include/duckdb/common/exception.hpp +3 -0
  126. package/src/duckdb/src/include/duckdb/common/types/time.hpp +2 -0
  127. package/src/duckdb/src/include/duckdb/common/types/timestamp.hpp +4 -14
  128. package/src/duckdb/src/include/duckdb/common/vector_operations/aggregate_executor.hpp +92 -57
  129. package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/corr.hpp +20 -24
  130. package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/covar.hpp +36 -39
  131. package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/stddev.hpp +57 -53
  132. package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_count.hpp +8 -9
  133. package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_slope.hpp +16 -18
  134. package/src/duckdb/src/include/duckdb/core_functions/aggregate/sum_helpers.hpp +7 -8
  135. package/src/duckdb/src/include/duckdb/core_functions/scalar/generic_functions.hpp +9 -0
  136. package/src/duckdb/src/include/duckdb/core_functions/scalar/map_functions.hpp +2 -6
  137. package/src/duckdb/src/include/duckdb/core_functions/scalar/string_functions.hpp +16 -36
  138. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +10 -4
  139. package/src/duckdb/src/include/duckdb/execution/index/art/fixed_size_allocator.hpp +3 -0
  140. package/src/duckdb/src/include/duckdb/execution/index/art/leaf.hpp +1 -1
  141. package/src/duckdb/src/include/duckdb/execution/index/art/leaf_segment.hpp +2 -0
  142. package/src/duckdb/src/include/duckdb/execution/index/art/node.hpp +13 -3
  143. package/src/duckdb/src/include/duckdb/execution/index/art/node48.hpp +1 -0
  144. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +9 -30
  145. package/src/duckdb/src/include/duckdb/function/aggregate_state.hpp +95 -0
  146. package/src/duckdb/src/include/duckdb/function/function_serialization.hpp +4 -2
  147. package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +1 -1
  148. package/src/duckdb/src/include/duckdb/function/scalar_function.hpp +2 -1
  149. package/src/duckdb/src/include/duckdb/function/table_function.hpp +3 -2
  150. package/src/duckdb/src/include/duckdb/main/attached_database.hpp +4 -1
  151. package/src/duckdb/src/include/duckdb/main/capi/capi_internal.hpp +3 -1
  152. package/src/duckdb/src/include/duckdb/main/config.hpp +5 -0
  153. package/src/duckdb/src/include/duckdb/main/database_manager.hpp +1 -0
  154. package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +142 -136
  155. package/src/duckdb/src/include/duckdb/main/query_result.hpp +6 -0
  156. package/src/duckdb/src/include/duckdb/main/settings.hpp +19 -0
  157. package/src/duckdb/src/include/duckdb/optimizer/unnest_rewriter.hpp +4 -0
  158. package/src/duckdb/src/include/duckdb/parallel/meta_pipeline.hpp +12 -3
  159. package/src/duckdb/src/include/duckdb/parser/parser.hpp +2 -0
  160. package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +1 -1
  161. package/src/duckdb/src/include/duckdb/parser/tableref/pivotref.hpp +2 -2
  162. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +0 -2
  163. package/src/duckdb/src/include/duckdb/planner/bind_context.hpp +1 -1
  164. package/src/duckdb/src/include/duckdb/planner/bound_result_modifier.hpp +3 -0
  165. package/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +1 -1
  166. package/src/duckdb/src/include/duckdb/planner/logical_operator.hpp +5 -0
  167. package/src/duckdb/src/include/duckdb/planner/operator/logical_copy_to_file.hpp +6 -2
  168. package/src/duckdb/src/include/duckdb/planner/operator/logical_execute.hpp +4 -0
  169. package/src/duckdb/src/include/duckdb/planner/operator/logical_explain.hpp +5 -1
  170. package/src/duckdb/src/include/duckdb/planner/operator/logical_get.hpp +5 -1
  171. package/src/duckdb/src/include/duckdb/planner/operator/logical_pragma.hpp +6 -2
  172. package/src/duckdb/src/include/duckdb/planner/operator/logical_prepare.hpp +4 -0
  173. package/src/duckdb/src/include/duckdb/storage/compression/chimp/algorithm/byte_reader.hpp +4 -0
  174. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +1 -1
  175. package/src/duckdb/src/include/duckdb/storage/in_memory_block_manager.hpp +13 -13
  176. package/src/duckdb/src/include/duckdb/storage/index.hpp +4 -2
  177. package/src/duckdb/src/include/duckdb/storage/storage_extension.hpp +0 -6
  178. package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +1 -1
  179. package/src/duckdb/src/include/duckdb/storage/table/list_column_data.hpp +2 -1
  180. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +2 -2
  181. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +2 -1
  182. package/src/duckdb/src/include/duckdb/storage/table/standard_column_data.hpp +2 -1
  183. package/src/duckdb/src/include/duckdb/storage/table/struct_column_data.hpp +2 -1
  184. package/src/duckdb/src/include/duckdb/storage/table_storage_info.hpp +0 -2
  185. package/src/duckdb/src/main/attached_database.cpp +8 -0
  186. package/src/duckdb/src/main/capi/arrow-c.cpp +4 -4
  187. package/src/duckdb/src/main/capi/config-c.cpp +2 -5
  188. package/src/duckdb/src/main/client_context.cpp +4 -3
  189. package/src/duckdb/src/main/config.cpp +2 -0
  190. package/src/duckdb/src/main/database.cpp +1 -0
  191. package/src/duckdb/src/main/database_manager.cpp +21 -0
  192. package/src/duckdb/src/main/query_result.cpp +6 -2
  193. package/src/duckdb/src/main/settings/settings.cpp +41 -6
  194. package/src/duckdb/src/optimizer/unnest_rewriter.cpp +27 -16
  195. package/src/duckdb/src/parallel/executor.cpp +38 -14
  196. package/src/duckdb/src/parallel/meta_pipeline.cpp +17 -3
  197. package/src/duckdb/src/parser/column_definition.cpp +5 -8
  198. package/src/duckdb/src/parser/parsed_data/create_info.cpp +0 -3
  199. package/src/duckdb/src/parser/parser.cpp +95 -35
  200. package/src/duckdb/src/parser/transform/expression/transform_function.cpp +1 -0
  201. package/src/duckdb/src/parser/transform/expression/transform_operator.cpp +3 -0
  202. package/src/duckdb/src/parser/transform/helpers/nodetype_to_string.cpp +0 -2
  203. package/src/duckdb/src/parser/transform/statement/transform_drop.cpp +0 -3
  204. package/src/duckdb/src/parser/transform/tableref/transform_pivot.cpp +3 -0
  205. package/src/duckdb/src/parser/transformer.cpp +0 -2
  206. package/src/duckdb/src/planner/bind_context.cpp +3 -4
  207. package/src/duckdb/src/planner/binder/expression/bind_function_expression.cpp +0 -2
  208. package/src/duckdb/src/planner/binder/expression/bind_positional_reference_expression.cpp +8 -3
  209. package/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +31 -15
  210. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +0 -27
  211. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +18 -1
  212. package/src/duckdb/src/planner/binder/statement/bind_drop.cpp +0 -25
  213. package/src/duckdb/src/planner/binder/statement/bind_update.cpp +2 -114
  214. package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +6 -1
  215. package/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp +5 -0
  216. package/src/duckdb/src/planner/bound_result_modifier.cpp +14 -0
  217. package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +6 -5
  218. package/src/duckdb/src/planner/expression/bound_default_expression.cpp +7 -1
  219. package/src/duckdb/src/planner/expression.cpp +3 -0
  220. package/src/duckdb/src/planner/expression_binder.cpp +3 -2
  221. package/src/duckdb/src/planner/operator/logical_distinct.cpp +5 -4
  222. package/src/duckdb/src/planner/operator/logical_pivot.cpp +14 -2
  223. package/src/duckdb/src/planner/planner.cpp +5 -15
  224. package/src/duckdb/src/storage/data_table.cpp +10 -8
  225. package/src/duckdb/src/storage/index.cpp +13 -0
  226. package/src/duckdb/src/storage/storage_manager.cpp +6 -0
  227. package/src/duckdb/src/storage/table/column_data.cpp +7 -3
  228. package/src/duckdb/src/storage/table/list_column_data.cpp +5 -4
  229. package/src/duckdb/src/storage/table/row_group.cpp +4 -3
  230. package/src/duckdb/src/storage/table/row_group_collection.cpp +6 -3
  231. package/src/duckdb/src/storage/table/standard_column_data.cpp +4 -3
  232. package/src/duckdb/src/storage/table/struct_column_data.cpp +4 -3
  233. package/src/duckdb/src/storage/wal_replay.cpp +4 -5
  234. package/src/duckdb/third_party/libpg_query/include/nodes/nodes.hpp +0 -1
  235. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +0 -14
  236. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +12828 -12956
  237. package/src/duckdb/third_party/zstd/compress/zstd_compress.cpp +3 -0
  238. package/src/duckdb/third_party/zstd/include/zstd/compress/zstd_cwksp.h +4 -0
  239. package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +5 -5
  240. package/src/duckdb/ub_src_parser_transform_statement.cpp +0 -2
  241. package/test/extension.test.ts +11 -0
  242. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_database_info.hpp +0 -46
  243. package/src/duckdb/src/parser/transform/statement/transform_create_database.cpp +0 -27
@@ -4,94 +4,18 @@
4
4
  #include "duckdb/catalog/catalog_entry/type_catalog_entry.hpp"
5
5
  #include "duckdb/common/string_util.hpp"
6
6
  #include "duckdb/parser/parsed_data/create_type_info.hpp"
7
+ #include "duckdb/catalog/default/builtin_types/types.hpp"
7
8
 
8
9
  namespace duckdb {
9
10
 
10
- struct DefaultType {
11
- const char *name;
12
- LogicalTypeId type;
13
- };
14
-
15
- static DefaultType internal_types[] = {{"int", LogicalTypeId::INTEGER},
16
- {"int4", LogicalTypeId::INTEGER},
17
- {"signed", LogicalTypeId::INTEGER},
18
- {"integer", LogicalTypeId::INTEGER},
19
- {"integral", LogicalTypeId::INTEGER},
20
- {"int32", LogicalTypeId::INTEGER},
21
- {"varchar", LogicalTypeId::VARCHAR},
22
- {"bpchar", LogicalTypeId::VARCHAR},
23
- {"text", LogicalTypeId::VARCHAR},
24
- {"string", LogicalTypeId::VARCHAR},
25
- {"char", LogicalTypeId::VARCHAR},
26
- {"nvarchar", LogicalTypeId::VARCHAR},
27
- {"bytea", LogicalTypeId::BLOB},
28
- {"blob", LogicalTypeId::BLOB},
29
- {"varbinary", LogicalTypeId::BLOB},
30
- {"binary", LogicalTypeId::BLOB},
31
- {"bit", LogicalTypeId::BIT},
32
- {"bitstring", LogicalTypeId::BIT},
33
- {"int8", LogicalTypeId::BIGINT},
34
- {"bigint", LogicalTypeId::BIGINT},
35
- {"int64", LogicalTypeId::BIGINT},
36
- {"long", LogicalTypeId::BIGINT},
37
- {"oid", LogicalTypeId::BIGINT},
38
- {"int2", LogicalTypeId::SMALLINT},
39
- {"smallint", LogicalTypeId::SMALLINT},
40
- {"short", LogicalTypeId::SMALLINT},
41
- {"int16", LogicalTypeId::SMALLINT},
42
- {"timestamp", LogicalTypeId::TIMESTAMP},
43
- {"datetime", LogicalTypeId::TIMESTAMP},
44
- {"timestamp_us", LogicalTypeId::TIMESTAMP},
45
- {"timestamp_ms", LogicalTypeId::TIMESTAMP_MS},
46
- {"timestamp_ns", LogicalTypeId::TIMESTAMP_NS},
47
- {"timestamp_s", LogicalTypeId::TIMESTAMP_SEC},
48
- {"bool", LogicalTypeId::BOOLEAN},
49
- {"boolean", LogicalTypeId::BOOLEAN},
50
- {"logical", LogicalTypeId::BOOLEAN},
51
- {"decimal", LogicalTypeId::DECIMAL},
52
- {"dec", LogicalTypeId::DECIMAL},
53
- {"numeric", LogicalTypeId::DECIMAL},
54
- {"real", LogicalTypeId::FLOAT},
55
- {"float4", LogicalTypeId::FLOAT},
56
- {"float", LogicalTypeId::FLOAT},
57
- {"double", LogicalTypeId::DOUBLE},
58
- {"float8", LogicalTypeId::DOUBLE},
59
- {"tinyint", LogicalTypeId::TINYINT},
60
- {"int1", LogicalTypeId::TINYINT},
61
- {"date", LogicalTypeId::DATE},
62
- {"time", LogicalTypeId::TIME},
63
- {"interval", LogicalTypeId::INTERVAL},
64
- {"hugeint", LogicalTypeId::HUGEINT},
65
- {"int128", LogicalTypeId::HUGEINT},
66
- {"uuid", LogicalTypeId::UUID},
67
- {"guid", LogicalTypeId::UUID},
68
- {"struct", LogicalTypeId::STRUCT},
69
- {"row", LogicalTypeId::STRUCT},
70
- {"list", LogicalTypeId::LIST},
71
- {"map", LogicalTypeId::MAP},
72
- {"utinyint", LogicalTypeId::UTINYINT},
73
- {"uint8", LogicalTypeId::UTINYINT},
74
- {"usmallint", LogicalTypeId::USMALLINT},
75
- {"uint16", LogicalTypeId::USMALLINT},
76
- {"uinteger", LogicalTypeId::UINTEGER},
77
- {"uint32", LogicalTypeId::UINTEGER},
78
- {"ubigint", LogicalTypeId::UBIGINT},
79
- {"uint64", LogicalTypeId::UBIGINT},
80
- {"union", LogicalTypeId::UNION},
81
- {"timestamptz", LogicalTypeId::TIMESTAMP_TZ},
82
- {"timetz", LogicalTypeId::TIME_TZ},
83
- {"enum", LogicalTypeId::ENUM},
84
- {"null", LogicalTypeId::SQLNULL},
85
- {nullptr, LogicalTypeId::INVALID}};
86
-
87
11
  LogicalTypeId DefaultTypeGenerator::GetDefaultType(const string &name) {
88
- auto lower_str = StringUtil::Lower(name);
89
- for (idx_t index = 0; internal_types[index].name != nullptr; index++) {
90
- if (internal_types[index].name == lower_str) {
91
- return internal_types[index].type;
12
+ auto &internal_types = BUILTIN_TYPES;
13
+ for (auto &type : internal_types) {
14
+ if (StringUtil::CIEquals(name, type.name)) {
15
+ return type.type;
92
16
  }
93
17
  }
94
- return LogicalTypeId::INVALID;
18
+ return LogicalType::INVALID;
95
19
  }
96
20
 
97
21
  DefaultTypeGenerator::DefaultTypeGenerator(Catalog &catalog, SchemaCatalogEntry &schema)
@@ -119,8 +43,9 @@ vector<string> DefaultTypeGenerator::GetDefaultEntries() {
119
43
  if (schema.name != DEFAULT_SCHEMA) {
120
44
  return result;
121
45
  }
122
- for (idx_t index = 0; internal_types[index].name != nullptr; index++) {
123
- result.emplace_back(internal_types[index].name);
46
+ auto &internal_types = BUILTIN_TYPES;
47
+ for (auto &type : internal_types) {
48
+ result.emplace_back(StringUtil::Lower(type.name));
124
49
  }
125
50
  return result;
126
51
  }
@@ -5,10 +5,13 @@
5
5
  #include "duckdb/common/string_util.hpp"
6
6
 
7
7
  #include "duckdb.h"
8
- #include "duckdb/main/connection.hpp"
9
8
  #include "duckdb/common/arrow/arrow_wrapper.hpp"
10
9
  #include "duckdb/common/arrow/arrow.hpp"
11
10
 
11
+ #ifndef DUCKDB_AMALGAMATION
12
+ #include "duckdb/main/connection.hpp"
13
+ #endif
14
+
12
15
  #include <string.h>
13
16
  #include <stdlib.h>
14
17
 
@@ -37,6 +40,10 @@ duckdb_adbc::AdbcStatusCode duckdb_adbc_init(size_t count, struct duckdb_adbc::A
37
40
  driver->StatementSetOption = duckdb_adbc::StatementSetOption;
38
41
  driver->StatementSetSqlQuery = duckdb_adbc::StatementSetSqlQuery;
39
42
  driver->ConnectionGetObjects = duckdb_adbc::ConnectionGetObjects;
43
+ driver->ConnectionCommit = duckdb_adbc::ConnectionCommit;
44
+ driver->ConnectionRollback = duckdb_adbc::ConnectionRollback;
45
+ driver->ConnectionReadPartition = duckdb_adbc::ConnectionReadPartition;
46
+ driver->StatementExecutePartitions = duckdb_adbc::StatementExecutePartitions;
40
47
  return ADBC_STATUS_OK;
41
48
  }
42
49
 
@@ -162,10 +169,104 @@ AdbcStatusCode ConnectionNew(struct AdbcConnection *connection, struct AdbcError
162
169
  return ADBC_STATUS_OK;
163
170
  }
164
171
 
172
+ AdbcStatusCode ExecuteQuery(duckdb::Connection *conn, const char *query, struct AdbcError *error) {
173
+ auto res = conn->Query(query);
174
+ if (res->HasError()) {
175
+ auto error_message = "Failed to execute query \"" + std::string(query) + "\": " + res->GetError();
176
+ SetError(error, error_message);
177
+ return ADBC_STATUS_INTERNAL;
178
+ }
179
+ return ADBC_STATUS_OK;
180
+ }
181
+
165
182
  AdbcStatusCode ConnectionSetOption(struct AdbcConnection *connection, const char *key, const char *value,
166
183
  struct AdbcError *error) {
167
- // there are no connection-level options that need to be set before connecting
168
- return ADBC_STATUS_OK;
184
+ if (!connection) {
185
+ SetError(error, "Connection is not set");
186
+ return ADBC_STATUS_INVALID_ARGUMENT;
187
+ }
188
+ auto conn = (duckdb::Connection *)connection->private_data;
189
+ if (strcmp(key, ADBC_CONNECTION_OPTION_AUTOCOMMIT) == 0) {
190
+ if (strcmp(value, ADBC_OPTION_VALUE_ENABLED) == 0) {
191
+ if (conn->HasActiveTransaction()) {
192
+ AdbcStatusCode status = ExecuteQuery(conn, "COMMIT", error);
193
+ if (status != ADBC_STATUS_OK) {
194
+ return status;
195
+ }
196
+ } else {
197
+ // no-op
198
+ }
199
+ } else if (strcmp(value, ADBC_OPTION_VALUE_DISABLED) == 0) {
200
+ if (conn->HasActiveTransaction()) {
201
+ // no-op
202
+ } else {
203
+ // begin
204
+ AdbcStatusCode status = ExecuteQuery(conn, "START TRANSACTION", error);
205
+ if (status != ADBC_STATUS_OK) {
206
+ return status;
207
+ }
208
+ }
209
+ } else {
210
+ auto error_message = "Invalid connection option value " + std::string(key) + "=" + std::string(value);
211
+ SetError(error, error_message);
212
+ return ADBC_STATUS_INVALID_ARGUMENT;
213
+ }
214
+ return ADBC_STATUS_OK;
215
+ }
216
+ auto error_message =
217
+ "Unknown connection option " + std::string(key) + "=" + (value ? std::string(value) : "(NULL)");
218
+ SetError(error, error_message);
219
+ return ADBC_STATUS_NOT_IMPLEMENTED;
220
+ }
221
+
222
+ AdbcStatusCode ConnectionReadPartition(struct AdbcConnection *connection, const uint8_t *serialized_partition,
223
+ size_t serialized_length, struct ArrowArrayStream *out,
224
+ struct AdbcError *error) {
225
+ SetError(error, "Read Partitions are not supported in DuckDB");
226
+ return ADBC_STATUS_NOT_IMPLEMENTED;
227
+ }
228
+
229
+ AdbcStatusCode StatementExecutePartitions(struct AdbcStatement *statement, struct ArrowSchema *schema,
230
+ struct AdbcPartitions *partitions, int64_t *rows_affected,
231
+ struct AdbcError *error) {
232
+ SetError(error, "Execute Partitions are not supported in DuckDB");
233
+ return ADBC_STATUS_NOT_IMPLEMENTED;
234
+ }
235
+
236
+ AdbcStatusCode ConnectionCommit(struct AdbcConnection *connection, struct AdbcError *error) {
237
+ if (!connection) {
238
+ SetError(error, "Connection is not set");
239
+ return ADBC_STATUS_INVALID_ARGUMENT;
240
+ }
241
+ auto conn = (duckdb::Connection *)connection->private_data;
242
+ if (!conn->HasActiveTransaction()) {
243
+ SetError(error, "No active transaction, cannot commit");
244
+ return ADBC_STATUS_INVALID_STATE;
245
+ }
246
+
247
+ AdbcStatusCode status = ExecuteQuery(conn, "COMMIT", error);
248
+ if (status != ADBC_STATUS_OK) {
249
+ return status;
250
+ }
251
+ return ExecuteQuery(conn, "START TRANSACTION", error);
252
+ }
253
+
254
+ AdbcStatusCode ConnectionRollback(struct AdbcConnection *connection, struct AdbcError *error) {
255
+ if (!connection) {
256
+ SetError(error, "Connection is not set");
257
+ return ADBC_STATUS_INVALID_ARGUMENT;
258
+ }
259
+ auto conn = (duckdb::Connection *)connection->private_data;
260
+ if (!conn->HasActiveTransaction()) {
261
+ SetError(error, "No active transaction, cannot rollback");
262
+ return ADBC_STATUS_INVALID_STATE;
263
+ }
264
+
265
+ AdbcStatusCode status = ExecuteQuery(conn, "ROLLBACK", error);
266
+ if (status != ADBC_STATUS_OK) {
267
+ return status;
268
+ }
269
+ return ExecuteQuery(conn, "START TRANSACTION", error);
169
270
  }
170
271
 
171
272
  AdbcStatusCode ConnectionInit(struct AdbcConnection *connection, struct AdbcDatabase *database,
@@ -219,11 +320,11 @@ void release(struct ArrowArrayStream *stream) {
219
320
  if (!stream || !stream->release) {
220
321
  return;
221
322
  }
222
- stream->release = nullptr;
223
323
  if (stream->private_data) {
224
324
  duckdb_destroy_arrow((duckdb_arrow *)&stream->private_data);
225
325
  stream->private_data = nullptr;
226
326
  }
327
+ stream->release = nullptr;
227
328
  }
228
329
 
229
330
  const char *get_last_error(struct ArrowArrayStream *stream) {
@@ -270,16 +371,21 @@ AdbcStatusCode Ingest(duckdb_connection connection, const char *table_name, stru
270
371
  if (status != ADBC_STATUS_OK) {
271
372
  return status;
272
373
  }
374
+ auto cconn = (duckdb::Connection *)connection;
273
375
 
376
+ auto has_table = cconn->TableInfo(table_name);
377
+ auto arrow_scan = cconn->TableFunction("arrow_scan", {duckdb::Value::POINTER((uintptr_t)input),
378
+ duckdb::Value::POINTER((uintptr_t)stream_produce),
379
+ duckdb::Value::POINTER((uintptr_t)get_schema)});
274
380
  try {
275
- // TODO evil cast, do we need a way to do this from the C api?
276
- auto cconn = (duckdb::Connection *)connection;
277
- cconn
278
- ->TableFunction("arrow_scan",
279
- {duckdb::Value::POINTER((uintptr_t)input),
280
- duckdb::Value::POINTER((uintptr_t)stream_produce),
281
- duckdb::Value::POINTER((uintptr_t)get_schema)}) // TODO make this a parameter somewhere
282
- ->Create(table_name); // TODO this should probably be a temp table
381
+ if (!has_table) {
382
+ // We create the table based on an Arrow Scanner
383
+ arrow_scan->Create(table_name);
384
+ } else {
385
+ arrow_scan->CreateView("temp_adbc_view", true, true);
386
+ auto query = "insert into " + std::string(table_name) + " select * from temp_adbc_view";
387
+ auto result = cconn->Query(query);
388
+ }
283
389
  // After creating a table, the arrow array stream is released. Hence we must set it as released to avoid
284
390
  // double-releasing it
285
391
  input->release = nullptr;
@@ -133,10 +133,6 @@ static AdbcStatusCode ReleaseDriver(struct AdbcDriver *driver, struct AdbcError
133
133
 
134
134
  // Default stubs
135
135
 
136
- AdbcStatusCode ConnectionCommit(struct AdbcConnection *, struct AdbcError *error) {
137
- return ADBC_STATUS_NOT_IMPLEMENTED;
138
- }
139
-
140
136
  AdbcStatusCode ConnectionGetInfo(struct AdbcConnection *connection, uint32_t *info_codes, size_t info_codes_length,
141
137
  struct ArrowArrayStream *out, struct AdbcError *error) {
142
138
  return ADBC_STATUS_NOT_IMPLEMENTED;
@@ -147,27 +143,11 @@ AdbcStatusCode ConnectionGetTableSchema(struct AdbcConnection *, const char *, c
147
143
  return ADBC_STATUS_NOT_IMPLEMENTED;
148
144
  }
149
145
 
150
- AdbcStatusCode ConnectionReadPartition(struct AdbcConnection *connection, const uint8_t *serialized_partition,
151
- size_t serialized_length, struct ArrowArrayStream *out,
152
- struct AdbcError *error) {
153
- return ADBC_STATUS_NOT_IMPLEMENTED;
154
- }
155
-
156
- AdbcStatusCode ConnectionRollback(struct AdbcConnection *, struct AdbcError *error) {
157
- return ADBC_STATUS_NOT_IMPLEMENTED;
158
- }
159
-
160
146
  AdbcStatusCode StatementBind(struct AdbcStatement *, struct ArrowArray *, struct ArrowSchema *,
161
147
  struct AdbcError *error) {
162
148
  return ADBC_STATUS_NOT_IMPLEMENTED;
163
149
  }
164
150
 
165
- AdbcStatusCode StatementExecutePartitions(struct AdbcStatement *statement, struct ArrowSchema *schema,
166
- struct AdbcPartitions *partitions, int64_t *rows_affected,
167
- struct AdbcError *error) {
168
- return ADBC_STATUS_NOT_IMPLEMENTED;
169
- }
170
-
171
151
  AdbcStatusCode StatementGetParameterSchema(struct AdbcStatement *statement, struct ArrowSchema *schema,
172
152
  struct AdbcError *error) {
173
153
  return ADBC_STATUS_NOT_IMPLEMENTED;
@@ -16,7 +16,7 @@
16
16
  namespace duckdb {
17
17
 
18
18
  void ArrowConverter::ToArrowArray(DataChunk &input, ArrowArray *out_array, ArrowOptions options) {
19
- ArrowAppender appender(input.GetTypes(), input.size(), options);
19
+ ArrowAppender appender(input.GetTypes(), input.size(), std::move(options));
20
20
  appender.Append(input, 0, input.size(), input.size());
21
21
  *out_array = appender.Finalize();
22
22
  }
@@ -59,10 +59,10 @@ void InitializeChild(ArrowSchema &child, const string &name = "") {
59
59
  child.dictionary = nullptr;
60
60
  }
61
61
  void SetArrowFormat(DuckDBArrowSchemaHolder &root_holder, ArrowSchema &child, const LogicalType &type,
62
- const string &config_timezone, ArrowOptions options);
62
+ const ArrowOptions &options);
63
63
 
64
64
  void SetArrowMapFormat(DuckDBArrowSchemaHolder &root_holder, ArrowSchema &child, const LogicalType &type,
65
- const string &config_timezone, ArrowOptions options) {
65
+ const ArrowOptions &options) {
66
66
  child.format = "+m";
67
67
  //! Map has one child which is a struct
68
68
  child.n_children = 1;
@@ -73,11 +73,11 @@ void SetArrowMapFormat(DuckDBArrowSchemaHolder &root_holder, ArrowSchema &child,
73
73
  InitializeChild(root_holder.nested_children.back()[0]);
74
74
  child.children = &root_holder.nested_children_ptr.back()[0];
75
75
  child.children[0]->name = "entries";
76
- SetArrowFormat(root_holder, **child.children, ListType::GetChildType(type), config_timezone, options);
76
+ SetArrowFormat(root_holder, **child.children, ListType::GetChildType(type), options);
77
77
  }
78
78
 
79
79
  void SetArrowFormat(DuckDBArrowSchemaHolder &root_holder, ArrowSchema &child, const LogicalType &type,
80
- const string &config_timezone, ArrowOptions options) {
80
+ const ArrowOptions &options) {
81
81
  switch (type.id()) {
82
82
  case LogicalTypeId::BOOLEAN:
83
83
  child.format = "b";
@@ -134,7 +134,7 @@ void SetArrowFormat(DuckDBArrowSchemaHolder &root_holder, ArrowSchema &child, co
134
134
  child.format = "tsu:";
135
135
  break;
136
136
  case LogicalTypeId::TIMESTAMP_TZ: {
137
- string format = "tsu:" + config_timezone;
137
+ string format = "tsu:" + options.time_zone;
138
138
  auto format_ptr = make_unsafe_uniq_array<char>(format.size() + 1);
139
139
  for (size_t i = 0; i < format.size(); i++) {
140
140
  format_ptr[i] = format[i];
@@ -192,7 +192,7 @@ void SetArrowFormat(DuckDBArrowSchemaHolder &root_holder, ArrowSchema &child, co
192
192
  InitializeChild(root_holder.nested_children.back()[0]);
193
193
  child.children = &root_holder.nested_children_ptr.back()[0];
194
194
  child.children[0]->name = "l";
195
- SetArrowFormat(root_holder, **child.children, ListType::GetChildType(type), config_timezone, options);
195
+ SetArrowFormat(root_holder, **child.children, ListType::GetChildType(type), options);
196
196
  break;
197
197
  }
198
198
  case LogicalTypeId::STRUCT: {
@@ -220,13 +220,12 @@ void SetArrowFormat(DuckDBArrowSchemaHolder &root_holder, ArrowSchema &child, co
220
220
  root_holder.owned_type_names.push_back(std::move(name_ptr));
221
221
 
222
222
  child.children[type_idx]->name = root_holder.owned_type_names.back().get();
223
- SetArrowFormat(root_holder, *child.children[type_idx], child_types[type_idx].second, config_timezone,
224
- options);
223
+ SetArrowFormat(root_holder, *child.children[type_idx], child_types[type_idx].second, options);
225
224
  }
226
225
  break;
227
226
  }
228
227
  case LogicalTypeId::MAP: {
229
- SetArrowMapFormat(root_holder, child, type, config_timezone, options);
228
+ SetArrowMapFormat(root_holder, child, type, options);
230
229
  break;
231
230
  }
232
231
  case LogicalTypeId::ENUM: {
@@ -259,7 +258,7 @@ void SetArrowFormat(DuckDBArrowSchemaHolder &root_holder, ArrowSchema &child, co
259
258
  }
260
259
 
261
260
  void ArrowConverter::ToArrowSchema(ArrowSchema *out_schema, const vector<LogicalType> &types,
262
- const vector<string> &names, const string &config_timezone, ArrowOptions options) {
261
+ const vector<string> &names, const ArrowOptions &options) {
263
262
  D_ASSERT(out_schema);
264
263
  D_ASSERT(types.size() == names.size());
265
264
  idx_t column_count = types.size();
@@ -287,7 +286,7 @@ void ArrowConverter::ToArrowSchema(ArrowSchema *out_schema, const vector<Logical
287
286
 
288
287
  auto &child = root_holder->children[col_idx];
289
288
  InitializeChild(child, names[col_idx]);
290
- SetArrowFormat(*root_holder, child, types[col_idx], config_timezone, options);
289
+ SetArrowFormat(*root_holder, child, types[col_idx], options);
291
290
  }
292
291
 
293
292
  // Release ownership to caller
@@ -80,7 +80,7 @@ int ResultArrowArrayStreamWrapper::MyStreamGetSchema(struct ArrowArrayStream *st
80
80
  auto my_stream = reinterpret_cast<ResultArrowArrayStreamWrapper *>(stream->private_data);
81
81
  if (!my_stream->column_types.empty()) {
82
82
  ArrowConverter::ToArrowSchema(out, my_stream->column_types, my_stream->column_names,
83
- my_stream->timezone_config);
83
+ QueryResult::GetArrowOptions(*my_stream->result));
84
84
  return 0;
85
85
  }
86
86
 
@@ -100,7 +100,8 @@ int ResultArrowArrayStreamWrapper::MyStreamGetSchema(struct ArrowArrayStream *st
100
100
  my_stream->column_types = result.types;
101
101
  my_stream->column_names = result.names;
102
102
  }
103
- ArrowConverter::ToArrowSchema(out, my_stream->column_types, my_stream->column_names, my_stream->timezone_config);
103
+ ArrowConverter::ToArrowSchema(out, my_stream->column_types, my_stream->column_names,
104
+ QueryResult::GetArrowOptions(*my_stream->result));
104
105
  return 0;
105
106
  }
106
107
 
@@ -186,7 +187,7 @@ bool ArrowUtil::TryFetchNext(QueryResult &result, unique_ptr<DataChunk> &chunk,
186
187
  bool ArrowUtil::TryFetchChunk(QueryResult *result, idx_t chunk_size, ArrowArray *out, idx_t &count,
187
188
  PreservedError &error) {
188
189
  count = 0;
189
- ArrowAppender appender(result->types, chunk_size);
190
+ ArrowAppender appender(result->types, chunk_size, QueryResult::GetArrowOptions(*result));
190
191
  auto &current_chunk = result->current_chunk;
191
192
  if (current_chunk.Valid()) {
192
193
  // We start by scanning the non-finished current chunk
@@ -73,8 +73,11 @@ string Exception::ConstructMessageRecursive(const string &msg, std::vector<Excep
73
73
  parameter_count++;
74
74
  }
75
75
  if (parameter_count != values.size()) {
76
- throw InternalException("Expected %d parameters, received %d", parameter_count, values.size());
76
+ throw InternalException("Primary exception: %s\nSecondary exception in ConstructMessageRecursive: Expected %d "
77
+ "parameters, received %d",
78
+ msg.c_str(), parameter_count, values.size());
77
79
  }
80
+
78
81
  #endif
79
82
  return ExceptionFormatValue::Format(msg, values);
80
83
  }
@@ -68,22 +68,31 @@ ExceptionFormatValue ExceptionFormatValue::CreateFormatValue(hugeint_t value) {
68
68
  }
69
69
 
70
70
  string ExceptionFormatValue::Format(const string &msg, std::vector<ExceptionFormatValue> &values) {
71
- std::vector<duckdb_fmt::basic_format_arg<duckdb_fmt::printf_context>> format_args;
72
- for (auto &val : values) {
73
- switch (val.type) {
74
- case ExceptionFormatValueType::FORMAT_VALUE_TYPE_DOUBLE:
75
- format_args.push_back(duckdb_fmt::internal::make_arg<duckdb_fmt::printf_context>(val.dbl_val));
76
- break;
77
- case ExceptionFormatValueType::FORMAT_VALUE_TYPE_INTEGER:
78
- format_args.push_back(duckdb_fmt::internal::make_arg<duckdb_fmt::printf_context>(val.int_val));
79
- break;
80
- case ExceptionFormatValueType::FORMAT_VALUE_TYPE_STRING:
81
- format_args.push_back(duckdb_fmt::internal::make_arg<duckdb_fmt::printf_context>(val.str_val));
82
- break;
71
+ try {
72
+ std::vector<duckdb_fmt::basic_format_arg<duckdb_fmt::printf_context>> format_args;
73
+ for (auto &val : values) {
74
+ switch (val.type) {
75
+ case ExceptionFormatValueType::FORMAT_VALUE_TYPE_DOUBLE:
76
+ format_args.push_back(duckdb_fmt::internal::make_arg<duckdb_fmt::printf_context>(val.dbl_val));
77
+ break;
78
+ case ExceptionFormatValueType::FORMAT_VALUE_TYPE_INTEGER:
79
+ format_args.push_back(duckdb_fmt::internal::make_arg<duckdb_fmt::printf_context>(val.int_val));
80
+ break;
81
+ case ExceptionFormatValueType::FORMAT_VALUE_TYPE_STRING:
82
+ format_args.push_back(duckdb_fmt::internal::make_arg<duckdb_fmt::printf_context>(val.str_val));
83
+ break;
84
+ }
83
85
  }
84
- }
85
- return duckdb_fmt::vsprintf(msg, duckdb_fmt::basic_format_args<duckdb_fmt::printf_context>(
86
- format_args.data(), static_cast<int>(format_args.size())));
86
+ return duckdb_fmt::vsprintf(msg, duckdb_fmt::basic_format_args<duckdb_fmt::printf_context>(
87
+ format_args.data(), static_cast<int>(format_args.size())));
88
+ } catch (std::exception &ex) { // LCOV_EXCL_START
89
+ // work-around for oss-fuzz limiting memory which causes issues here
90
+ if (StringUtil::Contains(ex.what(), "fuzz mode")) {
91
+ throw Exception(msg);
92
+ }
93
+ throw InternalException(std::string("Primary exception: ") + msg +
94
+ "\nSecondary exception in ExceptionFormatValue: " + ex.what());
95
+ } // LCOV_EXCL_STOP
87
96
  }
88
97
 
89
98
  } // namespace duckdb
@@ -34,6 +34,9 @@ vector<string> MultiFileReader::GetFileList(ClientContext &context, const Value
34
34
  if (val.IsNull()) {
35
35
  throw ParserException("%s reader cannot take NULL input as parameter", name);
36
36
  }
37
+ if (val.type().id() != LogicalTypeId::VARCHAR) {
38
+ throw ParserException("%s reader can only take a list of strings as a parameter", name);
39
+ }
37
40
  auto glob_files = fs.GlobFiles(StringValue::Get(val), context, options);
38
41
  files.insert(files.end(), glob_files.begin(), glob_files.end());
39
42
  }
@@ -28,7 +28,7 @@ double RandomEngine::NextRandom(double min, double max) {
28
28
  }
29
29
 
30
30
  double RandomEngine::NextRandom() {
31
- return random_state->pcg() / double(std::numeric_limits<uint32_t>::max());
31
+ return std::ldexp(random_state->pcg(), -32);
32
32
  }
33
33
  uint32_t RandomEngine::NextRandomInteger() {
34
34
  return random_state->pcg();
@@ -101,16 +101,17 @@ void RowDataCollectionScanner::AlignHeapBlocks(RowDataCollection &swizzled_block
101
101
  make_uniq<RowDataBlock>(buffer_manager, MaxValue<idx_t>(total_size, (idx_t)Storage::BLOCK_SIZE), 1));
102
102
  auto new_heap_handle = buffer_manager.Pin(swizzled_string_heap.blocks.back()->block);
103
103
  auto new_heap_ptr = new_heap_handle.Ptr();
104
+ for (auto &ptr_and_size : ptrs_and_sizes) {
105
+ memcpy(new_heap_ptr, ptr_and_size.first, ptr_and_size.second);
106
+ new_heap_ptr += ptr_and_size.second;
107
+ }
108
+ new_heap_ptr = new_heap_handle.Ptr();
104
109
  if (swizzled_string_heap.keep_pinned) {
105
110
  // Since the heap blocks are pinned, we can unswizzle the data again.
106
111
  swizzled_string_heap.pinned_blocks.emplace_back(std::move(new_heap_handle));
107
112
  RowOperations::UnswizzlePointers(layout, base_row_ptr, new_heap_ptr, data_block->count);
108
113
  RowOperations::UnswizzleHeapPointer(layout, base_row_ptr, new_heap_ptr, data_block->count);
109
114
  }
110
- for (auto &ptr_and_size : ptrs_and_sizes) {
111
- memcpy(new_heap_ptr, ptr_and_size.first, ptr_and_size.second);
112
- new_heap_ptr += ptr_and_size.second;
113
- }
114
115
  }
115
116
  }
116
117
 
@@ -62,8 +62,21 @@ inline string_t TupleDataWithinListValueLoad(const data_ptr_t &location, data_pt
62
62
  return result;
63
63
  }
64
64
 
65
+ #ifdef DEBUG
66
+ static void ResetCombinedListData(vector<TupleDataVectorFormat> &vector_data) {
67
+ for (auto &vd : vector_data) {
68
+ vd.combined_list_data = nullptr;
69
+ ResetCombinedListData(vd.child_formats);
70
+ }
71
+ }
72
+ #endif
73
+
65
74
  void TupleDataCollection::ComputeHeapSizes(TupleDataChunkState &chunk_state, const DataChunk &new_chunk,
66
75
  const SelectionVector &append_sel, const idx_t append_count) {
76
+ #ifdef DEBUG
77
+ ResetCombinedListData(chunk_state.vector_data);
78
+ #endif
79
+
67
80
  auto heap_sizes = FlatVector::GetData<idx_t>(chunk_state.heap_sizes);
68
81
  std::fill_n(heap_sizes, new_chunk.size(), 0);
69
82
 
@@ -293,7 +306,12 @@ static void ApplySliceRecursive(const Vector &source_v, TupleDataVectorFormat &s
293
306
  for (idx_t struct_col_idx = 0; struct_col_idx < struct_sources.size(); struct_col_idx++) {
294
307
  auto &struct_source = *struct_sources[struct_col_idx];
295
308
  auto &struct_format = source_format.child_formats[struct_col_idx];
296
- struct_format.combined_list_data = make_uniq<CombinedListData>();
309
+ #ifdef DEBUG
310
+ D_ASSERT(!struct_format.combined_list_data);
311
+ #endif
312
+ if (!struct_format.combined_list_data) {
313
+ struct_format.combined_list_data = make_uniq<CombinedListData>();
314
+ }
297
315
  ApplySliceRecursive(struct_source, struct_format, *source_format.data.sel, count);
298
316
  }
299
317
  }
@@ -308,14 +326,15 @@ void TupleDataCollection::ListWithinListComputeHeapSizes(Vector &heap_sizes_v, c
308
326
  const auto list_entries = UnifiedVectorFormat::GetData<list_entry_t>(list_data);
309
327
  const auto &list_validity = list_data.validity;
310
328
 
311
- // Child list
329
+ // Child list ("source_v")
312
330
  const auto &child_list_data = source_format.data;
313
331
  const auto child_list_sel = *child_list_data.sel;
314
332
  const auto child_list_entries = UnifiedVectorFormat::GetData<list_entry_t>(child_list_data);
315
333
  const auto &child_list_validity = child_list_data.validity;
316
334
 
317
- // Figure out actual child list size (differs from ListVector::GetListSize if dict/const vector)
318
- idx_t child_list_child_count = ListVector::GetListSize(source_v);
335
+ // Figure out actual child list size (can differ from ListVector::GetListSize if dict/const vector),
336
+ // and we cannot use ConstantVector::ZeroSelectionVector because it may need to be longer than STANDARD_VECTOR_SIZE
337
+ idx_t sum_of_sizes = 0;
319
338
  for (idx_t i = 0; i < append_count; i++) {
320
339
  const auto list_idx = list_sel.get_index(append_sel.get_index(i));
321
340
  if (!list_validity.RowIsValid(list_idx)) {
@@ -324,15 +343,33 @@ void TupleDataCollection::ListWithinListComputeHeapSizes(Vector &heap_sizes_v, c
324
343
  const auto &list_entry = list_entries[list_idx];
325
344
  const auto &list_offset = list_entry.offset;
326
345
  const auto &list_length = list_entry.length;
327
- child_list_child_count = MaxValue<idx_t>(child_list_child_count, list_offset + list_length);
346
+
347
+ for (idx_t child_i = 0; child_i < list_length; child_i++) {
348
+ const auto child_list_idx = child_list_sel.get_index(list_offset + child_i);
349
+ if (!child_list_validity.RowIsValid(child_list_idx)) {
350
+ continue;
351
+ }
352
+
353
+ const auto &child_list_entry = child_list_entries[child_list_idx];
354
+ const auto &child_list_length = child_list_entry.length;
355
+
356
+ sum_of_sizes += child_list_length;
357
+ }
328
358
  }
359
+ const auto child_list_child_count = MaxValue<idx_t>(sum_of_sizes, ListVector::GetListSize(source_v));
329
360
 
330
361
  // Target
331
362
  auto heap_sizes = FlatVector::GetData<idx_t>(heap_sizes_v);
332
363
 
333
364
  // Construct combined list entries and a selection vector for the child list child
334
365
  auto &child_format = source_format.child_formats[0];
335
- child_format.combined_list_data = make_uniq<CombinedListData>();
366
+ #ifdef DEBUG
367
+ // In debug mode this should be deleted by ResetCombinedListData
368
+ D_ASSERT(!child_format.combined_list_data);
369
+ #endif
370
+ if (!child_format.combined_list_data) {
371
+ child_format.combined_list_data = make_uniq<CombinedListData>();
372
+ }
336
373
  auto &combined_list_data = *child_format.combined_list_data;
337
374
  auto &combined_list_entries = combined_list_data.combined_list_entries;
338
375
  SelectionVector combined_sel(child_list_child_count);
@@ -365,7 +402,7 @@ void TupleDataCollection::ListWithinListComputeHeapSizes(Vector &heap_sizes_v, c
365
402
  const auto &child_list_offset = child_list_entry.offset;
366
403
  const auto &child_list_length = child_list_entry.length;
367
404
 
368
- // Add this child's list entry's to the combined selection vector
405
+ // Add this child's list entries to the combined selection vector
369
406
  for (idx_t child_value_i = 0; child_value_i < child_list_length; child_value_i++) {
370
407
  auto idx = combined_list_offset + child_list_size + child_value_i;
371
408
  auto loc = child_list_offset + child_value_i;