1111#include " ../Ref.hpp"
1212#include " ColumnData.hpp"
1313#include " DuckDBResult.hpp"
14+ #include " cast_duckdb_type.hpp"
1415#include " chunk_ptrs_t.hpp"
1516#include " get_duckdb_type.hpp"
1617
@@ -36,17 +37,40 @@ struct MakeChunkPtrs<rfl::Tuple<ColumnData<Ts, ColNames>...>> {
3637 template <class T , class ColName , int _i>
3738 static auto make_column_data (const Ref<DuckDBResult>& _res,
3839 duckdb_data_chunk _chunk) {
39- if (duckdb_column_type (&_res->res (), _i) != get_duckdb_type<T>()) {
40+ const auto actual_duckdb_type = duckdb_column_type (&_res->res (), _i);
41+
42+ auto vec = duckdb_data_chunk_get_vector (_chunk, _i);
43+
44+ if (actual_duckdb_type == get_duckdb_type<T>()) {
45+ return ColumnData<T, ColName>{
46+ .vec = vec,
47+ .data = static_cast <T*>(duckdb_vector_get_data (vec)),
48+ .validity = duckdb_vector_get_validity (vec)};
49+ }
50+
51+ if constexpr (std::is_same_v<T, bool >) {
4052 throw std::runtime_error (
41- " Wrong type in field " + std::to_string (_i) + " . Expected " +
53+ " Wrong type in field ' " + ColName (). str () + " ' . Expected " +
4254 rfl::enum_to_string (get_duckdb_type<T>()) + " , got " +
43- rfl::enum_to_string (duckdb_column_type (&_res->res (), _i)) + " ." );
55+ rfl::enum_to_string (actual_duckdb_type) + " ." );
56+
57+ } else {
58+ const auto ptr_res = cast_duckdb_type<T>(
59+ actual_duckdb_type, duckdb_data_chunk_get_size (_chunk),
60+ duckdb_vector_get_data (vec));
61+
62+ if (!ptr_res) {
63+ throw std::runtime_error (
64+ " Wrong type in field '" + ColName ().str () + " '. Expected " +
65+ rfl::enum_to_string (get_duckdb_type<T>()) + " , got " +
66+ rfl::enum_to_string (actual_duckdb_type) + " ." );
67+ }
68+
69+ return ColumnData<T, ColName>{.vec = vec,
70+ .data = (*ptr_res)->data (),
71+ .validity = duckdb_vector_get_validity (vec),
72+ .ptr = ptr_res->ptr ()};
4473 }
45- auto vec = duckdb_data_chunk_get_vector (_chunk, _i);
46- return ColumnData<T, ColName>{
47- .vec = vec,
48- .data = static_cast <T*>(duckdb_vector_get_data (vec)),
49- .validity = duckdb_vector_get_validity (vec)};
5074 }
5175};
5276
0 commit comments