44#include < duckdb.h>
55
66#include < rfl.hpp>
7+ #include < rfl/enums.hpp>
78#include < type_traits>
89#include < utility>
910
11+ #include " ./parsing/Parser.hpp"
1012#include " ColumnData.hpp"
1113#include " chunk_ptrs_t.hpp"
14+ #include " get_duckdb_type.hpp"
1215
1316namespace sqlgen ::duckdb {
1417
@@ -17,16 +20,27 @@ struct MakeChunkPtrs;
1720
1821template <class ... Ts>
1922struct MakeChunkPtrs <rfl::Tuple<ColumnData<Ts>...>> {
20- Result<rfl::Tuple<ColumnData<Ts>...>> operator ()(duckdb_data_chunk _chunk) {
21- // TODO: Runtime type checking
22- return [&]<int ... _is>(std::integer_sequence<int , _is...>) {
23- return rfl::Tuple<ColumnData<Ts>...>(
24- make_column_data<Ts, _is>(_chunk)...);
25- }(std::make_integer_sequence<int , sizeof ...(Ts)>());
23+ Result<rfl::Tuple<ColumnData<Ts>...>> operator ()(
24+ const Ref<duckdb_result>& _res, duckdb_data_chunk _chunk) {
25+ try {
26+ return [&]<int ... _is>(std::integer_sequence<int , _is...>) {
27+ return rfl::Tuple<ColumnData<Ts>...>(
28+ make_column_data<Ts, _is>(_res, _chunk)...);
29+ }(std::make_integer_sequence<int , sizeof ...(Ts)>());
30+ } catch (const std::exception& e) {
31+ return error (e.what ());
32+ }
2633 }
2734
2835 template <class T , int _i>
29- static auto make_column_data (duckdb_data_chunk _chunk) {
36+ static auto make_column_data (const Ref<duckdb_result>& _res,
37+ duckdb_data_chunk _chunk) {
38+ if (duckdb_column_type (_res.get (), _i) != get_duckdb_type<T>()) {
39+ throw std::runtime_error (
40+ " Wrong type in field " + std::to_string (_i) + " . Expected " +
41+ rfl::enum_to_string (get_duckdb_type<T>()) + " , got " +
42+ rfl::enum_to_string (duckdb_column_type (_res.get (), _i)) + " ." );
43+ }
3044 auto vec = duckdb_data_chunk_get_vector (_chunk, _i);
3145 return ColumnData<T>{.vec = vec,
3246 .data = static_cast <T*>(duckdb_vector_get_data (vec)),
@@ -36,8 +50,8 @@ struct MakeChunkPtrs<rfl::Tuple<ColumnData<Ts>...>> {
3650
3751template <class T >
3852struct MakeChunkPtrs {
39- auto operator ()(duckdb_data_chunk _chunk) {
40- return MakeChunkPtrs<chunk_ptrs_t <T>>{}(_chunk);
53+ auto operator ()(const Ref<duckdb_result>& _res, duckdb_data_chunk _chunk) {
54+ return MakeChunkPtrs<chunk_ptrs_t <T>>{}(_res, _chunk);
4155 }
4256};
4357
0 commit comments